diff --git a/discovery/googleapis/adexchangeseller__v1.1.json b/discovery/googleapis/adexchangeseller__v1.1.json
index 359aacd..ac8638e 100644
--- a/discovery/googleapis/adexchangeseller__v1.1.json
+++ b/discovery/googleapis/adexchangeseller__v1.1.json
@@ -18,7 +18,7 @@
     "description": "Gives Ad Exchange seller users access to their inventory and the ability to generate reports",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/ad-exchange/seller-rest/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/-Sh2IMIsIqhQ3klzcQfPkMhvc2c\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/bok_hcSdBm1EdbGDzvvOPwoa2gI\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif",
         "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif"
@@ -704,7 +704,7 @@
             }
         }
     },
-    "revision": "20140908",
+    "revision": "20140921",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/admin__directory_v1.json b/discovery/googleapis/admin__directory_v1.json
index bb12303..ae35668 100644
--- a/discovery/googleapis/admin__directory_v1.json
+++ b/discovery/googleapis/admin__directory_v1.json
@@ -52,6 +52,12 @@
                 },
                 "https://www.googleapis.com/auth/admin.directory.user.security": {
                     "description": "Manage data access permissions for users on your domain"
+                },
+                "https://www.googleapis.com/auth/admin.directory.userschema": {
+                    "description": "View and manage the provisioning of user schemas on your domain"
+                },
+                "https://www.googleapis.com/auth/admin.directory.userschema.readonly": {
+                    "description": "View user schemas on your domain"
                 }
             }
         }
@@ -63,7 +69,7 @@
     "description": "The Admin SDK Directory API lets you view and manage enterprise resources such as users and groups, administrative notifications, security features, and more.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/admin-sdk/directory/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/j_ZwE0C9AiYczX4hTNBHFJNHzq0\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/JayrKKEnIqmNj16l21fqKTyl5PU\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -1468,6 +1474,184 @@
                 }
             }
         },
+        "schemas": {
+            "methods": {
+                "delete": {
+                    "description": "Delete schema",
+                    "httpMethod": "DELETE",
+                    "id": "directory.schemas.delete",
+                    "parameterOrder": [
+                        "customerId",
+                        "schemaKey"
+                    ],
+                    "parameters": {
+                        "customerId": {
+                            "description": "Immutable id of the Google Apps account",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "schemaKey": {
+                            "description": "Name or immutable Id of the schema",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "customer/{customerId}/schemas/{schemaKey}",
+                    "scopes": [
+                        "https://www.googleapis.com/auth/admin.directory.userschema"
+                    ]
+                },
+                "get": {
+                    "description": "Retrieve schema",
+                    "httpMethod": "GET",
+                    "id": "directory.schemas.get",
+                    "parameterOrder": [
+                        "customerId",
+                        "schemaKey"
+                    ],
+                    "parameters": {
+                        "customerId": {
+                            "description": "Immutable id of the Google Apps account",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "schemaKey": {
+                            "description": "Name or immutable Id of the schema",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "customer/{customerId}/schemas/{schemaKey}",
+                    "response": {
+                        "$ref": "Schema"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/admin.directory.userschema",
+                        "https://www.googleapis.com/auth/admin.directory.userschema.readonly"
+                    ]
+                },
+                "insert": {
+                    "description": "Create schema.",
+                    "httpMethod": "POST",
+                    "id": "directory.schemas.insert",
+                    "parameterOrder": [
+                        "customerId"
+                    ],
+                    "parameters": {
+                        "customerId": {
+                            "description": "Immutable id of the Google Apps account",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "customer/{customerId}/schemas",
+                    "request": {
+                        "$ref": "Schema"
+                    },
+                    "response": {
+                        "$ref": "Schema"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/admin.directory.userschema"
+                    ]
+                },
+                "list": {
+                    "description": "Retrieve all schemas for a customer",
+                    "httpMethod": "GET",
+                    "id": "directory.schemas.list",
+                    "parameterOrder": [
+                        "customerId"
+                    ],
+                    "parameters": {
+                        "customerId": {
+                            "description": "Immutable id of the Google Apps account",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "customer/{customerId}/schemas",
+                    "response": {
+                        "$ref": "Schemas"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/admin.directory.userschema",
+                        "https://www.googleapis.com/auth/admin.directory.userschema.readonly"
+                    ]
+                },
+                "patch": {
+                    "description": "Update schema. This method supports patch semantics.",
+                    "httpMethod": "PATCH",
+                    "id": "directory.schemas.patch",
+                    "parameterOrder": [
+                        "customerId",
+                        "schemaKey"
+                    ],
+                    "parameters": {
+                        "customerId": {
+                            "description": "Immutable id of the Google Apps account",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "schemaKey": {
+                            "description": "Name or immutable Id of the schema.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "customer/{customerId}/schemas/{schemaKey}",
+                    "request": {
+                        "$ref": "Schema"
+                    },
+                    "response": {
+                        "$ref": "Schema"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/admin.directory.userschema"
+                    ]
+                },
+                "update": {
+                    "description": "Update schema",
+                    "httpMethod": "PUT",
+                    "id": "directory.schemas.update",
+                    "parameterOrder": [
+                        "customerId",
+                        "schemaKey"
+                    ],
+                    "parameters": {
+                        "customerId": {
+                            "description": "Immutable id of the Google Apps account",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        },
+                        "schemaKey": {
+                            "description": "Name or immutable Id of the schema.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "customer/{customerId}/schemas/{schemaKey}",
+                    "request": {
+                        "$ref": "Schema"
+                    },
+                    "response": {
+                        "$ref": "Schema"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/admin.directory.userschema"
+                    ]
+                }
+            }
+        },
         "tokens": {
             "methods": {
                 "delete": {
@@ -1582,11 +1766,46 @@
                         "userKey"
                     ],
                     "parameters": {
+                        "customFieldMask": {
+                            "description": "Comma-separated list of schema names. All fields from these schemas are fetched. This should only be set when projection=custom.",
+                            "location": "query",
+                            "type": "string"
+                        },
+                        "projection": {
+                            "default": "basic",
+                            "description": "What subset of fields to fetch for this user.",
+                            "enum": [
+                                "basic",
+                                "custom",
+                                "full"
+                            ],
+                            "enumDescriptions": [
+                                "Do not include any custom fields for the user.",
+                                "Include custom fields from schemas mentioned in customFieldMask.",
+                                "Include all fields associated with this user."
+                            ],
+                            "location": "query",
+                            "type": "string"
+                        },
                         "userKey": {
                             "description": "Email or immutable Id of the user",
                             "location": "path",
                             "required": true,
                             "type": "string"
+                        },
+                        "viewType": {
+                            "default": "admin_view",
+                            "description": "Whether to fetch the ADMIN_VIEW or DOMAIN_PUBLIC view of the user.",
+                            "enum": [
+                                "admin_view",
+                                "domain_public"
+                            ],
+                            "enumDescriptions": [
+                                "Fetches the ADMIN_VIEW of the user.",
+                                "Fetches the DOMAIN_PUBLIC view of the user."
+                            ],
+                            "location": "query",
+                            "type": "string"
                         }
                     },
                     "path": "users/{userKey}",
@@ -1618,6 +1837,11 @@
                     "httpMethod": "GET",
                     "id": "directory.users.list",
                     "parameters": {
+                        "customFieldMask": {
+                            "description": "Comma-separated list of schema names. All fields from these schemas are fetched. This should only be set when projection=custom.",
+                            "location": "query",
+                            "type": "string"
+                        },
                         "customer": {
                             "description": "Immutable id of the Google Apps account. In case of multi-domain, to fetch all users for a customer, fill this field instead of domain.",
                             "location": "query",
@@ -1675,8 +1899,24 @@
                             "location": "query",
                             "type": "string"
                         },
+                        "projection": {
+                            "default": "basic",
+                            "description": "What subset of fields to fetch for this user.",
+                            "enum": [
+                                "basic",
+                                "custom",
+                                "full"
+                            ],
+                            "enumDescriptions": [
+                                "Do not include any custom fields for the user.",
+                                "Include custom fields from schemas mentioned in customFieldMask.",
+                                "Include all fields associated with this user."
+                            ],
+                            "location": "query",
+                            "type": "string"
+                        },
                         "query": {
-                            "description": "Query string search. Should be of the form \"\" where field can be any of supported fields, operators can be one of '=' for exact match or ':' for prefix match. For prefix match, the value should always be followed by a *.",
+                            "description": "Query string search. Should be of the form \"\". Complete documentation is at https://developers.google.com/admin-sdk/directory/v1/guides/search-users",
                             "location": "query",
                             "type": "string"
                         },
@@ -1697,6 +1937,20 @@
                             ],
                             "location": "query",
                             "type": "string"
+                        },
+                        "viewType": {
+                            "default": "admin_view",
+                            "description": "Whether to fetch the ADMIN_VIEW or DOMAIN_PUBLIC view of the user.",
+                            "enum": [
+                                "admin_view",
+                                "domain_public"
+                            ],
+                            "enumDescriptions": [
+                                "Fetches the ADMIN_VIEW of the user.",
+                                "Fetches the DOMAIN_PUBLIC view of the user."
+                            ],
+                            "location": "query",
+                            "type": "string"
                         }
                     },
                     "path": "users",
@@ -1812,6 +2066,11 @@
                     "httpMethod": "POST",
                     "id": "directory.users.watch",
                     "parameters": {
+                        "customFieldMask": {
+                            "description": "Comma-separated list of schema names. All fields from these schemas are fetched. This should only be set when projection=custom.",
+                            "location": "query",
+                            "type": "string"
+                        },
                         "customer": {
                             "description": "Immutable id of the Google Apps account. In case of multi-domain, to fetch all users for a customer, fill this field instead of domain.",
                             "location": "query",
@@ -1869,8 +2128,24 @@
                             "location": "query",
                             "type": "string"
                         },
+                        "projection": {
+                            "default": "basic",
+                            "description": "What subset of fields to fetch for this user.",
+                            "enum": [
+                                "basic",
+                                "custom",
+                                "full"
+                            ],
+                            "enumDescriptions": [
+                                "Do not include any custom fields for the user.",
+                                "Include custom fields from schemas mentioned in customFieldMask.",
+                                "Include all fields associated with this user."
+                            ],
+                            "location": "query",
+                            "type": "string"
+                        },
                         "query": {
-                            "description": "Query string search. Should be of the form \"\" where field can be any of supported fields, operators can be one of '=' for exact match or ':' for prefix match. For prefix match, the value should always be followed by a *.",
+                            "description": "Query string search. Should be of the form \"\". Complete documentation is at https://developers.google.com/admin-sdk/directory/v1/guides/search-users",
                             "location": "query",
                             "type": "string"
                         },
@@ -1891,6 +2166,20 @@
                             ],
                             "location": "query",
                             "type": "string"
+                        },
+                        "viewType": {
+                            "default": "admin_view",
+                            "description": "Whether to fetch the ADMIN_VIEW or DOMAIN_PUBLIC view of the user.",
+                            "enum": [
+                                "admin_view",
+                                "domain_public"
+                            ],
+                            "enumDescriptions": [
+                                "Fetches the ADMIN_VIEW of the user.",
+                                "Fetches the DOMAIN_PUBLIC view of the user."
+                            ],
+                            "location": "query",
+                            "type": "string"
                         }
                     },
                     "path": "users/watch",
@@ -2222,7 +2511,7 @@
             }
         }
     },
-    "revision": "20140905",
+    "revision": "20140919",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Alias": {
@@ -3018,6 +3307,147 @@
             },
             "type": "object"
         },
+        "Schema": {
+            "description": "JSON template for Schema resource in Directory API.",
+            "id": "Schema",
+            "properties": {
+                "etag": {
+                    "description": "ETag of the resource.",
+                    "type": "string"
+                },
+                "fields": {
+                    "annotations": {
+                        "required": [
+                            "directory.schemas.insert",
+                            "directory.schemas.update"
+                        ]
+                    },
+                    "description": "Fields of Schema",
+                    "items": {
+                        "$ref": "SchemaFieldSpec"
+                    },
+                    "type": "array"
+                },
+                "kind": {
+                    "default": "admin#directory#schema",
+                    "description": "Kind of resource this is.",
+                    "type": "string"
+                },
+                "schemaId": {
+                    "description": "Unique identifier of Schema (Read-only)",
+                    "type": "string"
+                },
+                "schemaName": {
+                    "annotations": {
+                        "required": [
+                            "directory.schemas.insert"
+                        ]
+                    },
+                    "description": "Schema name",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "SchemaFieldSpec": {
+            "description": "JSON template for FieldSpec resource for Schemas in Directory API.",
+            "id": "SchemaFieldSpec",
+            "properties": {
+                "etag": {
+                    "description": "ETag of the resource.",
+                    "type": "string"
+                },
+                "fieldId": {
+                    "description": "Unique identifier of Field (Read-only)",
+                    "type": "string"
+                },
+                "fieldName": {
+                    "annotations": {
+                        "required": [
+                            "directory.schemas.insert",
+                            "directory.schemas.update"
+                        ]
+                    },
+                    "description": "Name of the field.",
+                    "type": "string"
+                },
+                "fieldType": {
+                    "annotations": {
+                        "required": [
+                            "directory.schemas.insert",
+                            "directory.schemas.update"
+                        ]
+                    },
+                    "description": "Type of the field.",
+                    "type": "string"
+                },
+                "indexed": {
+                    "default": "true",
+                    "description": "Boolean specifying whether the field is indexed or not.",
+                    "type": "boolean"
+                },
+                "kind": {
+                    "default": "admin#directory#schema#fieldspec",
+                    "description": "Kind of resource this is.",
+                    "type": "string"
+                },
+                "multiValued": {
+                    "annotations": {
+                        "required": [
+                            "directory.schemas.insert",
+                            "directory.schemas.update"
+                        ]
+                    },
+                    "description": "Boolean specifying whether this is a multi-valued field or not.",
+                    "type": "boolean"
+                },
+                "numericIndexingSpec": {
+                    "description": "Indexing spec for a numeric field. By default, only exact match queries will be supported for numeric fields. Setting the numericIndexingSpec allows range queries to be supported.",
+                    "properties": {
+                        "maxValue": {
+                            "description": "Maximum value of this field. This is meant to be indicative rather than enforced. Values outside this range will still be indexed, but search may not be as performant.",
+                            "format": "double",
+                            "type": "number"
+                        },
+                        "minValue": {
+                            "description": "Minimum value of this field. This is meant to be indicative rather than enforced. Values outside this range will still be indexed, but search may not be as performant.",
+                            "format": "double",
+                            "type": "number"
+                        }
+                    },
+                    "type": "object"
+                },
+                "readAccessType": {
+                    "default": "ALL_DOMAIN_USERS",
+                    "description": "Read ACLs on the field specifying who can view values of this field. Valid values are \"ALL_DOMAIN_USERS\" and \"ADMINS_AND_SELF\".",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "Schemas": {
+            "description": "JSON response template for List Schema operation in Directory API.",
+            "id": "Schemas",
+            "properties": {
+                "etag": {
+                    "description": "ETag of the resource.",
+                    "type": "string"
+                },
+                "kind": {
+                    "default": "admin#directory#schemas",
+                    "description": "Kind of resource this is.",
+                    "type": "string"
+                },
+                "schemas": {
+                    "description": "List of UserSchema objects.",
+                    "items": {
+                        "$ref": "Schema"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
         "Token": {
             "description": "JSON template for token resource in Directory API.",
             "id": "Token",
@@ -3085,7 +3515,7 @@
             "type": "object"
         },
         "User": {
-            "description": "JSON template for User object in Apps Directory API.",
+            "description": "JSON template for User object in Directory API.",
             "id": "User",
             "properties": {
                 "addresses": {
@@ -3111,6 +3541,13 @@
                     "format": "date-time",
                     "type": "string"
                 },
+                "customSchemas": {
+                    "additionalProperties": {
+                        "$ref": "UserCustomProperties"
+                    },
+                    "description": "Custom fields of the user.",
+                    "type": "object"
+                },
                 "customerId": {
                     "description": "CustomerId of User (Read-only)",
                     "type": "string"
@@ -3291,6 +3728,14 @@
             },
             "type": "object"
         },
+        "UserCustomProperties": {
+            "additionalProperties": {
+                "type": "any"
+            },
+            "description": "JSON template for a set of custom properties (i.e. all fields in a particular schema)",
+            "id": "UserCustomProperties",
+            "type": "object"
+        },
         "UserEmail": {
             "description": "JSON template for an email.",
             "id": "UserEmail",
diff --git a/discovery/googleapis/admin__email_migration_v2.json b/discovery/googleapis/admin__email_migration_v2.json
index 65153ab..6c585ea 100644
--- a/discovery/googleapis/admin__email_migration_v2.json
+++ b/discovery/googleapis/admin__email_migration_v2.json
@@ -14,10 +14,10 @@
     "description": "Email Migration API lets you migrate emails of users to Google backends.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/admin-sdk/email-migration/v2/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/sAW4O9TJFjBOU_nyFti74xIcDhI\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/Dam2iHq0kOgu8qnsdYB9fhgy5SY\"",
     "icons": {
-        "x16": "http://www.google.com/images/icons/product/search-16.gif",
-        "x32": "http://www.google.com/images/icons/product/search-32.gif"
+        "x16": "https://www.google.com/images/icons/product/googlemail-16.png",
+        "x32": "https://www.google.com/images/icons/product/googlemail-32.png"
     },
     "id": "admin:email_migration_v2",
     "kind": "discovery#restDescription",
@@ -116,7 +116,7 @@
             }
         }
     },
-    "revision": "20140130",
+    "revision": "20140903",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "MailItem": {
diff --git a/discovery/googleapis/admin__reports_v1.json b/discovery/googleapis/admin__reports_v1.json
index e53011d..ff6f4e6 100644
--- a/discovery/googleapis/admin__reports_v1.json
+++ b/discovery/googleapis/admin__reports_v1.json
@@ -18,7 +18,7 @@
     "description": "Allows the administrators of Google Apps customers to fetch reports about the usage, collaboration, security and risk for their users.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/admin-sdk/reports/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/1CnyuAQi1v-9K692tzB6A2cyPVk\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/kIY0aqiDkZ24yMy88cSNtVuMbHk\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -370,7 +370,7 @@
             }
         }
     },
-    "revision": "20140725",
+    "revision": "20140912",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Activities": {
@@ -451,6 +451,21 @@
                                             "format": "int64",
                                             "type": "string"
                                         },
+                                        "multiIntValue": {
+                                            "description": "Multi-int value of the parameter.",
+                                            "items": {
+                                                "format": "int64",
+                                                "type": "string"
+                                            },
+                                            "type": "array"
+                                        },
+                                        "multiValue": {
+                                            "description": "Multi-string value of the parameter.",
+                                            "items": {
+                                                "type": "string"
+                                            },
+                                            "type": "array"
+                                        },
                                         "name": {
                                             "description": "The name of the parameter.",
                                             "type": "string"
diff --git a/discovery/googleapis/adsense__v1.4.json b/discovery/googleapis/adsense__v1.4.json
index e4fb64d..ec4f0a6 100644
--- a/discovery/googleapis/adsense__v1.4.json
+++ b/discovery/googleapis/adsense__v1.4.json
@@ -18,7 +18,7 @@
     "description": "Gives AdSense publishers access to their inventory and the ability to generate reports",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/adsense/management/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/w5NCsqdDReX8O9yjFmrFBeYpEhQ\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/21ZlLWjjym4MBeOUj_1PdKmd4yc\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/adsense-16.png",
         "x32": "https://www.google.com/images/icons/product/adsense-32.png"
@@ -1624,7 +1624,7 @@
             }
         }
     },
-    "revision": "20140908",
+    "revision": "20140921",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/adsensehost__v4.1.json b/discovery/googleapis/adsensehost__v4.1.json
index 3d262f6..328d61d 100644
--- a/discovery/googleapis/adsensehost__v4.1.json
+++ b/discovery/googleapis/adsensehost__v4.1.json
@@ -15,7 +15,7 @@
     "description": "Gives AdSense Hosts access to report generation, ad code generation, and publisher management capabilities.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/adsense/host/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/9aNn1Kv5HngMiv4DqtLxcaAgF8g\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/w_BZT9vnsySgZ6dEU-tvcfoerto\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/adsense-16.png",
         "x32": "https://www.google.com/images/icons/product/adsense-32.png"
@@ -1072,7 +1072,7 @@
             }
         }
     },
-    "revision": "20140908",
+    "revision": "20140921",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/androidpublisher__v2.json b/discovery/googleapis/androidpublisher__v2.json
index 1a18112..0c33bd4 100644
--- a/discovery/googleapis/androidpublisher__v2.json
+++ b/discovery/googleapis/androidpublisher__v2.json
@@ -15,7 +15,7 @@
     "description": "Lets Android application developers access their Google Play accounts.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/android-publisher",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/tXT4pCufDuL1OYbmvPiKHbGGdkc\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/rvEzY_KAgBOlUM1lQqukKQLrl6Y\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/android-16.png",
         "x32": "https://www.google.com/images/icons/product/android-32.png"
@@ -2004,6 +2004,46 @@
                                 "https://www.googleapis.com/auth/androidpublisher"
                             ]
                         },
+                        "defer": {
+                            "description": "Defers a user's subscription purchase until a specified future expiration time.",
+                            "httpMethod": "POST",
+                            "id": "androidpublisher.purchases.subscriptions.defer",
+                            "parameterOrder": [
+                                "packageName",
+                                "subscriptionId",
+                                "token"
+                            ],
+                            "parameters": {
+                                "packageName": {
+                                    "description": "The package name of the application for which this subscription was purchased (for example, 'com.some.thing').",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                },
+                                "subscriptionId": {
+                                    "description": "The purchased subscription ID (for example, 'monthly001').",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                },
+                                "token": {
+                                    "description": "The token provided to the user's device when the subscription was purchased.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:defer",
+                            "request": {
+                                "$ref": "SubscriptionPurchasesDeferRequest"
+                            },
+                            "response": {
+                                "$ref": "SubscriptionPurchasesDeferResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/androidpublisher"
+                            ]
+                        },
                         "get": {
                             "description": "Checks whether a user's subscription purchase is valid and returns its expiry time.",
                             "httpMethod": "GET",
@@ -2040,6 +2080,74 @@
                             "scopes": [
                                 "https://www.googleapis.com/auth/androidpublisher"
                             ]
+                        },
+                        "refund": {
+                            "description": "Refunds a user's subscription purchase, but the subscription remains valid until its expiration time and it will continue to recur.",
+                            "httpMethod": "POST",
+                            "id": "androidpublisher.purchases.subscriptions.refund",
+                            "parameterOrder": [
+                                "packageName",
+                                "subscriptionId",
+                                "token"
+                            ],
+                            "parameters": {
+                                "packageName": {
+                                    "description": "The package name of the application for which this subscription was purchased (for example, 'com.some.thing').",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                },
+                                "subscriptionId": {
+                                    "description": "The purchased subscription ID (for example, 'monthly001').",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                },
+                                "token": {
+                                    "description": "The token provided to the user's device when the subscription was purchased.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:refund",
+                            "scopes": [
+                                "https://www.googleapis.com/auth/androidpublisher"
+                            ]
+                        },
+                        "revoke": {
+                            "description": "Refunds and immediately revokes a user's subscription purchase. Access to the subscription will be terminated immediately and it will stop recurring.",
+                            "httpMethod": "POST",
+                            "id": "androidpublisher.purchases.subscriptions.revoke",
+                            "parameterOrder": [
+                                "packageName",
+                                "subscriptionId",
+                                "token"
+                            ],
+                            "parameters": {
+                                "packageName": {
+                                    "description": "The package name of the application for which this subscription was purchased (for example, 'com.some.thing').",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                },
+                                "subscriptionId": {
+                                    "description": "The purchased subscription ID (for example, 'monthly001').",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                },
+                                "token": {
+                                    "description": "The token provided to the user's device when the subscription was purchased.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:revoke",
+                            "scopes": [
+                                "https://www.googleapis.com/auth/androidpublisher"
+                            ]
                         }
                     }
                 }
@@ -2271,6 +2379,10 @@
                     "description": "Purchase type enum value. Unmodifiable after creation.",
                     "type": "string"
                 },
+                "season": {
+                    "$ref": "Season",
+                    "description": "Definition of a season for a seasonal subscription. Can be defined only for yearly subscriptions."
+                },
                 "sku": {
                     "description": "The stock-keeping-unit (SKU) of the product, unique within an app.",
                     "type": "string"
@@ -2467,6 +2579,22 @@
             },
             "type": "object"
         },
+        "MonthDay": {
+            "id": "MonthDay",
+            "properties": {
+                "day": {
+                    "description": "Day of a month, value in [1, 31] range. Valid range depends on the specified month.",
+                    "format": "uint32",
+                    "type": "integer"
+                },
+                "month": {
+                    "description": "Month of a year. e.g. 1 = JAN, 2 = FEB etc.",
+                    "format": "uint32",
+                    "type": "integer"
+                }
+            },
+            "type": "object"
+        },
         "PageInfo": {
             "id": "PageInfo",
             "properties": {
@@ -2530,6 +2658,37 @@
             },
             "type": "object"
         },
+        "Season": {
+            "id": "Season",
+            "properties": {
+                "end": {
+                    "$ref": "MonthDay",
+                    "description": "Inclusive end date of the recurrence period."
+                },
+                "start": {
+                    "$ref": "MonthDay",
+                    "description": "Inclusive start date of the recurrence period."
+                }
+            },
+            "type": "object"
+        },
+        "SubscriptionDeferralInfo": {
+            "description": "A SubscriptionDeferralInfo contains the data needed to defer a subscription purchase to a future expiry time.",
+            "id": "SubscriptionDeferralInfo",
+            "properties": {
+                "desiredExpiryTimeMillis": {
+                    "description": "The desired next expiry time for the subscription in milliseconds since Epoch. The given time must be after the current expiry time for the subscription.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "expectedExpiryTimeMillis": {
+                    "description": "The expected expiry time for the subscription. If the current expiry time for the subscription is not the value specified here, the deferral will not occur.",
+                    "format": "int64",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
         "SubscriptionPurchase": {
             "description": "A SubscriptionPurchase resource indicates the status of a user's subscription purchase.",
             "id": "SubscriptionPurchase",
@@ -2556,6 +2715,27 @@
             },
             "type": "object"
         },
+        "SubscriptionPurchasesDeferRequest": {
+            "id": "SubscriptionPurchasesDeferRequest",
+            "properties": {
+                "deferralInfo": {
+                    "$ref": "SubscriptionDeferralInfo",
+                    "description": "The information about the new desired expiry time for the subscription."
+                }
+            },
+            "type": "object"
+        },
+        "SubscriptionPurchasesDeferResponse": {
+            "id": "SubscriptionPurchasesDeferResponse",
+            "properties": {
+                "newExpiryTimeMillis": {
+                    "description": "The new expiry time for the subscription in milliseconds since the Epoch.",
+                    "format": "int64",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
         "Testers": {
             "id": "Testers",
             "properties": {
diff --git a/discovery/googleapis/appsactivity__v1.json b/discovery/googleapis/appsactivity__v1.json
index 010ba44..39af361 100644
--- a/discovery/googleapis/appsactivity__v1.json
+++ b/discovery/googleapis/appsactivity__v1.json
@@ -23,7 +23,7 @@
     "description": "Provides a historical view of activity.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/google-apps/activity/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/MmwdCrDlqhBi2D0-JqsndcBoC3M\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/lSpXo4dql_m7xuje0Y2WPH_dsVA\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -149,7 +149,7 @@
             }
         }
     },
-    "revision": "20140619",
+    "revision": "20140828",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Activity": {
diff --git a/discovery/googleapis/appstate__v1.json b/discovery/googleapis/appstate__v1.json
index 4987982..73ddc54 100644
--- a/discovery/googleapis/appstate__v1.json
+++ b/discovery/googleapis/appstate__v1.json
@@ -15,7 +15,7 @@
     "description": "The Google App State API.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/games/services/web/api/states",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/-zmhkDRvj1IoucD8LokwszWaafM\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/HUrCO3I6MchQv8ct1rfLE-lXhNs\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -211,7 +211,7 @@
             }
         }
     },
-    "revision": "20140904",
+    "revision": "20140909",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "GetResponse": {
diff --git a/discovery/googleapis/calendar__v3.json b/discovery/googleapis/calendar__v3.json
index 17fa2d2..cd3e25f 100644
--- a/discovery/googleapis/calendar__v3.json
+++ b/discovery/googleapis/calendar__v3.json
@@ -17,7 +17,7 @@
     "description": "Lets you manipulate events and other calendar data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/google-apps/calendar/firstapp",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/cBsbsu-N6Y-_6MMRCb7O-46pRnI\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/vWqMsHvvvKs-y7bO-cWrAXLs9SU\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/calendar-16.png",
         "x32": "http://www.google.com/images/icons/product/calendar-32.png"
@@ -1535,7 +1535,7 @@
             }
         }
     },
-    "revision": "20140902",
+    "revision": "20140914",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Acl": {
@@ -2240,6 +2240,7 @@
             "id": "EventAttendee",
             "properties": {
                 "additionalGuests": {
+                    "default": "0",
                     "description": "Number of additional guests. Optional. The default is 0.",
                     "format": "int32",
                     "type": "integer"
@@ -2268,6 +2269,7 @@
                     "type": "string"
                 },
                 "optional": {
+                    "default": "false",
                     "description": "Whether this is an optional attendee. Optional. The default is False.",
                     "type": "boolean"
                 },
@@ -2276,6 +2278,7 @@
                     "type": "boolean"
                 },
                 "resource": {
+                    "default": "false",
                     "description": "Whether the attendee is a resource. Read-only. The default is False.",
                     "type": "boolean"
                 },
@@ -2284,6 +2287,7 @@
                     "type": "string"
                 },
                 "self": {
+                    "default": "false",
                     "description": "Whether this entry represents the calendar on which this copy of the event appears. Read-only. The default is False.",
                     "type": "boolean"
                 }
diff --git a/discovery/googleapis/civicinfo__us_v1.json b/discovery/googleapis/civicinfo__us_v1.json
index fde1585..829c102 100644
--- a/discovery/googleapis/civicinfo__us_v1.json
+++ b/discovery/googleapis/civicinfo__us_v1.json
@@ -6,7 +6,7 @@
     "description": "An API for accessing civic information.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/civic-information",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/tNyc5_G2Q097X-O_7m0x4Pe2LIg\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/xUdHq4Z75BUD9ZtUhNKiCTTAQpg\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -162,7 +162,7 @@
             }
         }
     },
-    "revision": "20140815",
+    "revision": "20140918",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AdministrationRegion": {
@@ -532,7 +532,7 @@
             "id": "GeographicDivision",
             "properties": {
                 "alsoKnownAs": {
-                    "description": "Any other valid OCD IDs that refer to the same division. For example, if this division's OCD ID is ocd-division/country:us/district:dc, this will contain ocd-division/country:us/state:dc.",
+                    "description": "Any other valid OCD IDs that refer to the same division.\n\nBecause OCD IDs are meant to be human-readable and at least somewhat predictable, there are occasionally several identifiers for a single division. These identifiers are defined to be equivalent to one another, and one is always indicated as the primary identifier. The primary identifier will be returned in ocd_id above, and any other equivalent valid identifiers will be returned in this list.\n\nFor example, if this division's OCD ID is ocd-division/country:us/district:dc, this will contain ocd-division/country:us/state:dc.",
                     "items": {
                         "type": "string"
                     },
@@ -590,7 +590,7 @@
             "type": "object"
         },
         "Official": {
-            "description": "Information about a official holding an elected office.",
+            "description": "Information about a person holding an elected office.",
             "id": "Official",
             "properties": {
                 "address": {
diff --git a/discovery/googleapis/civicinfo__v1.json b/discovery/googleapis/civicinfo__v1.json
index 2d46e7d..c51d4c3 100644
--- a/discovery/googleapis/civicinfo__v1.json
+++ b/discovery/googleapis/civicinfo__v1.json
@@ -6,7 +6,7 @@
     "description": "An API for accessing civic information.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/civic-information",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/Sze2Rhamx1amW6d_XzjhazX9mXA\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/E48KE0Nyeq0wTXpsQ1wBH_VLmVc\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -162,7 +162,7 @@
             }
         }
     },
-    "revision": "20140815",
+    "revision": "20140918",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AdministrationRegion": {
@@ -532,7 +532,7 @@
             "id": "GeographicDivision",
             "properties": {
                 "alsoKnownAs": {
-                    "description": "Any other valid OCD IDs that refer to the same division. For example, if this division's OCD ID is ocd-division/country:us/district:dc, this will contain ocd-division/country:us/state:dc.",
+                    "description": "Any other valid OCD IDs that refer to the same division.\n\nBecause OCD IDs are meant to be human-readable and at least somewhat predictable, there are occasionally several identifiers for a single division. These identifiers are defined to be equivalent to one another, and one is always indicated as the primary identifier. The primary identifier will be returned in ocd_id above, and any other equivalent valid identifiers will be returned in this list.\n\nFor example, if this division's OCD ID is ocd-division/country:us/district:dc, this will contain ocd-division/country:us/state:dc.",
                     "items": {
                         "type": "string"
                     },
@@ -590,7 +590,7 @@
             "type": "object"
         },
         "Official": {
-            "description": "Information about a official holding an elected office.",
+            "description": "Information about a person holding an elected office.",
             "id": "Official",
             "properties": {
                 "address": {
diff --git a/discovery/googleapis/content__v2.json b/discovery/googleapis/content__v2.json
index 8e6d9dc..e751d06 100644
--- a/discovery/googleapis/content__v2.json
+++ b/discovery/googleapis/content__v2.json
@@ -15,7 +15,7 @@
     "description": "Manage product items, inventory, and Merchant Center accounts for Google Shopping.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/shopping-content/v2/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/mXxQR2aSdOdWdq_00grXYfGGqMU\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/WKtj4perod7wdCJHRIDRqG7zj-U\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -933,7 +933,7 @@
             }
         }
     },
-    "revision": "20140831",
+    "revision": "20140916",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
diff --git a/discovery/googleapis/dfareporting__v1.3.json b/discovery/googleapis/dfareporting__v1.3.json
index 28070ed..4997af1 100644
--- a/discovery/googleapis/dfareporting__v1.3.json
+++ b/discovery/googleapis/dfareporting__v1.3.json
@@ -14,7 +14,7 @@
     "description": "Lets you create, run and download reports.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/doubleclick-advertisers/reporting/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/DksHEtiLa6AYCFbemQxikIlHU8s\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/MWMfv6FhKF4U3Z385phCHGvJ6w0\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/doubleclick-16.gif",
         "x32": "https://www.google.com/images/icons/product/doubleclick-32.gif"
@@ -705,7 +705,7 @@
             }
         }
     },
-    "revision": "20140903",
+    "revision": "20140910",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Activities": {
diff --git a/discovery/googleapis/doubleclicksearch__v2.json b/discovery/googleapis/doubleclicksearch__v2.json
index 72fbd58..090116f 100644
--- a/discovery/googleapis/doubleclicksearch__v2.json
+++ b/discovery/googleapis/doubleclicksearch__v2.json
@@ -14,7 +14,7 @@
     "description": "Report and modify your advertising data in DoubleClick Search (for example, campaigns, ad groups, keywords, and conversions).",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/doubleclick-search/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/GOxwndul1frHFhJwbGPiuFL2qqY\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/fGqvJFn3J0Pke36WoleMuVHFod4\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -430,7 +430,7 @@
             }
         }
     },
-    "revision": "20140903",
+    "revision": "20140909",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Availability": {
diff --git a/discovery/googleapis/drive__v2.json b/discovery/googleapis/drive__v2.json
index f8206fb..2cd0c09 100644
--- a/discovery/googleapis/drive__v2.json
+++ b/discovery/googleapis/drive__v2.json
@@ -32,7 +32,7 @@
     "description": "The API to interact with Drive.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/drive/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/9I9Zl6d27F88N6e-Q2Opsw4M-bY\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/-2NkK8k7_hT4MS2pNsIOEUlM2A0\"",
     "icons": {
         "x16": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_16.png",
         "x32": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_32.png"
@@ -2429,7 +2429,7 @@
             }
         }
     },
-    "revision": "20140902",
+    "revision": "20140916",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "About": {
@@ -3578,6 +3578,27 @@
                     "format": "int64",
                     "type": "string"
                 },
+                "videoMediaMetadata": {
+                    "description": "Metadata about video media. This will only be present for video types.",
+                    "properties": {
+                        "durationMillis": {
+                            "description": "The duration of the video in milliseconds.",
+                            "format": "int64",
+                            "type": "string"
+                        },
+                        "height": {
+                            "description": "The height of the video in pixels.",
+                            "format": "int32",
+                            "type": "integer"
+                        },
+                        "width": {
+                            "description": "The width of the video in pixels.",
+                            "format": "int32",
+                            "type": "integer"
+                        }
+                    },
+                    "type": "object"
+                },
                 "webContentLink": {
                     "description": "A link for downloading the content of the file in a browser using cookie based authentication. In cases where the content is shared publicly, the content can be downloaded without any credentials.",
                     "type": "string"
@@ -3708,7 +3729,7 @@
                     "type": "string"
                 },
                 "emailAddress": {
-                    "description": "The email address of the user this permission refers to. This is an output-only field which is present when the permission type is user and the given user's Google+ profile privacy settings allow exposing their email address.",
+                    "description": "The email address of the user this permission refers to. This is an output-only field which is present when the permission type is user.",
                     "type": "string"
                 },
                 "etag": {
diff --git a/discovery/googleapis/gamesManagement__v1management.json b/discovery/googleapis/gamesManagement__v1management.json
index 5639727..af9efba 100644
--- a/discovery/googleapis/gamesManagement__v1management.json
+++ b/discovery/googleapis/gamesManagement__v1management.json
@@ -18,7 +18,7 @@
     "description": "The Management API for Google Play Game Services.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/games/services",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/j6bIxSGy0DvVu81vCWQfkHkrm9A\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/IluT4nOQ5Y-TIa9GQcTCsb_yD1Y\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -397,7 +397,7 @@
             }
         }
     },
-    "revision": "20140903",
+    "revision": "20140905",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AchievementResetAllResponse": {
diff --git a/discovery/googleapis/games__v1.json b/discovery/googleapis/games__v1.json
index 6965a4e..d27f753 100644
--- a/discovery/googleapis/games__v1.json
+++ b/discovery/googleapis/games__v1.json
@@ -21,7 +21,7 @@
     "description": "The API for Google Play Game Services.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/games/services/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/1fGA1cCjRff4tjdq9wXB3UvbVW8\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/EQ0bR5eQIuMQqKzDSyOJahEWsT4\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -1907,7 +1907,7 @@
             }
         }
     },
-    "revision": "20140903",
+    "revision": "20140905",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AchievementDefinition": {
diff --git a/discovery/googleapis/identitytoolkit__v3.json b/discovery/googleapis/identitytoolkit__v3.json
index dbd5331..832e25c 100644
--- a/discovery/googleapis/identitytoolkit__v3.json
+++ b/discovery/googleapis/identitytoolkit__v3.json
@@ -6,7 +6,7 @@
     "description": "Help the third party sites to implement federated login.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/identity-toolkit/v3/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/3Q4T5rCRWv05dybb5cUgUxFbyZs\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/zVUSgAlpBKN8kedTmeeniVwh5g4\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -135,7 +135,7 @@
                     }
                 },
                 "resetPassword": {
-                    "description": "Set account info for a user.",
+                    "description": "Reset password for a user.",
                     "httpMethod": "POST",
                     "id": "identitytoolkit.relyingparty.resetPassword",
                     "path": "resetPassword",
@@ -197,7 +197,7 @@
             }
         }
     },
-    "revision": "20140717",
+    "revision": "20140916",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "CreateAuthUriResponse": {
@@ -208,6 +208,10 @@
                     "description": "The URI used by the IDP to authenticate the user.",
                     "type": "string"
                 },
+                "captchaRequired": {
+                    "description": "True if captcha is required.",
+                    "type": "boolean"
+                },
                 "forExistingProvider": {
                     "description": "True if the authUri is for user's existing provider.",
                     "type": "boolean"
diff --git a/discovery/googleapis/mapsengine__v1.json b/discovery/googleapis/mapsengine__v1.json
index 416d54d..32d010b 100644
--- a/discovery/googleapis/mapsengine__v1.json
+++ b/discovery/googleapis/mapsengine__v1.json
@@ -18,7 +18,7 @@
     "description": "The Google Maps Engine API allows developers to store and query geospatial vector and raster data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/maps-engine/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/jGUBdJqkmjTr16N5VHnjqkXRtPo\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/KLvHOFhlqcmmjqmNE4lM_SMZ6_s\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/maps_engine-16.png",
         "x32": "https://www.google.com/images/icons/product/maps_engine-32.png"
@@ -236,6 +236,34 @@
                             ]
                         }
                     }
+                },
+                "permissions": {
+                    "methods": {
+                        "list": {
+                            "description": "Return all of the permissions for the specified asset.",
+                            "httpMethod": "GET",
+                            "id": "mapsengine.assets.permissions.list",
+                            "parameterOrder": [
+                                "id"
+                            ],
+                            "parameters": {
+                                "id": {
+                                    "description": "The ID of the asset whose permissions will be listed.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "assets/{id}/permissions",
+                            "response": {
+                                "$ref": "PermissionsListResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/mapsengine",
+                                "https://www.googleapis.com/auth/mapsengine.readonly"
+                            ]
+                        }
+                    }
                 }
             }
         },
@@ -321,6 +349,7 @@
                             "type": "string"
                         },
                         "version": {
+                            "description": "Deprecated: The version parameter indicates which version of the layer should be returned. When version is set to published, the published version of the layer will be returned. Please use the layers.getPublished endpoint instead.",
                             "enum": [
                                 "draft",
                                 "published"
@@ -642,6 +671,86 @@
                             ]
                         }
                     }
+                },
+                "permissions": {
+                    "methods": {
+                        "batchDelete": {
+                            "description": "Remove permission entries from an already existing asset.",
+                            "httpMethod": "POST",
+                            "id": "mapsengine.layers.permissions.batchDelete",
+                            "parameterOrder": [
+                                "id"
+                            ],
+                            "parameters": {
+                                "id": {
+                                    "description": "The ID of the asset from which permissions will be removed.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "layers/{id}/permissions/batchDelete",
+                            "request": {
+                                "$ref": "PermissionsBatchDeleteRequest"
+                            },
+                            "response": {
+                                "$ref": "PermissionsBatchDeleteResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/mapsengine"
+                            ]
+                        },
+                        "batchUpdate": {
+                            "description": "Add or update permission entries to an already existing asset.\n\nAn asset can hold up to 20 different permission entries. Each batchInsert request is atomic.",
+                            "httpMethod": "POST",
+                            "id": "mapsengine.layers.permissions.batchUpdate",
+                            "parameterOrder": [
+                                "id"
+                            ],
+                            "parameters": {
+                                "id": {
+                                    "description": "The ID of the asset to which permissions will be added.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "layers/{id}/permissions/batchUpdate",
+                            "request": {
+                                "$ref": "PermissionsBatchUpdateRequest"
+                            },
+                            "response": {
+                                "$ref": "PermissionsBatchUpdateResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/mapsengine"
+                            ]
+                        },
+                        "list": {
+                            "description": "Return all of the permissions for the specified asset.",
+                            "httpMethod": "GET",
+                            "id": "mapsengine.layers.permissions.list",
+                            "parameterOrder": [
+                                "id"
+                            ],
+                            "parameters": {
+                                "id": {
+                                    "description": "The ID of the asset whose permissions will be listed.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "layers/{id}/permissions",
+                            "response": {
+                                "$ref": "PermissionsListResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/mapsengine",
+                                "https://www.googleapis.com/auth/mapsengine.readonly"
+                            ]
+                        }
+                    }
                 }
             }
         },
@@ -697,6 +806,7 @@
                             "type": "string"
                         },
                         "version": {
+                            "description": "Deprecated: The version parameter indicates which version of the map should be returned. When version is set to published, the published version of the map will be returned. Please use the maps.getPublished endpoint instead.",
                             "enum": [
                                 "draft",
                                 "published"
@@ -953,6 +1063,88 @@
                         "https://www.googleapis.com/auth/mapsengine"
                     ]
                 }
+            },
+            "resources": {
+                "permissions": {
+                    "methods": {
+                        "batchDelete": {
+                            "description": "Remove permission entries from an already existing asset.",
+                            "httpMethod": "POST",
+                            "id": "mapsengine.maps.permissions.batchDelete",
+                            "parameterOrder": [
+                                "id"
+                            ],
+                            "parameters": {
+                                "id": {
+                                    "description": "The ID of the asset from which permissions will be removed.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "maps/{id}/permissions/batchDelete",
+                            "request": {
+                                "$ref": "PermissionsBatchDeleteRequest"
+                            },
+                            "response": {
+                                "$ref": "PermissionsBatchDeleteResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/mapsengine"
+                            ]
+                        },
+                        "batchUpdate": {
+                            "description": "Add or update permission entries to an already existing asset.\n\nAn asset can hold up to 20 different permission entries. Each batchInsert request is atomic.",
+                            "httpMethod": "POST",
+                            "id": "mapsengine.maps.permissions.batchUpdate",
+                            "parameterOrder": [
+                                "id"
+                            ],
+                            "parameters": {
+                                "id": {
+                                    "description": "The ID of the asset to which permissions will be added.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "maps/{id}/permissions/batchUpdate",
+                            "request": {
+                                "$ref": "PermissionsBatchUpdateRequest"
+                            },
+                            "response": {
+                                "$ref": "PermissionsBatchUpdateResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/mapsengine"
+                            ]
+                        },
+                        "list": {
+                            "description": "Return all of the permissions for the specified asset.",
+                            "httpMethod": "GET",
+                            "id": "mapsengine.maps.permissions.list",
+                            "parameterOrder": [
+                                "id"
+                            ],
+                            "parameters": {
+                                "id": {
+                                    "description": "The ID of the asset whose permissions will be listed.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "maps/{id}/permissions",
+                            "response": {
+                                "$ref": "PermissionsListResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/mapsengine",
+                                "https://www.googleapis.com/auth/mapsengine.readonly"
+                            ]
+                        }
+                    }
+                }
             }
         },
         "projects": {
@@ -1367,6 +1559,86 @@
                         }
                     }
                 },
+                "permissions": {
+                    "methods": {
+                        "batchDelete": {
+                            "description": "Remove permission entries from an already existing asset.",
+                            "httpMethod": "POST",
+                            "id": "mapsengine.rasterCollections.permissions.batchDelete",
+                            "parameterOrder": [
+                                "id"
+                            ],
+                            "parameters": {
+                                "id": {
+                                    "description": "The ID of the asset from which permissions will be removed.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "rasterCollections/{id}/permissions/batchDelete",
+                            "request": {
+                                "$ref": "PermissionsBatchDeleteRequest"
+                            },
+                            "response": {
+                                "$ref": "PermissionsBatchDeleteResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/mapsengine"
+                            ]
+                        },
+                        "batchUpdate": {
+                            "description": "Add or update permission entries to an already existing asset.\n\nAn asset can hold up to 20 different permission entries. Each batchInsert request is atomic.",
+                            "httpMethod": "POST",
+                            "id": "mapsengine.rasterCollections.permissions.batchUpdate",
+                            "parameterOrder": [
+                                "id"
+                            ],
+                            "parameters": {
+                                "id": {
+                                    "description": "The ID of the asset to which permissions will be added.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "rasterCollections/{id}/permissions/batchUpdate",
+                            "request": {
+                                "$ref": "PermissionsBatchUpdateRequest"
+                            },
+                            "response": {
+                                "$ref": "PermissionsBatchUpdateResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/mapsengine"
+                            ]
+                        },
+                        "list": {
+                            "description": "Return all of the permissions for the specified asset.",
+                            "httpMethod": "GET",
+                            "id": "mapsengine.rasterCollections.permissions.list",
+                            "parameterOrder": [
+                                "id"
+                            ],
+                            "parameters": {
+                                "id": {
+                                    "description": "The ID of the asset whose permissions will be listed.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "rasterCollections/{id}/permissions",
+                            "response": {
+                                "$ref": "PermissionsListResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/mapsengine",
+                                "https://www.googleapis.com/auth/mapsengine.readonly"
+                            ]
+                        }
+                    }
+                },
                 "rasters": {
                     "methods": {
                         "batchDelete": {
@@ -1826,6 +2098,86 @@
                             ]
                         }
                     }
+                },
+                "permissions": {
+                    "methods": {
+                        "batchDelete": {
+                            "description": "Remove permission entries from an already existing asset.",
+                            "httpMethod": "POST",
+                            "id": "mapsengine.rasters.permissions.batchDelete",
+                            "parameterOrder": [
+                                "id"
+                            ],
+                            "parameters": {
+                                "id": {
+                                    "description": "The ID of the asset from which permissions will be removed.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "rasters/{id}/permissions/batchDelete",
+                            "request": {
+                                "$ref": "PermissionsBatchDeleteRequest"
+                            },
+                            "response": {
+                                "$ref": "PermissionsBatchDeleteResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/mapsengine"
+                            ]
+                        },
+                        "batchUpdate": {
+                            "description": "Add or update permission entries to an already existing asset.\n\nAn asset can hold up to 20 different permission entries. Each batchInsert request is atomic.",
+                            "httpMethod": "POST",
+                            "id": "mapsengine.rasters.permissions.batchUpdate",
+                            "parameterOrder": [
+                                "id"
+                            ],
+                            "parameters": {
+                                "id": {
+                                    "description": "The ID of the asset to which permissions will be added.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "rasters/{id}/permissions/batchUpdate",
+                            "request": {
+                                "$ref": "PermissionsBatchUpdateRequest"
+                            },
+                            "response": {
+                                "$ref": "PermissionsBatchUpdateResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/mapsengine"
+                            ]
+                        },
+                        "list": {
+                            "description": "Return all of the permissions for the specified asset.",
+                            "httpMethod": "GET",
+                            "id": "mapsengine.rasters.permissions.list",
+                            "parameterOrder": [
+                                "id"
+                            ],
+                            "parameters": {
+                                "id": {
+                                    "description": "The ID of the asset whose permissions will be listed.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "rasters/{id}/permissions",
+                            "response": {
+                                "$ref": "PermissionsListResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/mapsengine",
+                                "https://www.googleapis.com/auth/mapsengine.readonly"
+                            ]
+                        }
+                    }
                 }
             }
         },
@@ -2360,11 +2712,91 @@
                             ]
                         }
                     }
+                },
+                "permissions": {
+                    "methods": {
+                        "batchDelete": {
+                            "description": "Remove permission entries from an already existing asset.",
+                            "httpMethod": "POST",
+                            "id": "mapsengine.tables.permissions.batchDelete",
+                            "parameterOrder": [
+                                "id"
+                            ],
+                            "parameters": {
+                                "id": {
+                                    "description": "The ID of the asset from which permissions will be removed.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "tables/{id}/permissions/batchDelete",
+                            "request": {
+                                "$ref": "PermissionsBatchDeleteRequest"
+                            },
+                            "response": {
+                                "$ref": "PermissionsBatchDeleteResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/mapsengine"
+                            ]
+                        },
+                        "batchUpdate": {
+                            "description": "Add or update permission entries to an already existing asset.\n\nAn asset can hold up to 20 different permission entries. Each batchInsert request is atomic.",
+                            "httpMethod": "POST",
+                            "id": "mapsengine.tables.permissions.batchUpdate",
+                            "parameterOrder": [
+                                "id"
+                            ],
+                            "parameters": {
+                                "id": {
+                                    "description": "The ID of the asset to which permissions will be added.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "tables/{id}/permissions/batchUpdate",
+                            "request": {
+                                "$ref": "PermissionsBatchUpdateRequest"
+                            },
+                            "response": {
+                                "$ref": "PermissionsBatchUpdateResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/mapsengine"
+                            ]
+                        },
+                        "list": {
+                            "description": "Return all of the permissions for the specified asset.",
+                            "httpMethod": "GET",
+                            "id": "mapsengine.tables.permissions.list",
+                            "parameterOrder": [
+                                "id"
+                            ],
+                            "parameters": {
+                                "id": {
+                                    "description": "The ID of the asset whose permissions will be listed.",
+                                    "location": "path",
+                                    "required": true,
+                                    "type": "string"
+                                }
+                            },
+                            "path": "tables/{id}/permissions",
+                            "response": {
+                                "$ref": "PermissionsListResponse"
+                            },
+                            "scopes": [
+                                "https://www.googleapis.com/auth/mapsengine",
+                                "https://www.googleapis.com/auth/mapsengine.readonly"
+                            ]
+                        }
+                    }
                 }
             }
         }
     },
-    "revision": "20140909",
+    "revision": "20140919",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AcquisitionTime": {
@@ -2409,7 +2841,7 @@
             "id": "Asset",
             "properties": {
                 "bbox": {
-                    "description": "A rectangular bounding box which contains all of the data in this asset. The numbers represent latitude and longitude in decimal degrees.",
+                    "description": "A rectangular bounding box which contains all of the data in this asset. The box is expressed as \\\"west, south, east, north\\\". The numbers represent latitude and longitude in decimal degrees.",
                     "items": {
                         "format": "double",
                         "type": "number"
@@ -2421,6 +2853,10 @@
                     "format": "date-time",
                     "type": "string"
                 },
+                "creatorEmail": {
+                    "description": "The email address of the creator of this asset. This is only returned on GET requests and not LIST requests.",
+                    "type": "string"
+                },
                 "description": {
                     "description": "The asset's description.",
                     "type": "string"
@@ -2438,6 +2874,10 @@
                     "format": "date-time",
                     "type": "string"
                 },
+                "lastModifierEmail": {
+                    "description": "The email address of the last modifier of this asset. This is only returned on GET requests and not LIST requests.",
+                    "type": "string"
+                },
                 "name": {
                     "description": "The asset's name.",
                     "type": "string"
@@ -2474,6 +2914,10 @@
                         ""
                     ],
                     "type": "string"
+                },
+                "writersCanEditPermissions": {
+                    "description": "If true, WRITERs of the asset are able to edit the asset permissions.",
+                    "type": "boolean"
                 }
             },
             "type": "object"
@@ -2670,7 +3114,8 @@
                     "type": "array"
                 },
                 "normalizeGeometries": {
-                    "description": "If true, the server will normalize feature geometries. It is assumed that the South Pole is exterior to any polygons given. See here for a list of normalizations. If false, the all feature geometries must be given already normalized. The points in all LinearRings must be listed in counter-clockwise order, and LinearRings may not intersect.",
+                    "default": "true",
+                    "description": "If true, the server will normalize feature geometries. It is assumed that the South Pole is exterior to any polygons given. See here for a list of normalizations. If false, all feature geometries must be given already normalized. The points in all LinearRings must be listed in counter-clockwise order, and LinearRings may not intersect.",
                     "type": "boolean"
                 }
             },
@@ -2687,7 +3132,8 @@
                     "type": "array"
                 },
                 "normalizeGeometries": {
-                    "description": "If true, the server will normalize feature geometries. It is assumed that the South Pole is exterior to any polygons given. See here for a list of normalizations. If false, the all feature geometries must be given already normalized. The points in all LinearRings must be listed in counter-clockwise order, and LinearRings may not intersect.",
+                    "default": "true",
+                    "description": "If true, the server will normalize feature geometries. It is assumed that the South Pole is exterior to any polygons given. See here for a list of normalizations. If false, all feature geometries must be given already normalized. The points in all LinearRings must be listed in counter-clockwise order, and LinearRings may not intersect.",
                     "type": "boolean"
                 }
             },
@@ -3008,7 +3454,7 @@
             "id": "GeoJsonPolygon",
             "properties": {
                 "coordinates": {
-                    "description": "An array of LinearRings, each of which is an array of four or more GeoJsonPositions. The first and last coordinates in each LinearRing must be the same. For polygons with multiple rings, the first LinearRing is the external ring, with subsequent rings being interior rings (i.e. hole). All LinearRings must contain GeoJsonPositions in counter-clockwise order.",
+                    "description": "An array of LinearRings. A LinearRing is a GeoJsonLineString which is closed (that is, the first and last GeoJsonPositions are equal), and which contains at least four GeoJsonPositions. For polygons with multiple rings, the first LinearRing is the exterior ring, and any subsequent rings are interior rings (that is, holes).",
                     "items": {
                         "items": {
                             "$ref": "GeoJsonPosition"
@@ -3186,7 +3632,7 @@
             "id": "Layer",
             "properties": {
                 "bbox": {
-                    "description": "A rectangular bounding box which contains all of the data in this Layer. The numbers represent latitude and longitude in decimal degrees.",
+                    "description": "A rectangular bounding box which contains all of the data in this Layer. The box is expressed as \\\"west, south, east, north\\\". The numbers represent latitude and longitude in decimal degrees.",
                     "items": {
                         "format": "double",
                         "type": "number"
@@ -3198,6 +3644,10 @@
                     "format": "date-time",
                     "type": "string"
                 },
+                "creatorEmail": {
+                    "description": "The email address of the creator of this layer. This is only returned on GET requests and not LIST requests.",
+                    "type": "string"
+                },
                 "datasourceType": {
                     "description": "Deprecated: The type of the datasources used to build this Layer. Note: This has been replaced by layerType, but is still available for now to maintain backward compatibility.",
                     "enum": [
@@ -3212,14 +3662,14 @@
                 },
                 "datasources": {
                     "$ref": "Datasources",
-                    "description": "An array of datasources used to build this Layer. If layerType is \"image\", or layerType is not specified and datasourceType is \"image\", then each element in this array is a reference to an Image or RasterCollection. If layerType is \"vector\", or layerType is not specified and datasourceType is \"table\" then each element in this array is a reference to a Vector Table."
+                    "description": "An array of datasources used to build this layer. If layerType is \"image\", or layerType is not specified and datasourceType is \"image\", then each element in this array is a reference to an Image or RasterCollection. If layerType is \"vector\", or layerType is not specified and datasourceType is \"table\" then each element in this array is a reference to a Vector Table."
                 },
                 "description": {
                     "description": "The description of this Layer, supplied by the author.",
                     "type": "string"
                 },
                 "draftAccessList": {
-                    "description": "Deprecated: The name of an access list of the Map Editor type. The user on whose behalf the request is being sent must be an editor on that access list. Note: Google Maps Engine no longer uses access lists. For backward compatibility, the API still accepts access lists for projects that are already using access lists. If you created a GME account/project after July 14th, 2014, you will not be able to send API requests that include access lists. The API does not yet support the new permissions model. When you create a map via the API without specifying permissions, the account that created the map is the owner and has effective administrator access. Users can then use the Maps Engine user interface to adjust the permissions. This is a temporary workaround until the API supports the new permissions model. Read Add new users and groups in the Google Maps Engine help center for more information.",
+                    "description": "Deprecated: The name of an access list of the Map Editor type. The user on whose behalf the request is being sent must be an editor on that access list. Note: Google Maps Engine no longer uses access lists. Instead, each asset has its own list of permissions. For backward compatibility, the API still accepts access lists for projects that are already using access lists. If you created a GME account/project after July 14th, 2014, you will not be able to send API requests that include access lists. Note: This is an input field only. It is not returned in response to a list or get request.",
                     "type": "string"
                 },
                 "etag": {
@@ -3235,6 +3685,10 @@
                     "format": "date-time",
                     "type": "string"
                 },
+                "lastModifierEmail": {
+                    "description": "The email address of the last modifier of this layer. This is only returned on GET requests and not LIST requests.",
+                    "type": "string"
+                },
                 "layerType": {
                     "annotations": {
                         "required": [
@@ -3289,7 +3743,7 @@
                     "type": "string"
                 },
                 "publishedAccessList": {
-                    "description": "Deprecated: The access list to whom view permissions are granted. The value must be the name of a Maps Engine access list of the Map Viewer type, and the user must be a viewer on that list. Read Share data, layers, and maps in the Google Maps Engine help center for more information.",
+                    "description": "Deprecated: The access list to whom view permissions are granted. The value must be the name of a Maps Engine access list of the Map Viewer type, and the user must be a viewer on that list. Note: Google Maps Engine no longer uses access lists. Instead, each asset has its own list of permissions. For backward compatibility, the API still accepts access lists for projects that are already using access lists. If you created a GME account/project after July 14th, 2014, you will not be able to send API requests that include access lists. Note: This is an input field only. It is not returned in response to a list or get request.",
                     "type": "string"
                 },
                 "publishingStatus": {
@@ -3306,17 +3760,21 @@
                 },
                 "style": {
                     "$ref": "VectorStyle",
-                    "description": "The Styling information for a vector layer."
+                    "description": "The styling information for a vector layer. Note: Style information is returned in response to a get request but not a list request. After requesting a list of layers, you'll need to send a get request to retrieve the VectorStyles for each layer."
                 },
                 "tags": {
                     "$ref": "Tags",
                     "description": "Tags of this Layer."
+                },
+                "writersCanEditPermissions": {
+                    "description": "If true, WRITERs of the asset are able to edit the asset permissions.",
+                    "type": "boolean"
                 }
             },
             "type": "object"
         },
         "LayersListResponse": {
-            "description": "The response returned by a call to layers.List.",
+            "description": "The response returned by a call to layers.List. Note: The list response does not include all the fields available in a layer. Refer to the layer resource description for details of the fields that are not included. You'll need to send a get request to retrieve the additional fields for each layer.",
             "id": "LayersListResponse",
             "properties": {
                 "layers": {
@@ -3394,7 +3852,7 @@
             "id": "Map",
             "properties": {
                 "bbox": {
-                    "description": "A rectangular bounding box which contains all of the data in this Map. The numbers represent latitude and longitude in decimal degrees.",
+                    "description": "A rectangular bounding box which contains all of the data in this Map. The box is expressed as \\\"west, south, east, north\\\". The numbers represent latitude and longitude in decimal degrees.",
                     "items": {
                         "format": "double",
                         "type": "number"
@@ -3410,6 +3868,10 @@
                     "format": "date-time",
                     "type": "string"
                 },
+                "creatorEmail": {
+                    "description": "The email address of the creator of this map. This is only returned on GET requests and not LIST requests.",
+                    "type": "string"
+                },
                 "defaultViewport": {
                     "$ref": "LatLngBox",
                     "description": "An array of four numbers (west, south, east, north) which defines the rectangular bounding box of the default viewport. The numbers represent latitude and longitude in decimal degrees."
@@ -3419,7 +3881,7 @@
                     "type": "string"
                 },
                 "draftAccessList": {
-                    "description": "Deprecated: The name of an access list of the Map Editor type. The user on whose behalf the request is being sent must be an editor on that access list. Note: Google Maps Engine no longer uses access lists. For backward compatibility, the API still accepts access lists for projects that are already using access lists. If you created a GME account/project after July 14th, 2014, you will not be able to send API requests that include access lists. The API does not yet support the new permissions model. When you create a map via the API without specifying permissions, the account that created the map is the owner and has effective administrator access. Users can then use the Maps Engine user interface to adjust the permissions. This is a temporary workaround until the API supports the new permissions model. Read Add new users and groups in the Google Maps Engine help center for more information.",
+                    "description": "Deprecated: The name of an access list of the Map Editor type. The user on whose behalf the request is being sent must be an editor on that access list. Note: Google Maps Engine no longer uses access lists. Instead, each asset has its own list of permissions. For backward compatibility, the API still accepts access lists for projects that are already using access lists. If you created a GME account/project after July 14th, 2014, you will not be able to send API requests that include access lists. Note: This is an input field only. It is not returned in response to a list or get request.",
                     "type": "string"
                 },
                 "etag": {
@@ -3435,6 +3897,10 @@
                     "format": "date-time",
                     "type": "string"
                 },
+                "lastModifierEmail": {
+                    "description": "The email address of the last modifier of this map. This is only returned on GET requests and not LIST requests.",
+                    "type": "string"
+                },
                 "name": {
                     "annotations": {
                         "required": [
@@ -3472,7 +3938,7 @@
                     "type": "string"
                 },
                 "publishedAccessList": {
-                    "description": "Deprecated: The access list to whom view permissions are granted. The value must be the name of a Maps Engine access list of the Map Viewer type, and the user must be a viewer on that list. Read Share data, layers, and maps in the Google Maps Engine help center for more information.",
+                    "description": "Deprecated: The access list to whom view permissions are granted. The value must be the name of a Maps Engine access list of the Map Viewer type, and the user must be a viewer on that list. Note: Google Maps Engine no longer uses access lists. Instead, each asset has its own list of permissions. For backward compatibility, the API still accepts access lists for projects that are already using access lists. If you created a GME account/project after July 14th, 2014, you will not be able to send API requests that include access lists. This is an input field only. It is not returned in response to a list or get request.",
                     "type": "string"
                 },
                 "publishingStatus": {
@@ -3498,6 +3964,10 @@
                         "type": "string"
                     },
                     "type": "array"
+                },
+                "writersCanEditPermissions": {
+                    "description": "If true, WRITERs of the asset are able to edit the asset permissions.",
+                    "type": "boolean"
                 }
             },
             "type": "object"
@@ -3742,6 +4212,134 @@
             },
             "type": "object"
         },
+        "Permission": {
+            "description": "A permission defines the user or group that has access to an asset, and the type of access they have.",
+            "id": "Permission",
+            "properties": {
+                "discoverable": {
+                    "description": "Indicates whether a public asset is listed and can be found via a web search (value true), or is visible only to people who have a link to the asset (value false).",
+                    "type": "boolean"
+                },
+                "id": {
+                    "annotations": {
+                        "required": [
+                            "mapsengine.layers.permissions.batchUpdate",
+                            "mapsengine.maps.permissions.batchUpdate",
+                            "mapsengine.rasterCollections.permissions.batchUpdate",
+                            "mapsengine.tables.permissions.batchUpdate"
+                        ]
+                    },
+                    "description": "The unique identifier of the permission. This could be the email address of the user or group this permission refers to, or the string \"anyone\" for public permissions.",
+                    "type": "string"
+                },
+                "role": {
+                    "annotations": {
+                        "required": [
+                            "mapsengine.layers.permissions.batchUpdate",
+                            "mapsengine.maps.permissions.batchUpdate",
+                            "mapsengine.rasterCollections.permissions.batchUpdate",
+                            "mapsengine.tables.permissions.batchUpdate"
+                        ]
+                    },
+                    "description": "The type of access granted to this user or group.",
+                    "enum": [
+                        "owner",
+                        "reader",
+                        "viewer",
+                        "writer"
+                    ],
+                    "enumDescriptions": [
+                        "",
+                        "",
+                        "",
+                        ""
+                    ],
+                    "type": "string"
+                },
+                "type": {
+                    "description": "The account type.",
+                    "enum": [
+                        "anyone",
+                        "group",
+                        "user"
+                    ],
+                    "enumDescriptions": [
+                        "",
+                        "",
+                        ""
+                    ],
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "PermissionsBatchDeleteRequest": {
+            "description": "The request sent to mapsengine.permissions.batchDelete.",
+            "id": "PermissionsBatchDeleteRequest",
+            "properties": {
+                "ids": {
+                    "annotations": {
+                        "required": [
+                            "mapsengine.layers.permissions.batchDelete",
+                            "mapsengine.maps.permissions.batchDelete",
+                            "mapsengine.rasterCollections.permissions.batchDelete",
+                            "mapsengine.tables.permissions.batchDelete"
+                        ]
+                    },
+                    "description": "An array of permission ids to be removed. This could be the email address of the user or group this permission refers to, or the string \"anyone\" for public permissions.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "PermissionsBatchDeleteResponse": {
+            "description": "The response returned by a call to mapsengine.permissions.batchDelete.",
+            "id": "PermissionsBatchDeleteResponse",
+            "type": "object"
+        },
+        "PermissionsBatchUpdateRequest": {
+            "description": "The request sent to mapsengine.permissions.batchUpdate.",
+            "id": "PermissionsBatchUpdateRequest",
+            "properties": {
+                "permissions": {
+                    "annotations": {
+                        "required": [
+                            "mapsengine.layers.permissions.batchUpdate",
+                            "mapsengine.maps.permissions.batchUpdate",
+                            "mapsengine.rasterCollections.permissions.batchUpdate",
+                            "mapsengine.tables.permissions.batchUpdate"
+                        ]
+                    },
+                    "description": "The permissions to be inserted or updated.",
+                    "items": {
+                        "$ref": "Permission"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
+        "PermissionsBatchUpdateResponse": {
+            "description": "The response returned by a call to mapsengine.permissions.batchUpdate.",
+            "id": "PermissionsBatchUpdateResponse",
+            "type": "object"
+        },
+        "PermissionsListResponse": {
+            "id": "PermissionsListResponse",
+            "properties": {
+                "permissions": {
+                    "description": "The set of permissions associated with this asset.",
+                    "items": {
+                        "$ref": "Permission"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
         "PointStyle": {
             "description": "Style for points.",
             "id": "PointStyle",
@@ -3825,20 +4423,11 @@
                     "description": "The description of this Layer, supplied by the author.",
                     "type": "string"
                 },
-                "etag": {
-                    "description": "The ETag, used to refer to the current version of the asset.",
-                    "type": "string"
-                },
                 "id": {
                     "description": "A globally unique ID, used to refer to this Layer.",
                     "type": "string"
                 },
                 "layerType": {
-                    "annotations": {
-                        "required": [
-                            "mapsengine.layers.create"
-                        ]
-                    },
                     "description": "The type of the datasources used to build this Layer. This should be used instead of datasourceType. At least one of layerType and datasourceType and must be specified, but layerType takes precedence.",
                     "enum": [
                         "image",
@@ -3851,20 +4440,10 @@
                     "type": "string"
                 },
                 "name": {
-                    "annotations": {
-                        "required": [
-                            "mapsengine.layers.create"
-                        ]
-                    },
                     "description": "The name of this Layer, supplied by the author.",
                     "type": "string"
                 },
                 "projectId": {
-                    "annotations": {
-                        "required": [
-                            "mapsengine.layers.create"
-                        ]
-                    },
                     "description": "The ID of the project that this Layer is in.",
                     "type": "string"
                 }
@@ -3906,29 +4485,15 @@
                     "description": "The description of this Map, supplied by the author.",
                     "type": "string"
                 },
-                "etag": {
-                    "description": "The ETag, used to refer to the current version of the asset.",
-                    "type": "string"
-                },
                 "id": {
                     "description": "A globally unique ID, used to refer to this Map.",
                     "type": "string"
                 },
                 "name": {
-                    "annotations": {
-                        "required": [
-                            "mapsengine.maps.create"
-                        ]
-                    },
                     "description": "The name of this Map, supplied by the author.",
                     "type": "string"
                 },
                 "projectId": {
-                    "annotations": {
-                        "required": [
-                            "mapsengine.maps.create"
-                        ]
-                    },
                     "description": "The ID of the project that this Map is in.",
                     "type": "string"
                 }
@@ -3967,7 +4532,7 @@
                     "type": "string"
                 },
                 "bbox": {
-                    "description": "A rectangular bounding box which contains all of the data in this Raster. The numbers represent latitude and longitude in decimal degrees.",
+                    "description": "A rectangular bounding box which contains all of the data in this Raster. The box is expressed as \\\"west, south, east, north\\\". The numbers represent latitudes and longitudes in decimal degrees.",
                     "items": {
                         "format": "double",
                         "type": "number"
@@ -3979,12 +4544,16 @@
                     "format": "date-time",
                     "type": "string"
                 },
+                "creatorEmail": {
+                    "description": "The email address of the creator of this raster. This is only returned on GET requests and not LIST requests.",
+                    "type": "string"
+                },
                 "description": {
                     "description": "The description of this Raster, supplied by the author.",
                     "type": "string"
                 },
                 "draftAccessList": {
-                    "description": "Deprecated: The name of an access list of the Map Editor type. The user on whose behalf the request is being sent must be an editor on that access list. Note: Google Maps Engine no longer uses access lists. For backward compatibility, the API still accepts access lists for projects that are already using access lists. If you created a GME account/project after July 14th, 2014, you will not be able to send API requests that include access lists. The API does not yet support the new permissions model. When you create a map via the API without specifying permissions, the account that created the map is the owner and has effective administrator access. Users can then use the Maps Engine user interface to adjust the permissions. This is a temporary workaround until the API supports the new permissions model. Read Add new users and groups in the Google Maps Engine help center for more information.",
+                    "description": "Deprecated: The name of an access list of the Map Editor type. The user on whose behalf the request is being sent must be an editor on that access list. Note: Google Maps Engine no longer uses access lists. Instead, each asset has its own list of permissions. For backward compatibility, the API still accepts access lists for projects that are already using access lists. If you created a GME account/project after July 14th, 2014, you will not be able to send API requests that include access lists. Note: This is an input field only. It is not returned in response to a list or get request.",
                     "type": "string"
                 },
                 "etag": {
@@ -4012,6 +4581,10 @@
                     "format": "date-time",
                     "type": "string"
                 },
+                "lastModifierEmail": {
+                    "description": "The email address of the last modifier of this raster. This is only returned on GET requests and not LIST requests.",
+                    "type": "string"
+                },
                 "maskType": {
                     "default": "autoMask",
                     "description": "The mask processing type of this Raster.",
@@ -4071,6 +4644,10 @@
                 "tags": {
                     "$ref": "Tags",
                     "description": "Tags of this Raster."
+                },
+                "writersCanEditPermissions": {
+                    "description": "If true, WRITERs of the asset are able to edit the asset permissions.",
+                    "type": "boolean"
                 }
             },
             "type": "object"
@@ -4080,11 +4657,11 @@
             "id": "RasterCollection",
             "properties": {
                 "attribution": {
-                    "description": "The name of the attribution to be used for this RasterCollection.",
+                    "description": "The name of the attribution to be used for this RasterCollection. Note: Attribution is returned in response to a get request but not a list request. After requesting a list of raster collections, you'll need to send a get request to retrieve the attribution for each raster collection.",
                     "type": "string"
                 },
                 "bbox": {
-                    "description": "A rectangular bounding box which contains all of the data in this RasterCollection. The numbers represent latitude and longitude in decimal degrees.",
+                    "description": "A rectangular bounding box which contains all of the data in this RasterCollection. The box is expressed as \\\"west, south, east, north\\\". The numbers represent latitude and longitude in decimal degrees.",
                     "items": {
                         "format": "double",
                         "type": "number"
@@ -4096,12 +4673,16 @@
                     "format": "date-time",
                     "type": "string"
                 },
+                "creatorEmail": {
+                    "description": "The email address of the creator of this raster collection. This is only returned on GET requests and not LIST requests.",
+                    "type": "string"
+                },
                 "description": {
                     "description": "The description of this RasterCollection, supplied by the author.",
                     "type": "string"
                 },
                 "draftAccessList": {
-                    "description": "Deprecated: The name of an access list of the Map Editor type. The user on whose behalf the request is being sent must be an editor on that access list. Note: Google Maps Engine no longer uses access lists. For backward compatibility, the API still accepts access lists for projects that are already using access lists. If you created a GME account/project after July 14th, 2014, you will not be able to send API requests that include access lists. The API does not yet support the new permissions model. When you create a map via the API without specifying permissions, the account that created the map is the owner and has effective administrator access. Users can then use the Maps Engine user interface to adjust the permissions. This is a temporary workaround until the API supports the new permissions model. Read Add new users and groups in the Google Maps Engine help center for more information.",
+                    "description": "Deprecated: The name of an access list of the Map Editor type. The user on whose behalf the request is being sent must be an editor on that access list. Note: Google Maps Engine no longer uses access lists. Instead, each asset has its own list of permissions. For backward compatibility, the API still accepts access lists for projects that are already using access lists. If you created a GME account/project after July 14th, 2014, you will not be able to send API requests that include access lists. Note: This is an input field only. It is not returned in response to a list or get request.",
                     "type": "string"
                 },
                 "etag": {
@@ -4117,6 +4698,10 @@
                     "format": "date-time",
                     "type": "string"
                 },
+                "lastModifierEmail": {
+                    "description": "The email address of the last modifier of this raster collection. This is only returned on GET requests and not LIST requests.",
+                    "type": "string"
+                },
                 "mosaic": {
                     "annotations": {
                         "required": [
@@ -4180,12 +4765,16 @@
                 "tags": {
                     "$ref": "Tags",
                     "description": "Tags of this RasterCollection."
+                },
+                "writersCanEditPermissions": {
+                    "description": "If true, WRITERs of the asset are able to edit the asset permissions.",
+                    "type": "boolean"
                 }
             },
             "type": "object"
         },
         "RasterCollectionsListResponse": {
-            "description": "The response returned by a call to raster_collections.List.",
+            "description": "The response returned by a call to raster_collections.List. Note: The list response does not include all the fields available in a raster collection. Refer to the RasterCollection resource description for details of the fields that are not included. You'll need to send a get request to retrieve the additional fields for each raster collection.",
             "id": "RasterCollectionsListResponse",
             "properties": {
                 "nextPageToken": {
@@ -4208,7 +4797,7 @@
             "id": "RasterCollectionsRaster",
             "properties": {
                 "bbox": {
-                    "description": "A rectangular bounding box which contains all of the data in this Raster. The numbers represent latitude and longitude in decimal degrees.",
+                    "description": "A rectangular bounding box which contains all of the data in this Raster. The box is expressed as \\\"west, south, east, north\\\". The numbers represent latitudes and longitudes in decimal degrees.",
                     "items": {
                         "format": "double",
                         "type": "number"
@@ -4471,7 +5060,7 @@
             "id": "Table",
             "properties": {
                 "bbox": {
-                    "description": "A rectangular bounding box which contains all of the data in this table. The numbers represent latitude and longitude in decimal degrees.",
+                    "description": "A rectangular bounding box which contains all of the data in this Table. The box is expressed as \\\"west, south, east, north\\\". The numbers represent latitude and longitude in decimal degrees.",
                     "items": {
                         "format": "double",
                         "type": "number"
@@ -4483,12 +5072,16 @@
                     "format": "date-time",
                     "type": "string"
                 },
+                "creatorEmail": {
+                    "description": "The email address of the creator of this table. This is only returned on GET requests and not LIST requests.",
+                    "type": "string"
+                },
                 "description": {
                     "description": "The description of this table, supplied by the author.",
                     "type": "string"
                 },
                 "draftAccessList": {
-                    "description": "Deprecated: The name of an access list of the Map Editor type. The user on whose behalf the request is being sent must be an editor on that access list. Note: Google Maps Engine no longer uses access lists. For backward compatibility, the API still accepts access lists for projects that are already using access lists. If you created a GME account/project after July 14th, 2014, you will not be able to send API requests that include access lists. The API does not yet support the new permissions model. When you create a map via the API without specifying permissions, the account that created the map is the owner and has effective administrator access. Users can then use the Maps Engine user interface to adjust the permissions. This is a temporary workaround until the API supports the new permissions model. Read Add new users and groups in the Google Maps Engine help center for more information.",
+                    "description": "Deprecated: The name of an access list of the Map Editor type. The user on whose behalf the request is being sent must be an editor on that access list. Note: Google Maps Engine no longer uses access lists. Instead, each asset has its own list of permissions. For backward compatibility, the API still accepts access lists for projects that are already using access lists. If you created a GME account/project after July 14th, 2014, you will not be able to send API requests that include access lists. Note: This is an input field only. It is not returned in response to a list or get request.",
                     "type": "string"
                 },
                 "etag": {
@@ -4516,6 +5109,10 @@
                     "format": "date-time",
                     "type": "string"
                 },
+                "lastModifierEmail": {
+                    "description": "The email address of the last modifier of this table. This is only returned on GET requests and not LIST requests.",
+                    "type": "string"
+                },
                 "name": {
                     "annotations": {
                         "required": [
@@ -4555,7 +5152,7 @@
                     "type": "string"
                 },
                 "publishedAccessList": {
-                    "description": "Deprecated: The access list to whom view permissions are granted. The value must be the name of a Maps Engine access list of the Map Viewer type, and the user must be a viewer on that list. Read Share data, layers, and maps in the Google Maps Engine help center for more information.",
+                    "description": "Deprecated: The access list to whom view permissions are granted. The value must be the name of a Maps Engine access list of the Map Viewer type, and the user must be a viewer on that list. Note: Google Maps Engine no longer uses access lists. Instead, each asset has its own list of permissions. For backward compatibility, the API still accepts access lists for projects that are already using access lists. If you created a GME account/project after July 14th, 2014, you will not be able to send API requests that include access lists. Note: This is an input field only. It is not returned in response to a list or get request.",
                     "type": "string"
                 },
                 "schema": {
@@ -4565,7 +5162,7 @@
                             "mapsengine.tables.create"
                         ]
                     },
-                    "description": "The schema for this table."
+                    "description": "The schema for this table. Note: The schema is returned in response to a get request but not a list request. After requesting a list of tables, you'll need to send a get request to retrieve the schema for each table."
                 },
                 "sourceEncoding": {
                     "default": "UTF-8",
@@ -4575,6 +5172,10 @@
                 "tags": {
                     "$ref": "Tags",
                     "description": "An array of text strings, with each string representing a tag. More information about tags can be found in the Tagging data article of the Maps Engine help center."
+                },
+                "writersCanEditPermissions": {
+                    "description": "If true, WRITERs of the asset are able to edit the asset permissions.",
+                    "type": "boolean"
                 }
             },
             "type": "object"
@@ -4624,7 +5225,7 @@
             "type": "object"
         },
         "TablesListResponse": {
-            "description": "The response returned by a call to tables.List.",
+            "description": "The response returned by a call to tables.List. Note: The list response does not include all the fields available in a table. Refer to the table resource description for details of the fields that are not included. You'll need to send a get request to retrieve the additional fields for each table.",
             "id": "TablesListResponse",
             "properties": {
                 "nextPageToken": {
diff --git a/discovery/googleapis/mirror__v1.json b/discovery/googleapis/mirror__v1.json
index 11e55d6..e5e94e2 100644
--- a/discovery/googleapis/mirror__v1.json
+++ b/discovery/googleapis/mirror__v1.json
@@ -17,7 +17,7 @@
     "description": "API for interacting with Glass users via the timeline.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/glass",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/mHzQ-YLzhCvTUBkktYBjTjOWqUY\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/x73cpqpFVl1e3xcBp5OSFfItgv0\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -735,7 +735,7 @@
             }
         }
     },
-    "revision": "20140908",
+    "revision": "20140917",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Account": {
@@ -1014,6 +1014,10 @@
                     "description": "Controls the behavior when the user picks the menu option. Allowed values are:  \n- CUSTOM - Custom action set by the service. When the user selects this menuItem, the API triggers a notification to your callbackUrl with the userActions.type set to CUSTOM and the userActions.payload set to the ID of this menu item. This is the default value. \n- Built-in actions:  \n- REPLY - Initiate a reply to the timeline item using the voice recording UI. The creator attribute must be set in the timeline item for this menu to be available. \n- REPLY_ALL - Same behavior as REPLY. The original timeline item's recipients will be added to the reply item. \n- DELETE - Delete the timeline item. \n- SHARE - Share the timeline item with the available contacts. \n- READ_ALOUD - Read the timeline item's speakableText aloud; if this field is not set, read the text field; if none of those fields are set, this menu item is ignored. \n- GET_MEDIA_INPUT - Allow users to provide media payloads to Glassware from a menu item (currently, only transcribed text from voice input is supported). Subscribe to notifications when users invoke this menu item to receive the timeline item ID. Retrieve the media from the timeline item in the payload property. \n- VOICE_CALL - Initiate a phone call using the timeline item's creator.phoneNumber attribute as recipient. \n- NAVIGATE - Navigate to the timeline item's location. \n- TOGGLE_PINNED - Toggle the isPinned state of the timeline item. \n- OPEN_URI - Open the payload of the menu item in the browser. \n- PLAY_VIDEO - Open the payload of the menu item in the Glass video player. \n- SEND_MESSAGE - Initiate sending a message to the timeline item's creator:  \n- If the creator.phoneNumber is set and Glass is connected to an Android phone, the message is an SMS. \n- Otherwise, if the creator.email is set, the message is an email.",
                     "type": "string"
                 },
+                "contextual_command": {
+                    "description": "The ContextualMenus.Command associated with this MenuItem (e.g. READ_ALOUD). The voice label for this command will be displayed in the voice menu and the touch label will be displayed in the touch menu. Note that the default menu value's display name will be overriden if you specify this property. Values that do not correspond to a ContextualMenus.Command name will be ignored.",
+                    "type": "string"
+                },
                 "id": {
                     "description": "The ID for this menu item. This is generated by the application and is treated as an opaque token.",
                     "type": "string"
diff --git a/discovery/googleapis/plusDomains__v1.json b/discovery/googleapis/plusDomains__v1.json
index 77fd15a..86febb9 100644
--- a/discovery/googleapis/plusDomains__v1.json
+++ b/discovery/googleapis/plusDomains__v1.json
@@ -41,7 +41,7 @@
     "description": "The Google+ API enables developers to build on top of the Google+ platform.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/+/domains/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/ysNDgCsVw_r8z9dw2VwzCGCTbKo\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/nat8N8_mZgm3flr-9YPb5O94lNs\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/gplus-16.png",
         "x32": "http://www.google.com/images/icons/product/gplus-32.png"
@@ -851,7 +851,7 @@
             }
         }
     },
-    "revision": "20140908",
+    "revision": "20140921",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Acl": {
diff --git a/discovery/googleapis/plus__v1.json b/discovery/googleapis/plus__v1.json
index bbe32fd..fd6d090 100644
--- a/discovery/googleapis/plus__v1.json
+++ b/discovery/googleapis/plus__v1.json
@@ -23,7 +23,7 @@
     "description": "The Google+ API enables developers to build on top of the Google+ platform.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/+/api/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/vkmbF6orr831snGxF4GqtRQCbMc\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/geZLVEz_ep13WYm9tir6SMI9D5Y\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/gplus-16.png",
         "x32": "http://www.google.com/images/icons/product/gplus-32.png"
@@ -621,7 +621,7 @@
             }
         }
     },
-    "revision": "20140908",
+    "revision": "20140921",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Acl": {
diff --git a/discovery/googleapis/prediction__v1.6.json b/discovery/googleapis/prediction__v1.6.json
index dec7079..a7fea12 100644
--- a/discovery/googleapis/prediction__v1.6.json
+++ b/discovery/googleapis/prediction__v1.6.json
@@ -23,7 +23,7 @@
     "description": "Lets you access a cloud hosted machine learning service that makes it easy to build smart apps",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/prediction/docs/developer-guide",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/XH5kx6DVwHOxcDh-sCub5wYn1Ss\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/MKubU0FmYvcCiak8-htY8xGlT7I\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/feature/predictionapi-16.png",
         "x32": "http://www.google.com/images/icons/feature/predictionapi-32.png"
@@ -746,8 +746,7 @@
                 },
                 "outputValue": {
                     "description": "The estimated regression value (Regression models only).",
-                    "format": "double",
-                    "type": "number"
+                    "type": "string"
                 },
                 "selfLink": {
                     "description": "A URL to re-request this resource.",
diff --git a/discovery/googleapis/storage__v1.json b/discovery/googleapis/storage__v1.json
index 9efb50c..1362aad 100644
--- a/discovery/googleapis/storage__v1.json
+++ b/discovery/googleapis/storage__v1.json
@@ -20,7 +20,7 @@
     "description": "Lets you store and retrieve potentially-large, immutable data objects.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/storage/docs/json_api/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/OhKztLK4Ii8Zk7OTAP7hk0RY9sE\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/J4NEKl25SgasPn8QqRPJTF8nCH8\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/cloud_storage-16.png",
         "x32": "https://www.google.com/images/icons/product/cloud_storage-32.png"
@@ -1844,7 +1844,7 @@
             }
         }
     },
-    "revision": "20140828",
+    "revision": "20140911",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Bucket": {
diff --git a/discovery/googleapis_beta/autoscaler__v1beta2.json b/discovery/googleapis_beta/autoscaler__v1beta2.json
index 76262db..34f0b64 100644
--- a/discovery/googleapis_beta/autoscaler__v1beta2.json
+++ b/discovery/googleapis_beta/autoscaler__v1beta2.json
@@ -17,7 +17,7 @@
     "description": "The Google Compute Engine Autoscaler API provides autoscaling for groups of Cloud VMs.",
     "discoveryVersion": "v1",
     "documentationLink": "http://developers.google.com/compute/docs/autoscaler",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/aqfSeC1jGN1VtOnSnFM7d_GgZoI\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/OGrwqagtFyzrQU63rEsuM0hbVC4\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -440,7 +440,7 @@
             }
         }
     },
-    "revision": "20140814",
+    "revision": "20140909",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Autoscaler": {
@@ -464,6 +464,11 @@
                     "format": "uint64",
                     "type": "string"
                 },
+                "kind": {
+                    "default": "compute#autoscaler",
+                    "description": "Type of resource.",
+                    "type": "string"
+                },
                 "name": {
                     "description": "Name of the Autoscaler resource. Must be unique per project and zone.",
                     "type": "string"
@@ -489,6 +494,11 @@
                     },
                     "type": "array"
                 },
+                "kind": {
+                    "default": "compute#autoscalerList",
+                    "description": "Type of resource.",
+                    "type": "string"
+                },
                 "nextPageToken": {
                     "description": "[Output only] A token used to continue a truncated list request.",
                     "type": "string"
@@ -557,6 +567,10 @@
                     "description": "Target value of the metric which Autoscaler should maintain. Must be a positive value.",
                     "format": "double",
                     "type": "number"
+                },
+                "utilizationTargetType": {
+                    "description": "Defines type in which utilization_target is expressed.",
+                    "type": "string"
                 }
             },
             "type": "object"
diff --git a/discovery/googleapis_beta/datastore__v1beta2.json b/discovery/googleapis_beta/datastore__v1beta2.json
index 9f2b6d0..845cd2b 100644
--- a/discovery/googleapis_beta/datastore__v1beta2.json
+++ b/discovery/googleapis_beta/datastore__v1beta2.json
@@ -2,6 +2,9 @@
     "auth": {
         "oauth2": {
             "scopes": {
+                "https://www.googleapis.com/auth/cloud-platform": {
+                    "description": "View and manage your data across Google Cloud Platform services"
+                },
                 "https://www.googleapis.com/auth/datastore": {
                     "description": "View and manage your Google Cloud Datastore data"
                 },
@@ -17,7 +20,7 @@
     "description": "API for accessing Google Cloud Datastore.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/datastore/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/2BYNDaZqMjLdfTtg3EL0oL8j6oI\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/LDhSkY4UxrCPhfQmh9G4U2uaRlU\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -101,6 +104,7 @@
                         "$ref": "AllocateIdsResponse"
                     },
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/datastore",
                         "https://www.googleapis.com/auth/userinfo.email"
                     ]
@@ -128,6 +132,7 @@
                         "$ref": "BeginTransactionResponse"
                     },
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/datastore",
                         "https://www.googleapis.com/auth/userinfo.email"
                     ]
@@ -155,6 +160,7 @@
                         "$ref": "CommitResponse"
                     },
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/datastore",
                         "https://www.googleapis.com/auth/userinfo.email"
                     ]
@@ -182,6 +188,7 @@
                         "$ref": "LookupResponse"
                     },
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/datastore",
                         "https://www.googleapis.com/auth/userinfo.email"
                     ]
@@ -209,6 +216,7 @@
                         "$ref": "RollbackResponse"
                     },
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/datastore",
                         "https://www.googleapis.com/auth/userinfo.email"
                     ]
@@ -236,6 +244,7 @@
                         "$ref": "RunQueryResponse"
                     },
                     "scopes": [
+                        "https://www.googleapis.com/auth/cloud-platform",
                         "https://www.googleapis.com/auth/datastore",
                         "https://www.googleapis.com/auth/userinfo.email"
                     ]
@@ -243,7 +252,7 @@
             }
         }
     },
-    "revision": "20140613",
+    "revision": "20140916",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AllocateIdsRequest": {
@@ -351,6 +360,7 @@
             "type": "object"
         },
         "CompositeFilter": {
+            "description": "A filter that merges the multiple other filters using the given operation.",
             "id": "CompositeFilter",
             "properties": {
                 "filters": {
@@ -374,6 +384,7 @@
             "type": "object"
         },
         "Entity": {
+            "description": "An entity.",
             "id": "Entity",
             "properties": {
                 "key": {
@@ -392,6 +403,7 @@
             "type": "object"
         },
         "EntityResult": {
+            "description": "The result of fetching an entity from the datastore.",
             "id": "EntityResult",
             "properties": {
                 "entity": {
@@ -402,6 +414,7 @@
             "type": "object"
         },
         "Filter": {
+            "description": "A holder for any type of filter. Exactly one field should be specified.",
             "id": "Filter",
             "properties": {
                 "compositeFilter": {
@@ -416,6 +429,7 @@
             "type": "object"
         },
         "GqlQuery": {
+            "description": "A GQL query.",
             "id": "GqlQuery",
             "properties": {
                 "allowLiteral": {
@@ -437,12 +451,14 @@
                     "type": "array"
                 },
                 "queryString": {
+                    "description": "The query string.",
                     "type": "string"
                 }
             },
             "type": "object"
         },
         "GqlQueryArg": {
+            "description": "A binding argument for a GQL query.",
             "id": "GqlQueryArg",
             "properties": {
                 "cursor": {
@@ -460,6 +476,7 @@
             "type": "object"
         },
         "Key": {
+            "description": "A unique identifier for an entity.",
             "id": "Key",
             "properties": {
                 "partitionId": {
@@ -497,6 +514,7 @@
             "type": "object"
         },
         "KindExpression": {
+            "description": "A representation of a kind.",
             "id": "KindExpression",
             "properties": {
                 "name": {
@@ -554,6 +572,7 @@
             "type": "object"
         },
         "Mutation": {
+            "description": "A set of changes to apply.",
             "id": "Mutation",
             "properties": {
                 "delete": {
@@ -617,6 +636,7 @@
             "type": "object"
         },
         "PartitionId": {
+            "description": "An identifier for a particular subset of entities.\n\nEntities are partitioned into various subsets, each used by different datasets and different namespaces within a dataset and so forth.",
             "id": "PartitionId",
             "properties": {
                 "datasetId": {
@@ -631,6 +651,7 @@
             "type": "object"
         },
         "Property": {
+            "description": "An entity property.",
             "id": "Property",
             "properties": {
                 "blobKeyValue": {
@@ -693,6 +714,7 @@
             "type": "object"
         },
         "PropertyExpression": {
+            "description": "A representation of a property in a projection.",
             "id": "PropertyExpression",
             "properties": {
                 "aggregationFunction": {
@@ -713,6 +735,7 @@
             "type": "object"
         },
         "PropertyFilter": {
+            "description": "A filter on a specific property.",
             "id": "PropertyFilter",
             "properties": {
                 "operator": {
@@ -747,6 +770,7 @@
             "type": "object"
         },
         "PropertyOrder": {
+            "description": "The desired order for a specific property.",
             "id": "PropertyOrder",
             "properties": {
                 "direction": {
@@ -769,6 +793,7 @@
             "type": "object"
         },
         "PropertyReference": {
+            "description": "A reference to a property relative to the kind expressions.",
             "id": "PropertyReference",
             "properties": {
                 "name": {
@@ -779,6 +804,7 @@
             "type": "object"
         },
         "Query": {
+            "description": "A query.",
             "id": "Query",
             "properties": {
                 "endCursor": {
@@ -837,10 +863,11 @@
             "type": "object"
         },
         "QueryResultBatch": {
+            "description": "A batch of results produced by a query.",
             "id": "QueryResultBatch",
             "properties": {
                 "endCursor": {
-                    "description": "A cursor that points to the position after the last result in the batch. May be absent.",
+                    "description": "A cursor that points to the position after the last result in the batch. May be absent. TODO(arfuller): Once all plans produce cursors update documentation here.",
                     "format": "byte",
                     "type": "string"
                 },
@@ -979,6 +1006,7 @@
             "type": "object"
         },
         "Value": {
+            "description": "A message that can hold any of the supported value types and associated metadata.",
             "id": "Value",
             "properties": {
                 "blobKeyValue": {
diff --git a/discovery/googleapis_beta/genomics__v1beta.json b/discovery/googleapis_beta/genomics__v1beta.json
index 9bdfa51..1321170 100644
--- a/discovery/googleapis_beta/genomics__v1beta.json
+++ b/discovery/googleapis_beta/genomics__v1beta.json
@@ -23,7 +23,7 @@
     "description": "Provides access to Genomics data.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/genomics/v1beta/reference",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/x23R38eVdK-WjO-U4LV9QK0q830\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/Z3uHhhm6ncEawcl8acPHr16tDuw\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -87,7 +87,7 @@
                     "httpMethod": "GET",
                     "id": "genomics.beacons.get",
                     "parameterOrder": [
-                        "variantsetId"
+                        "variantSetId"
                     ],
                     "parameters": {
                         "allele": {
@@ -95,25 +95,25 @@
                             "location": "query",
                             "type": "string"
                         },
-                        "contig": {
-                            "description": "Required. The contig to query over.",
-                            "location": "query",
-                            "type": "string"
-                        },
                         "position": {
                             "description": "Required. The 0-based position to query.",
                             "format": "int64",
                             "location": "query",
                             "type": "string"
                         },
-                        "variantsetId": {
-                            "description": "The ID of the variantset to query over. It must be public. Private variantsets will return an unauthorized exception.",
+                        "referenceName": {
+                            "description": "Required. The reference to query over.",
+                            "location": "query",
+                            "type": "string"
+                        },
+                        "variantSetId": {
+                            "description": "The ID of the variant set to query over. It must be public. Private variant sets will return an unauthorized exception.",
                             "location": "path",
                             "required": true,
                             "type": "string"
                         }
                     },
-                    "path": "beacons/{variantsetId}",
+                    "path": "beacons/{variantSetId}",
                     "response": {
                         "$ref": "Beacon"
                     }
@@ -123,58 +123,58 @@
         "callsets": {
             "methods": {
                 "create": {
-                    "description": "Creates a new callset.",
+                    "description": "Creates a new call set.",
                     "httpMethod": "POST",
                     "id": "genomics.callsets.create",
                     "path": "callsets",
                     "request": {
-                        "$ref": "Callset"
+                        "$ref": "CallSet"
                     },
                     "response": {
-                        "$ref": "Callset"
+                        "$ref": "CallSet"
                     },
                     "scopes": [
                         "https://www.googleapis.com/auth/genomics"
                     ]
                 },
                 "delete": {
-                    "description": "Deletes a callset.",
+                    "description": "Deletes a call set.",
                     "httpMethod": "DELETE",
                     "id": "genomics.callsets.delete",
                     "parameterOrder": [
-                        "callsetId"
+                        "callSetId"
                     ],
                     "parameters": {
-                        "callsetId": {
+                        "callSetId": {
                             "description": "The ID of the callset to be deleted.",
                             "location": "path",
                             "required": true,
                             "type": "string"
                         }
                     },
-                    "path": "callsets/{callsetId}",
+                    "path": "callsets/{callSetId}",
                     "scopes": [
                         "https://www.googleapis.com/auth/genomics"
                     ]
                 },
                 "get": {
-                    "description": "Gets a callset by ID.",
+                    "description": "Gets a call set by ID.",
                     "httpMethod": "GET",
                     "id": "genomics.callsets.get",
                     "parameterOrder": [
-                        "callsetId"
+                        "callSetId"
                     ],
                     "parameters": {
-                        "callsetId": {
+                        "callSetId": {
                             "description": "The ID of the callset.",
                             "location": "path",
                             "required": true,
                             "type": "string"
                         }
                     },
-                    "path": "callsets/{callsetId}",
+                    "path": "callsets/{callSetId}",
                     "response": {
-                        "$ref": "Callset"
+                        "$ref": "CallSet"
                     },
                     "scopes": [
                         "https://www.googleapis.com/auth/genomics",
@@ -182,41 +182,41 @@
                     ]
                 },
                 "patch": {
-                    "description": "Updates a callset. This method supports patch semantics.",
+                    "description": "Updates a call set. This method supports patch semantics.",
                     "httpMethod": "PATCH",
                     "id": "genomics.callsets.patch",
                     "parameterOrder": [
-                        "callsetId"
+                        "callSetId"
                     ],
                     "parameters": {
-                        "callsetId": {
+                        "callSetId": {
                             "description": "The ID of the callset to be updated.",
                             "location": "path",
                             "required": true,
                             "type": "string"
                         }
                     },
-                    "path": "callsets/{callsetId}",
+                    "path": "callsets/{callSetId}",
                     "request": {
-                        "$ref": "Callset"
+                        "$ref": "CallSet"
                     },
                     "response": {
-                        "$ref": "Callset"
+                        "$ref": "CallSet"
                     },
                     "scopes": [
                         "https://www.googleapis.com/auth/genomics"
                     ]
                 },
                 "search": {
-                    "description": "Gets a list of callsets matching the criteria.",
+                    "description": "Gets a list of call sets matching the criteria.",
                     "httpMethod": "POST",
                     "id": "genomics.callsets.search",
                     "path": "callsets/search",
                     "request": {
-                        "$ref": "SearchCallsetsRequest"
+                        "$ref": "SearchCallSetsRequest"
                     },
                     "response": {
-                        "$ref": "SearchCallsetsResponse"
+                        "$ref": "SearchCallSetsResponse"
                     },
                     "scopes": [
                         "https://www.googleapis.com/auth/genomics",
@@ -224,26 +224,26 @@
                     ]
                 },
                 "update": {
-                    "description": "Updates a callset.",
+                    "description": "Updates a call set.",
                     "httpMethod": "PUT",
                     "id": "genomics.callsets.update",
                     "parameterOrder": [
-                        "callsetId"
+                        "callSetId"
                     ],
                     "parameters": {
-                        "callsetId": {
+                        "callSetId": {
                             "description": "The ID of the callset to be updated.",
                             "location": "path",
                             "required": true,
                             "type": "string"
                         }
                     },
-                    "path": "callsets/{callsetId}",
+                    "path": "callsets/{callSetId}",
                     "request": {
-                        "$ref": "Callset"
+                        "$ref": "CallSet"
                     },
                     "response": {
-                        "$ref": "Callset"
+                        "$ref": "CallSet"
                     },
                     "scopes": [
                         "https://www.googleapis.com/auth/genomics"
@@ -325,7 +325,7 @@
                             "type": "string"
                         },
                         "pageToken": {
-                            "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of \"nextPageToken\" from the previous response.",
+                            "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
                             "location": "query",
                             "type": "string"
                         },
@@ -696,7 +696,7 @@
                                     "type": "string"
                                 },
                                 "pageToken": {
-                                    "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of \"nextPageToken\" from the previous response.",
+                                    "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
                                     "location": "query",
                                     "type": "string"
                                 },
@@ -707,7 +707,7 @@
                                     "type": "string"
                                 },
                                 "range.sequenceName": {
-                                    "description": "The reference sequence name, for example \"chr1\", \"1\", or \"chrX\".",
+                                    "description": "The reference sequence name, for example chr1, 1, or chrX.",
                                     "location": "query",
                                     "type": "string"
                                 },
@@ -724,7 +724,7 @@
                                     "type": "string"
                                 },
                                 "targetBucketWidth": {
-                                    "description": "The desired width of each reported coverage bucket in base pairs. This will be rounded down to the nearest precomputed bucket width; the value of which is returned as bucket_width in the response. Defaults to infinity (each bucket spans an entire reference sequence) or the length of the target range, if specified. The smallest precomputed bucket_width is currently 2048 base pairs; this is subject to change.",
+                                    "description": "The desired width of each reported coverage bucket in base pairs. This will be rounded down to the nearest precomputed bucket width; the value of which is returned as bucketWidth in the response. Defaults to infinity (each bucket spans an entire reference sequence) or the length of the target range, if specified. The smallest precomputed bucketWidth is currently 2048 base pairs; this is subject to change.",
                                     "format": "uint64",
                                     "location": "query",
                                     "type": "string"
@@ -820,26 +820,6 @@
                         "https://www.googleapis.com/auth/genomics.readonly"
                     ]
                 },
-                "getSummary": {
-                    "description": "Gets a summary of all the variant data in a variantset.",
-                    "httpMethod": "GET",
-                    "id": "genomics.variants.getSummary",
-                    "parameters": {
-                        "variantsetId": {
-                            "description": "Required. The ID of the variant set to get variant summary information for.",
-                            "location": "query",
-                            "type": "string"
-                        }
-                    },
-                    "path": "variants/summary",
-                    "response": {
-                        "$ref": "GetVariantsSummaryResponse"
-                    },
-                    "scopes": [
-                        "https://www.googleapis.com/auth/genomics",
-                        "https://www.googleapis.com/auth/genomics.readonly"
-                    ]
-                },
                 "import": {
                     "description": "Creates variant data by asynchronously importing the provided information.",
                     "httpMethod": "POST",
@@ -856,32 +836,6 @@
                         "https://www.googleapis.com/auth/genomics"
                     ]
                 },
-                "patch": {
-                    "description": "Updates a variant. This method supports patch semantics.",
-                    "httpMethod": "PATCH",
-                    "id": "genomics.variants.patch",
-                    "parameterOrder": [
-                        "variantId"
-                    ],
-                    "parameters": {
-                        "variantId": {
-                            "description": "The ID of the variant to be updated..",
-                            "location": "path",
-                            "required": true,
-                            "type": "string"
-                        }
-                    },
-                    "path": "variants/{variantId}",
-                    "request": {
-                        "$ref": "Variant"
-                    },
-                    "response": {
-                        "$ref": "Variant"
-                    },
-                    "scopes": [
-                        "https://www.googleapis.com/auth/genomics"
-                    ]
-                },
                 "search": {
                     "description": "Gets a list of variants matching the criteria.",
                     "httpMethod": "POST",
@@ -899,7 +853,7 @@
                     ]
                 },
                 "update": {
-                    "description": "Updates a variant.",
+                    "description": "Updates a variant's names and info fields. All other modifications are silently ignored. Returns the modified variant without its calls.",
                     "httpMethod": "PUT",
                     "id": "genomics.variants.update",
                     "parameterOrder": [
@@ -907,7 +861,7 @@
                     ],
                     "parameters": {
                         "variantId": {
-                            "description": "The ID of the variant to be updated..",
+                            "description": "The ID of the variant to be updated.",
                             "location": "path",
                             "required": true,
                             "type": "string"
@@ -925,13 +879,77 @@
                     ]
                 }
             }
+        },
+        "variantsets": {
+            "methods": {
+                "delete": {
+                    "description": "Deletes the contents of a variant set. The variant set object is not deleted.",
+                    "httpMethod": "DELETE",
+                    "id": "genomics.variantsets.delete",
+                    "parameterOrder": [
+                        "variantSetId"
+                    ],
+                    "parameters": {
+                        "variantSetId": {
+                            "description": "The ID of the variant set to be deleted.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "variantsets/{variantSetId}",
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics"
+                    ]
+                },
+                "get": {
+                    "description": "Gets a variant set by ID.",
+                    "httpMethod": "GET",
+                    "id": "genomics.variantsets.get",
+                    "parameterOrder": [
+                        "variantSetId"
+                    ],
+                    "parameters": {
+                        "variantSetId": {
+                            "description": "Required. The ID of the variant set.",
+                            "location": "path",
+                            "required": true,
+                            "type": "string"
+                        }
+                    },
+                    "path": "variantsets/{variantSetId}",
+                    "response": {
+                        "$ref": "VariantSet"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics",
+                        "https://www.googleapis.com/auth/genomics.readonly"
+                    ]
+                },
+                "search": {
+                    "description": "Returns a list of all variant sets matching search criteria.",
+                    "httpMethod": "POST",
+                    "id": "genomics.variantsets.search",
+                    "path": "variantsets/search",
+                    "request": {
+                        "$ref": "SearchVariantSetsRequest"
+                    },
+                    "response": {
+                        "$ref": "SearchVariantSetsResponse"
+                    },
+                    "scopes": [
+                        "https://www.googleapis.com/auth/genomics",
+                        "https://www.googleapis.com/auth/genomics.readonly"
+                    ]
+                }
+            }
         }
     },
-    "revision": "20140904",
+    "revision": "20140917",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Beacon": {
-            "description": "A beacon represents whether any variant call in a variantset has a specific allele at a particular position.",
+            "description": "A beacon represents whether any variant call in a variant set has a specific allele at a particular position.",
             "id": "Beacon",
             "properties": {
                 "exists": {
@@ -942,19 +960,19 @@
             "type": "object"
         },
         "Call": {
-            "description": "A Call represents the determination of genotype with respect to a particular variant. It may include associated information such as quality and phasing. For example, a Call might assign a probability of 0.32 to the occurrence of a SNP named rs1234 in a callset with the name NA12345.",
+            "description": "A Call represents the determination of genotype with respect to a particular variant. It may include associated information such as quality and phasing. For example, a Call might assign a probability of 0.32 to the occurrence of a SNP named rs1234 in a call set with the name NA12345.",
             "id": "Call",
             "properties": {
-                "callsetId": {
-                    "description": "The ID of the callset this variant call belongs to.",
+                "callSetId": {
+                    "description": "The ID of the call set this variant call belongs to.",
                     "type": "string"
                 },
-                "callsetName": {
-                    "description": "The name of the callset this variant call belongs to.",
+                "callSetName": {
+                    "description": "The name of the call set this variant call belongs to.",
                     "type": "string"
                 },
                 "genotype": {
-                    "description": "The genotype of this variant call. Each value represents either the value of the referenceBases field or a 1-based index into alternateBases. If a variant had a referenceBases field of \"T\" and an alternateBases value of [\"A\", \"C\"], and the genotype was [2, 1], that would mean the call represented the heterozygous value \"CA\" for this variant. If the genotype was instead [0, 1], the represented value would be \"TA\". Ordering of the genotype values is important if the phaseset field is present. If a genotype is not called (that is, a \".\" is present in the GT string) -1 is returned.",
+                    "description": "The genotype of this variant call. Each value represents either the value of the referenceBases field or a 1-based index into alternateBases. If a variant had a referenceBases value of T and an alternateBases value of [\"A\", \"C\"], and the genotype was [2, 1], that would mean the call represented the heterozygous value CA for this variant. If the genotype was instead [0, 1], the represented value would be TA. Ordering of the genotype values is important if the phaseset is present. If a genotype is not called (that is, a . is present in the GT string) -1 is returned.",
                     "items": {
                         "format": "int32",
                         "type": "integer"
@@ -981,23 +999,23 @@
                     "type": "object"
                 },
                 "phaseset": {
-                    "description": "If this field is present, this variant call's genotype ordering implies the phase of the bases and is consistent with any other variant calls on the same contig which have the same phaseset value. When importing data from VCF, if the genotype data was phased but no phase set was specified this field will be set to \"*\".",
+                    "description": "If this field is present, this variant call's genotype ordering implies the phase of the bases and is consistent with any other variant calls in the same reference sequence which have the same phaseset value. When importing data from VCF, if the genotype data was phased but no phase set was specified this field will be set to *.",
                     "type": "string"
                 }
             },
             "type": "object"
         },
-        "Callset": {
-            "description": "A Callset is a collection of Variant Calls. It belongs to a Variantset.",
-            "id": "Callset",
+        "CallSet": {
+            "description": "A CallSet is a collection of variant calls. It belongs to a variant set.",
+            "id": "CallSet",
             "properties": {
                 "created": {
-                    "description": "The date this callset was created in milliseconds from the epoch.",
+                    "description": "The date this call set was created in milliseconds from the epoch.",
                     "format": "int64",
                     "type": "string"
                 },
                 "id": {
-                    "description": "The Google generated ID of the callset, immutable.",
+                    "description": "The Google generated ID of the call set, immutable.",
                     "type": "string"
                 },
                 "info": {
@@ -1015,25 +1033,16 @@
                     "description": "The callset name.",
                     "type": "string"
                 },
-                "variantsetId": {
-                    "description": "The ID of the variantset this callset belongs to.",
-                    "type": "string"
-                }
-            },
-            "type": "object"
-        },
-        "ContigBound": {
-            "description": "ContigBound records an upper bound for the starting coordinate of variants in a particular contig.",
-            "id": "ContigBound",
-            "properties": {
-                "contig": {
-                    "description": "The contig the bound is associate with.",
+                "sampleId": {
+                    "description": "The sample ID this call set corresponds to.",
                     "type": "string"
                 },
-                "upperBound": {
-                    "description": "An upper bound (inclusive) on the starting coordinate of any variant in the contig.",
-                    "format": "int64",
-                    "type": "string"
+                "variantSetIds": {
+                    "description": "The IDs of the variant sets this call set belongs to.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
                 }
             },
             "type": "object"
@@ -1083,19 +1092,19 @@
             "id": "ExperimentalCreateJobRequest",
             "properties": {
                 "align": {
-                    "description": "Specifies whether or not to run the alignment pipeline. At least one of align or call_variants must be provided.",
+                    "description": "Specifies whether or not to run the alignment pipeline. At least one of align or callVariants must be provided.",
                     "type": "boolean"
                 },
                 "callVariants": {
-                    "description": "Specifies whether or not to run the variant calling pipeline. If specified, alignment will be performed first and the aligned BAMs will passed as input to the variant caller. At least one of align or call_variants must be provided.",
+                    "description": "Specifies whether or not to run the variant calling pipeline. If specified, alignment will be performed first and the aligned BAMs will passed as input to the variant caller. At least one of align or callVariants must be provided.",
                     "type": "boolean"
                 },
                 "gcsOutputPath": {
-                    "description": "Specifies where to copy the results of certain pipelines. This shoud be in the form of \"gs://bucket/path\".",
+                    "description": "Specifies where to copy the results of certain pipelines. This should be in the form of gs://bucket/path.",
                     "type": "string"
                 },
                 "pairedSourceUris": {
-                    "description": "A list of Google Cloud Storage URIs of paired end .fastq files to operate upon. If specified, this represents the second file of each paired .fastq file. The first file of each pair should be specified in \"sourceUris\".",
+                    "description": "A list of Google Cloud Storage URIs of paired end .fastq files to operate upon. If specified, this represents the second file of each paired .fastq file. The first file of each pair should be specified in sourceUris.",
                     "items": {
                         "type": "string"
                     },
@@ -1107,7 +1116,7 @@
                     "type": "string"
                 },
                 "sourceUris": {
-                    "description": "A list of Google Cloud Storage URIs of data files to operate upon. These can be .bam, interleaved .fastq, or paired .fastq. If specifying paired .fastq files, the first of each pair of files should be listed here, and the second of each pair should be listed in \"pairedSourceUris\".",
+                    "description": "A list of Google Cloud Storage URIs of data files to operate upon. These can be .bam, interleaved .fastq, or paired .fastq. If specifying paired .fastq files, the first of each pair of files should be listed here, and the second of each pair should be listed in pairedSourceUris.",
                     "items": {
                         "type": "string"
                     },
@@ -1148,7 +1157,7 @@
                     "type": "array"
                 },
                 "referenceNames": {
-                    "description": "The reference names to export. If this is not specified, all reference sequences are exported. Use '*' to export unmapped reads.",
+                    "description": "The reference names to export. If this is not specified, all reference sequences, including unmapped reads, are exported. Use * to export only unmapped reads.",
                     "items": {
                         "type": "string"
                     },
@@ -1180,8 +1189,8 @@
                     "description": "The BigQuery table to export data to. The caller must have WRITE access to this BigQuery table.",
                     "type": "string"
                 },
-                "callsetIds": {
-                    "description": "If provided, only variant call information from the specified callsets will be exported. By default all variant calls are exported.",
+                "callSetIds": {
+                    "description": "If provided, only variant call information from the specified call sets will be exported. By default all variant calls are exported.",
                     "items": {
                         "type": "string"
                     },
@@ -1202,8 +1211,8 @@
                     "format": "int64",
                     "type": "string"
                 },
-                "variantsetId": {
-                    "description": "Required. The ID of the variantset that contains variant data which should be exported. The caller must have READ access to this variantset.",
+                "variantSetId": {
+                    "description": "Required. The ID of the variant set that contains variant data which should be exported. The caller must have READ access to this variant set.",
                     "type": "string"
                 }
             },
@@ -1230,7 +1239,7 @@
                     "type": "string"
                 },
                 "sequenceName": {
-                    "description": "The reference sequence name, for example \"chr1\", \"1\", or \"chrX\".",
+                    "description": "The reference sequence name, for example chr1, 1, or chrX.",
                     "type": "string"
                 },
                 "sequenceStart": {
@@ -1241,27 +1250,6 @@
             },
             "type": "object"
         },
-        "GetVariantsSummaryResponse": {
-            "description": "The variants summary response.",
-            "id": "GetVariantsSummaryResponse",
-            "properties": {
-                "contigBounds": {
-                    "description": "A list of all contigs used by the variants in a dataset with associated coordinate upper bounds for each one.",
-                    "items": {
-                        "$ref": "ContigBound"
-                    },
-                    "type": "array"
-                },
-                "metadata": {
-                    "description": "The metadata associated with this dataset.",
-                    "items": {
-                        "$ref": "Metadata"
-                    },
-                    "type": "array"
-                }
-            },
-            "type": "object"
-        },
         "Header": {
             "id": "Header",
             "properties": {
@@ -1378,8 +1366,8 @@
                     },
                     "type": "array"
                 },
-                "variantsetId": {
-                    "description": "Required. The variantset to which variant data should be imported.",
+                "variantSetId": {
+                    "description": "Required. The variant set to which variant data should be imported.",
                     "type": "string"
                 }
             },
@@ -1513,12 +1501,12 @@
             "id": "ListCoverageBucketsResponse",
             "properties": {
                 "bucketWidth": {
-                    "description": "The length of each coverage bucket in base pairs. Note that buckets at the end of a reference sequence may be shorter. This value is omitted if the bucket width is infinity (the default behaviour, with no range or target_bucket_width).",
+                    "description": "The length of each coverage bucket in base pairs. Note that buckets at the end of a reference sequence may be shorter. This value is omitted if the bucket width is infinity (the default behaviour, with no range or targetBucketWidth).",
                     "format": "uint64",
                     "type": "string"
                 },
                 "coverageBuckets": {
-                    "description": "The coverage buckets. The list of buckets is sparse; a bucket with 0 overlapping reads is not returned. A bucket never crosses more than one reference sequence. Each bucket has width bucket_width, unless its end is is the end of the reference sequence.",
+                    "description": "The coverage buckets. The list of buckets is sparse; a bucket with 0 overlapping reads is not returned. A bucket never crosses more than one reference sequence. Each bucket has width bucketWidth, unless its end is the end of the reference sequence.",
                     "items": {
                         "$ref": "CoverageBucket"
                     },
@@ -1793,6 +1781,22 @@
             },
             "type": "object"
         },
+        "ReferenceBound": {
+            "description": "ReferenceBound records an upper bound for the starting coordinate of variants in a particular reference.",
+            "id": "ReferenceBound",
+            "properties": {
+                "referenceName": {
+                    "description": "The reference the bound is associate with.",
+                    "type": "string"
+                },
+                "upperBound": {
+                    "description": "An upper bound (inclusive) on the starting coordinate of any variant in the reference sequence.",
+                    "format": "int64",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
         "ReferenceSequence": {
             "id": "ReferenceSequence",
             "properties": {
@@ -1824,25 +1828,25 @@
             },
             "type": "object"
         },
-        "SearchCallsetsRequest": {
-            "description": "The callset search request.",
-            "id": "SearchCallsetsRequest",
+        "SearchCallSetsRequest": {
+            "description": "The call set search request.",
+            "id": "SearchCallSetsRequest",
             "properties": {
-                "maxResults": {
-                    "description": "The maximum number of callsets to return.",
-                    "format": "uint64",
+                "name": {
+                    "description": "Only return call sets for which a substring of the name matches this string.",
                     "type": "string"
                 },
-                "name": {
-                    "description": "Only return callsets for which a substring of the name matches this string.",
-                    "type": "string"
+                "pageSize": {
+                    "description": "The maximum number of call sets to return.",
+                    "format": "int32",
+                    "type": "integer"
                 },
                 "pageToken": {
-                    "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of \"nextPageToken\" from the previous response.",
+                    "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
                     "type": "string"
                 },
-                "variantsetIds": {
-                    "description": "Restrict the query to callsets within the given variantsets. At least one ID must be provided.",
+                "variantSetIds": {
+                    "description": "Restrict the query to call sets within the given variant sets. At least one ID must be provided.",
                     "items": {
                         "type": "string"
                     },
@@ -1851,14 +1855,14 @@
             },
             "type": "object"
         },
-        "SearchCallsetsResponse": {
-            "description": "The callset search response.",
-            "id": "SearchCallsetsResponse",
+        "SearchCallSetsResponse": {
+            "description": "The call set search response.",
+            "id": "SearchCallSetsResponse",
             "properties": {
-                "callsets": {
-                    "description": "The list of matching callsets.",
+                "callSets": {
+                    "description": "The list of matching call sets.",
                     "items": {
-                        "$ref": "Callset"
+                        "$ref": "CallSet"
                     },
                     "type": "array"
                 },
@@ -1889,11 +1893,11 @@
                     "type": "string"
                 },
                 "pageToken": {
-                    "description": "The continuation token which is used to page through large result sets. To get the next page of results, set this parameter to the value of the \"nextPageToken\" from the previous response.",
+                    "description": "The continuation token which is used to page through large result sets. To get the next page of results, set this parameter to the value of the nextPageToken from the previous response.",
                     "type": "string"
                 },
                 "projectId": {
-                    "description": "Required. Only return jobs which belong to this Google Developers Console project. Only accepts project numbers.",
+                    "description": "Required. Only return jobs which belong to this Google Developers",
                     "format": "int64",
                     "type": "string"
                 },
@@ -1953,7 +1957,7 @@
                     "type": "string"
                 },
                 "pageToken": {
-                    "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of \"nextPageToken\" from the previous response.",
+                    "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
                     "type": "string"
                 },
                 "readsetIds": {
@@ -1964,16 +1968,16 @@
                     "type": "array"
                 },
                 "sequenceEnd": {
-                    "description": "The end position (1-based, inclusive) of the target range. If specified, \"sequenceName\" must also be specified. Defaults to the end of the target reference sequence, if any.",
+                    "description": "The end position (1-based, inclusive) of the target range. If specified, sequenceName must also be specified. Defaults to the end of the target reference sequence, if any.",
                     "format": "uint64",
                     "type": "string"
                 },
                 "sequenceName": {
-                    "description": "Restricts the results to a particular reference sequence such as '1', 'chr1', or 'X'. The set of valid references sequences depends on the readsets specified. If set to \"*\", only unmapped Reads are returned.",
+                    "description": "Restricts the results to a particular reference sequence such as 1, chr1, or X. The set of valid references sequences depends on the readsets specified. If set to *, only unmapped Reads are returned.",
                     "type": "string"
                 },
                 "sequenceStart": {
-                    "description": "The start position (1-based, inclusive) of the target range. If specified, \"sequenceName\" must also be specified. Defaults to the start of the target reference sequence, if any.",
+                    "description": "The start position (1-based, inclusive) of the target range. If specified, sequenceName must also be specified. Defaults to the start of the target reference sequence, if any.",
                     "format": "uint64",
                     "type": "string"
                 }
@@ -2019,7 +2023,7 @@
                     "type": "string"
                 },
                 "pageToken": {
-                    "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of \"nextPageToken\" from the previous response.",
+                    "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
                     "type": "string"
                 }
             },
@@ -2043,43 +2047,82 @@
             },
             "type": "object"
         },
+        "SearchVariantSetsRequest": {
+            "description": "The search variant sets request.",
+            "id": "SearchVariantSetsRequest",
+            "properties": {
+                "datasetIds": {
+                    "description": "Exactly one dataset ID must be provided here. Only variant sets which belong to this dataset will be returned.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
+                },
+                "pageSize": {
+                    "description": "The maximum number of variant sets to return in a request.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "pageToken": {
+                    "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "SearchVariantSetsResponse": {
+            "description": "The search variant sets response.",
+            "id": "SearchVariantSetsResponse",
+            "properties": {
+                "nextPageToken": {
+                    "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results. This field will be empty if there aren't any additional results.",
+                    "type": "string"
+                },
+                "variantSets": {
+                    "description": "The variant sets belonging to the requested dataset.",
+                    "items": {
+                        "$ref": "VariantSet"
+                    },
+                    "type": "array"
+                }
+            },
+            "type": "object"
+        },
         "SearchVariantsRequest": {
             "description": "The variant search request.",
             "id": "SearchVariantsRequest",
             "properties": {
-                "callsetIds": {
-                    "description": "Only return variant calls which belong to callsets with these ids. Leaving this blank returns all variant calls. At most one of callsetNames or callsetIds should be provided.",
+                "callSetIds": {
+                    "description": "Only return variant calls which belong to call sets with these ids. Leaving this blank returns all variant calls.",
                     "items": {
                         "type": "string"
                     },
                     "type": "array"
                 },
-                "callsetNames": {
-                    "description": "Only return variant calls which belong to callsets which have exactly these names. Leaving this blank returns all variant calls. At most one of callsetNames or callsetIds should be provided.",
-                    "items": {
-                        "type": "string"
-                    },
-                    "type": "array"
-                },
-                "contig": {
-                    "description": "Required. Only return variants on this contig.",
-                    "type": "string"
-                },
-                "endPosition": {
+                "end": {
                     "description": "Required. The end of the window (0-based, exclusive) for which overlapping variants should be returned.",
                     "format": "int64",
                     "type": "string"
                 },
-                "maxResults": {
+                "maxCalls": {
+                    "description": "The maximum number of calls to return. However, at least one variant will always be returned, even if it has more calls than this limit.",
+                    "format": "int32",
+                    "type": "integer"
+                },
+                "pageSize": {
                     "description": "The maximum number of variants to return.",
-                    "format": "uint64",
-                    "type": "string"
+                    "format": "int32",
+                    "type": "integer"
                 },
                 "pageToken": {
-                    "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of \"nextPageToken\" from the previous response.",
+                    "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of nextPageToken from the previous response.",
                     "type": "string"
                 },
-                "startPosition": {
+                "referenceName": {
+                    "description": "Required. Only return variants in this reference sequence.",
+                    "type": "string"
+                },
+                "start": {
                     "description": "Required. The beginning of the window (0-based, inclusive) for which overlapping variants should be returned.",
                     "format": "int64",
                     "type": "string"
@@ -2088,9 +2131,12 @@
                     "description": "Only return variants which have exactly this name.",
                     "type": "string"
                 },
-                "variantsetId": {
-                    "description": "Required. The ID of the variantset to search.",
-                    "type": "string"
+                "variantSetIds": {
+                    "description": "Exactly one variant set ID must be provided. Only variants from this variant set will be returned.",
+                    "items": {
+                        "type": "string"
+                    },
+                    "type": "array"
                 }
             },
             "type": "object"
@@ -2114,7 +2160,7 @@
             "type": "object"
         },
         "Variant": {
-            "description": "A Variant represents a change in DNA sequence relative to some reference. For example, a Variant could represent a SNP or an insertion. Variants belong to a Variantset.",
+            "description": "A Variant represents a change in DNA sequence relative to some reference. For example, a Variant could represent a SNP or an insertion. Variants belong to a variant set.",
             "id": "Variant",
             "properties": {
                 "alternateBases": {
@@ -2131,17 +2177,13 @@
                     },
                     "type": "array"
                 },
-                "contig": {
-                    "description": "The contig on which this variant occurs. (such as 'chr20' or 'X')",
-                    "type": "string"
-                },
                 "created": {
                     "description": "The date this variant was created, in milliseconds from the epoch.",
                     "format": "int64",
                     "type": "string"
                 },
                 "end": {
-                    "description": "The end position (0-based) of this variant. This corresponds to the first base after the last base in the reference allele. So, the length of the reference allele is (end - position). This is useful for variants that don't explicitly give alternate bases, for example large deletions.",
+                    "description": "The end position (0-based) of this variant. This corresponds to the first base after the last base in the reference allele. So, the length of the reference allele is (end - start). This is useful for variants that don't explicitly give alternate bases, for example large deletions.",
                     "format": "int64",
                     "type": "string"
                 },
@@ -2167,18 +2209,51 @@
                     },
                     "type": "array"
                 },
-                "position": {
-                    "description": "The position at which this variant occurs (0-based). This corresponds to the first base of the string of reference bases.",
-                    "format": "int64",
-                    "type": "string"
-                },
                 "referenceBases": {
                     "description": "The reference bases for this variant. They start at the given position.",
                     "type": "string"
                 },
-                "variantsetId": {
-                    "description": "The ID of the variantset this variant belongs to.",
+                "referenceName": {
+                    "description": "The reference on which this variant occurs. (such as chr20 or X)",
                     "type": "string"
+                },
+                "start": {
+                    "description": "The position at which this variant occurs (0-based). This corresponds to the first base of the string of reference bases.",
+                    "format": "int64",
+                    "type": "string"
+                },
+                "variantSetId": {
+                    "description": "The ID of the variant set this variant belongs to.",
+                    "type": "string"
+                }
+            },
+            "type": "object"
+        },
+        "VariantSet": {
+            "description": "A VariantSet represents a collection of Variants and their summary statistics.",
+            "id": "VariantSet",
+            "properties": {
+                "datasetId": {
+                    "description": "The dataset to which this variant set belongs. Immutable.",
+                    "type": "string"
+                },
+                "id": {
+                    "description": "The Google-generated ID of the variant set. Immutable.",
+                    "type": "string"
+                },
+                "metadata": {
+                    "description": "The metadata associated with this variant set.",
+                    "items": {
+                        "$ref": "Metadata"
+                    },
+                    "type": "array"
+                },
+                "referenceBounds": {
+                    "description": "A list of all references used by the variants in a variant set with associated coordinate upper bounds for each one.",
+                    "items": {
+                        "$ref": "ReferenceBound"
+                    },
+                    "type": "array"
                 }
             },
             "type": "object"
diff --git a/discovery/googleapis_beta/manager__v1beta2.json b/discovery/googleapis_beta/manager__v1beta2.json
index d9ffb3a..02e6855 100644
--- a/discovery/googleapis_beta/manager__v1beta2.json
+++ b/discovery/googleapis_beta/manager__v1beta2.json
@@ -29,7 +29,7 @@
     "description": "The Deployment Manager API allows users to declaratively configure, deploy and run complex solutions on the Google Cloud Platform.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/deployment-manager/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/9W3DLv6LKY-GqB6jKJr0p6e9y7s\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/iGUA1MFJvjag5CPQwb2aT371UTs\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -365,7 +365,7 @@
             }
         }
     },
-    "revision": "20140818",
+    "revision": "20140915",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AccessConfig": {
@@ -916,6 +916,10 @@
                     "format": "int64",
                     "type": "string"
                 },
+                "diskType": {
+                    "description": "Name of the disk type resource describing which disk type to use to create the disk. For example 'pd-ssd' or 'pd-standard'. Default is 'pd-standard'",
+                    "type": "string"
+                },
                 "sourceImage": {
                     "description": "The fully-qualified URL of a source image to use to create this disk.",
                     "type": "string"
diff --git a/discovery/googleapis_beta/pubsub__v1beta1.json b/discovery/googleapis_beta/pubsub__v1beta1.json
index b80f25c..52d4cd7 100644
--- a/discovery/googleapis_beta/pubsub__v1beta1.json
+++ b/discovery/googleapis_beta/pubsub__v1beta1.json
@@ -17,7 +17,7 @@
     "description": "Provides reliable, many-to-many, asynchronous messaging between applications.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/pubsub/v1beta1",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/0Fp5e_WTNFkUTCc0NWbk-5s1uKQ\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/ywePitQXGabB9vHcCh_sNtCXjDU\"",
     "icons": {
         "x16": "https://www.google.com/images/icons/product/search-16.gif",
         "x32": "https://www.google.com/images/icons/product/search-32.gif"
@@ -338,7 +338,7 @@
             }
         }
     },
-    "revision": "20140814",
+    "revision": "20140919",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AcknowledgeRequest": {
@@ -416,7 +416,7 @@
             "id": "ModifyAckDeadlineRequest",
             "properties": {
                 "ackDeadlineSeconds": {
-                    "description": "The new Ack deadline. Must be >= 1.",
+                    "description": "The new Ack deadline. Must be >= 0.",
                     "format": "int32",
                     "type": "integer"
                 },
diff --git a/discovery/googleapis_beta/replicapool__v1beta1.json b/discovery/googleapis_beta/replicapool__v1beta1.json
index 3cf754f..3c36ad8 100644
--- a/discovery/googleapis_beta/replicapool__v1beta1.json
+++ b/discovery/googleapis_beta/replicapool__v1beta1.json
@@ -26,7 +26,7 @@
     "description": "The Replica Pool API allows users to declaratively provision and manage groups of Google Compute Engine instances based on a common template.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/compute/docs/replica-pool/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/7J4unpNjcNo2pcmmAY8uBF1BWss\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/23e47jzhtet3mpIUahkbF_tHUFw\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -540,7 +540,7 @@
             }
         }
     },
-    "revision": "20140827",
+    "revision": "20140912",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "AccessConfig": {
diff --git a/discovery/googleapis_beta/resourceviews__v1beta1.json b/discovery/googleapis_beta/resourceviews__v1beta1.json
index 21d3a31..908d244 100644
--- a/discovery/googleapis_beta/resourceviews__v1beta1.json
+++ b/discovery/googleapis_beta/resourceviews__v1beta1.json
@@ -26,7 +26,7 @@
     "description": "The Resource View API allows users to create and manage logical sets of Google Compute Engine instances.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/compute/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/AoeAr1zgY1CKn9zcrNzEbavwbEo\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/2oa8SMSfpFS6UKNS3wRm4F3v1wQ\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -681,7 +681,7 @@
             }
         }
     },
-    "revision": "20140827",
+    "revision": "20140904",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "Label": {
diff --git a/discovery/googleapis_beta/sqladmin__v1beta3.json b/discovery/googleapis_beta/sqladmin__v1beta3.json
index b1d66d9..8df4548 100644
--- a/discovery/googleapis_beta/sqladmin__v1beta3.json
+++ b/discovery/googleapis_beta/sqladmin__v1beta3.json
@@ -18,7 +18,7 @@
     "description": "API for Cloud SQL database instance management.",
     "discoveryVersion": "v1",
     "documentationLink": "https://developers.google.com/cloud-sql/docs/admin-api/",
-    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/iSvEUXm2HnuHWXog2Opj9zU6i3I\"",
+    "etag": "\"uUWyYHXmEn-ab7WLvo8qNz2S8ws/9fwQA8H2k5NmzsvEUWIyM_KlxbQ\"",
     "icons": {
         "x16": "http://www.google.com/images/icons/product/search-16.gif",
         "x32": "http://www.google.com/images/icons/product/search-32.gif"
@@ -888,7 +888,7 @@
             }
         }
     },
-    "revision": "20140813",
+    "revision": "20140827",
     "rootUrl": "https://www.googleapis.com/",
     "schemas": {
         "BackupConfiguration": {
diff --git a/generated/googleapis/CHANGELOG.md b/generated/googleapis/CHANGELOG.md
index 85f6c15..27f79f0 100644
--- a/generated/googleapis/CHANGELOG.md
+++ b/generated/googleapis/CHANGELOG.md
@@ -1,3 +1,15 @@
+## 0.2.0
+
+* [apis] admin:directory: additional schemas/methods
+* [apis] admin:reports_v1: schema changes
+* [apis] androidpublisher:v2: additional schemas/methods
+* [apis] drive:v2: schema changes
+* [apis] identitytoolkit:v3: schema changes
+* [apis] mirror:v1: schema changes
+* [apis-breaking] mapsengine:v1: major changes (additional schemas/methods)
+* [generator] Bugfix in resumable media uploader.
+* [generator] Bugfix json decoding optimization.
+
 ## 0.1.1
 
 * [apis] Added Discovery API
diff --git a/generated/googleapis/README.md b/generated/googleapis/README.md
index 73cf8cb..0cce6f6 100644
--- a/generated/googleapis/README.md
+++ b/generated/googleapis/README.md
@@ -77,7 +77,7 @@
 
 Official API documentation: https://developers.google.com/admin-sdk/directory/
 
-#### ![Logo](http://www.google.com/images/icons/product/search-16.gif) Email Migration API v2 - admin email_migration_v2
+#### ![Logo](https://www.google.com/images/icons/product/googlemail-16.png) Email Migration API v2 - admin email_migration_v2
 
 Email Migration API lets you migrate emails of users to Google backends.
 
diff --git a/generated/googleapis/lib/adexchangebuyer/v1_3.dart b/generated/googleapis/lib/adexchangebuyer/v1_3.dart
index 90d091c..12b5035 100644
--- a/generated/googleapis/lib/adexchangebuyer/v1_3.dart
+++ b/generated/googleapis/lib/adexchangebuyer/v1_3.dart
@@ -32,7 +32,7 @@
   PretargetingConfigResourceApi get pretargetingConfig => new PretargetingConfigResourceApi(_requester);
 
   AdexchangebuyerApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/adexchangebuyer/v1.3/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "adexchangebuyer/v1.3/");
 }
 
 
diff --git a/generated/googleapis/lib/adexchangeseller/v1_1.dart b/generated/googleapis/lib/adexchangeseller/v1_1.dart
index c01b32b..d7c971e 100644
--- a/generated/googleapis/lib/adexchangeseller/v1_1.dart
+++ b/generated/googleapis/lib/adexchangeseller/v1_1.dart
@@ -38,7 +38,7 @@
   UrlchannelsResourceApi get urlchannels => new UrlchannelsResourceApi(_requester);
 
   AdexchangesellerApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/adexchangeseller/v1.1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "adexchangeseller/v1.1/");
 }
 
 
diff --git a/generated/googleapis/lib/admin/directory_v1.dart b/generated/googleapis/lib/admin/directory_v1.dart
index 574c65a..f31570d 100644
--- a/generated/googleapis/lib/admin/directory_v1.dart
+++ b/generated/googleapis/lib/admin/directory_v1.dart
@@ -70,6 +70,12 @@
   /** Manage data access permissions for users on your domain */
   static const AdminDirectoryUserSecurityScope = "https://www.googleapis.com/auth/admin.directory.user.security";
 
+  /** View and manage the provisioning of user schemas on your domain */
+  static const AdminDirectoryUserschemaScope = "https://www.googleapis.com/auth/admin.directory.userschema";
+
+  /** View user schemas on your domain */
+  static const AdminDirectoryUserschemaReadonlyScope = "https://www.googleapis.com/auth/admin.directory.userschema.readonly";
+
 
   final common_internal.ApiRequester _requester;
 
@@ -81,12 +87,13 @@
   MobiledevicesResourceApi get mobiledevices => new MobiledevicesResourceApi(_requester);
   NotificationsResourceApi get notifications => new NotificationsResourceApi(_requester);
   OrgunitsResourceApi get orgunits => new OrgunitsResourceApi(_requester);
+  SchemasResourceApi get schemas => new SchemasResourceApi(_requester);
   TokensResourceApi get tokens => new TokensResourceApi(_requester);
   UsersResourceApi get users => new UsersResourceApi(_requester);
   VerificationCodesResourceApi get verificationCodes => new VerificationCodesResourceApi(_requester);
 
   AdminApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/admin/directory/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "admin/directory/v1/");
 }
 
 
@@ -2083,6 +2090,290 @@
 
 
 /** Not documented yet. */
+class SchemasResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  SchemasResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Delete schema
+   *
+   * Request parameters:
+   *
+   * [customerId] - Immutable id of the Google Apps account
+   *
+   * [schemaKey] - Name or immutable Id of the schema
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future delete(core.String customerId, core.String schemaKey) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (customerId == null) {
+      throw new core.ArgumentError("Parameter customerId is required.");
+    }
+    if (schemaKey == null) {
+      throw new core.ArgumentError("Parameter schemaKey is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = 'customer/' + common_internal.Escaper.ecapeVariable('$customerId') + '/schemas/' + common_internal.Escaper.ecapeVariable('$schemaKey');
+
+    var _response = _requester.request(_url,
+                                       "DELETE",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Retrieve schema
+   *
+   * Request parameters:
+   *
+   * [customerId] - Immutable id of the Google Apps account
+   *
+   * [schemaKey] - Name or immutable Id of the schema
+   *
+   * Completes with a [Schema].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Schema> get(core.String customerId, core.String schemaKey) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (customerId == null) {
+      throw new core.ArgumentError("Parameter customerId is required.");
+    }
+    if (schemaKey == null) {
+      throw new core.ArgumentError("Parameter schemaKey is required.");
+    }
+
+
+    _url = 'customer/' + common_internal.Escaper.ecapeVariable('$customerId') + '/schemas/' + common_internal.Escaper.ecapeVariable('$schemaKey');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Schema.fromJson(data));
+  }
+
+  /**
+   * Create schema.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [customerId] - Immutable id of the Google Apps account
+   *
+   * Completes with a [Schema].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Schema> insert(Schema request, core.String customerId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (customerId == null) {
+      throw new core.ArgumentError("Parameter customerId is required.");
+    }
+
+
+    _url = 'customer/' + common_internal.Escaper.ecapeVariable('$customerId') + '/schemas';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Schema.fromJson(data));
+  }
+
+  /**
+   * Retrieve all schemas for a customer
+   *
+   * Request parameters:
+   *
+   * [customerId] - Immutable id of the Google Apps account
+   *
+   * Completes with a [Schemas].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Schemas> list(core.String customerId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (customerId == null) {
+      throw new core.ArgumentError("Parameter customerId is required.");
+    }
+
+
+    _url = 'customer/' + common_internal.Escaper.ecapeVariable('$customerId') + '/schemas';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Schemas.fromJson(data));
+  }
+
+  /**
+   * Update schema. This method supports patch semantics.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [customerId] - Immutable id of the Google Apps account
+   *
+   * [schemaKey] - Name or immutable Id of the schema.
+   *
+   * Completes with a [Schema].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Schema> patch(Schema request, core.String customerId, core.String schemaKey) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (customerId == null) {
+      throw new core.ArgumentError("Parameter customerId is required.");
+    }
+    if (schemaKey == null) {
+      throw new core.ArgumentError("Parameter schemaKey is required.");
+    }
+
+
+    _url = 'customer/' + common_internal.Escaper.ecapeVariable('$customerId') + '/schemas/' + common_internal.Escaper.ecapeVariable('$schemaKey');
+
+    var _response = _requester.request(_url,
+                                       "PATCH",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Schema.fromJson(data));
+  }
+
+  /**
+   * Update schema
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [customerId] - Immutable id of the Google Apps account
+   *
+   * [schemaKey] - Name or immutable Id of the schema.
+   *
+   * Completes with a [Schema].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<Schema> update(Schema request, core.String customerId, core.String schemaKey) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (customerId == null) {
+      throw new core.ArgumentError("Parameter customerId is required.");
+    }
+    if (schemaKey == null) {
+      throw new core.ArgumentError("Parameter schemaKey is required.");
+    }
+
+
+    _url = 'customer/' + common_internal.Escaper.ecapeVariable('$customerId') + '/schemas/' + common_internal.Escaper.ecapeVariable('$schemaKey');
+
+    var _response = _requester.request(_url,
+                                       "PUT",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new Schema.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
 class TokensResourceApi {
   final common_internal.ApiRequester _requester;
 
@@ -2281,6 +2572,22 @@
    *
    * [userKey] - Email or immutable Id of the user
    *
+   * [customFieldMask] - Comma-separated list of schema names. All fields from
+   * these schemas are fetched. This should only be set when projection=custom.
+   *
+   * [projection] - What subset of fields to fetch for this user.
+   * Possible string values are:
+   * - "basic" : Do not include any custom fields for the user.
+   * - "custom" : Include custom fields from schemas mentioned in
+   * customFieldMask.
+   * - "full" : Include all fields associated with this user.
+   *
+   * [viewType] - Whether to fetch the ADMIN_VIEW or DOMAIN_PUBLIC view of the
+   * user.
+   * Possible string values are:
+   * - "admin_view" : Fetches the ADMIN_VIEW of the user.
+   * - "domain_public" : Fetches the DOMAIN_PUBLIC view of the user.
+   *
    * Completes with a [User].
    *
    * Completes with a [common.ApiRequestError] if the API endpoint returned an
@@ -2289,7 +2596,7 @@
    * If the used [http.Client] completes with an error when making a REST call,
    * this method  will complete with the same error.
    */
-  async.Future<User> get(core.String userKey) {
+  async.Future<User> get(core.String userKey, {core.String customFieldMask, core.String projection, core.String viewType}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -2300,6 +2607,15 @@
     if (userKey == null) {
       throw new core.ArgumentError("Parameter userKey is required.");
     }
+    if (customFieldMask != null) {
+      _queryParams["customFieldMask"] = [customFieldMask];
+    }
+    if (projection != null) {
+      _queryParams["projection"] = [projection];
+    }
+    if (viewType != null) {
+      _queryParams["viewType"] = [viewType];
+    }
 
 
     _url = 'users/' + common_internal.Escaper.ecapeVariable('$userKey');
@@ -2359,6 +2675,9 @@
    *
    * Request parameters:
    *
+   * [customFieldMask] - Comma-separated list of schema names. All fields from
+   * these schemas are fetched. This should only be set when projection=custom.
+   *
    * [customer] - Immutable id of the Google Apps account. In case of
    * multi-domain, to fetch all users for a customer, fill this field instead of
    * domain.
@@ -2386,10 +2705,16 @@
    *
    * [pageToken] - Token to specify next page in the list
    *
-   * [query] - Query string search. Should be of the form "" where field can be
-   * any of supported fields, operators can be one of '=' for exact match or ':'
-   * for prefix match. For prefix match, the value should always be followed by
-   * a *.
+   * [projection] - What subset of fields to fetch for this user.
+   * Possible string values are:
+   * - "basic" : Do not include any custom fields for the user.
+   * - "custom" : Include custom fields from schemas mentioned in
+   * customFieldMask.
+   * - "full" : Include all fields associated with this user.
+   *
+   * [query] - Query string search. Should be of the form "". Complete
+   * documentation is at
+   * https://developers.google.com/admin-sdk/directory/v1/guides/search-users
    *
    * [showDeleted] - If set to true retrieves the list of deleted users. Default
    * is false
@@ -2399,6 +2724,12 @@
    * - "ASCENDING" : Ascending order.
    * - "DESCENDING" : Descending order.
    *
+   * [viewType] - Whether to fetch the ADMIN_VIEW or DOMAIN_PUBLIC view of the
+   * user.
+   * Possible string values are:
+   * - "admin_view" : Fetches the ADMIN_VIEW of the user.
+   * - "domain_public" : Fetches the DOMAIN_PUBLIC view of the user.
+   *
    * Completes with a [Users].
    *
    * Completes with a [common.ApiRequestError] if the API endpoint returned an
@@ -2407,7 +2738,7 @@
    * If the used [http.Client] completes with an error when making a REST call,
    * this method  will complete with the same error.
    */
-  async.Future<Users> list({core.String customer, core.String domain, core.String event, core.int maxResults, core.String orderBy, core.String pageToken, core.String query, core.String showDeleted, core.String sortOrder}) {
+  async.Future<Users> list({core.String customFieldMask, core.String customer, core.String domain, core.String event, core.int maxResults, core.String orderBy, core.String pageToken, core.String projection, core.String query, core.String showDeleted, core.String sortOrder, core.String viewType}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -2415,6 +2746,9 @@
     var _downloadOptions = common.DownloadOptions.Metadata;
     var _body = null;
 
+    if (customFieldMask != null) {
+      _queryParams["customFieldMask"] = [customFieldMask];
+    }
     if (customer != null) {
       _queryParams["customer"] = [customer];
     }
@@ -2433,6 +2767,9 @@
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
+    if (projection != null) {
+      _queryParams["projection"] = [projection];
+    }
     if (query != null) {
       _queryParams["query"] = [query];
     }
@@ -2442,6 +2779,9 @@
     if (sortOrder != null) {
       _queryParams["sortOrder"] = [sortOrder];
     }
+    if (viewType != null) {
+      _queryParams["viewType"] = [viewType];
+    }
 
 
     _url = 'users';
@@ -2643,6 +2983,9 @@
    *
    * Request parameters:
    *
+   * [customFieldMask] - Comma-separated list of schema names. All fields from
+   * these schemas are fetched. This should only be set when projection=custom.
+   *
    * [customer] - Immutable id of the Google Apps account. In case of
    * multi-domain, to fetch all users for a customer, fill this field instead of
    * domain.
@@ -2670,10 +3013,16 @@
    *
    * [pageToken] - Token to specify next page in the list
    *
-   * [query] - Query string search. Should be of the form "" where field can be
-   * any of supported fields, operators can be one of '=' for exact match or ':'
-   * for prefix match. For prefix match, the value should always be followed by
-   * a *.
+   * [projection] - What subset of fields to fetch for this user.
+   * Possible string values are:
+   * - "basic" : Do not include any custom fields for the user.
+   * - "custom" : Include custom fields from schemas mentioned in
+   * customFieldMask.
+   * - "full" : Include all fields associated with this user.
+   *
+   * [query] - Query string search. Should be of the form "". Complete
+   * documentation is at
+   * https://developers.google.com/admin-sdk/directory/v1/guides/search-users
    *
    * [showDeleted] - If set to true retrieves the list of deleted users. Default
    * is false
@@ -2683,6 +3032,12 @@
    * - "ASCENDING" : Ascending order.
    * - "DESCENDING" : Descending order.
    *
+   * [viewType] - Whether to fetch the ADMIN_VIEW or DOMAIN_PUBLIC view of the
+   * user.
+   * Possible string values are:
+   * - "admin_view" : Fetches the ADMIN_VIEW of the user.
+   * - "domain_public" : Fetches the DOMAIN_PUBLIC view of the user.
+   *
    * Completes with a [Channel].
    *
    * Completes with a [common.ApiRequestError] if the API endpoint returned an
@@ -2691,7 +3046,7 @@
    * If the used [http.Client] completes with an error when making a REST call,
    * this method  will complete with the same error.
    */
-  async.Future<Channel> watch(Channel request, {core.String customer, core.String domain, core.String event, core.int maxResults, core.String orderBy, core.String pageToken, core.String query, core.String showDeleted, core.String sortOrder}) {
+  async.Future<Channel> watch(Channel request, {core.String customFieldMask, core.String customer, core.String domain, core.String event, core.int maxResults, core.String orderBy, core.String pageToken, core.String projection, core.String query, core.String showDeleted, core.String sortOrder, core.String viewType}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -2702,6 +3057,9 @@
     if (request != null) {
       _body = convert.JSON.encode((request).toJson());
     }
+    if (customFieldMask != null) {
+      _queryParams["customFieldMask"] = [customFieldMask];
+    }
     if (customer != null) {
       _queryParams["customer"] = [customer];
     }
@@ -2720,6 +3078,9 @@
     if (pageToken != null) {
       _queryParams["pageToken"] = [pageToken];
     }
+    if (projection != null) {
+      _queryParams["projection"] = [projection];
+    }
     if (query != null) {
       _queryParams["query"] = [query];
     }
@@ -2729,6 +3090,9 @@
     if (sortOrder != null) {
       _queryParams["sortOrder"] = [sortOrder];
     }
+    if (viewType != null) {
+      _queryParams["viewType"] = [viewType];
+    }
 
 
     _url = 'users/watch';
@@ -4862,6 +5226,256 @@
 }
 
 
+/** JSON template for Schema resource in Directory API. */
+class Schema {
+  /** ETag of the resource. */
+  core.String etag;
+
+  /** Fields of Schema */
+  core.List<SchemaFieldSpec> fields;
+
+  /** Kind of resource this is. */
+  core.String kind;
+
+  /** Unique identifier of Schema (Read-only) */
+  core.String schemaId;
+
+  /** Schema name */
+  core.String schemaName;
+
+
+  Schema();
+
+  Schema.fromJson(core.Map _json) {
+    if (_json.containsKey("etag")) {
+      etag = _json["etag"];
+    }
+    if (_json.containsKey("fields")) {
+      fields = _json["fields"].map((value) => new SchemaFieldSpec.fromJson(value)).toList();
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("schemaId")) {
+      schemaId = _json["schemaId"];
+    }
+    if (_json.containsKey("schemaName")) {
+      schemaName = _json["schemaName"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (etag != null) {
+      _json["etag"] = etag;
+    }
+    if (fields != null) {
+      _json["fields"] = fields.map((value) => (value).toJson()).toList();
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (schemaId != null) {
+      _json["schemaId"] = schemaId;
+    }
+    if (schemaName != null) {
+      _json["schemaName"] = schemaName;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * Indexing spec for a numeric field. By default, only exact match queries will
+ * be supported for numeric fields. Setting the numericIndexingSpec allows range
+ * queries to be supported.
+ */
+class SchemaFieldSpecNumericIndexingSpec {
+  /**
+   * Maximum value of this field. This is meant to be indicative rather than
+   * enforced. Values outside this range will still be indexed, but search may
+   * not be as performant.
+   */
+  core.double maxValue;
+
+  /**
+   * Minimum value of this field. This is meant to be indicative rather than
+   * enforced. Values outside this range will still be indexed, but search may
+   * not be as performant.
+   */
+  core.double minValue;
+
+
+  SchemaFieldSpecNumericIndexingSpec();
+
+  SchemaFieldSpecNumericIndexingSpec.fromJson(core.Map _json) {
+    if (_json.containsKey("maxValue")) {
+      maxValue = _json["maxValue"];
+    }
+    if (_json.containsKey("minValue")) {
+      minValue = _json["minValue"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (maxValue != null) {
+      _json["maxValue"] = maxValue;
+    }
+    if (minValue != null) {
+      _json["minValue"] = minValue;
+    }
+    return _json;
+  }
+}
+
+
+/** JSON template for FieldSpec resource for Schemas in Directory API. */
+class SchemaFieldSpec {
+  /** ETag of the resource. */
+  core.String etag;
+
+  /** Unique identifier of Field (Read-only) */
+  core.String fieldId;
+
+  /** Name of the field. */
+  core.String fieldName;
+
+  /** Type of the field. */
+  core.String fieldType;
+
+  /** Boolean specifying whether the field is indexed or not. */
+  core.bool indexed;
+
+  /** Kind of resource this is. */
+  core.String kind;
+
+  /** Boolean specifying whether this is a multi-valued field or not. */
+  core.bool multiValued;
+
+  /**
+   * Indexing spec for a numeric field. By default, only exact match queries
+   * will be supported for numeric fields. Setting the numericIndexingSpec
+   * allows range queries to be supported.
+   */
+  SchemaFieldSpecNumericIndexingSpec numericIndexingSpec;
+
+  /**
+   * Read ACLs on the field specifying who can view values of this field. Valid
+   * values are "ALL_DOMAIN_USERS" and "ADMINS_AND_SELF".
+   */
+  core.String readAccessType;
+
+
+  SchemaFieldSpec();
+
+  SchemaFieldSpec.fromJson(core.Map _json) {
+    if (_json.containsKey("etag")) {
+      etag = _json["etag"];
+    }
+    if (_json.containsKey("fieldId")) {
+      fieldId = _json["fieldId"];
+    }
+    if (_json.containsKey("fieldName")) {
+      fieldName = _json["fieldName"];
+    }
+    if (_json.containsKey("fieldType")) {
+      fieldType = _json["fieldType"];
+    }
+    if (_json.containsKey("indexed")) {
+      indexed = _json["indexed"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("multiValued")) {
+      multiValued = _json["multiValued"];
+    }
+    if (_json.containsKey("numericIndexingSpec")) {
+      numericIndexingSpec = new SchemaFieldSpecNumericIndexingSpec.fromJson(_json["numericIndexingSpec"]);
+    }
+    if (_json.containsKey("readAccessType")) {
+      readAccessType = _json["readAccessType"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (etag != null) {
+      _json["etag"] = etag;
+    }
+    if (fieldId != null) {
+      _json["fieldId"] = fieldId;
+    }
+    if (fieldName != null) {
+      _json["fieldName"] = fieldName;
+    }
+    if (fieldType != null) {
+      _json["fieldType"] = fieldType;
+    }
+    if (indexed != null) {
+      _json["indexed"] = indexed;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (multiValued != null) {
+      _json["multiValued"] = multiValued;
+    }
+    if (numericIndexingSpec != null) {
+      _json["numericIndexingSpec"] = (numericIndexingSpec).toJson();
+    }
+    if (readAccessType != null) {
+      _json["readAccessType"] = readAccessType;
+    }
+    return _json;
+  }
+}
+
+
+/** JSON response template for List Schema operation in Directory API. */
+class Schemas {
+  /** ETag of the resource. */
+  core.String etag;
+
+  /** Kind of resource this is. */
+  core.String kind;
+
+  /** List of UserSchema objects. */
+  core.List<Schema> schemas;
+
+
+  Schemas();
+
+  Schemas.fromJson(core.Map _json) {
+    if (_json.containsKey("etag")) {
+      etag = _json["etag"];
+    }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
+    if (_json.containsKey("schemas")) {
+      schemas = _json["schemas"].map((value) => new Schema.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (etag != null) {
+      _json["etag"] = etag;
+    }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
+    if (schemas != null) {
+      _json["schemas"] = schemas.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
 /** JSON template for token resource in Directory API. */
 class Token {
   /**
@@ -4999,7 +5613,7 @@
 }
 
 
-/** JSON template for User object in Apps Directory API. */
+/** JSON template for User object in Directory API. */
 class User {
   /**
    * Not documented yet.
@@ -5021,6 +5635,9 @@
   /** User's Google account creation time. (Read-only) */
   core.DateTime creationTime;
 
+  /** Custom fields of the user. */
+  core.Map<core.String, UserCustomProperties> customSchemas;
+
   /** CustomerId of User (Read-only) */
   core.String customerId;
 
@@ -5148,6 +5765,9 @@
     if (_json.containsKey("creationTime")) {
       creationTime = core.DateTime.parse(_json["creationTime"]);
     }
+    if (_json.containsKey("customSchemas")) {
+      customSchemas = common_internal.mapMap(_json["customSchemas"], (item) => new UserCustomProperties.fromJson(item));
+    }
     if (_json.containsKey("customerId")) {
       customerId = _json["customerId"];
     }
@@ -5245,6 +5865,9 @@
     if (creationTime != null) {
       _json["creationTime"] = (creationTime).toIso8601String();
     }
+    if (customSchemas != null) {
+      _json["customSchemas"] = customSchemas;
+    }
     if (customerId != null) {
       _json["customerId"] = customerId;
     }
@@ -5472,6 +6095,47 @@
 }
 
 
+/**
+ * JSON template for a set of custom properties (i.e. all fields in a particular
+ * schema)
+ */
+class UserCustomProperties
+    extends collection.MapBase<core.String, core.Object> {
+  final core.Map _innerMap = {};
+
+  UserCustomProperties();
+
+  UserCustomProperties.fromJson(core.Map _json) {
+    _json.forEach((core.String key, value) {
+      this[key] = value;
+    });
+  }
+
+  core.Map toJson() {
+    var _json = {};
+    this.forEach((core.String key, value) {
+      _json[key] = value;
+    });
+    return _json;
+  }
+
+  core.Object operator [](core.Object key)
+      => _innerMap[key];
+
+  operator []=(core.String key, core.Object value) {
+    _innerMap[key] = value;
+  }
+
+  void clear() {
+    _innerMap.clear();
+  }
+
+  core.Iterable<core.String> get keys => _innerMap.keys;
+
+  core.Object remove(core.Object key) => _innerMap.remove(key);
+}
+
+
 /** JSON template for an email. */
 class UserEmail {
   /** Email id of the user. */
diff --git a/generated/googleapis/lib/admin/email_migration_v2.dart b/generated/googleapis/lib/admin/email_migration_v2.dart
index 86a7ee3..1511bc4 100644
--- a/generated/googleapis/lib/admin/email_migration_v2.dart
+++ b/generated/googleapis/lib/admin/email_migration_v2.dart
@@ -24,7 +24,7 @@
   MailResourceApi get mail => new MailResourceApi(_requester);
 
   AdminApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/email/v2/users/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "email/v2/users/");
 }
 
 
diff --git a/generated/googleapis/lib/admin/reports_v1.dart b/generated/googleapis/lib/admin/reports_v1.dart
index c3435d0..8814ae1 100644
--- a/generated/googleapis/lib/admin/reports_v1.dart
+++ b/generated/googleapis/lib/admin/reports_v1.dart
@@ -33,7 +33,7 @@
   UserUsageReportResourceApi get userUsageReport => new UserUsageReportResourceApi(_requester);
 
   AdminApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/admin/reports/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "admin/reports/v1/");
 }
 
 
@@ -573,6 +573,12 @@
   /** Integral value of the parameter. */
   core.String intValue;
 
+  /** Multi-int value of the parameter. */
+  core.List<core.String> multiIntValue;
+
+  /** Multi-string value of the parameter. */
+  core.List<core.String> multiValue;
+
   /** The name of the parameter. */
   core.String name;
 
@@ -589,6 +595,12 @@
     if (_json.containsKey("intValue")) {
       intValue = _json["intValue"];
     }
+    if (_json.containsKey("multiIntValue")) {
+      multiIntValue = _json["multiIntValue"];
+    }
+    if (_json.containsKey("multiValue")) {
+      multiValue = _json["multiValue"];
+    }
     if (_json.containsKey("name")) {
       name = _json["name"];
     }
@@ -605,6 +617,12 @@
     if (intValue != null) {
       _json["intValue"] = intValue;
     }
+    if (multiIntValue != null) {
+      _json["multiIntValue"] = multiIntValue;
+    }
+    if (multiValue != null) {
+      _json["multiValue"] = multiValue;
+    }
     if (name != null) {
       _json["name"] = name;
     }
diff --git a/generated/googleapis/lib/adsense/v1_4.dart b/generated/googleapis/lib/adsense/v1_4.dart
index 4d7369c..c3ebebd 100644
--- a/generated/googleapis/lib/adsense/v1_4.dart
+++ b/generated/googleapis/lib/adsense/v1_4.dart
@@ -39,7 +39,7 @@
   UrlchannelsResourceApi get urlchannels => new UrlchannelsResourceApi(_requester);
 
   AdsenseApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/adsense/v1.4/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "adsense/v1.4/");
 }
 
 
diff --git a/generated/googleapis/lib/adsensehost/v4_1.dart b/generated/googleapis/lib/adsensehost/v4_1.dart
index be8a79b..17636d5 100644
--- a/generated/googleapis/lib/adsensehost/v4_1.dart
+++ b/generated/googleapis/lib/adsensehost/v4_1.dart
@@ -32,7 +32,7 @@
   UrlchannelsResourceApi get urlchannels => new UrlchannelsResourceApi(_requester);
 
   AdsensehostApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/adsensehost/v4.1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "adsensehost/v4.1/");
 }
 
 
diff --git a/generated/googleapis/lib/analytics/v3.dart b/generated/googleapis/lib/analytics/v3.dart
index efc3d33..7fcd246 100644
--- a/generated/googleapis/lib/analytics/v3.dart
+++ b/generated/googleapis/lib/analytics/v3.dart
@@ -42,7 +42,7 @@
   ProvisioningResourceApi get provisioning => new ProvisioningResourceApi(_requester);
 
   AnalyticsApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/analytics/v3/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "analytics/v3/");
 }
 
 
diff --git a/generated/googleapis/lib/androidpublisher/v2.dart b/generated/googleapis/lib/androidpublisher/v2.dart
index 68193f1..9ec7205 100644
--- a/generated/googleapis/lib/androidpublisher/v2.dart
+++ b/generated/googleapis/lib/androidpublisher/v2.dart
@@ -26,7 +26,7 @@
   PurchasesResourceApi get purchases => new PurchasesResourceApi(_requester);
 
   AndroidpublisherApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/androidpublisher/v2/applications/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "androidpublisher/v2/applications/");
 }
 
 
@@ -2738,6 +2738,65 @@
   }
 
   /**
+   * Defers a user's subscription purchase until a specified future expiration
+   * time.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [packageName] - The package name of the application for which this
+   * subscription was purchased (for example, 'com.some.thing').
+   *
+   * [subscriptionId] - The purchased subscription ID (for example,
+   * 'monthly001').
+   *
+   * [token] - The token provided to the user's device when the subscription was
+   * purchased.
+   *
+   * Completes with a [SubscriptionPurchasesDeferResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<SubscriptionPurchasesDeferResponse> defer(SubscriptionPurchasesDeferRequest request, core.String packageName, core.String subscriptionId, core.String token) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (packageName == null) {
+      throw new core.ArgumentError("Parameter packageName is required.");
+    }
+    if (subscriptionId == null) {
+      throw new core.ArgumentError("Parameter subscriptionId is required.");
+    }
+    if (token == null) {
+      throw new core.ArgumentError("Parameter token is required.");
+    }
+
+
+    _url = common_internal.Escaper.ecapeVariable('$packageName') + '/purchases/subscriptions/' + common_internal.Escaper.ecapeVariable('$subscriptionId') + '/tokens/' + common_internal.Escaper.ecapeVariable('$token') + ':defer';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new SubscriptionPurchasesDeferResponse.fromJson(data));
+  }
+
+  /**
    * Checks whether a user's subscription purchase is valid and returns its
    * expiry time.
    *
@@ -2791,6 +2850,112 @@
     return _response.then((data) => new SubscriptionPurchase.fromJson(data));
   }
 
+  /**
+   * Refunds a user's subscription purchase, but the subscription remains valid
+   * until its expiration time and it will continue to recur.
+   *
+   * Request parameters:
+   *
+   * [packageName] - The package name of the application for which this
+   * subscription was purchased (for example, 'com.some.thing').
+   *
+   * [subscriptionId] - The purchased subscription ID (for example,
+   * 'monthly001').
+   *
+   * [token] - The token provided to the user's device when the subscription was
+   * purchased.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future refund(core.String packageName, core.String subscriptionId, core.String token) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (packageName == null) {
+      throw new core.ArgumentError("Parameter packageName is required.");
+    }
+    if (subscriptionId == null) {
+      throw new core.ArgumentError("Parameter subscriptionId is required.");
+    }
+    if (token == null) {
+      throw new core.ArgumentError("Parameter token is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = common_internal.Escaper.ecapeVariable('$packageName') + '/purchases/subscriptions/' + common_internal.Escaper.ecapeVariable('$subscriptionId') + '/tokens/' + common_internal.Escaper.ecapeVariable('$token') + ':refund';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Refunds and immediately revokes a user's subscription purchase. Access to
+   * the subscription will be terminated immediately and it will stop recurring.
+   *
+   * Request parameters:
+   *
+   * [packageName] - The package name of the application for which this
+   * subscription was purchased (for example, 'com.some.thing').
+   *
+   * [subscriptionId] - The purchased subscription ID (for example,
+   * 'monthly001').
+   *
+   * [token] - The token provided to the user's device when the subscription was
+   * purchased.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future revoke(core.String packageName, core.String subscriptionId, core.String token) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (packageName == null) {
+      throw new core.ArgumentError("Parameter packageName is required.");
+    }
+    if (subscriptionId == null) {
+      throw new core.ArgumentError("Parameter subscriptionId is required.");
+    }
+    if (token == null) {
+      throw new core.ArgumentError("Parameter token is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = common_internal.Escaper.ecapeVariable('$packageName') + '/purchases/subscriptions/' + common_internal.Escaper.ecapeVariable('$subscriptionId') + '/tokens/' + common_internal.Escaper.ecapeVariable('$token') + ':revoke';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
 }
 
 
@@ -3257,6 +3422,12 @@
   /** Purchase type enum value. Unmodifiable after creation. */
   core.String purchaseType;
 
+  /**
+   * Definition of a season for a seasonal subscription. Can be defined only for
+   * yearly subscriptions.
+   */
+  Season season;
+
   /** The stock-keeping-unit (SKU) of the product, unique within an app. */
   core.String sku;
 
@@ -3299,6 +3470,9 @@
     if (_json.containsKey("purchaseType")) {
       purchaseType = _json["purchaseType"];
     }
+    if (_json.containsKey("season")) {
+      season = new Season.fromJson(_json["season"]);
+    }
     if (_json.containsKey("sku")) {
       sku = _json["sku"];
     }
@@ -3333,6 +3507,9 @@
     if (purchaseType != null) {
       _json["purchaseType"] = purchaseType;
     }
+    if (season != null) {
+      _json["season"] = (season).toJson();
+    }
     if (sku != null) {
       _json["sku"] = sku;
     }
@@ -3788,6 +3965,42 @@
 
 
 /** Not documented yet. */
+class MonthDay {
+  /**
+   * Day of a month, value in [1, 31] range. Valid range depends on the
+   * specified month.
+   */
+  core.int day;
+
+  /** Month of a year. e.g. 1 = JAN, 2 = FEB etc. */
+  core.int month;
+
+
+  MonthDay();
+
+  MonthDay.fromJson(core.Map _json) {
+    if (_json.containsKey("day")) {
+      day = _json["day"];
+    }
+    if (_json.containsKey("month")) {
+      month = _json["month"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (day != null) {
+      _json["day"] = day;
+    }
+    if (month != null) {
+      _json["month"] = month;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
 class PageInfo {
   /** Not documented yet. */
   core.int resultPerPage;
@@ -3944,6 +4157,83 @@
 }
 
 
+/** Not documented yet. */
+class Season {
+  /** Inclusive end date of the recurrence period. */
+  MonthDay end;
+
+  /** Inclusive start date of the recurrence period. */
+  MonthDay start;
+
+
+  Season();
+
+  Season.fromJson(core.Map _json) {
+    if (_json.containsKey("end")) {
+      end = new MonthDay.fromJson(_json["end"]);
+    }
+    if (_json.containsKey("start")) {
+      start = new MonthDay.fromJson(_json["start"]);
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (end != null) {
+      _json["end"] = (end).toJson();
+    }
+    if (start != null) {
+      _json["start"] = (start).toJson();
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * A SubscriptionDeferralInfo contains the data needed to defer a subscription
+ * purchase to a future expiry time.
+ */
+class SubscriptionDeferralInfo {
+  /**
+   * The desired next expiry time for the subscription in milliseconds since
+   * Epoch. The given time must be after the current expiry time for the
+   * subscription.
+   */
+  core.String desiredExpiryTimeMillis;
+
+  /**
+   * The expected expiry time for the subscription. If the current expiry time
+   * for the subscription is not the value specified here, the deferral will not
+   * occur.
+   */
+  core.String expectedExpiryTimeMillis;
+
+
+  SubscriptionDeferralInfo();
+
+  SubscriptionDeferralInfo.fromJson(core.Map _json) {
+    if (_json.containsKey("desiredExpiryTimeMillis")) {
+      desiredExpiryTimeMillis = _json["desiredExpiryTimeMillis"];
+    }
+    if (_json.containsKey("expectedExpiryTimeMillis")) {
+      expectedExpiryTimeMillis = _json["expectedExpiryTimeMillis"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (desiredExpiryTimeMillis != null) {
+      _json["desiredExpiryTimeMillis"] = desiredExpiryTimeMillis;
+    }
+    if (expectedExpiryTimeMillis != null) {
+      _json["expectedExpiryTimeMillis"] = expectedExpiryTimeMillis;
+    }
+    return _json;
+  }
+}
+
+
 /**
  * A SubscriptionPurchase resource indicates the status of a user's subscription
  * purchase.
@@ -4009,6 +4299,58 @@
 
 
 /** Not documented yet. */
+class SubscriptionPurchasesDeferRequest {
+  /**
+   * The information about the new desired expiry time for the subscription.
+   */
+  SubscriptionDeferralInfo deferralInfo;
+
+
+  SubscriptionPurchasesDeferRequest();
+
+  SubscriptionPurchasesDeferRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("deferralInfo")) {
+      deferralInfo = new SubscriptionDeferralInfo.fromJson(_json["deferralInfo"]);
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (deferralInfo != null) {
+      _json["deferralInfo"] = (deferralInfo).toJson();
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class SubscriptionPurchasesDeferResponse {
+  /**
+   * The new expiry time for the subscription in milliseconds since the Epoch.
+   */
+  core.String newExpiryTimeMillis;
+
+
+  SubscriptionPurchasesDeferResponse();
+
+  SubscriptionPurchasesDeferResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("newExpiryTimeMillis")) {
+      newExpiryTimeMillis = _json["newExpiryTimeMillis"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (newExpiryTimeMillis != null) {
+      _json["newExpiryTimeMillis"] = newExpiryTimeMillis;
+    }
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
 class Testers {
   /** Not documented yet. */
   core.List<core.String> googleGroups;
diff --git a/generated/googleapis/lib/appsactivity/v1.dart b/generated/googleapis/lib/appsactivity/v1.dart
index b8f990d..adecb6c 100644
--- a/generated/googleapis/lib/appsactivity/v1.dart
+++ b/generated/googleapis/lib/appsactivity/v1.dart
@@ -33,7 +33,7 @@
   ActivitiesResourceApi get activities => new ActivitiesResourceApi(_requester);
 
   AppsactivityApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/appsactivity/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "appsactivity/v1/");
 }
 
 
diff --git a/generated/googleapis/lib/appstate/v1.dart b/generated/googleapis/lib/appstate/v1.dart
index d90602a..f2b3278 100644
--- a/generated/googleapis/lib/appstate/v1.dart
+++ b/generated/googleapis/lib/appstate/v1.dart
@@ -24,7 +24,7 @@
   StatesResourceApi get states => new StatesResourceApi(_requester);
 
   AppstateApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/appstate/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "appstate/v1/");
 }
 
 
diff --git a/generated/googleapis/lib/bigquery/v2.dart b/generated/googleapis/lib/bigquery/v2.dart
index 74229c9..ad21da3 100644
--- a/generated/googleapis/lib/bigquery/v2.dart
+++ b/generated/googleapis/lib/bigquery/v2.dart
@@ -43,7 +43,7 @@
   TablesResourceApi get tables => new TablesResourceApi(_requester);
 
   BigqueryApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/bigquery/v2/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "bigquery/v2/");
 }
 
 
diff --git a/generated/googleapis/lib/blogger/v3.dart b/generated/googleapis/lib/blogger/v3.dart
index 9a2973c..d6dd27a 100644
--- a/generated/googleapis/lib/blogger/v3.dart
+++ b/generated/googleapis/lib/blogger/v3.dart
@@ -34,7 +34,7 @@
   UsersResourceApi get users => new UsersResourceApi(_requester);
 
   BloggerApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/blogger/v3/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "blogger/v3/");
 }
 
 
diff --git a/generated/googleapis/lib/books/v1.dart b/generated/googleapis/lib/books/v1.dart
index 1c913d3..619295d 100644
--- a/generated/googleapis/lib/books/v1.dart
+++ b/generated/googleapis/lib/books/v1.dart
@@ -30,7 +30,7 @@
   VolumesResourceApi get volumes => new VolumesResourceApi(_requester);
 
   BooksApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/books/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "books/v1/");
 }
 
 
diff --git a/generated/googleapis/lib/calendar/v3.dart b/generated/googleapis/lib/calendar/v3.dart
index a3c38b0..d0f0245 100644
--- a/generated/googleapis/lib/calendar/v3.dart
+++ b/generated/googleapis/lib/calendar/v3.dart
@@ -34,7 +34,7 @@
   SettingsResourceApi get settings => new SettingsResourceApi(_requester);
 
   CalendarApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/calendar/v3/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "calendar/v3/");
 }
 
 
diff --git a/generated/googleapis/lib/civicinfo/us_v1.dart b/generated/googleapis/lib/civicinfo/us_v1.dart
index 78584e0..81a93d3 100644
--- a/generated/googleapis/lib/civicinfo/us_v1.dart
+++ b/generated/googleapis/lib/civicinfo/us_v1.dart
@@ -23,7 +23,7 @@
   RepresentativesResourceApi get representatives => new RepresentativesResourceApi(_requester);
 
   CivicinfoApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/civicinfo/us_v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "civicinfo/us_v1/");
 }
 
 
@@ -1084,9 +1084,18 @@
 /** Describes a political geography. */
 class GeographicDivision {
   /**
-   * Any other valid OCD IDs that refer to the same division. For example, if
-   * this division's OCD ID is ocd-division/country:us/district:dc, this will
-   * contain ocd-division/country:us/state:dc.
+   * Any other valid OCD IDs that refer to the same division.
+   *
+   * Because OCD IDs are meant to be human-readable and at least somewhat
+   * predictable, there are occasionally several identifiers for a single
+   * division. These identifiers are defined to be equivalent to one another,
+   * and one is always indicated as the primary identifier. The primary
+   * identifier will be returned in ocd_id above, and any other equivalent valid
+   * identifiers will be returned in this list.
+   *
+   * For example, if this division's OCD ID is
+   * ocd-division/country:us/district:dc, this will contain
+   * ocd-division/country:us/state:dc.
    */
   core.List<core.String> alsoKnownAs;
 
@@ -1214,7 +1223,7 @@
 }
 
 
-/** Information about a official holding an elected office. */
+/** Information about a person holding an elected office. */
 class Official {
   /** Addresses at which to contact the official. */
   core.List<SimpleAddressType> address;
diff --git a/generated/googleapis/lib/civicinfo/v1.dart b/generated/googleapis/lib/civicinfo/v1.dart
index d65c919..2869359 100644
--- a/generated/googleapis/lib/civicinfo/v1.dart
+++ b/generated/googleapis/lib/civicinfo/v1.dart
@@ -23,7 +23,7 @@
   RepresentativesResourceApi get representatives => new RepresentativesResourceApi(_requester);
 
   CivicinfoApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/civicinfo/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "civicinfo/v1/");
 }
 
 
@@ -1084,9 +1084,18 @@
 /** Describes a political geography. */
 class GeographicDivision {
   /**
-   * Any other valid OCD IDs that refer to the same division. For example, if
-   * this division's OCD ID is ocd-division/country:us/district:dc, this will
-   * contain ocd-division/country:us/state:dc.
+   * Any other valid OCD IDs that refer to the same division.
+   *
+   * Because OCD IDs are meant to be human-readable and at least somewhat
+   * predictable, there are occasionally several identifiers for a single
+   * division. These identifiers are defined to be equivalent to one another,
+   * and one is always indicated as the primary identifier. The primary
+   * identifier will be returned in ocd_id above, and any other equivalent valid
+   * identifiers will be returned in this list.
+   *
+   * For example, if this division's OCD ID is
+   * ocd-division/country:us/district:dc, this will contain
+   * ocd-division/country:us/state:dc.
    */
   core.List<core.String> alsoKnownAs;
 
@@ -1214,7 +1223,7 @@
 }
 
 
-/** Information about a official holding an elected office. */
+/** Information about a person holding an elected office. */
 class Official {
   /** Addresses at which to contact the official. */
   core.List<SimpleAddressType> address;
diff --git a/generated/googleapis/lib/compute/v1.dart b/generated/googleapis/lib/compute/v1.dart
index 6549177..6660b94 100644
--- a/generated/googleapis/lib/compute/v1.dart
+++ b/generated/googleapis/lib/compute/v1.dart
@@ -61,7 +61,7 @@
   ZonesResourceApi get zones => new ZonesResourceApi(_requester);
 
   ComputeApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/compute/v1/projects/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "compute/v1/projects/");
 }
 
 
diff --git a/generated/googleapis/lib/content/v2.dart b/generated/googleapis/lib/content/v2.dart
index 098b4ae..8c0e8d8 100644
--- a/generated/googleapis/lib/content/v2.dart
+++ b/generated/googleapis/lib/content/v2.dart
@@ -33,7 +33,7 @@
   ProductstatusesResourceApi get productstatuses => new ProductstatusesResourceApi(_requester);
 
   ContentApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/content/v2/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "content/v2/");
 }
 
 
diff --git a/generated/googleapis/lib/coordinate/v1.dart b/generated/googleapis/lib/coordinate/v1.dart
index fb98e62..54d45a8 100644
--- a/generated/googleapis/lib/coordinate/v1.dart
+++ b/generated/googleapis/lib/coordinate/v1.dart
@@ -31,7 +31,7 @@
   WorkerResourceApi get worker => new WorkerResourceApi(_requester);
 
   CoordinateApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/coordinate/v1/teams/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "coordinate/v1/teams/");
 }
 
 
diff --git a/generated/googleapis/lib/customsearch/v1.dart b/generated/googleapis/lib/customsearch/v1.dart
index 6822db6..9d99025 100644
--- a/generated/googleapis/lib/customsearch/v1.dart
+++ b/generated/googleapis/lib/customsearch/v1.dart
@@ -21,7 +21,7 @@
   CseResourceApi get cse => new CseResourceApi(_requester);
 
   CustomsearchApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/customsearch/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "customsearch/");
 }
 
 
diff --git a/generated/googleapis/lib/dfareporting/v1_3.dart b/generated/googleapis/lib/dfareporting/v1_3.dart
index dff732d..1fbc48b 100644
--- a/generated/googleapis/lib/dfareporting/v1_3.dart
+++ b/generated/googleapis/lib/dfareporting/v1_3.dart
@@ -27,7 +27,7 @@
   UserProfilesResourceApi get userProfiles => new UserProfilesResourceApi(_requester);
 
   DfareportingApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/dfareporting/v1.3/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "dfareporting/v1.3/");
 }
 
 
diff --git a/generated/googleapis/lib/discovery/v1.dart b/generated/googleapis/lib/discovery/v1.dart
index 82b9e44..8243068 100644
--- a/generated/googleapis/lib/discovery/v1.dart
+++ b/generated/googleapis/lib/discovery/v1.dart
@@ -24,7 +24,7 @@
   ApisResourceApi get apis => new ApisResourceApi(_requester);
 
   DiscoveryApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/discovery/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "discovery/v1/");
 }
 
 
diff --git a/generated/googleapis/lib/doubleclickbidmanager/v1.dart b/generated/googleapis/lib/doubleclickbidmanager/v1.dart
index ac90b3a..cce3e80 100644
--- a/generated/googleapis/lib/doubleclickbidmanager/v1.dart
+++ b/generated/googleapis/lib/doubleclickbidmanager/v1.dart
@@ -23,7 +23,7 @@
   ReportsResourceApi get reports => new ReportsResourceApi(_requester);
 
   DoubleclickbidmanagerApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/doubleclickbidmanager/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "doubleclickbidmanager/v1/");
 }
 
 
diff --git a/generated/googleapis/lib/doubleclicksearch/v2.dart b/generated/googleapis/lib/doubleclicksearch/v2.dart
index 759ac86..9a9613b 100644
--- a/generated/googleapis/lib/doubleclicksearch/v2.dart
+++ b/generated/googleapis/lib/doubleclicksearch/v2.dart
@@ -29,7 +29,7 @@
   SavedColumnsResourceApi get savedColumns => new SavedColumnsResourceApi(_requester);
 
   DoubleclicksearchApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/doubleclicksearch/v2/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "doubleclicksearch/v2/");
 }
 
 
diff --git a/generated/googleapis/lib/drive/v2.dart b/generated/googleapis/lib/drive/v2.dart
index 4c092e3..042f969 100644
--- a/generated/googleapis/lib/drive/v2.dart
+++ b/generated/googleapis/lib/drive/v2.dart
@@ -57,7 +57,7 @@
   RevisionsResourceApi get revisions => new RevisionsResourceApi(_requester);
 
   DriveApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/drive/v2/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "drive/v2/");
 }
 
 
@@ -5389,6 +5389,48 @@
 }
 
 
+/** Metadata about video media. This will only be present for video types. */
+class FileVideoMediaMetadata {
+  /** The duration of the video in milliseconds. */
+  core.String durationMillis;
+
+  /** The height of the video in pixels. */
+  core.int height;
+
+  /** The width of the video in pixels. */
+  core.int width;
+
+
+  FileVideoMediaMetadata();
+
+  FileVideoMediaMetadata.fromJson(core.Map _json) {
+    if (_json.containsKey("durationMillis")) {
+      durationMillis = _json["durationMillis"];
+    }
+    if (_json.containsKey("height")) {
+      height = _json["height"];
+    }
+    if (_json.containsKey("width")) {
+      width = _json["width"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (durationMillis != null) {
+      _json["durationMillis"] = durationMillis;
+    }
+    if (height != null) {
+      _json["height"] = height;
+    }
+    if (width != null) {
+      _json["width"] = width;
+    }
+    return _json;
+  }
+}
+
+
 /** The metadata for a file. */
 class File {
   /** A link for opening the file in a relevant Google editor or viewer. */
@@ -5593,6 +5635,9 @@
    */
   core.String version;
 
+  /** Metadata about video media. This will only be present for video types. */
+  FileVideoMediaMetadata videoMediaMetadata;
+
   /**
    * A link for downloading the content of the file in a browser using cookie
    * based authentication. In cases where the content is shared publicly, the
@@ -5751,6 +5796,9 @@
     if (_json.containsKey("version")) {
       version = _json["version"];
     }
+    if (_json.containsKey("videoMediaMetadata")) {
+      videoMediaMetadata = new FileVideoMediaMetadata.fromJson(_json["videoMediaMetadata"]);
+    }
     if (_json.containsKey("webContentLink")) {
       webContentLink = _json["webContentLink"];
     }
@@ -5902,6 +5950,9 @@
     if (version != null) {
       _json["version"] = version;
     }
+    if (videoMediaMetadata != null) {
+      _json["videoMediaMetadata"] = (videoMediaMetadata).toJson();
+    }
     if (webContentLink != null) {
       _json["webContentLink"] = webContentLink;
     }
@@ -6113,9 +6164,7 @@
 
   /**
    * The email address of the user this permission refers to. This is an
-   * output-only field which is present when the permission type is user and the
-   * given user's Google+ profile privacy settings allow exposing their email
-   * address.
+   * output-only field which is present when the permission type is user.
    */
   core.String emailAddress;
 
diff --git a/generated/googleapis/lib/freebase/v1.dart b/generated/googleapis/lib/freebase/v1.dart
index b90bdfb..a58a222 100644
--- a/generated/googleapis/lib/freebase/v1.dart
+++ b/generated/googleapis/lib/freebase/v1.dart
@@ -19,7 +19,7 @@
   final common_internal.ApiRequester _requester;
 
   FreebaseApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/freebase/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "freebase/v1/");
 
   /**
    * Reconcile entities to Freebase open data.
diff --git a/generated/googleapis/lib/fusiontables/v1.dart b/generated/googleapis/lib/fusiontables/v1.dart
index 0004ce1..90b9099 100644
--- a/generated/googleapis/lib/fusiontables/v1.dart
+++ b/generated/googleapis/lib/fusiontables/v1.dart
@@ -32,7 +32,7 @@
   TemplateResourceApi get template => new TemplateResourceApi(_requester);
 
   FusiontablesApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/fusiontables/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "fusiontables/v1/");
 }
 
 
diff --git a/generated/googleapis/lib/games/v1.dart b/generated/googleapis/lib/games/v1.dart
index 08e0fc9..c41bada 100644
--- a/generated/googleapis/lib/games/v1.dart
+++ b/generated/googleapis/lib/games/v1.dart
@@ -47,7 +47,7 @@
   TurnBasedMatchesResourceApi get turnBasedMatches => new TurnBasedMatchesResourceApi(_requester);
 
   GamesApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/games/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "games/v1/");
 }
 
 
diff --git a/generated/googleapis/lib/gamesmanagement/v1management.dart b/generated/googleapis/lib/gamesmanagement/v1management.dart
index 94cf47c..feabf0a 100644
--- a/generated/googleapis/lib/gamesmanagement/v1management.dart
+++ b/generated/googleapis/lib/gamesmanagement/v1management.dart
@@ -37,7 +37,7 @@
   TurnBasedMatchesResourceApi get turnBasedMatches => new TurnBasedMatchesResourceApi(_requester);
 
   GamesManagementApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/games/v1management/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "games/v1management/");
 }
 
 
diff --git a/generated/googleapis/lib/gmail/v1.dart b/generated/googleapis/lib/gmail/v1.dart
index b2a4a70..b9dee7f 100644
--- a/generated/googleapis/lib/gmail/v1.dart
+++ b/generated/googleapis/lib/gmail/v1.dart
@@ -33,7 +33,7 @@
   UsersResourceApi get users => new UsersResourceApi(_requester);
 
   GmailApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/gmail/v1/users/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "gmail/v1/users/");
 }
 
 
diff --git a/generated/googleapis/lib/groupsmigration/v1.dart b/generated/googleapis/lib/groupsmigration/v1.dart
index 6d92a33..3ba1d1c 100644
--- a/generated/googleapis/lib/groupsmigration/v1.dart
+++ b/generated/googleapis/lib/groupsmigration/v1.dart
@@ -21,7 +21,7 @@
   ArchiveResourceApi get archive => new ArchiveResourceApi(_requester);
 
   GroupsmigrationApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/groups/v1/groups/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "groups/v1/groups/");
 }
 
 
diff --git a/generated/googleapis/lib/groupssettings/v1.dart b/generated/googleapis/lib/groupssettings/v1.dart
index 1715dfa..a54d095 100644
--- a/generated/googleapis/lib/groupssettings/v1.dart
+++ b/generated/googleapis/lib/groupssettings/v1.dart
@@ -24,7 +24,7 @@
   GroupsResourceApi get groups => new GroupsResourceApi(_requester);
 
   GroupssettingsApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/groups/v1/groups/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "groups/v1/groups/");
 }
 
 
diff --git a/generated/googleapis/lib/identitytoolkit/v3.dart b/generated/googleapis/lib/identitytoolkit/v3.dart
index f132eef..caca776 100644
--- a/generated/googleapis/lib/identitytoolkit/v3.dart
+++ b/generated/googleapis/lib/identitytoolkit/v3.dart
@@ -21,7 +21,7 @@
   RelyingpartyResourceApi get relyingparty => new RelyingpartyResourceApi(_requester);
 
   IdentitytoolkitApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/identitytoolkit/v3/relyingparty/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "identitytoolkit/v3/relyingparty/");
 }
 
 
@@ -268,7 +268,7 @@
   }
 
   /**
-   * Set account info for a user.
+   * Reset password for a user.
    *
    * [request] - The metadata request object.
    *
@@ -476,6 +476,9 @@
   /** The URI used by the IDP to authenticate the user. */
   core.String authUri;
 
+  /** True if captcha is required. */
+  core.bool captchaRequired;
+
   /** True if the authUri is for user's existing provider. */
   core.bool forExistingProvider;
 
@@ -495,6 +498,9 @@
     if (_json.containsKey("authUri")) {
       authUri = _json["authUri"];
     }
+    if (_json.containsKey("captchaRequired")) {
+      captchaRequired = _json["captchaRequired"];
+    }
     if (_json.containsKey("forExistingProvider")) {
       forExistingProvider = _json["forExistingProvider"];
     }
@@ -514,6 +520,9 @@
     if (authUri != null) {
       _json["authUri"] = authUri;
     }
+    if (captchaRequired != null) {
+      _json["captchaRequired"] = captchaRequired;
+    }
     if (forExistingProvider != null) {
       _json["forExistingProvider"] = forExistingProvider;
     }
diff --git a/generated/googleapis/lib/licensing/v1.dart b/generated/googleapis/lib/licensing/v1.dart
index b01acc5..8ba9d49 100644
--- a/generated/googleapis/lib/licensing/v1.dart
+++ b/generated/googleapis/lib/licensing/v1.dart
@@ -21,7 +21,7 @@
   LicenseAssignmentsResourceApi get licenseAssignments => new LicenseAssignmentsResourceApi(_requester);
 
   LicensingApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/apps/licensing/v1/product/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "apps/licensing/v1/product/");
 }
 
 
diff --git a/generated/googleapis/lib/mapsengine/v1.dart b/generated/googleapis/lib/mapsengine/v1.dart
index 32cb97b..4e4775d 100644
--- a/generated/googleapis/lib/mapsengine/v1.dart
+++ b/generated/googleapis/lib/mapsengine/v1.dart
@@ -36,7 +36,7 @@
   TablesResourceApi get tables => new TablesResourceApi(_requester);
 
   MapsengineApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/mapsengine/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "mapsengine/v1/");
 }
 
 
@@ -45,6 +45,7 @@
   final common_internal.ApiRequester _requester;
 
   AssetsParentsResourceApi get parents => new AssetsParentsResourceApi(_requester);
+  AssetsPermissionsResourceApi get permissions => new AssetsPermissionsResourceApi(_requester);
 
   AssetsResourceApi(common_internal.ApiRequester client) : 
       _requester = client;
@@ -281,10 +282,61 @@
 
 
 /** Not documented yet. */
+class AssetsPermissionsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  AssetsPermissionsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Return all of the permissions for the specified asset.
+   *
+   * Request parameters:
+   *
+   * [id] - The ID of the asset whose permissions will be listed.
+   *
+   * Completes with a [PermissionsListResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<PermissionsListResponse> list(core.String id) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+
+
+    _url = 'assets/' + common_internal.Escaper.ecapeVariable('$id') + '/permissions';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new PermissionsListResponse.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
 class LayersResourceApi {
   final common_internal.ApiRequester _requester;
 
   LayersParentsResourceApi get parents => new LayersParentsResourceApi(_requester);
+  LayersPermissionsResourceApi get permissions => new LayersPermissionsResourceApi(_requester);
 
   LayersResourceApi(common_internal.ApiRequester client) : 
       _requester = client;
@@ -423,7 +475,10 @@
    *
    * [id] - The ID of the layer.
    *
-   * [version] - null
+   * [version] - Deprecated: The version parameter indicates which version of
+   * the layer should be returned. When version is set to published, the
+   * published version of the layer will be returned. Please use the
+   * layers.getPublished endpoint instead.
    * Possible string values are:
    * - "draft" : The draft version.
    * - "published" : The published version.
@@ -927,9 +982,154 @@
 
 
 /** Not documented yet. */
+class LayersPermissionsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  LayersPermissionsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Remove permission entries from an already existing asset.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [id] - The ID of the asset from which permissions will be removed.
+   *
+   * Completes with a [PermissionsBatchDeleteResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<PermissionsBatchDeleteResponse> batchDelete(PermissionsBatchDeleteRequest request, core.String id) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+
+
+    _url = 'layers/' + common_internal.Escaper.ecapeVariable('$id') + '/permissions/batchDelete';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new PermissionsBatchDeleteResponse.fromJson(data));
+  }
+
+  /**
+   * Add or update permission entries to an already existing asset.
+   *
+   * An asset can hold up to 20 different permission entries. Each batchInsert
+   * request is atomic.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [id] - The ID of the asset to which permissions will be added.
+   *
+   * Completes with a [PermissionsBatchUpdateResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<PermissionsBatchUpdateResponse> batchUpdate(PermissionsBatchUpdateRequest request, core.String id) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+
+
+    _url = 'layers/' + common_internal.Escaper.ecapeVariable('$id') + '/permissions/batchUpdate';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new PermissionsBatchUpdateResponse.fromJson(data));
+  }
+
+  /**
+   * Return all of the permissions for the specified asset.
+   *
+   * Request parameters:
+   *
+   * [id] - The ID of the asset whose permissions will be listed.
+   *
+   * Completes with a [PermissionsListResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<PermissionsListResponse> list(core.String id) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+
+
+    _url = 'layers/' + common_internal.Escaper.ecapeVariable('$id') + '/permissions';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new PermissionsListResponse.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
 class MapsResourceApi {
   final common_internal.ApiRequester _requester;
 
+  MapsPermissionsResourceApi get permissions => new MapsPermissionsResourceApi(_requester);
+
   MapsResourceApi(common_internal.ApiRequester client) : 
       _requester = client;
 
@@ -1021,7 +1221,10 @@
    *
    * [id] - The ID of the map.
    *
-   * [version] - null
+   * [version] - Deprecated: The version parameter indicates which version of
+   * the map should be returned. When version is set to published, the published
+   * version of the map will be returned. Please use the maps.getPublished
+   * endpoint instead.
    * Possible string values are:
    * - "draft" : The draft version.
    * - "published" : The published version.
@@ -1421,6 +1624,149 @@
 
 
 /** Not documented yet. */
+class MapsPermissionsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  MapsPermissionsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Remove permission entries from an already existing asset.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [id] - The ID of the asset from which permissions will be removed.
+   *
+   * Completes with a [PermissionsBatchDeleteResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<PermissionsBatchDeleteResponse> batchDelete(PermissionsBatchDeleteRequest request, core.String id) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+
+
+    _url = 'maps/' + common_internal.Escaper.ecapeVariable('$id') + '/permissions/batchDelete';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new PermissionsBatchDeleteResponse.fromJson(data));
+  }
+
+  /**
+   * Add or update permission entries to an already existing asset.
+   *
+   * An asset can hold up to 20 different permission entries. Each batchInsert
+   * request is atomic.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [id] - The ID of the asset to which permissions will be added.
+   *
+   * Completes with a [PermissionsBatchUpdateResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<PermissionsBatchUpdateResponse> batchUpdate(PermissionsBatchUpdateRequest request, core.String id) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+
+
+    _url = 'maps/' + common_internal.Escaper.ecapeVariable('$id') + '/permissions/batchUpdate';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new PermissionsBatchUpdateResponse.fromJson(data));
+  }
+
+  /**
+   * Return all of the permissions for the specified asset.
+   *
+   * Request parameters:
+   *
+   * [id] - The ID of the asset whose permissions will be listed.
+   *
+   * Completes with a [PermissionsListResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<PermissionsListResponse> list(core.String id) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+
+
+    _url = 'maps/' + common_internal.Escaper.ecapeVariable('$id') + '/permissions';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new PermissionsListResponse.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
 class ProjectsResourceApi {
   final common_internal.ApiRequester _requester;
 
@@ -1653,6 +1999,7 @@
   final common_internal.ApiRequester _requester;
 
   RasterCollectionsParentsResourceApi get parents => new RasterCollectionsParentsResourceApi(_requester);
+  RasterCollectionsPermissionsResourceApi get permissions => new RasterCollectionsPermissionsResourceApi(_requester);
   RasterCollectionsRastersResourceApi get rasters => new RasterCollectionsRastersResourceApi(_requester);
 
   RasterCollectionsResourceApi(common_internal.ApiRequester client) : 
@@ -2100,6 +2447,149 @@
 
 
 /** Not documented yet. */
+class RasterCollectionsPermissionsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  RasterCollectionsPermissionsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Remove permission entries from an already existing asset.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [id] - The ID of the asset from which permissions will be removed.
+   *
+   * Completes with a [PermissionsBatchDeleteResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<PermissionsBatchDeleteResponse> batchDelete(PermissionsBatchDeleteRequest request, core.String id) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+
+
+    _url = 'rasterCollections/' + common_internal.Escaper.ecapeVariable('$id') + '/permissions/batchDelete';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new PermissionsBatchDeleteResponse.fromJson(data));
+  }
+
+  /**
+   * Add or update permission entries to an already existing asset.
+   *
+   * An asset can hold up to 20 different permission entries. Each batchInsert
+   * request is atomic.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [id] - The ID of the asset to which permissions will be added.
+   *
+   * Completes with a [PermissionsBatchUpdateResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<PermissionsBatchUpdateResponse> batchUpdate(PermissionsBatchUpdateRequest request, core.String id) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+
+
+    _url = 'rasterCollections/' + common_internal.Escaper.ecapeVariable('$id') + '/permissions/batchUpdate';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new PermissionsBatchUpdateResponse.fromJson(data));
+  }
+
+  /**
+   * Return all of the permissions for the specified asset.
+   *
+   * Request parameters:
+   *
+   * [id] - The ID of the asset whose permissions will be listed.
+   *
+   * Completes with a [PermissionsListResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<PermissionsListResponse> list(core.String id) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+
+
+    _url = 'rasterCollections/' + common_internal.Escaper.ecapeVariable('$id') + '/permissions';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new PermissionsListResponse.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
 class RasterCollectionsRastersResourceApi {
   final common_internal.ApiRequester _requester;
 
@@ -2327,6 +2817,7 @@
 
   RastersFilesResourceApi get files => new RastersFilesResourceApi(_requester);
   RastersParentsResourceApi get parents => new RastersParentsResourceApi(_requester);
+  RastersPermissionsResourceApi get permissions => new RastersPermissionsResourceApi(_requester);
 
   RastersResourceApi(common_internal.ApiRequester client) : 
       _requester = client;
@@ -2802,12 +3293,156 @@
 
 
 /** Not documented yet. */
+class RastersPermissionsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  RastersPermissionsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Remove permission entries from an already existing asset.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [id] - The ID of the asset from which permissions will be removed.
+   *
+   * Completes with a [PermissionsBatchDeleteResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<PermissionsBatchDeleteResponse> batchDelete(PermissionsBatchDeleteRequest request, core.String id) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+
+
+    _url = 'rasters/' + common_internal.Escaper.ecapeVariable('$id') + '/permissions/batchDelete';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new PermissionsBatchDeleteResponse.fromJson(data));
+  }
+
+  /**
+   * Add or update permission entries to an already existing asset.
+   *
+   * An asset can hold up to 20 different permission entries. Each batchInsert
+   * request is atomic.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [id] - The ID of the asset to which permissions will be added.
+   *
+   * Completes with a [PermissionsBatchUpdateResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<PermissionsBatchUpdateResponse> batchUpdate(PermissionsBatchUpdateRequest request, core.String id) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+
+
+    _url = 'rasters/' + common_internal.Escaper.ecapeVariable('$id') + '/permissions/batchUpdate';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new PermissionsBatchUpdateResponse.fromJson(data));
+  }
+
+  /**
+   * Return all of the permissions for the specified asset.
+   *
+   * Request parameters:
+   *
+   * [id] - The ID of the asset whose permissions will be listed.
+   *
+   * Completes with a [PermissionsListResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<PermissionsListResponse> list(core.String id) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+
+
+    _url = 'rasters/' + common_internal.Escaper.ecapeVariable('$id') + '/permissions';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new PermissionsListResponse.fromJson(data));
+  }
+
+}
+
+
+/** Not documented yet. */
 class TablesResourceApi {
   final common_internal.ApiRequester _requester;
 
   TablesFeaturesResourceApi get features => new TablesFeaturesResourceApi(_requester);
   TablesFilesResourceApi get files => new TablesFilesResourceApi(_requester);
   TablesParentsResourceApi get parents => new TablesParentsResourceApi(_requester);
+  TablesPermissionsResourceApi get permissions => new TablesPermissionsResourceApi(_requester);
 
   TablesResourceApi(common_internal.ApiRequester client) : 
       _requester = client;
@@ -3666,6 +4301,149 @@
 }
 
 
+/** Not documented yet. */
+class TablesPermissionsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  TablesPermissionsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Remove permission entries from an already existing asset.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [id] - The ID of the asset from which permissions will be removed.
+   *
+   * Completes with a [PermissionsBatchDeleteResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<PermissionsBatchDeleteResponse> batchDelete(PermissionsBatchDeleteRequest request, core.String id) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+
+
+    _url = 'tables/' + common_internal.Escaper.ecapeVariable('$id') + '/permissions/batchDelete';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new PermissionsBatchDeleteResponse.fromJson(data));
+  }
+
+  /**
+   * Add or update permission entries to an already existing asset.
+   *
+   * An asset can hold up to 20 different permission entries. Each batchInsert
+   * request is atomic.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * [id] - The ID of the asset to which permissions will be added.
+   *
+   * Completes with a [PermissionsBatchUpdateResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<PermissionsBatchUpdateResponse> batchUpdate(PermissionsBatchUpdateRequest request, core.String id) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+
+
+    _url = 'tables/' + common_internal.Escaper.ecapeVariable('$id') + '/permissions/batchUpdate';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new PermissionsBatchUpdateResponse.fromJson(data));
+  }
+
+  /**
+   * Return all of the permissions for the specified asset.
+   *
+   * Request parameters:
+   *
+   * [id] - The ID of the asset whose permissions will be listed.
+   *
+   * Completes with a [PermissionsListResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<PermissionsListResponse> list(core.String id) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (id == null) {
+      throw new core.ArgumentError("Parameter id is required.");
+    }
+
+
+    _url = 'tables/' + common_internal.Escaper.ecapeVariable('$id') + '/permissions';
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new PermissionsListResponse.fromJson(data));
+  }
+
+}
+
+
 
 /** Acquisition time represents acquired time of a raster. */
 class AcquisitionTime {
@@ -3735,7 +4513,8 @@
 class Asset {
   /**
    * A rectangular bounding box which contains all of the data in this asset.
-   * The numbers represent latitude and longitude in decimal degrees.
+   * The box is expressed as \"west, south, east, north\". The numbers represent
+   * latitude and longitude in decimal degrees.
    */
   core.List<core.double> bbox;
 
@@ -3745,6 +4524,12 @@
    */
   core.DateTime creationTime;
 
+  /**
+   * The email address of the creator of this asset. This is only returned on
+   * GET requests and not LIST requests.
+   */
+  core.String creatorEmail;
+
   /** The asset's description. */
   core.String description;
 
@@ -3760,6 +4545,12 @@
    */
   core.DateTime lastModifiedTime;
 
+  /**
+   * The email address of the last modifier of this asset. This is only returned
+   * on GET requests and not LIST requests.
+   */
+  core.String lastModifierEmail;
+
   /** The asset's name. */
   core.String name;
 
@@ -3790,6 +4581,9 @@
    */
   core.String type;
 
+  /** If true, WRITERs of the asset are able to edit the asset permissions. */
+  core.bool writersCanEditPermissions;
+
 
   Asset();
 
@@ -3800,6 +4594,9 @@
     if (_json.containsKey("creationTime")) {
       creationTime = core.DateTime.parse(_json["creationTime"]);
     }
+    if (_json.containsKey("creatorEmail")) {
+      creatorEmail = _json["creatorEmail"];
+    }
     if (_json.containsKey("description")) {
       description = _json["description"];
     }
@@ -3812,6 +4609,9 @@
     if (_json.containsKey("lastModifiedTime")) {
       lastModifiedTime = core.DateTime.parse(_json["lastModifiedTime"]);
     }
+    if (_json.containsKey("lastModifierEmail")) {
+      lastModifierEmail = _json["lastModifierEmail"];
+    }
     if (_json.containsKey("name")) {
       name = _json["name"];
     }
@@ -3827,6 +4627,9 @@
     if (_json.containsKey("type")) {
       type = _json["type"];
     }
+    if (_json.containsKey("writersCanEditPermissions")) {
+      writersCanEditPermissions = _json["writersCanEditPermissions"];
+    }
   }
 
   core.Map toJson() {
@@ -3837,6 +4640,9 @@
     if (creationTime != null) {
       _json["creationTime"] = (creationTime).toIso8601String();
     }
+    if (creatorEmail != null) {
+      _json["creatorEmail"] = creatorEmail;
+    }
     if (description != null) {
       _json["description"] = description;
     }
@@ -3849,6 +4655,9 @@
     if (lastModifiedTime != null) {
       _json["lastModifiedTime"] = (lastModifiedTime).toIso8601String();
     }
+    if (lastModifierEmail != null) {
+      _json["lastModifierEmail"] = lastModifierEmail;
+    }
     if (name != null) {
       _json["name"] = name;
     }
@@ -3864,6 +4673,9 @@
     if (type != null) {
       _json["type"] = type;
     }
+    if (writersCanEditPermissions != null) {
+      _json["writersCanEditPermissions"] = writersCanEditPermissions;
+    }
     return _json;
   }
 }
@@ -4222,7 +5034,7 @@
   /**
    * If true, the server will normalize feature geometries. It is assumed that
    * the South Pole is exterior to any polygons given. See here for a list of
-   * normalizations. If false, the all feature geometries must be given already
+   * normalizations. If false, all feature geometries must be given already
    * normalized. The points in all LinearRings must be listed in
    * counter-clockwise order, and LinearRings may not intersect.
    */
@@ -4261,7 +5073,7 @@
   /**
    * If true, the server will normalize feature geometries. It is assumed that
    * the South Pole is exterior to any polygons given. See here for a list of
-   * normalizations. If false, the all feature geometries must be given already
+   * normalizations. If false, all feature geometries must be given already
    * normalized. The points in all LinearRings must be listed in
    * counter-clockwise order, and LinearRings may not intersect.
    */
@@ -4707,11 +5519,11 @@
 /** Not documented yet. */
 class GeoJsonPolygon  extends GeoJsonGeometry {
   /**
-   * An array of LinearRings, each of which is an array of four or more
-   * GeoJsonPositions. The first and last coordinates in each LinearRing must be
-   * the same. For polygons with multiple rings, the first LinearRing is the
-   * external ring, with subsequent rings being interior rings (i.e. hole). All
-   * LinearRings must contain GeoJsonPositions in counter-clockwise order.
+   * An array of LinearRings. A LinearRing is a GeoJsonLineString which is
+   * closed (that is, the first and last GeoJsonPositions are equal), and which
+   * contains at least four GeoJsonPositions. For polygons with multiple rings,
+   * the first LinearRing is the exterior ring, and any subsequent rings are
+   * interior rings (that is, holes).
    */
   core.List<core.List<GeoJsonPosition>> coordinates;
 
@@ -5082,7 +5894,8 @@
 class Layer {
   /**
    * A rectangular bounding box which contains all of the data in this Layer.
-   * The numbers represent latitude and longitude in decimal degrees.
+   * The box is expressed as \"west, south, east, north\". The numbers represent
+   * latitude and longitude in decimal degrees.
    */
   core.List<core.double> bbox;
 
@@ -5093,6 +5906,12 @@
   core.DateTime creationTime;
 
   /**
+   * The email address of the creator of this layer. This is only returned on
+   * GET requests and not LIST requests.
+   */
+  core.String creatorEmail;
+
+  /**
    * Deprecated: The type of the datasources used to build this Layer. Note:
    * This has been replaced by layerType, but is still available for now to
    * maintain backward compatibility.
@@ -5103,7 +5922,7 @@
   core.String datasourceType;
 
   /**
-   * An array of datasources used to build this Layer. If layerType is "image",
+   * An array of datasources used to build this layer. If layerType is "image",
    * or layerType is not specified and datasourceType is "image", then each
    * element in this array is a reference to an Image or RasterCollection. If
    * layerType is "vector", or layerType is not specified and datasourceType is
@@ -5117,17 +5936,13 @@
   /**
    * Deprecated: The name of an access list of the Map Editor type. The user on
    * whose behalf the request is being sent must be an editor on that access
-   * list. Note: Google Maps Engine no longer uses access lists. For backward
-   * compatibility, the API still accepts access lists for projects that are
-   * already using access lists. If you created a GME account/project after July
-   * 14th, 2014, you will not be able to send API requests that include access
-   * lists. The API does not yet support the new permissions model. When you
-   * create a map via the API without specifying permissions, the account that
-   * created the map is the owner and has effective administrator access. Users
-   * can then use the Maps Engine user interface to adjust the permissions. This
-   * is a temporary workaround until the API supports the new permissions model.
-   * Read Add new users and groups in the Google Maps Engine help center for
-   * more information.
+   * list. Note: Google Maps Engine no longer uses access lists. Instead, each
+   * asset has its own list of permissions. For backward compatibility, the API
+   * still accepts access lists for projects that are already using access
+   * lists. If you created a GME account/project after July 14th, 2014, you will
+   * not be able to send API requests that include access lists. Note: This is
+   * an input field only. It is not returned in response to a list or get
+   * request.
    */
   core.String draftAccessList;
 
@@ -5144,6 +5959,12 @@
   core.DateTime lastModifiedTime;
 
   /**
+   * The email address of the last modifier of this layer. This is only returned
+   * on GET requests and not LIST requests.
+   */
+  core.String lastModifierEmail;
+
+  /**
    * The type of the datasources used to build this Layer. This should be used
    * instead of datasourceType. At least one of layerType and datasourceType and
    * must be specified, but layerType takes precedence.
@@ -5173,8 +5994,13 @@
   /**
    * Deprecated: The access list to whom view permissions are granted. The value
    * must be the name of a Maps Engine access list of the Map Viewer type, and
-   * the user must be a viewer on that list. Read Share data, layers, and maps
-   * in the Google Maps Engine help center for more information.
+   * the user must be a viewer on that list. Note: Google Maps Engine no longer
+   * uses access lists. Instead, each asset has its own list of permissions. For
+   * backward compatibility, the API still accepts access lists for projects
+   * that are already using access lists. If you created a GME account/project
+   * after July 14th, 2014, you will not be able to send API requests that
+   * include access lists. Note: This is an input field only. It is not returned
+   * in response to a list or get request.
    */
   core.String publishedAccessList;
 
@@ -5186,12 +6012,20 @@
    */
   core.String publishingStatus;
 
-  /** The Styling information for a vector layer. */
+  /**
+   * The styling information for a vector layer. Note: Style information is
+   * returned in response to a get request but not a list request. After
+   * requesting a list of layers, you'll need to send a get request to retrieve
+   * the VectorStyles for each layer.
+   */
   VectorStyle style;
 
   /** Tags of this Layer. */
   Tags tags;
 
+  /** If true, WRITERs of the asset are able to edit the asset permissions. */
+  core.bool writersCanEditPermissions;
+
 
   Layer();
 
@@ -5202,6 +6036,9 @@
     if (_json.containsKey("creationTime")) {
       creationTime = core.DateTime.parse(_json["creationTime"]);
     }
+    if (_json.containsKey("creatorEmail")) {
+      creatorEmail = _json["creatorEmail"];
+    }
     if (_json.containsKey("datasourceType")) {
       datasourceType = _json["datasourceType"];
     }
@@ -5223,6 +6060,9 @@
     if (_json.containsKey("lastModifiedTime")) {
       lastModifiedTime = core.DateTime.parse(_json["lastModifiedTime"]);
     }
+    if (_json.containsKey("lastModifierEmail")) {
+      lastModifierEmail = _json["lastModifierEmail"];
+    }
     if (_json.containsKey("layerType")) {
       layerType = _json["layerType"];
     }
@@ -5247,6 +6087,9 @@
     if (_json.containsKey("tags")) {
       tags = new Tags.fromJson(_json["tags"]);
     }
+    if (_json.containsKey("writersCanEditPermissions")) {
+      writersCanEditPermissions = _json["writersCanEditPermissions"];
+    }
   }
 
   core.Map toJson() {
@@ -5257,6 +6100,9 @@
     if (creationTime != null) {
       _json["creationTime"] = (creationTime).toIso8601String();
     }
+    if (creatorEmail != null) {
+      _json["creatorEmail"] = creatorEmail;
+    }
     if (datasourceType != null) {
       _json["datasourceType"] = datasourceType;
     }
@@ -5278,6 +6124,9 @@
     if (lastModifiedTime != null) {
       _json["lastModifiedTime"] = (lastModifiedTime).toIso8601String();
     }
+    if (lastModifierEmail != null) {
+      _json["lastModifierEmail"] = lastModifierEmail;
+    }
     if (layerType != null) {
       _json["layerType"] = layerType;
     }
@@ -5302,12 +6151,20 @@
     if (tags != null) {
       _json["tags"] = tags;
     }
+    if (writersCanEditPermissions != null) {
+      _json["writersCanEditPermissions"] = writersCanEditPermissions;
+    }
     return _json;
   }
 }
 
 
-/** The response returned by a call to layers.List. */
+/**
+ * The response returned by a call to layers.List. Note: The list response does
+ * not include all the fields available in a layer. Refer to the layer resource
+ * description for details of the fields that are not included. You'll need to
+ * send a get request to retrieve the additional fields for each layer.
+ */
 class LayersListResponse {
   /** Resources returned. */
   core.List<Layer> layers;
@@ -5453,7 +6310,8 @@
 class Map {
   /**
    * A rectangular bounding box which contains all of the data in this Map. The
-   * numbers represent latitude and longitude in decimal degrees.
+   * box is expressed as \"west, south, east, north\". The numbers represent
+   * latitude and longitude in decimal degrees.
    */
   core.List<core.double> bbox;
 
@@ -5467,6 +6325,12 @@
   core.DateTime creationTime;
 
   /**
+   * The email address of the creator of this map. This is only returned on GET
+   * requests and not LIST requests.
+   */
+  core.String creatorEmail;
+
+  /**
    * An array of four numbers (west, south, east, north) which defines the
    * rectangular bounding box of the default viewport. The numbers represent
    * latitude and longitude in decimal degrees.
@@ -5479,17 +6343,13 @@
   /**
    * Deprecated: The name of an access list of the Map Editor type. The user on
    * whose behalf the request is being sent must be an editor on that access
-   * list. Note: Google Maps Engine no longer uses access lists. For backward
-   * compatibility, the API still accepts access lists for projects that are
-   * already using access lists. If you created a GME account/project after July
-   * 14th, 2014, you will not be able to send API requests that include access
-   * lists. The API does not yet support the new permissions model. When you
-   * create a map via the API without specifying permissions, the account that
-   * created the map is the owner and has effective administrator access. Users
-   * can then use the Maps Engine user interface to adjust the permissions. This
-   * is a temporary workaround until the API supports the new permissions model.
-   * Read Add new users and groups in the Google Maps Engine help center for
-   * more information.
+   * list. Note: Google Maps Engine no longer uses access lists. Instead, each
+   * asset has its own list of permissions. For backward compatibility, the API
+   * still accepts access lists for projects that are already using access
+   * lists. If you created a GME account/project after July 14th, 2014, you will
+   * not be able to send API requests that include access lists. Note: This is
+   * an input field only. It is not returned in response to a list or get
+   * request.
    */
   core.String draftAccessList;
 
@@ -5505,6 +6365,12 @@
    */
   core.DateTime lastModifiedTime;
 
+  /**
+   * The email address of the last modifier of this map. This is only returned
+   * on GET requests and not LIST requests.
+   */
+  core.String lastModifierEmail;
+
   /** The name of this Map, supplied by the author. */
   core.String name;
 
@@ -5526,8 +6392,13 @@
   /**
    * Deprecated: The access list to whom view permissions are granted. The value
    * must be the name of a Maps Engine access list of the Map Viewer type, and
-   * the user must be a viewer on that list. Read Share data, layers, and maps
-   * in the Google Maps Engine help center for more information.
+   * the user must be a viewer on that list. Note: Google Maps Engine no longer
+   * uses access lists. Instead, each asset has its own list of permissions. For
+   * backward compatibility, the API still accepts access lists for projects
+   * that are already using access lists. If you created a GME account/project
+   * after July 14th, 2014, you will not be able to send API requests that
+   * include access lists. This is an input field only. It is not returned in
+   * response to a list or get request.
    */
   core.String publishedAccessList;
 
@@ -5549,6 +6420,9 @@
    */
   core.List<core.String> versions;
 
+  /** If true, WRITERs of the asset are able to edit the asset permissions. */
+  core.bool writersCanEditPermissions;
+
 
   Map();
 
@@ -5562,6 +6436,9 @@
     if (_json.containsKey("creationTime")) {
       creationTime = core.DateTime.parse(_json["creationTime"]);
     }
+    if (_json.containsKey("creatorEmail")) {
+      creatorEmail = _json["creatorEmail"];
+    }
     if (_json.containsKey("defaultViewport")) {
       defaultViewport = new LatLngBox.fromJson(_json["defaultViewport"]);
     }
@@ -5580,6 +6457,9 @@
     if (_json.containsKey("lastModifiedTime")) {
       lastModifiedTime = core.DateTime.parse(_json["lastModifiedTime"]);
     }
+    if (_json.containsKey("lastModifierEmail")) {
+      lastModifierEmail = _json["lastModifierEmail"];
+    }
     if (_json.containsKey("name")) {
       name = _json["name"];
     }
@@ -5601,6 +6481,9 @@
     if (_json.containsKey("versions")) {
       versions = _json["versions"];
     }
+    if (_json.containsKey("writersCanEditPermissions")) {
+      writersCanEditPermissions = _json["writersCanEditPermissions"];
+    }
   }
 
   core.Map toJson() {
@@ -5614,6 +6497,9 @@
     if (creationTime != null) {
       _json["creationTime"] = (creationTime).toIso8601String();
     }
+    if (creatorEmail != null) {
+      _json["creatorEmail"] = creatorEmail;
+    }
     if (defaultViewport != null) {
       _json["defaultViewport"] = defaultViewport;
     }
@@ -5632,6 +6518,9 @@
     if (lastModifiedTime != null) {
       _json["lastModifiedTime"] = (lastModifiedTime).toIso8601String();
     }
+    if (lastModifierEmail != null) {
+      _json["lastModifierEmail"] = lastModifierEmail;
+    }
     if (name != null) {
       _json["name"] = name;
     }
@@ -5653,6 +6542,9 @@
     if (versions != null) {
       _json["versions"] = versions;
     }
+    if (writersCanEditPermissions != null) {
+      _json["writersCanEditPermissions"] = writersCanEditPermissions;
+    }
     return _json;
   }
 }
@@ -6043,6 +6935,187 @@
 }
 
 
+/**
+ * A permission defines the user or group that has access to an asset, and the
+ * type of access they have.
+ */
+class Permission {
+  /**
+   * Indicates whether a public asset is listed and can be found via a web
+   * search (value true), or is visible only to people who have a link to the
+   * asset (value false).
+   */
+  core.bool discoverable;
+
+  /**
+   * The unique identifier of the permission. This could be the email address of
+   * the user or group this permission refers to, or the string "anyone" for
+   * public permissions.
+   */
+  core.String id;
+
+  /**
+   * The type of access granted to this user or group.
+   * Possible string values are:
+   * - "owner"
+   * - "reader"
+   * - "viewer"
+   * - "writer"
+   */
+  core.String role;
+
+  /**
+   * The account type.
+   * Possible string values are:
+   * - "anyone"
+   * - "group"
+   * - "user"
+   */
+  core.String type;
+
+
+  Permission();
+
+  Permission.fromJson(core.Map _json) {
+    if (_json.containsKey("discoverable")) {
+      discoverable = _json["discoverable"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("role")) {
+      role = _json["role"];
+    }
+    if (_json.containsKey("type")) {
+      type = _json["type"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (discoverable != null) {
+      _json["discoverable"] = discoverable;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (role != null) {
+      _json["role"] = role;
+    }
+    if (type != null) {
+      _json["type"] = type;
+    }
+    return _json;
+  }
+}
+
+
+/** The request sent to mapsengine.permissions.batchDelete. */
+class PermissionsBatchDeleteRequest {
+  /**
+   * An array of permission ids to be removed. This could be the email address
+   * of the user or group this permission refers to, or the string "anyone" for
+   * public permissions.
+   */
+  core.List<core.String> ids;
+
+
+  PermissionsBatchDeleteRequest();
+
+  PermissionsBatchDeleteRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("ids")) {
+      ids = _json["ids"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (ids != null) {
+      _json["ids"] = ids;
+    }
+    return _json;
+  }
+}
+
+
+/** The response returned by a call to mapsengine.permissions.batchDelete. */
+class PermissionsBatchDeleteResponse {
+
+  PermissionsBatchDeleteResponse();
+
+  PermissionsBatchDeleteResponse.fromJson(core.Map _json) {
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    return _json;
+  }
+}
+
+
+/** The request sent to mapsengine.permissions.batchUpdate. */
+class PermissionsBatchUpdateRequest {
+  /** The permissions to be inserted or updated. */
+  core.List<Permission> permissions;
+
+
+  PermissionsBatchUpdateRequest();
+
+  PermissionsBatchUpdateRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("permissions")) {
+      permissions = _json["permissions"].map((value) => new Permission.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (permissions != null) {
+      _json["permissions"] = permissions.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** The response returned by a call to mapsengine.permissions.batchUpdate. */
+class PermissionsBatchUpdateResponse {
+
+  PermissionsBatchUpdateResponse();
+
+  PermissionsBatchUpdateResponse.fromJson(core.Map _json) {
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    return _json;
+  }
+}
+
+
+/** Not documented yet. */
+class PermissionsListResponse {
+  /** The set of permissions associated with this asset. */
+  core.List<Permission> permissions;
+
+
+  PermissionsListResponse();
+
+  PermissionsListResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("permissions")) {
+      permissions = _json["permissions"].map((value) => new Permission.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (permissions != null) {
+      _json["permissions"] = permissions.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
 /** Style for points. */
 class PointStyle {
   /**
@@ -6207,9 +7280,6 @@
   /** The description of this Layer, supplied by the author. */
   core.String description;
 
-  /** The ETag, used to refer to the current version of the asset. */
-  core.String etag;
-
   /** A globally unique ID, used to refer to this Layer. */
   core.String id;
 
@@ -6236,9 +7306,6 @@
     if (_json.containsKey("description")) {
       description = _json["description"];
     }
-    if (_json.containsKey("etag")) {
-      etag = _json["etag"];
-    }
     if (_json.containsKey("id")) {
       id = _json["id"];
     }
@@ -6258,9 +7325,6 @@
     if (description != null) {
       _json["description"] = description;
     }
-    if (etag != null) {
-      _json["etag"] = etag;
-    }
     if (id != null) {
       _json["id"] = id;
     }
@@ -6334,9 +7398,6 @@
   /** The description of this Map, supplied by the author. */
   core.String description;
 
-  /** The ETag, used to refer to the current version of the asset. */
-  core.String etag;
-
   /** A globally unique ID, used to refer to this Map. */
   core.String id;
 
@@ -6359,9 +7420,6 @@
     if (_json.containsKey("description")) {
       description = _json["description"];
     }
-    if (_json.containsKey("etag")) {
-      etag = _json["etag"];
-    }
     if (_json.containsKey("id")) {
       id = _json["id"];
     }
@@ -6384,9 +7442,6 @@
     if (description != null) {
       _json["description"] = description;
     }
-    if (etag != null) {
-      _json["etag"] = etag;
-    }
     if (id != null) {
       _json["id"] = id;
     }
@@ -6452,7 +7507,8 @@
 
   /**
    * A rectangular bounding box which contains all of the data in this Raster.
-   * The numbers represent latitude and longitude in decimal degrees.
+   * The box is expressed as \"west, south, east, north\". The numbers represent
+   * latitudes and longitudes in decimal degrees.
    */
   core.List<core.double> bbox;
 
@@ -6462,23 +7518,25 @@
    */
   core.DateTime creationTime;
 
+  /**
+   * The email address of the creator of this raster. This is only returned on
+   * GET requests and not LIST requests.
+   */
+  core.String creatorEmail;
+
   /** The description of this Raster, supplied by the author. */
   core.String description;
 
   /**
    * Deprecated: The name of an access list of the Map Editor type. The user on
    * whose behalf the request is being sent must be an editor on that access
-   * list. Note: Google Maps Engine no longer uses access lists. For backward
-   * compatibility, the API still accepts access lists for projects that are
-   * already using access lists. If you created a GME account/project after July
-   * 14th, 2014, you will not be able to send API requests that include access
-   * lists. The API does not yet support the new permissions model. When you
-   * create a map via the API without specifying permissions, the account that
-   * created the map is the owner and has effective administrator access. Users
-   * can then use the Maps Engine user interface to adjust the permissions. This
-   * is a temporary workaround until the API supports the new permissions model.
-   * Read Add new users and groups in the Google Maps Engine help center for
-   * more information.
+   * list. Note: Google Maps Engine no longer uses access lists. Instead, each
+   * asset has its own list of permissions. For backward compatibility, the API
+   * still accepts access lists for projects that are already using access
+   * lists. If you created a GME account/project after July 14th, 2014, you will
+   * not be able to send API requests that include access lists. Note: This is
+   * an input field only. It is not returned in response to a list or get
+   * request.
    */
   core.String draftAccessList;
 
@@ -6497,6 +7555,12 @@
    */
   core.DateTime lastModifiedTime;
 
+  /**
+   * The email address of the last modifier of this raster. This is only
+   * returned on GET requests and not LIST requests.
+   */
+  core.String lastModifierEmail;
+
   /** The mask processing type of this Raster. */
   core.String maskType;
 
@@ -6527,6 +7591,9 @@
   /** Tags of this Raster. */
   Tags tags;
 
+  /** If true, WRITERs of the asset are able to edit the asset permissions. */
+  core.bool writersCanEditPermissions;
+
 
   Raster();
 
@@ -6543,6 +7610,9 @@
     if (_json.containsKey("creationTime")) {
       creationTime = core.DateTime.parse(_json["creationTime"]);
     }
+    if (_json.containsKey("creatorEmail")) {
+      creatorEmail = _json["creatorEmail"];
+    }
     if (_json.containsKey("description")) {
       description = _json["description"];
     }
@@ -6561,6 +7631,9 @@
     if (_json.containsKey("lastModifiedTime")) {
       lastModifiedTime = core.DateTime.parse(_json["lastModifiedTime"]);
     }
+    if (_json.containsKey("lastModifierEmail")) {
+      lastModifierEmail = _json["lastModifierEmail"];
+    }
     if (_json.containsKey("maskType")) {
       maskType = _json["maskType"];
     }
@@ -6579,6 +7652,9 @@
     if (_json.containsKey("tags")) {
       tags = new Tags.fromJson(_json["tags"]);
     }
+    if (_json.containsKey("writersCanEditPermissions")) {
+      writersCanEditPermissions = _json["writersCanEditPermissions"];
+    }
   }
 
   core.Map toJson() {
@@ -6595,6 +7671,9 @@
     if (creationTime != null) {
       _json["creationTime"] = (creationTime).toIso8601String();
     }
+    if (creatorEmail != null) {
+      _json["creatorEmail"] = creatorEmail;
+    }
     if (description != null) {
       _json["description"] = description;
     }
@@ -6613,6 +7692,9 @@
     if (lastModifiedTime != null) {
       _json["lastModifiedTime"] = (lastModifiedTime).toIso8601String();
     }
+    if (lastModifierEmail != null) {
+      _json["lastModifierEmail"] = lastModifierEmail;
+    }
     if (maskType != null) {
       _json["maskType"] = maskType;
     }
@@ -6631,6 +7713,9 @@
     if (tags != null) {
       _json["tags"] = tags;
     }
+    if (writersCanEditPermissions != null) {
+      _json["writersCanEditPermissions"] = writersCanEditPermissions;
+    }
     return _json;
   }
 }
@@ -6641,13 +7726,18 @@
  * Layer.
  */
 class RasterCollection {
-  /** The name of the attribution to be used for this RasterCollection. */
+  /**
+   * The name of the attribution to be used for this RasterCollection. Note:
+   * Attribution is returned in response to a get request but not a list
+   * request. After requesting a list of raster collections, you'll need to send
+   * a get request to retrieve the attribution for each raster collection.
+   */
   core.String attribution;
 
   /**
    * A rectangular bounding box which contains all of the data in this
-   * RasterCollection. The numbers represent latitude and longitude in decimal
-   * degrees.
+   * RasterCollection. The box is expressed as \"west, south, east, north\". The
+   * numbers represent latitude and longitude in decimal degrees.
    */
   core.List<core.double> bbox;
 
@@ -6657,23 +7747,25 @@
    */
   core.DateTime creationTime;
 
+  /**
+   * The email address of the creator of this raster collection. This is only
+   * returned on GET requests and not LIST requests.
+   */
+  core.String creatorEmail;
+
   /** The description of this RasterCollection, supplied by the author. */
   core.String description;
 
   /**
    * Deprecated: The name of an access list of the Map Editor type. The user on
    * whose behalf the request is being sent must be an editor on that access
-   * list. Note: Google Maps Engine no longer uses access lists. For backward
-   * compatibility, the API still accepts access lists for projects that are
-   * already using access lists. If you created a GME account/project after July
-   * 14th, 2014, you will not be able to send API requests that include access
-   * lists. The API does not yet support the new permissions model. When you
-   * create a map via the API without specifying permissions, the account that
-   * created the map is the owner and has effective administrator access. Users
-   * can then use the Maps Engine user interface to adjust the permissions. This
-   * is a temporary workaround until the API supports the new permissions model.
-   * Read Add new users and groups in the Google Maps Engine help center for
-   * more information.
+   * list. Note: Google Maps Engine no longer uses access lists. Instead, each
+   * asset has its own list of permissions. For backward compatibility, the API
+   * still accepts access lists for projects that are already using access
+   * lists. If you created a GME account/project after July 14th, 2014, you will
+   * not be able to send API requests that include access lists. Note: This is
+   * an input field only. It is not returned in response to a list or get
+   * request.
    */
   core.String draftAccessList;
 
@@ -6689,6 +7781,12 @@
    */
   core.DateTime lastModifiedTime;
 
+  /**
+   * The email address of the last modifier of this raster collection. This is
+   * only returned on GET requests and not LIST requests.
+   */
+  core.String lastModifierEmail;
+
   /** True if this RasterCollection is a mosaic. */
   core.bool mosaic;
 
@@ -6719,6 +7817,9 @@
   /** Tags of this RasterCollection. */
   Tags tags;
 
+  /** If true, WRITERs of the asset are able to edit the asset permissions. */
+  core.bool writersCanEditPermissions;
+
 
   RasterCollection();
 
@@ -6732,6 +7833,9 @@
     if (_json.containsKey("creationTime")) {
       creationTime = core.DateTime.parse(_json["creationTime"]);
     }
+    if (_json.containsKey("creatorEmail")) {
+      creatorEmail = _json["creatorEmail"];
+    }
     if (_json.containsKey("description")) {
       description = _json["description"];
     }
@@ -6747,6 +7851,9 @@
     if (_json.containsKey("lastModifiedTime")) {
       lastModifiedTime = core.DateTime.parse(_json["lastModifiedTime"]);
     }
+    if (_json.containsKey("lastModifierEmail")) {
+      lastModifierEmail = _json["lastModifierEmail"];
+    }
     if (_json.containsKey("mosaic")) {
       mosaic = _json["mosaic"];
     }
@@ -6765,6 +7872,9 @@
     if (_json.containsKey("tags")) {
       tags = new Tags.fromJson(_json["tags"]);
     }
+    if (_json.containsKey("writersCanEditPermissions")) {
+      writersCanEditPermissions = _json["writersCanEditPermissions"];
+    }
   }
 
   core.Map toJson() {
@@ -6778,6 +7888,9 @@
     if (creationTime != null) {
       _json["creationTime"] = (creationTime).toIso8601String();
     }
+    if (creatorEmail != null) {
+      _json["creatorEmail"] = creatorEmail;
+    }
     if (description != null) {
       _json["description"] = description;
     }
@@ -6793,6 +7906,9 @@
     if (lastModifiedTime != null) {
       _json["lastModifiedTime"] = (lastModifiedTime).toIso8601String();
     }
+    if (lastModifierEmail != null) {
+      _json["lastModifierEmail"] = lastModifierEmail;
+    }
     if (mosaic != null) {
       _json["mosaic"] = mosaic;
     }
@@ -6811,12 +7927,21 @@
     if (tags != null) {
       _json["tags"] = tags;
     }
+    if (writersCanEditPermissions != null) {
+      _json["writersCanEditPermissions"] = writersCanEditPermissions;
+    }
     return _json;
   }
 }
 
 
-/** The response returned by a call to raster_collections.List. */
+/**
+ * The response returned by a call to raster_collections.List. Note: The list
+ * response does not include all the fields available in a raster collection.
+ * Refer to the RasterCollection resource description for details of the fields
+ * that are not included. You'll need to send a get request to retrieve the
+ * additional fields for each raster collection.
+ */
 class RasterCollectionsListResponse {
   /** Next page token. */
   core.String nextPageToken;
@@ -6861,7 +7986,8 @@
 class RasterCollectionsRaster {
   /**
    * A rectangular bounding box which contains all of the data in this Raster.
-   * The numbers represent latitude and longitude in decimal degrees.
+   * The box is expressed as \"west, south, east, north\". The numbers represent
+   * latitudes and longitudes in decimal degrees.
    */
   core.List<core.double> bbox;
 
@@ -7316,8 +8442,9 @@
 /** A collection of geographic features, and associated metadata. */
 class Table {
   /**
-   * A rectangular bounding box which contains all of the data in this table.
-   * The numbers represent latitude and longitude in decimal degrees.
+   * A rectangular bounding box which contains all of the data in this Table.
+   * The box is expressed as \"west, south, east, north\". The numbers represent
+   * latitude and longitude in decimal degrees.
    */
   core.List<core.double> bbox;
 
@@ -7327,23 +8454,25 @@
    */
   core.DateTime creationTime;
 
+  /**
+   * The email address of the creator of this table. This is only returned on
+   * GET requests and not LIST requests.
+   */
+  core.String creatorEmail;
+
   /** The description of this table, supplied by the author. */
   core.String description;
 
   /**
    * Deprecated: The name of an access list of the Map Editor type. The user on
    * whose behalf the request is being sent must be an editor on that access
-   * list. Note: Google Maps Engine no longer uses access lists. For backward
-   * compatibility, the API still accepts access lists for projects that are
-   * already using access lists. If you created a GME account/project after July
-   * 14th, 2014, you will not be able to send API requests that include access
-   * lists. The API does not yet support the new permissions model. When you
-   * create a map via the API without specifying permissions, the account that
-   * created the map is the owner and has effective administrator access. Users
-   * can then use the Maps Engine user interface to adjust the permissions. This
-   * is a temporary workaround until the API supports the new permissions model.
-   * Read Add new users and groups in the Google Maps Engine help center for
-   * more information.
+   * list. Note: Google Maps Engine no longer uses access lists. Instead, each
+   * asset has its own list of permissions. For backward compatibility, the API
+   * still accepts access lists for projects that are already using access
+   * lists. If you created a GME account/project after July 14th, 2014, you will
+   * not be able to send API requests that include access lists. Note: This is
+   * an input field only. It is not returned in response to a list or get
+   * request.
    */
   core.String draftAccessList;
 
@@ -7362,6 +8491,12 @@
    */
   core.DateTime lastModifiedTime;
 
+  /**
+   * The email address of the last modifier of this table. This is only returned
+   * on GET requests and not LIST requests.
+   */
+  core.String lastModifierEmail;
+
   /** The name of this table, supplied by the author. */
   core.String name;
 
@@ -7382,12 +8517,21 @@
   /**
    * Deprecated: The access list to whom view permissions are granted. The value
    * must be the name of a Maps Engine access list of the Map Viewer type, and
-   * the user must be a viewer on that list. Read Share data, layers, and maps
-   * in the Google Maps Engine help center for more information.
+   * the user must be a viewer on that list. Note: Google Maps Engine no longer
+   * uses access lists. Instead, each asset has its own list of permissions. For
+   * backward compatibility, the API still accepts access lists for projects
+   * that are already using access lists. If you created a GME account/project
+   * after July 14th, 2014, you will not be able to send API requests that
+   * include access lists. Note: This is an input field only. It is not returned
+   * in response to a list or get request.
    */
   core.String publishedAccessList;
 
-  /** The schema for this table. */
+  /**
+   * The schema for this table. Note: The schema is returned in response to a
+   * get request but not a list request. After requesting a list of tables,
+   * you'll need to send a get request to retrieve the schema for each table.
+   */
   Schema schema;
 
   /**
@@ -7403,6 +8547,9 @@
    */
   Tags tags;
 
+  /** If true, WRITERs of the asset are able to edit the asset permissions. */
+  core.bool writersCanEditPermissions;
+
 
   Table();
 
@@ -7413,6 +8560,9 @@
     if (_json.containsKey("creationTime")) {
       creationTime = core.DateTime.parse(_json["creationTime"]);
     }
+    if (_json.containsKey("creatorEmail")) {
+      creatorEmail = _json["creatorEmail"];
+    }
     if (_json.containsKey("description")) {
       description = _json["description"];
     }
@@ -7431,6 +8581,9 @@
     if (_json.containsKey("lastModifiedTime")) {
       lastModifiedTime = core.DateTime.parse(_json["lastModifiedTime"]);
     }
+    if (_json.containsKey("lastModifierEmail")) {
+      lastModifierEmail = _json["lastModifierEmail"];
+    }
     if (_json.containsKey("name")) {
       name = _json["name"];
     }
@@ -7452,6 +8605,9 @@
     if (_json.containsKey("tags")) {
       tags = new Tags.fromJson(_json["tags"]);
     }
+    if (_json.containsKey("writersCanEditPermissions")) {
+      writersCanEditPermissions = _json["writersCanEditPermissions"];
+    }
   }
 
   core.Map toJson() {
@@ -7462,6 +8618,9 @@
     if (creationTime != null) {
       _json["creationTime"] = (creationTime).toIso8601String();
     }
+    if (creatorEmail != null) {
+      _json["creatorEmail"] = creatorEmail;
+    }
     if (description != null) {
       _json["description"] = description;
     }
@@ -7480,6 +8639,9 @@
     if (lastModifiedTime != null) {
       _json["lastModifiedTime"] = (lastModifiedTime).toIso8601String();
     }
+    if (lastModifierEmail != null) {
+      _json["lastModifierEmail"] = lastModifierEmail;
+    }
     if (name != null) {
       _json["name"] = name;
     }
@@ -7501,6 +8663,9 @@
     if (tags != null) {
       _json["tags"] = tags;
     }
+    if (writersCanEditPermissions != null) {
+      _json["writersCanEditPermissions"] = writersCanEditPermissions;
+    }
     return _json;
   }
 }
@@ -7550,7 +8715,12 @@
 }
 
 
-/** The response returned by a call to tables.List. */
+/**
+ * The response returned by a call to tables.List. Note: The list response does
+ * not include all the fields available in a table. Refer to the table resource
+ * description for details of the fields that are not included. You'll need to
+ * send a get request to retrieve the additional fields for each table.
+ */
 class TablesListResponse {
   /** Next page token. */
   core.String nextPageToken;
diff --git a/generated/googleapis/lib/mirror/v1.dart b/generated/googleapis/lib/mirror/v1.dart
index 9212fb6..81e7a79 100644
--- a/generated/googleapis/lib/mirror/v1.dart
+++ b/generated/googleapis/lib/mirror/v1.dart
@@ -32,7 +32,7 @@
   TimelineResourceApi get timeline => new TimelineResourceApi(_requester);
 
   MirrorApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/mirror/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "mirror/v1/");
 }
 
 
@@ -1776,6 +1776,16 @@
   core.String action;
 
   /**
+   * The ContextualMenus.Command associated with this MenuItem (e.g.
+   * READ_ALOUD). The voice label for this command will be displayed in the
+   * voice menu and the touch label will be displayed in the touch menu. Note
+   * that the default menu value's display name will be overriden if you specify
+   * this property. Values that do not correspond to a ContextualMenus.Command
+   * name will be ignored.
+   */
+  core.String contextualCommand;
+
+  /**
    * The ID for this menu item. This is generated by the application and is
    * treated as an opaque token.
    */
@@ -1813,6 +1823,9 @@
     if (_json.containsKey("action")) {
       action = _json["action"];
     }
+    if (_json.containsKey("contextual_command")) {
+      contextualCommand = _json["contextual_command"];
+    }
     if (_json.containsKey("id")) {
       id = _json["id"];
     }
@@ -1832,6 +1845,9 @@
     if (action != null) {
       _json["action"] = action;
     }
+    if (contextualCommand != null) {
+      _json["contextual_command"] = contextualCommand;
+    }
     if (id != null) {
       _json["id"] = id;
     }
diff --git a/generated/googleapis/lib/oauth2/v2.dart b/generated/googleapis/lib/oauth2/v2.dart
index 57c8adf..4b352a1 100644
--- a/generated/googleapis/lib/oauth2/v2.dart
+++ b/generated/googleapis/lib/oauth2/v2.dart
@@ -33,7 +33,7 @@
   UserinfoResourceApi get userinfo => new UserinfoResourceApi(_requester);
 
   Oauth2Api(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "");
 
   /**
    * Not documented yet.
diff --git a/generated/googleapis/lib/orkut/v2.dart b/generated/googleapis/lib/orkut/v2.dart
index f99d6c4..0936a14 100644
--- a/generated/googleapis/lib/orkut/v2.dart
+++ b/generated/googleapis/lib/orkut/v2.dart
@@ -45,7 +45,7 @@
   ScrapsResourceApi get scraps => new ScrapsResourceApi(_requester);
 
   OrkutApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/orkut/v2/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "orkut/v2/");
 }
 
 
diff --git a/generated/googleapis/lib/pagespeedonline/v1.dart b/generated/googleapis/lib/pagespeedonline/v1.dart
index d690526..3e4f397 100644
--- a/generated/googleapis/lib/pagespeedonline/v1.dart
+++ b/generated/googleapis/lib/pagespeedonline/v1.dart
@@ -24,7 +24,7 @@
   PagespeedapiResourceApi get pagespeedapi => new PagespeedapiResourceApi(_requester);
 
   PagespeedonlineApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/pagespeedonline/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "pagespeedonline/v1/");
 }
 
 
diff --git a/generated/googleapis/lib/plus/v1.dart b/generated/googleapis/lib/plus/v1.dart
index 8e1c018..3220c43 100644
--- a/generated/googleapis/lib/plus/v1.dart
+++ b/generated/googleapis/lib/plus/v1.dart
@@ -38,7 +38,7 @@
   PeopleResourceApi get people => new PeopleResourceApi(_requester);
 
   PlusApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/plus/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "plus/v1/");
 }
 
 
diff --git a/generated/googleapis/lib/plusdomains/v1.dart b/generated/googleapis/lib/plusdomains/v1.dart
index 4b9ad58..8f5b6a0 100644
--- a/generated/googleapis/lib/plusdomains/v1.dart
+++ b/generated/googleapis/lib/plusdomains/v1.dart
@@ -62,7 +62,7 @@
   PeopleResourceApi get people => new PeopleResourceApi(_requester);
 
   PlusDomainsApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/plusDomains/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "plusDomains/v1/");
 }
 
 
diff --git a/generated/googleapis/lib/prediction/v1_6.dart b/generated/googleapis/lib/prediction/v1_6.dart
index fd148d8..f53d16e 100644
--- a/generated/googleapis/lib/prediction/v1_6.dart
+++ b/generated/googleapis/lib/prediction/v1_6.dart
@@ -37,7 +37,7 @@
   TrainedmodelsResourceApi get trainedmodels => new TrainedmodelsResourceApi(_requester);
 
   PredictionApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/prediction/v1.6/projects/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "prediction/v1.6/projects/");
 }
 
 
@@ -1365,7 +1365,7 @@
   core.List<OutputOutputMulti> outputMulti;
 
   /** The estimated regression value (Regression models only). */
-  core.double outputValue;
+  core.String outputValue;
 
   /** A URL to re-request this resource. */
   core.String selfLink;
diff --git a/generated/googleapis/lib/qpxexpress/v1.dart b/generated/googleapis/lib/qpxexpress/v1.dart
index 9f0f701..ff4a39a 100644
--- a/generated/googleapis/lib/qpxexpress/v1.dart
+++ b/generated/googleapis/lib/qpxexpress/v1.dart
@@ -24,7 +24,7 @@
   TripsResourceApi get trips => new TripsResourceApi(_requester);
 
   QpxExpressApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/qpxExpress/v1/trips/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "qpxExpress/v1/trips/");
 }
 
 
diff --git a/generated/googleapis/lib/reseller/v1.dart b/generated/googleapis/lib/reseller/v1.dart
index 117400f..316cf25 100644
--- a/generated/googleapis/lib/reseller/v1.dart
+++ b/generated/googleapis/lib/reseller/v1.dart
@@ -28,7 +28,7 @@
   SubscriptionsResourceApi get subscriptions => new SubscriptionsResourceApi(_requester);
 
   ResellerApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/apps/reseller/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "apps/reseller/v1/");
 }
 
 
diff --git a/generated/googleapis/lib/siteverification/v1.dart b/generated/googleapis/lib/siteverification/v1.dart
index bda5a8e..1b0bff2 100644
--- a/generated/googleapis/lib/siteverification/v1.dart
+++ b/generated/googleapis/lib/siteverification/v1.dart
@@ -29,7 +29,7 @@
   WebResourceResourceApi get webResource => new WebResourceResourceApi(_requester);
 
   SiteVerificationApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/siteVerification/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "siteVerification/v1/");
 }
 
 
diff --git a/generated/googleapis/lib/src/common_internal.dart b/generated/googleapis/lib/src/common_internal.dart
index 9549d7f..2b60eb2 100644
--- a/generated/googleapis/lib/src/common_internal.dart
+++ b/generated/googleapis/lib/src/common_internal.dart
@@ -9,7 +9,7 @@
 import "package:http/http.dart" as http;
 
 const String USER_AGENT_STRING =
-    'google-api-dart-client googleapis/0.1.1';
+    'google-api-dart-client googleapis/0.2.0';
 
 const CONTENT_TYPE_JSON_UTF8 = 'application/json; charset=utf-8';
 
@@ -152,7 +152,7 @@
     if (requestUrl.startsWith('/')) {
       path ="$_rootUrl${requestUrl.substring(1)}";
     } else {
-      path ="$_rootUrl${_basePath.substring(1)}$requestUrl";
+      path ="$_rootUrl${_basePath}$requestUrl";
     }
 
     bool containsQueryParameter = path.contains('?');
@@ -430,12 +430,19 @@
 
         // Upload all but the last chunk.
         // The final send will be done in the [onDone] handler.
-        if (chunkStack.length > 1) {
+        bool hasPartialChunk = chunkStack.hasPartialChunk;
+        if (chunkStack.length > 1 ||
+            (chunkStack.length == 1 && hasPartialChunk)) {
           // Pause the input stream.
           subscription.pause();
 
           // Upload all chunks except the last one.
-          var fullChunks = chunkStack.removeSublist(0, chunkStack.length - 1);
+          var fullChunks;
+          if (hasPartialChunk) {
+            fullChunks = chunkStack.removeSublist(0, chunkStack.length);
+          } else {
+            fullChunks = chunkStack.removeSublist(0, chunkStack.length - 1);
+          }
           Future.forEach(fullChunks,
                          (c) => _uploadChunkDrained(uploadUri, c)).then((_) {
             // All chunks uploaded, we can continue consuming data.
@@ -457,11 +464,13 @@
           chunkStack.finalize();
 
           var lastChunk;
-          if (chunkStack.totalByteLength > 0) {
-            assert(chunkStack.length == 1);
+          if (chunkStack.length == 1) {
             lastChunk = chunkStack.removeSublist(0, chunkStack.length).first;
           } else {
-            lastChunk = new ResumableChunk([], 0, 0);
+            completer.completeError(new StateError(
+                'Resumable uploads need to result in at least one non-empty '
+                'chunk at the end.'));
+            return;
           }
           var end = lastChunk.endOfChunk;
 
@@ -654,16 +663,34 @@
   // Currently accumulated data.
   List<List<int>> _byteArrays = [];
   int _length = 0;
-  int _totalLength = 0;
   int _offset = 0;
 
   bool _finalized = false;
 
   ChunkStack(this._chunkSize);
 
+  /**
+   * Whether data for a not-yet-finished [ResumableChunk] is present. A call to
+   * `finalize` will create a [ResumableChunk] of this data.
+   */
+  bool get hasPartialChunk => _length > 0;
+
+  /**
+   * The number of chunks in this [ChunkStack].
+   */
   int get length => _chunkStack.length;
 
-  int get totalByteLength => _offset;
+  /**
+   * The total number of bytes which have been converted to [ResumableChunk]s.
+   * Can only be called once this [ChunkStack] has been finalized.
+   */
+  int get totalByteLength {
+    if (!_finalized) {
+      throw new StateError('ChunkStack has not been finalized yet.');
+    }
+
+    return _offset;
+  }
 
   /**
    * Returns the chunks [from] ... [to] and deletes it from the stack.
diff --git a/generated/googleapis/lib/storage/v1.dart b/generated/googleapis/lib/storage/v1.dart
index 50d312b..a9fe572 100644
--- a/generated/googleapis/lib/storage/v1.dart
+++ b/generated/googleapis/lib/storage/v1.dart
@@ -35,7 +35,7 @@
   ObjectsResourceApi get objects => new ObjectsResourceApi(_requester);
 
   StorageApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/storage/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "storage/v1/");
 }
 
 
diff --git a/generated/googleapis/lib/tasks/v1.dart b/generated/googleapis/lib/tasks/v1.dart
index 006d18d..47807f9 100644
--- a/generated/googleapis/lib/tasks/v1.dart
+++ b/generated/googleapis/lib/tasks/v1.dart
@@ -28,7 +28,7 @@
   TasksResourceApi get tasks => new TasksResourceApi(_requester);
 
   TasksApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/tasks/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "tasks/v1/");
 }
 
 
diff --git a/generated/googleapis/lib/translate/v2.dart b/generated/googleapis/lib/translate/v2.dart
index 03f2b19..fa6e34b 100644
--- a/generated/googleapis/lib/translate/v2.dart
+++ b/generated/googleapis/lib/translate/v2.dart
@@ -23,7 +23,7 @@
   TranslationsResourceApi get translations => new TranslationsResourceApi(_requester);
 
   TranslateApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/language/translate/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "language/translate/");
 }
 
 
diff --git a/generated/googleapis/lib/urlshortener/v1.dart b/generated/googleapis/lib/urlshortener/v1.dart
index bcff89b..2345c85 100644
--- a/generated/googleapis/lib/urlshortener/v1.dart
+++ b/generated/googleapis/lib/urlshortener/v1.dart
@@ -24,7 +24,7 @@
   UrlResourceApi get url => new UrlResourceApi(_requester);
 
   UrlshortenerApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/urlshortener/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "urlshortener/v1/");
 }
 
 
diff --git a/generated/googleapis/lib/webfonts/v1.dart b/generated/googleapis/lib/webfonts/v1.dart
index ce5c196..08e7bad 100644
--- a/generated/googleapis/lib/webfonts/v1.dart
+++ b/generated/googleapis/lib/webfonts/v1.dart
@@ -21,7 +21,7 @@
   WebfontsResourceApi get webfonts => new WebfontsResourceApi(_requester);
 
   WebfontsApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/webfonts/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "webfonts/v1/");
 }
 
 
diff --git a/generated/googleapis/lib/youtube/v3.dart b/generated/googleapis/lib/youtube/v3.dart
index 33b6132..0f0fca2 100644
--- a/generated/googleapis/lib/youtube/v3.dart
+++ b/generated/googleapis/lib/youtube/v3.dart
@@ -55,7 +55,7 @@
   WatermarksResourceApi get watermarks => new WatermarksResourceApi(_requester);
 
   YoutubeApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/youtube/v3/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "youtube/v3/");
 }
 
 
diff --git a/generated/googleapis/lib/youtubeanalytics/v1.dart b/generated/googleapis/lib/youtubeanalytics/v1.dart
index dae5e36..9cfc553 100644
--- a/generated/googleapis/lib/youtubeanalytics/v1.dart
+++ b/generated/googleapis/lib/youtubeanalytics/v1.dart
@@ -29,7 +29,7 @@
   ReportsResourceApi get reports => new ReportsResourceApi(_requester);
 
   YoutubeAnalyticsApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/youtube/analytics/v1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "youtube/analytics/v1/");
 }
 
 
diff --git a/generated/googleapis/pubspec.yaml b/generated/googleapis/pubspec.yaml
index 5318b66..b8648e0 100644
--- a/generated/googleapis/pubspec.yaml
+++ b/generated/googleapis/pubspec.yaml
@@ -1,5 +1,5 @@
 name: googleapis
-version: 0.1.1
+version: 0.2.0
 author: Dart Team <misc@dartlang.org>
 description: "Auto-generated client libraries for accessing the following APIs:adexchangebuyer:v1.3, adexchangeseller:v1.1, admin:directory_v1, admin:email_migration_v2, admin:reports_v1, adsense:v1.4, adsensehost:v4.1, analytics:v3, androidpublisher:v2, appsactivity:v1, appstate:v1, bigquery:v2, blogger:v3, books:v1, calendar:v3, civicinfo:us_v1, civicinfo:v1, compute:v1, content:v2, coordinate:v1, customsearch:v1, dfareporting:v1.3, discovery:v1, doubleclickbidmanager:v1, doubleclicksearch:v2, drive:v2, freebase:v1, fusiontables:v1, games:v1, gamesManagement:v1management, gmail:v1, groupsmigration:v1, groupssettings:v1, identitytoolkit:v3, licensing:v1, mapsengine:v1, mirror:v1, oauth2:v2, orkut:v2, pagespeedonline:v1, plus:v1, plusDomains:v1, prediction:v1.6, qpxExpress:v1, reseller:v1, siteVerification:v1, storage:v1, tasks:v1, translate:v2, urlshortener:v1, webfonts:v1, youtube:v3, youtubeAnalytics:v1"
 homepage: http://www.dartlang.org
diff --git a/generated/googleapis/test/adexchangebuyer/v1_3_test.dart b/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
index fb37171..ae05655 100644
--- a/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
+++ b/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
@@ -39,14 +39,14 @@
   buildCounterAccountBidderLocation--;
 }
 
-buildUnnamed537() {
+buildUnnamed565() {
   var o = new core.List<api.AccountBidderLocation>();
   o.add(buildAccountBidderLocation());
   o.add(buildAccountBidderLocation());
   return o;
 }
 
-checkUnnamed537(core.List<api.AccountBidderLocation> o) {
+checkUnnamed565(core.List<api.AccountBidderLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountBidderLocation(o[0]);
   checkAccountBidderLocation(o[1]);
@@ -57,7 +57,7 @@
   var o = new api.Account();
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    o.bidderLocation = buildUnnamed537();
+    o.bidderLocation = buildUnnamed565();
     o.cookieMatchingNid = "foo";
     o.cookieMatchingUrl = "foo";
     o.id = 42;
@@ -71,7 +71,7 @@
 checkAccount(api.Account o) {
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    checkUnnamed537(o.bidderLocation);
+    checkUnnamed565(o.bidderLocation);
     unittest.expect(o.cookieMatchingNid, unittest.equals('foo'));
     unittest.expect(o.cookieMatchingUrl, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals(42));
@@ -81,14 +81,14 @@
   buildCounterAccount--;
 }
 
-buildUnnamed538() {
+buildUnnamed566() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed538(core.List<api.Account> o) {
+checkUnnamed566(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -99,7 +99,7 @@
   var o = new api.AccountsList();
   buildCounterAccountsList++;
   if (buildCounterAccountsList < 3) {
-    o.items = buildUnnamed538();
+    o.items = buildUnnamed566();
     o.kind = "foo";
   }
   buildCounterAccountsList--;
@@ -109,20 +109,20 @@
 checkAccountsList(api.AccountsList o) {
   buildCounterAccountsList++;
   if (buildCounterAccountsList < 3) {
-    checkUnnamed538(o.items);
+    checkUnnamed566(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountsList--;
 }
 
-buildUnnamed539() {
+buildUnnamed567() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed539(core.List<core.String> o) {
+checkUnnamed567(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -135,7 +135,7 @@
   if (buildCounterBillingInfo < 3) {
     o.accountId = 42;
     o.accountName = "foo";
-    o.billingId = buildUnnamed539();
+    o.billingId = buildUnnamed567();
     o.kind = "foo";
   }
   buildCounterBillingInfo--;
@@ -147,20 +147,20 @@
   if (buildCounterBillingInfo < 3) {
     unittest.expect(o.accountId, unittest.equals(42));
     unittest.expect(o.accountName, unittest.equals('foo'));
-    checkUnnamed539(o.billingId);
+    checkUnnamed567(o.billingId);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBillingInfo--;
 }
 
-buildUnnamed540() {
+buildUnnamed568() {
   var o = new core.List<api.BillingInfo>();
   o.add(buildBillingInfo());
   o.add(buildBillingInfo());
   return o;
 }
 
-checkUnnamed540(core.List<api.BillingInfo> o) {
+checkUnnamed568(core.List<api.BillingInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBillingInfo(o[0]);
   checkBillingInfo(o[1]);
@@ -171,7 +171,7 @@
   var o = new api.BillingInfoList();
   buildCounterBillingInfoList++;
   if (buildCounterBillingInfoList < 3) {
-    o.items = buildUnnamed540();
+    o.items = buildUnnamed568();
     o.kind = "foo";
   }
   buildCounterBillingInfoList--;
@@ -181,59 +181,59 @@
 checkBillingInfoList(api.BillingInfoList o) {
   buildCounterBillingInfoList++;
   if (buildCounterBillingInfoList < 3) {
-    checkUnnamed540(o.items);
+    checkUnnamed568(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBillingInfoList--;
 }
 
-buildUnnamed541() {
+buildUnnamed569() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed541(core.List<core.String> o) {
+checkUnnamed569(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed542() {
+buildUnnamed570() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed542(core.List<core.int> o) {
+checkUnnamed570(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed543() {
+buildUnnamed571() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed543(core.List<core.String> o) {
+checkUnnamed571(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed544() {
+buildUnnamed572() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed544(core.List<core.String> o) {
+checkUnnamed572(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -244,7 +244,7 @@
   var o = new api.CreativeCorrections();
   buildCounterCreativeCorrections++;
   if (buildCounterCreativeCorrections < 3) {
-    o.details = buildUnnamed544();
+    o.details = buildUnnamed572();
     o.reason = "foo";
   }
   buildCounterCreativeCorrections--;
@@ -254,33 +254,33 @@
 checkCreativeCorrections(api.CreativeCorrections o) {
   buildCounterCreativeCorrections++;
   if (buildCounterCreativeCorrections < 3) {
-    checkUnnamed544(o.details);
+    checkUnnamed572(o.details);
     unittest.expect(o.reason, unittest.equals('foo'));
   }
   buildCounterCreativeCorrections--;
 }
 
-buildUnnamed545() {
+buildUnnamed573() {
   var o = new core.List<api.CreativeCorrections>();
   o.add(buildCreativeCorrections());
   o.add(buildCreativeCorrections());
   return o;
 }
 
-checkUnnamed545(core.List<api.CreativeCorrections> o) {
+checkUnnamed573(core.List<api.CreativeCorrections> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeCorrections(o[0]);
   checkCreativeCorrections(o[1]);
 }
 
-buildUnnamed546() {
+buildUnnamed574() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed546(core.List<core.String> o) {
+checkUnnamed574(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -291,7 +291,7 @@
   var o = new api.CreativeDisapprovalReasons();
   buildCounterCreativeDisapprovalReasons++;
   if (buildCounterCreativeDisapprovalReasons < 3) {
-    o.details = buildUnnamed546();
+    o.details = buildUnnamed574();
     o.reason = "foo";
   }
   buildCounterCreativeDisapprovalReasons--;
@@ -301,20 +301,20 @@
 checkCreativeDisapprovalReasons(api.CreativeDisapprovalReasons o) {
   buildCounterCreativeDisapprovalReasons++;
   if (buildCounterCreativeDisapprovalReasons < 3) {
-    checkUnnamed546(o.details);
+    checkUnnamed574(o.details);
     unittest.expect(o.reason, unittest.equals('foo'));
   }
   buildCounterCreativeDisapprovalReasons--;
 }
 
-buildUnnamed547() {
+buildUnnamed575() {
   var o = new core.List<api.CreativeDisapprovalReasons>();
   o.add(buildCreativeDisapprovalReasons());
   o.add(buildCreativeDisapprovalReasons());
   return o;
 }
 
-checkUnnamed547(core.List<api.CreativeDisapprovalReasons> o) {
+checkUnnamed575(core.List<api.CreativeDisapprovalReasons> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeDisapprovalReasons(o[0]);
   checkCreativeDisapprovalReasons(o[1]);
@@ -341,14 +341,14 @@
   buildCounterCreativeFilteringReasonsReasons--;
 }
 
-buildUnnamed548() {
+buildUnnamed576() {
   var o = new core.List<api.CreativeFilteringReasonsReasons>();
   o.add(buildCreativeFilteringReasonsReasons());
   o.add(buildCreativeFilteringReasonsReasons());
   return o;
 }
 
-checkUnnamed548(core.List<api.CreativeFilteringReasonsReasons> o) {
+checkUnnamed576(core.List<api.CreativeFilteringReasonsReasons> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreativeFilteringReasonsReasons(o[0]);
   checkCreativeFilteringReasonsReasons(o[1]);
@@ -360,7 +360,7 @@
   buildCounterCreativeFilteringReasons++;
   if (buildCounterCreativeFilteringReasons < 3) {
     o.date = "foo";
-    o.reasons = buildUnnamed548();
+    o.reasons = buildUnnamed576();
   }
   buildCounterCreativeFilteringReasons--;
   return o;
@@ -370,58 +370,58 @@
   buildCounterCreativeFilteringReasons++;
   if (buildCounterCreativeFilteringReasons < 3) {
     unittest.expect(o.date, unittest.equals('foo'));
-    checkUnnamed548(o.reasons);
+    checkUnnamed576(o.reasons);
   }
   buildCounterCreativeFilteringReasons--;
 }
 
-buildUnnamed549() {
+buildUnnamed577() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed549(core.List<core.int> o) {
+checkUnnamed577(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed550() {
+buildUnnamed578() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed550(core.List<core.int> o) {
+checkUnnamed578(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed551() {
+buildUnnamed579() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed551(core.List<core.int> o) {
+checkUnnamed579(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed552() {
+buildUnnamed580() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed552(core.List<core.int> o) {
+checkUnnamed580(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
@@ -434,22 +434,22 @@
   if (buildCounterCreative < 3) {
     o.HTMLSnippet = "foo";
     o.accountId = 42;
-    o.advertiserId = buildUnnamed541();
+    o.advertiserId = buildUnnamed569();
     o.advertiserName = "foo";
     o.agencyId = "foo";
-    o.attribute = buildUnnamed542();
+    o.attribute = buildUnnamed570();
     o.buyerCreativeId = "foo";
-    o.clickThroughUrl = buildUnnamed543();
-    o.corrections = buildUnnamed545();
-    o.disapprovalReasons = buildUnnamed547();
+    o.clickThroughUrl = buildUnnamed571();
+    o.corrections = buildUnnamed573();
+    o.disapprovalReasons = buildUnnamed575();
     o.filteringReasons = buildCreativeFilteringReasons();
     o.height = 42;
     o.kind = "foo";
-    o.productCategories = buildUnnamed549();
-    o.restrictedCategories = buildUnnamed550();
-    o.sensitiveCategories = buildUnnamed551();
+    o.productCategories = buildUnnamed577();
+    o.restrictedCategories = buildUnnamed578();
+    o.sensitiveCategories = buildUnnamed579();
     o.status = "foo";
-    o.vendorType = buildUnnamed552();
+    o.vendorType = buildUnnamed580();
     o.videoURL = "foo";
     o.width = 42;
   }
@@ -462,36 +462,36 @@
   if (buildCounterCreative < 3) {
     unittest.expect(o.HTMLSnippet, unittest.equals('foo'));
     unittest.expect(o.accountId, unittest.equals(42));
-    checkUnnamed541(o.advertiserId);
+    checkUnnamed569(o.advertiserId);
     unittest.expect(o.advertiserName, unittest.equals('foo'));
     unittest.expect(o.agencyId, unittest.equals('foo'));
-    checkUnnamed542(o.attribute);
+    checkUnnamed570(o.attribute);
     unittest.expect(o.buyerCreativeId, unittest.equals('foo'));
-    checkUnnamed543(o.clickThroughUrl);
-    checkUnnamed545(o.corrections);
-    checkUnnamed547(o.disapprovalReasons);
+    checkUnnamed571(o.clickThroughUrl);
+    checkUnnamed573(o.corrections);
+    checkUnnamed575(o.disapprovalReasons);
     checkCreativeFilteringReasons(o.filteringReasons);
     unittest.expect(o.height, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed549(o.productCategories);
-    checkUnnamed550(o.restrictedCategories);
-    checkUnnamed551(o.sensitiveCategories);
+    checkUnnamed577(o.productCategories);
+    checkUnnamed578(o.restrictedCategories);
+    checkUnnamed579(o.sensitiveCategories);
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed552(o.vendorType);
+    checkUnnamed580(o.vendorType);
     unittest.expect(o.videoURL, unittest.equals('foo'));
     unittest.expect(o.width, unittest.equals(42));
   }
   buildCounterCreative--;
 }
 
-buildUnnamed553() {
+buildUnnamed581() {
   var o = new core.List<api.Creative>();
   o.add(buildCreative());
   o.add(buildCreative());
   return o;
 }
 
-checkUnnamed553(core.List<api.Creative> o) {
+checkUnnamed581(core.List<api.Creative> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCreative(o[0]);
   checkCreative(o[1]);
@@ -502,7 +502,7 @@
   var o = new api.CreativesList();
   buildCounterCreativesList++;
   if (buildCounterCreativesList < 3) {
-    o.items = buildUnnamed553();
+    o.items = buildUnnamed581();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -513,7 +513,7 @@
 checkCreativesList(api.CreativesList o) {
   buildCounterCreativesList++;
   if (buildCounterCreativesList < 3) {
-    checkUnnamed553(o.items);
+    checkUnnamed581(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -561,14 +561,14 @@
   buildCounterDirectDeal--;
 }
 
-buildUnnamed554() {
+buildUnnamed582() {
   var o = new core.List<api.DirectDeal>();
   o.add(buildDirectDeal());
   o.add(buildDirectDeal());
   return o;
 }
 
-checkUnnamed554(core.List<api.DirectDeal> o) {
+checkUnnamed582(core.List<api.DirectDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDirectDeal(o[0]);
   checkDirectDeal(o[1]);
@@ -579,7 +579,7 @@
   var o = new api.DirectDealsList();
   buildCounterDirectDealsList++;
   if (buildCounterDirectDealsList < 3) {
-    o.directDeals = buildUnnamed554();
+    o.directDeals = buildUnnamed582();
     o.kind = "foo";
   }
   buildCounterDirectDealsList--;
@@ -589,59 +589,59 @@
 checkDirectDealsList(api.DirectDealsList o) {
   buildCounterDirectDealsList++;
   if (buildCounterDirectDealsList < 3) {
-    checkUnnamed554(o.directDeals);
+    checkUnnamed582(o.directDeals);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDirectDealsList--;
 }
 
-buildUnnamed555() {
+buildUnnamed583() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed555(core.List<core.Object> o) {
+checkUnnamed583(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) 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')); 
   var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
 }
 
-buildUnnamed556() {
+buildUnnamed584() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed556(core.List<core.Object> o) {
+checkUnnamed584(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o[0]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
   var casted4 = (o[1]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
 }
 
-buildUnnamed557() {
+buildUnnamed585() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed557(core.List<core.Object> o) {
+checkUnnamed585(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o[0]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
   var casted6 = (o[1]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
 }
 
-buildUnnamed558() {
+buildUnnamed586() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed558(core.List<core.Object> o) {
+checkUnnamed586(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted7 = (o[0]) as core.Map; unittest.expect(casted7, unittest.hasLength(3)); unittest.expect(casted7["list"], unittest.equals([1, 2, 3])); unittest.expect(casted7["bool"], unittest.equals(true)); unittest.expect(casted7["string"], unittest.equals('foo')); 
   var casted8 = (o[1]) as core.Map; unittest.expect(casted8, unittest.hasLength(3)); unittest.expect(casted8["list"], unittest.equals([1, 2, 3])); unittest.expect(casted8["bool"], unittest.equals(true)); unittest.expect(casted8["string"], unittest.equals('foo')); 
@@ -652,10 +652,10 @@
   var o = new api.PerformanceReport();
   buildCounterPerformanceReport++;
   if (buildCounterPerformanceReport < 3) {
-    o.calloutStatusRate = buildUnnamed555();
-    o.cookieMatcherStatusRate = buildUnnamed556();
-    o.creativeStatusRate = buildUnnamed557();
-    o.hostedMatchStatusRate = buildUnnamed558();
+    o.calloutStatusRate = buildUnnamed583();
+    o.cookieMatcherStatusRate = buildUnnamed584();
+    o.creativeStatusRate = buildUnnamed585();
+    o.hostedMatchStatusRate = buildUnnamed586();
     o.kind = "foo";
     o.latency50thPercentile = 42.0;
     o.latency85thPercentile = 42.0;
@@ -676,10 +676,10 @@
 checkPerformanceReport(api.PerformanceReport o) {
   buildCounterPerformanceReport++;
   if (buildCounterPerformanceReport < 3) {
-    checkUnnamed555(o.calloutStatusRate);
-    checkUnnamed556(o.cookieMatcherStatusRate);
-    checkUnnamed557(o.creativeStatusRate);
-    checkUnnamed558(o.hostedMatchStatusRate);
+    checkUnnamed583(o.calloutStatusRate);
+    checkUnnamed584(o.cookieMatcherStatusRate);
+    checkUnnamed585(o.creativeStatusRate);
+    checkUnnamed586(o.hostedMatchStatusRate);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.latency50thPercentile, unittest.equals(42.0));
     unittest.expect(o.latency85thPercentile, unittest.equals(42.0));
@@ -696,14 +696,14 @@
   buildCounterPerformanceReport--;
 }
 
-buildUnnamed559() {
+buildUnnamed587() {
   var o = new core.List<api.PerformanceReport>();
   o.add(buildPerformanceReport());
   o.add(buildPerformanceReport());
   return o;
 }
 
-checkUnnamed559(core.List<api.PerformanceReport> o) {
+checkUnnamed587(core.List<api.PerformanceReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPerformanceReport(o[0]);
   checkPerformanceReport(o[1]);
@@ -715,7 +715,7 @@
   buildCounterPerformanceReportList++;
   if (buildCounterPerformanceReportList < 3) {
     o.kind = "foo";
-    o.performanceReport = buildUnnamed559();
+    o.performanceReport = buildUnnamed587();
   }
   buildCounterPerformanceReportList--;
   return o;
@@ -725,19 +725,19 @@
   buildCounterPerformanceReportList++;
   if (buildCounterPerformanceReportList < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed559(o.performanceReport);
+    checkUnnamed587(o.performanceReport);
   }
   buildCounterPerformanceReportList--;
 }
 
-buildUnnamed560() {
+buildUnnamed588() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed560(core.List<core.String> o) {
+checkUnnamed588(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -764,40 +764,40 @@
   buildCounterPretargetingConfigDimensions--;
 }
 
-buildUnnamed561() {
+buildUnnamed589() {
   var o = new core.List<api.PretargetingConfigDimensions>();
   o.add(buildPretargetingConfigDimensions());
   o.add(buildPretargetingConfigDimensions());
   return o;
 }
 
-checkUnnamed561(core.List<api.PretargetingConfigDimensions> o) {
+checkUnnamed589(core.List<api.PretargetingConfigDimensions> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfigDimensions(o[0]);
   checkPretargetingConfigDimensions(o[1]);
 }
 
-buildUnnamed562() {
+buildUnnamed590() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed562(core.List<core.String> o) {
+checkUnnamed590(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed563() {
+buildUnnamed591() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed563(core.List<core.String> o) {
+checkUnnamed591(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -824,105 +824,105 @@
   buildCounterPretargetingConfigExcludedPlacements--;
 }
 
-buildUnnamed564() {
+buildUnnamed592() {
   var o = new core.List<api.PretargetingConfigExcludedPlacements>();
   o.add(buildPretargetingConfigExcludedPlacements());
   o.add(buildPretargetingConfigExcludedPlacements());
   return o;
 }
 
-checkUnnamed564(core.List<api.PretargetingConfigExcludedPlacements> o) {
+checkUnnamed592(core.List<api.PretargetingConfigExcludedPlacements> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfigExcludedPlacements(o[0]);
   checkPretargetingConfigExcludedPlacements(o[1]);
 }
 
-buildUnnamed565() {
+buildUnnamed593() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed565(core.List<core.String> o) {
+checkUnnamed593(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed566() {
+buildUnnamed594() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed566(core.List<core.String> o) {
+checkUnnamed594(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed567() {
+buildUnnamed595() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed567(core.List<core.String> o) {
+checkUnnamed595(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed568() {
+buildUnnamed596() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed568(core.List<core.String> o) {
+checkUnnamed596(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed569() {
+buildUnnamed597() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed569(core.List<core.String> o) {
+checkUnnamed597(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed570() {
+buildUnnamed598() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed570(core.List<core.String> o) {
+checkUnnamed598(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed571() {
+buildUnnamed599() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed571(core.List<core.String> o) {
+checkUnnamed599(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -949,79 +949,79 @@
   buildCounterPretargetingConfigPlacements--;
 }
 
-buildUnnamed572() {
+buildUnnamed600() {
   var o = new core.List<api.PretargetingConfigPlacements>();
   o.add(buildPretargetingConfigPlacements());
   o.add(buildPretargetingConfigPlacements());
   return o;
 }
 
-checkUnnamed572(core.List<api.PretargetingConfigPlacements> o) {
+checkUnnamed600(core.List<api.PretargetingConfigPlacements> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfigPlacements(o[0]);
   checkPretargetingConfigPlacements(o[1]);
 }
 
-buildUnnamed573() {
+buildUnnamed601() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed573(core.List<core.String> o) {
+checkUnnamed601(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed574() {
+buildUnnamed602() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed574(core.List<core.String> o) {
+checkUnnamed602(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed575() {
+buildUnnamed603() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed575(core.List<core.String> o) {
+checkUnnamed603(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed576() {
+buildUnnamed604() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed576(core.List<core.String> o) {
+checkUnnamed604(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed577() {
+buildUnnamed605() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed577(core.List<core.String> o) {
+checkUnnamed605(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1035,26 +1035,26 @@
     o.billingId = "foo";
     o.configId = "foo";
     o.configName = "foo";
-    o.creativeType = buildUnnamed560();
-    o.dimensions = buildUnnamed561();
-    o.excludedContentLabels = buildUnnamed562();
-    o.excludedGeoCriteriaIds = buildUnnamed563();
-    o.excludedPlacements = buildUnnamed564();
-    o.excludedUserLists = buildUnnamed565();
-    o.excludedVerticals = buildUnnamed566();
-    o.geoCriteriaIds = buildUnnamed567();
+    o.creativeType = buildUnnamed588();
+    o.dimensions = buildUnnamed589();
+    o.excludedContentLabels = buildUnnamed590();
+    o.excludedGeoCriteriaIds = buildUnnamed591();
+    o.excludedPlacements = buildUnnamed592();
+    o.excludedUserLists = buildUnnamed593();
+    o.excludedVerticals = buildUnnamed594();
+    o.geoCriteriaIds = buildUnnamed595();
     o.isActive = true;
     o.kind = "foo";
-    o.languages = buildUnnamed568();
-    o.mobileCarriers = buildUnnamed569();
-    o.mobileDevices = buildUnnamed570();
-    o.mobileOperatingSystemVersions = buildUnnamed571();
-    o.placements = buildUnnamed572();
-    o.platforms = buildUnnamed573();
-    o.supportedCreativeAttributes = buildUnnamed574();
-    o.userLists = buildUnnamed575();
-    o.vendorTypes = buildUnnamed576();
-    o.verticals = buildUnnamed577();
+    o.languages = buildUnnamed596();
+    o.mobileCarriers = buildUnnamed597();
+    o.mobileDevices = buildUnnamed598();
+    o.mobileOperatingSystemVersions = buildUnnamed599();
+    o.placements = buildUnnamed600();
+    o.platforms = buildUnnamed601();
+    o.supportedCreativeAttributes = buildUnnamed602();
+    o.userLists = buildUnnamed603();
+    o.vendorTypes = buildUnnamed604();
+    o.verticals = buildUnnamed605();
   }
   buildCounterPretargetingConfig--;
   return o;
@@ -1066,38 +1066,38 @@
     unittest.expect(o.billingId, unittest.equals('foo'));
     unittest.expect(o.configId, unittest.equals('foo'));
     unittest.expect(o.configName, unittest.equals('foo'));
-    checkUnnamed560(o.creativeType);
-    checkUnnamed561(o.dimensions);
-    checkUnnamed562(o.excludedContentLabels);
-    checkUnnamed563(o.excludedGeoCriteriaIds);
-    checkUnnamed564(o.excludedPlacements);
-    checkUnnamed565(o.excludedUserLists);
-    checkUnnamed566(o.excludedVerticals);
-    checkUnnamed567(o.geoCriteriaIds);
+    checkUnnamed588(o.creativeType);
+    checkUnnamed589(o.dimensions);
+    checkUnnamed590(o.excludedContentLabels);
+    checkUnnamed591(o.excludedGeoCriteriaIds);
+    checkUnnamed592(o.excludedPlacements);
+    checkUnnamed593(o.excludedUserLists);
+    checkUnnamed594(o.excludedVerticals);
+    checkUnnamed595(o.geoCriteriaIds);
     unittest.expect(o.isActive, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed568(o.languages);
-    checkUnnamed569(o.mobileCarriers);
-    checkUnnamed570(o.mobileDevices);
-    checkUnnamed571(o.mobileOperatingSystemVersions);
-    checkUnnamed572(o.placements);
-    checkUnnamed573(o.platforms);
-    checkUnnamed574(o.supportedCreativeAttributes);
-    checkUnnamed575(o.userLists);
-    checkUnnamed576(o.vendorTypes);
-    checkUnnamed577(o.verticals);
+    checkUnnamed596(o.languages);
+    checkUnnamed597(o.mobileCarriers);
+    checkUnnamed598(o.mobileDevices);
+    checkUnnamed599(o.mobileOperatingSystemVersions);
+    checkUnnamed600(o.placements);
+    checkUnnamed601(o.platforms);
+    checkUnnamed602(o.supportedCreativeAttributes);
+    checkUnnamed603(o.userLists);
+    checkUnnamed604(o.vendorTypes);
+    checkUnnamed605(o.verticals);
   }
   buildCounterPretargetingConfig--;
 }
 
-buildUnnamed578() {
+buildUnnamed606() {
   var o = new core.List<api.PretargetingConfig>();
   o.add(buildPretargetingConfig());
   o.add(buildPretargetingConfig());
   return o;
 }
 
-checkUnnamed578(core.List<api.PretargetingConfig> o) {
+checkUnnamed606(core.List<api.PretargetingConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPretargetingConfig(o[0]);
   checkPretargetingConfig(o[1]);
@@ -1108,7 +1108,7 @@
   var o = new api.PretargetingConfigList();
   buildCounterPretargetingConfigList++;
   if (buildCounterPretargetingConfigList < 3) {
-    o.items = buildUnnamed578();
+    o.items = buildUnnamed606();
     o.kind = "foo";
   }
   buildCounterPretargetingConfigList--;
@@ -1118,33 +1118,33 @@
 checkPretargetingConfigList(api.PretargetingConfigList o) {
   buildCounterPretargetingConfigList++;
   if (buildCounterPretargetingConfigList < 3) {
-    checkUnnamed578(o.items);
+    checkUnnamed606(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPretargetingConfigList--;
 }
 
-buildUnnamed579() {
+buildUnnamed607() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed579(core.List<core.int> o) {
+checkUnnamed607(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed580() {
+buildUnnamed608() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed580(core.List<core.String> o) {
+checkUnnamed608(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1343,8 +1343,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/adexchangebuyer/v1.3/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("adexchangebuyer/v1.3/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1389,8 +1391,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/adexchangebuyer/v1.3/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("adexchangebuyer/v1.3/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("accounts"));
         pathOffset += 8;
 
@@ -1437,8 +1441,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/adexchangebuyer/v1.3/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("adexchangebuyer/v1.3/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1488,8 +1494,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/adexchangebuyer/v1.3/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("adexchangebuyer/v1.3/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1539,8 +1547,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/adexchangebuyer/v1.3/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("adexchangebuyer/v1.3/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("billinginfo/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1585,8 +1595,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/adexchangebuyer/v1.3/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("adexchangebuyer/v1.3/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("billinginfo"));
         pathOffset += 11;
 
@@ -1634,8 +1646,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/adexchangebuyer/v1.3/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("adexchangebuyer/v1.3/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("creatives/"));
         pathOffset += 10;
         index = path.indexOf("/", pathOffset);
@@ -1691,8 +1705,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/adexchangebuyer/v1.3/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("adexchangebuyer/v1.3/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("creatives"));
         pathOffset += 9;
 
@@ -1729,8 +1745,8 @@
 
       var mock = new common_test.HttpServerMock();
       api.CreativesResourceApi res = new api.AdexchangebuyerApi(mock).creatives;
-      var arg_accountId = buildUnnamed579();
-      var arg_buyerCreativeId = buildUnnamed580();
+      var arg_accountId = buildUnnamed607();
+      var arg_buyerCreativeId = buildUnnamed608();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_statusFilter = "foo";
@@ -1739,8 +1755,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/adexchangebuyer/v1.3/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("adexchangebuyer/v1.3/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("creatives"));
         pathOffset += 9;
 
@@ -1792,8 +1810,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/adexchangebuyer/v1.3/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("adexchangebuyer/v1.3/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("directdeals/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1838,8 +1858,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/adexchangebuyer/v1.3/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("adexchangebuyer/v1.3/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("directdeals"));
         pathOffset += 11;
 
@@ -1890,8 +1912,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/adexchangebuyer/v1.3/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("adexchangebuyer/v1.3/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("performancereport"));
         pathOffset += 17;
 
@@ -1944,8 +1968,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/adexchangebuyer/v1.3/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("adexchangebuyer/v1.3/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("pretargetingconfigs/"));
         pathOffset += 20;
         index = path.indexOf("/", pathOffset);
@@ -1997,8 +2023,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/adexchangebuyer/v1.3/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("adexchangebuyer/v1.3/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("pretargetingconfigs/"));
         pathOffset += 20;
         index = path.indexOf("/", pathOffset);
@@ -2055,8 +2083,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/adexchangebuyer/v1.3/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("adexchangebuyer/v1.3/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("pretargetingconfigs/"));
         pathOffset += 20;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2102,8 +2132,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/adexchangebuyer/v1.3/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("adexchangebuyer/v1.3/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("pretargetingconfigs/"));
         pathOffset += 20;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2154,8 +2186,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/adexchangebuyer/v1.3/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("adexchangebuyer/v1.3/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("pretargetingconfigs/"));
         pathOffset += 20;
         index = path.indexOf("/", pathOffset);
@@ -2213,8 +2247,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/adexchangebuyer/v1.3/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("adexchangebuyer/v1.3/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("pretargetingconfigs/"));
         pathOffset += 20;
         index = path.indexOf("/", pathOffset);
diff --git a/generated/googleapis/test/adexchangeseller/v1_1_test.dart b/generated/googleapis/test/adexchangeseller/v1_1_test.dart
index f073469..a3ba91c 100644
--- a/generated/googleapis/test/adexchangeseller/v1_1_test.dart
+++ b/generated/googleapis/test/adexchangeseller/v1_1_test.dart
@@ -66,14 +66,14 @@
   buildCounterAdClient--;
 }
 
-buildUnnamed265() {
+buildUnnamed268() {
   var o = new core.List<api.AdClient>();
   o.add(buildAdClient());
   o.add(buildAdClient());
   return o;
 }
 
-checkUnnamed265(core.List<api.AdClient> o) {
+checkUnnamed268(core.List<api.AdClient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdClient(o[0]);
   checkAdClient(o[1]);
@@ -85,7 +85,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed265();
+    o.items = buildUnnamed268();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -97,7 +97,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed265(o.items);
+    checkUnnamed268(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -131,14 +131,14 @@
   buildCounterAdUnit--;
 }
 
-buildUnnamed266() {
+buildUnnamed269() {
   var o = new core.List<api.AdUnit>();
   o.add(buildAdUnit());
   o.add(buildAdUnit());
   return o;
 }
 
-checkUnnamed266(core.List<api.AdUnit> o) {
+checkUnnamed269(core.List<api.AdUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdUnit(o[0]);
   checkAdUnit(o[1]);
@@ -150,7 +150,7 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed266();
+    o.items = buildUnnamed269();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -162,7 +162,7 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed266(o.items);
+    checkUnnamed269(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -196,14 +196,14 @@
   buildCounterAlert--;
 }
 
-buildUnnamed267() {
+buildUnnamed270() {
   var o = new core.List<api.Alert>();
   o.add(buildAlert());
   o.add(buildAlert());
   return o;
 }
 
-checkUnnamed267(core.List<api.Alert> o) {
+checkUnnamed270(core.List<api.Alert> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAlert(o[0]);
   checkAlert(o[1]);
@@ -214,7 +214,7 @@
   var o = new api.Alerts();
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    o.items = buildUnnamed267();
+    o.items = buildUnnamed270();
     o.kind = "foo";
   }
   buildCounterAlerts--;
@@ -224,7 +224,7 @@
 checkAlerts(api.Alerts o) {
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    checkUnnamed267(o.items);
+    checkUnnamed270(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAlerts--;
@@ -282,14 +282,14 @@
   buildCounterCustomChannel--;
 }
 
-buildUnnamed268() {
+buildUnnamed271() {
   var o = new core.List<api.CustomChannel>();
   o.add(buildCustomChannel());
   o.add(buildCustomChannel());
   return o;
 }
 
-checkUnnamed268(core.List<api.CustomChannel> o) {
+checkUnnamed271(core.List<api.CustomChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomChannel(o[0]);
   checkCustomChannel(o[1]);
@@ -301,7 +301,7 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed268();
+    o.items = buildUnnamed271();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -313,21 +313,21 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed268(o.items);
+    checkUnnamed271(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCustomChannels--;
 }
 
-buildUnnamed269() {
+buildUnnamed272() {
   var o = new core.List<api.ReportingMetadataEntry>();
   o.add(buildReportingMetadataEntry());
   o.add(buildReportingMetadataEntry());
   return o;
 }
 
-checkUnnamed269(core.List<api.ReportingMetadataEntry> o) {
+checkUnnamed272(core.List<api.ReportingMetadataEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportingMetadataEntry(o[0]);
   checkReportingMetadataEntry(o[1]);
@@ -338,7 +338,7 @@
   var o = new api.Metadata();
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    o.items = buildUnnamed269();
+    o.items = buildUnnamed272();
     o.kind = "foo";
   }
   buildCounterMetadata--;
@@ -348,7 +348,7 @@
 checkMetadata(api.Metadata o) {
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    checkUnnamed269(o.items);
+    checkUnnamed272(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterMetadata--;
@@ -387,14 +387,14 @@
   buildCounterPreferredDeal--;
 }
 
-buildUnnamed270() {
+buildUnnamed273() {
   var o = new core.List<api.PreferredDeal>();
   o.add(buildPreferredDeal());
   o.add(buildPreferredDeal());
   return o;
 }
 
-checkUnnamed270(core.List<api.PreferredDeal> o) {
+checkUnnamed273(core.List<api.PreferredDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPreferredDeal(o[0]);
   checkPreferredDeal(o[1]);
@@ -405,7 +405,7 @@
   var o = new api.PreferredDeals();
   buildCounterPreferredDeals++;
   if (buildCounterPreferredDeals < 3) {
-    o.items = buildUnnamed270();
+    o.items = buildUnnamed273();
     o.kind = "foo";
   }
   buildCounterPreferredDeals--;
@@ -415,20 +415,20 @@
 checkPreferredDeals(api.PreferredDeals o) {
   buildCounterPreferredDeals++;
   if (buildCounterPreferredDeals < 3) {
-    checkUnnamed270(o.items);
+    checkUnnamed273(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPreferredDeals--;
 }
 
-buildUnnamed271() {
+buildUnnamed274() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed271(core.List<core.String> o) {
+checkUnnamed274(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -457,58 +457,19 @@
   buildCounterReportHeaders--;
 }
 
-buildUnnamed272() {
+buildUnnamed275() {
   var o = new core.List<api.ReportHeaders>();
   o.add(buildReportHeaders());
   o.add(buildReportHeaders());
   return o;
 }
 
-checkUnnamed272(core.List<api.ReportHeaders> o) {
+checkUnnamed275(core.List<api.ReportHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportHeaders(o[0]);
   checkReportHeaders(o[1]);
 }
 
-buildUnnamed273() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed273(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed274() {
-  var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed273());
-  o.add(buildUnnamed273());
-  return o;
-}
-
-checkUnnamed274(core.List<core.List<core.String>> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed273(o[0]);
-  checkUnnamed273(o[1]);
-}
-
-buildUnnamed275() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed275(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 buildUnnamed276() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -522,48 +483,17 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterReport = 0;
-buildReport() {
-  var o = new api.Report();
-  buildCounterReport++;
-  if (buildCounterReport < 3) {
-    o.averages = buildUnnamed271();
-    o.headers = buildUnnamed272();
-    o.kind = "foo";
-    o.rows = buildUnnamed274();
-    o.totalMatchedRows = "foo";
-    o.totals = buildUnnamed275();
-    o.warnings = buildUnnamed276();
-  }
-  buildCounterReport--;
-  return o;
-}
-
-checkReport(api.Report o) {
-  buildCounterReport++;
-  if (buildCounterReport < 3) {
-    checkUnnamed271(o.averages);
-    checkUnnamed272(o.headers);
-    unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed274(o.rows);
-    unittest.expect(o.totalMatchedRows, unittest.equals('foo'));
-    checkUnnamed275(o.totals);
-    checkUnnamed276(o.warnings);
-  }
-  buildCounterReport--;
-}
-
 buildUnnamed277() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
+  var o = new core.List<core.List<core.String>>();
+  o.add(buildUnnamed276());
+  o.add(buildUnnamed276());
   return o;
 }
 
-checkUnnamed277(core.List<core.String> o) {
+checkUnnamed277(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
+  checkUnnamed276(o[0]);
+  checkUnnamed276(o[1]);
 }
 
 buildUnnamed278() {
@@ -592,6 +522,37 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+core.int buildCounterReport = 0;
+buildReport() {
+  var o = new api.Report();
+  buildCounterReport++;
+  if (buildCounterReport < 3) {
+    o.averages = buildUnnamed274();
+    o.headers = buildUnnamed275();
+    o.kind = "foo";
+    o.rows = buildUnnamed277();
+    o.totalMatchedRows = "foo";
+    o.totals = buildUnnamed278();
+    o.warnings = buildUnnamed279();
+  }
+  buildCounterReport--;
+  return o;
+}
+
+checkReport(api.Report o) {
+  buildCounterReport++;
+  if (buildCounterReport < 3) {
+    checkUnnamed274(o.averages);
+    checkUnnamed275(o.headers);
+    unittest.expect(o.kind, unittest.equals('foo'));
+    checkUnnamed277(o.rows);
+    unittest.expect(o.totalMatchedRows, unittest.equals('foo'));
+    checkUnnamed278(o.totals);
+    checkUnnamed279(o.warnings);
+  }
+  buildCounterReport--;
+}
+
 buildUnnamed280() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -618,18 +579,57 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+buildUnnamed282() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed282(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed283() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed283(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed284() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed284(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 core.int buildCounterReportingMetadataEntry = 0;
 buildReportingMetadataEntry() {
   var o = new api.ReportingMetadataEntry();
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    o.compatibleDimensions = buildUnnamed277();
-    o.compatibleMetrics = buildUnnamed278();
+    o.compatibleDimensions = buildUnnamed280();
+    o.compatibleMetrics = buildUnnamed281();
     o.id = "foo";
     o.kind = "foo";
-    o.requiredDimensions = buildUnnamed279();
-    o.requiredMetrics = buildUnnamed280();
-    o.supportedProducts = buildUnnamed281();
+    o.requiredDimensions = buildUnnamed282();
+    o.requiredMetrics = buildUnnamed283();
+    o.supportedProducts = buildUnnamed284();
   }
   buildCounterReportingMetadataEntry--;
   return o;
@@ -638,13 +638,13 @@
 checkReportingMetadataEntry(api.ReportingMetadataEntry o) {
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    checkUnnamed277(o.compatibleDimensions);
-    checkUnnamed278(o.compatibleMetrics);
+    checkUnnamed280(o.compatibleDimensions);
+    checkUnnamed281(o.compatibleMetrics);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed279(o.requiredDimensions);
-    checkUnnamed280(o.requiredMetrics);
-    checkUnnamed281(o.supportedProducts);
+    checkUnnamed282(o.requiredDimensions);
+    checkUnnamed283(o.requiredMetrics);
+    checkUnnamed284(o.supportedProducts);
   }
   buildCounterReportingMetadataEntry--;
 }
@@ -672,14 +672,14 @@
   buildCounterSavedReport--;
 }
 
-buildUnnamed282() {
+buildUnnamed285() {
   var o = new core.List<api.SavedReport>();
   o.add(buildSavedReport());
   o.add(buildSavedReport());
   return o;
 }
 
-checkUnnamed282(core.List<api.SavedReport> o) {
+checkUnnamed285(core.List<api.SavedReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedReport(o[0]);
   checkSavedReport(o[1]);
@@ -691,7 +691,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed282();
+    o.items = buildUnnamed285();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -703,7 +703,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed282(o.items);
+    checkUnnamed285(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -733,14 +733,14 @@
   buildCounterUrlChannel--;
 }
 
-buildUnnamed283() {
+buildUnnamed286() {
   var o = new core.List<api.UrlChannel>();
   o.add(buildUrlChannel());
   o.add(buildUrlChannel());
   return o;
 }
 
-checkUnnamed283(core.List<api.UrlChannel> o) {
+checkUnnamed286(core.List<api.UrlChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlChannel(o[0]);
   checkUrlChannel(o[1]);
@@ -752,7 +752,7 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed283();
+    o.items = buildUnnamed286();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -764,52 +764,13 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed283(o.items);
+    checkUnnamed286(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterUrlChannels--;
 }
 
-buildUnnamed284() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed284(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed285() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed285(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed286() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed286(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 buildUnnamed287() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -823,6 +784,45 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+buildUnnamed288() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed288(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed289() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed289(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed290() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed290(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 
 main() {
   unittest.group("obj-schema-Account", () {
@@ -1016,8 +1016,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/adexchangeseller/v1.1/"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("adexchangeseller/v1.1/"));
+        pathOffset += 22;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1068,8 +1070,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/adexchangeseller/v1.1/"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("adexchangeseller/v1.1/"));
+        pathOffset += 22;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("adclients"));
         pathOffset += 9;
 
@@ -1119,8 +1123,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/adexchangeseller/v1.1/"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("adexchangeseller/v1.1/"));
+        pathOffset += 22;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/adunits/", pathOffset);
@@ -1176,8 +1182,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/adexchangeseller/v1.1/"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("adexchangeseller/v1.1/"));
+        pathOffset += 22;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/adunits", pathOffset);
@@ -1237,8 +1245,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/adexchangeseller/v1.1/"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("adexchangeseller/v1.1/"));
+        pathOffset += 22;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/adunits/", pathOffset);
@@ -1301,8 +1311,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/adexchangeseller/v1.1/"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("adexchangeseller/v1.1/"));
+        pathOffset += 22;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("alerts"));
         pathOffset += 6;
 
@@ -1351,8 +1363,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/adexchangeseller/v1.1/"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("adexchangeseller/v1.1/"));
+        pathOffset += 22;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/customchannels/", pathOffset);
@@ -1407,8 +1421,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/adexchangeseller/v1.1/"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("adexchangeseller/v1.1/"));
+        pathOffset += 22;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/customchannels", pathOffset);
@@ -1468,8 +1484,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/adexchangeseller/v1.1/"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("adexchangeseller/v1.1/"));
+        pathOffset += 22;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/customchannels/", pathOffset);
@@ -1532,8 +1550,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/adexchangeseller/v1.1/"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("adexchangeseller/v1.1/"));
+        pathOffset += 22;
         unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("metadata/dimensions"));
         pathOffset += 19;
 
@@ -1579,8 +1599,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/adexchangeseller/v1.1/"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("adexchangeseller/v1.1/"));
+        pathOffset += 22;
         unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("metadata/metrics"));
         pathOffset += 16;
 
@@ -1627,8 +1649,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/adexchangeseller/v1.1/"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("adexchangeseller/v1.1/"));
+        pathOffset += 22;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("preferreddeals/"));
         pathOffset += 15;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1673,8 +1697,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/adexchangeseller/v1.1/"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("adexchangeseller/v1.1/"));
+        pathOffset += 22;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("preferreddeals"));
         pathOffset += 14;
 
@@ -1719,20 +1745,22 @@
       api.ReportsResourceApi res = new api.AdexchangesellerApi(mock).reports;
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_dimension = buildUnnamed284();
-      var arg_filter = buildUnnamed285();
+      var arg_dimension = buildUnnamed287();
+      var arg_filter = buildUnnamed288();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed286();
-      var arg_sort = buildUnnamed287();
+      var arg_metric = buildUnnamed289();
+      var arg_sort = buildUnnamed290();
       var arg_startIndex = 42;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/adexchangeseller/v1.1/"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("adexchangeseller/v1.1/"));
+        pathOffset += 22;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("reports"));
         pathOffset += 7;
 
@@ -1791,8 +1819,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/adexchangeseller/v1.1/"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("adexchangeseller/v1.1/"));
+        pathOffset += 22;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("reports/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1842,8 +1872,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/adexchangeseller/v1.1/"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("adexchangeseller/v1.1/"));
+        pathOffset += 22;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("reports/saved"));
         pathOffset += 13;
 
@@ -1894,8 +1926,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/adexchangeseller/v1.1/"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("adexchangeseller/v1.1/"));
+        pathOffset += 22;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/urlchannels", pathOffset);
diff --git a/generated/googleapis/test/admin/directory_v1_test.dart b/generated/googleapis/test/admin/directory_v1_test.dart
index 516506b..534c64c 100644
--- a/generated/googleapis/test/admin/directory_v1_test.dart
+++ b/generated/googleapis/test/admin/directory_v1_test.dart
@@ -43,14 +43,14 @@
   buildCounterAlias--;
 }
 
-buildUnnamed456() {
+buildUnnamed481() {
   var o = new core.List<api.Alias>();
   o.add(buildAlias());
   o.add(buildAlias());
   return o;
 }
 
-checkUnnamed456(core.List<api.Alias> o) {
+checkUnnamed481(core.List<api.Alias> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAlias(o[0]);
   checkAlias(o[1]);
@@ -61,7 +61,7 @@
   var o = new api.Aliases();
   buildCounterAliases++;
   if (buildCounterAliases < 3) {
-    o.aliases = buildUnnamed456();
+    o.aliases = buildUnnamed481();
     o.etag = "foo";
     o.kind = "foo";
   }
@@ -72,7 +72,7 @@
 checkAliases(api.Aliases o) {
   buildCounterAliases++;
   if (buildCounterAliases < 3) {
-    checkUnnamed456(o.aliases);
+    checkUnnamed481(o.aliases);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
   }
@@ -110,14 +110,14 @@
   buildCounterAsp--;
 }
 
-buildUnnamed457() {
+buildUnnamed482() {
   var o = new core.List<api.Asp>();
   o.add(buildAsp());
   o.add(buildAsp());
   return o;
 }
 
-checkUnnamed457(core.List<api.Asp> o) {
+checkUnnamed482(core.List<api.Asp> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAsp(o[0]);
   checkAsp(o[1]);
@@ -129,7 +129,7 @@
   buildCounterAsps++;
   if (buildCounterAsps < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed457();
+    o.items = buildUnnamed482();
     o.kind = "foo";
   }
   buildCounterAsps--;
@@ -140,20 +140,20 @@
   buildCounterAsps++;
   if (buildCounterAsps < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed457(o.items);
+    checkUnnamed482(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAsps--;
 }
 
-buildUnnamed458() {
+buildUnnamed483() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed458(core.Map<core.String, core.String> o) {
+checkUnnamed483(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -168,7 +168,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed458();
+    o.params = buildUnnamed483();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -186,7 +186,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed458(o.params);
+    checkUnnamed483(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -217,14 +217,14 @@
   buildCounterChromeOsDeviceRecentUsers--;
 }
 
-buildUnnamed459() {
+buildUnnamed484() {
   var o = new core.List<api.ChromeOsDeviceRecentUsers>();
   o.add(buildChromeOsDeviceRecentUsers());
   o.add(buildChromeOsDeviceRecentUsers());
   return o;
 }
 
-checkUnnamed459(core.List<api.ChromeOsDeviceRecentUsers> o) {
+checkUnnamed484(core.List<api.ChromeOsDeviceRecentUsers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChromeOsDeviceRecentUsers(o[0]);
   checkChromeOsDeviceRecentUsers(o[1]);
@@ -253,7 +253,7 @@
     o.orgUnitPath = "foo";
     o.osVersion = "foo";
     o.platformVersion = "foo";
-    o.recentUsers = buildUnnamed459();
+    o.recentUsers = buildUnnamed484();
     o.serialNumber = "foo";
     o.status = "foo";
     o.supportEndDate = core.DateTime.parse("2002-02-27T14:01:02");
@@ -284,7 +284,7 @@
     unittest.expect(o.orgUnitPath, unittest.equals('foo'));
     unittest.expect(o.osVersion, unittest.equals('foo'));
     unittest.expect(o.platformVersion, unittest.equals('foo'));
-    checkUnnamed459(o.recentUsers);
+    checkUnnamed484(o.recentUsers);
     unittest.expect(o.serialNumber, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.supportEndDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -293,14 +293,14 @@
   buildCounterChromeOsDevice--;
 }
 
-buildUnnamed460() {
+buildUnnamed485() {
   var o = new core.List<api.ChromeOsDevice>();
   o.add(buildChromeOsDevice());
   o.add(buildChromeOsDevice());
   return o;
 }
 
-checkUnnamed460(core.List<api.ChromeOsDevice> o) {
+checkUnnamed485(core.List<api.ChromeOsDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChromeOsDevice(o[0]);
   checkChromeOsDevice(o[1]);
@@ -311,7 +311,7 @@
   var o = new api.ChromeOsDevices();
   buildCounterChromeOsDevices++;
   if (buildCounterChromeOsDevices < 3) {
-    o.chromeosdevices = buildUnnamed460();
+    o.chromeosdevices = buildUnnamed485();
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -323,7 +323,7 @@
 checkChromeOsDevices(api.ChromeOsDevices o) {
   buildCounterChromeOsDevices++;
   if (buildCounterChromeOsDevices < 3) {
-    checkUnnamed460(o.chromeosdevices);
+    checkUnnamed485(o.chromeosdevices);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -331,27 +331,27 @@
   buildCounterChromeOsDevices--;
 }
 
-buildUnnamed461() {
+buildUnnamed486() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed461(core.List<core.String> o) {
+checkUnnamed486(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed462() {
+buildUnnamed487() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed462(core.List<core.String> o) {
+checkUnnamed487(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -363,7 +363,7 @@
   buildCounterGroup++;
   if (buildCounterGroup < 3) {
     o.adminCreated = true;
-    o.aliases = buildUnnamed461();
+    o.aliases = buildUnnamed486();
     o.description = "foo";
     o.directMembersCount = "foo";
     o.email = "foo";
@@ -371,7 +371,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.nonEditableAliases = buildUnnamed462();
+    o.nonEditableAliases = buildUnnamed487();
   }
   buildCounterGroup--;
   return o;
@@ -381,7 +381,7 @@
   buildCounterGroup++;
   if (buildCounterGroup < 3) {
     unittest.expect(o.adminCreated, unittest.isTrue);
-    checkUnnamed461(o.aliases);
+    checkUnnamed486(o.aliases);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.directMembersCount, unittest.equals('foo'));
     unittest.expect(o.email, unittest.equals('foo'));
@@ -389,19 +389,19 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed462(o.nonEditableAliases);
+    checkUnnamed487(o.nonEditableAliases);
   }
   buildCounterGroup--;
 }
 
-buildUnnamed463() {
+buildUnnamed488() {
   var o = new core.List<api.Group>();
   o.add(buildGroup());
   o.add(buildGroup());
   return o;
 }
 
-checkUnnamed463(core.List<api.Group> o) {
+checkUnnamed488(core.List<api.Group> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGroup(o[0]);
   checkGroup(o[1]);
@@ -413,7 +413,7 @@
   buildCounterGroups++;
   if (buildCounterGroups < 3) {
     o.etag = "foo";
-    o.groups = buildUnnamed463();
+    o.groups = buildUnnamed488();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -425,7 +425,7 @@
   buildCounterGroups++;
   if (buildCounterGroups < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed463(o.groups);
+    checkUnnamed488(o.groups);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -461,14 +461,14 @@
   buildCounterMember--;
 }
 
-buildUnnamed464() {
+buildUnnamed489() {
   var o = new core.List<api.Member>();
   o.add(buildMember());
   o.add(buildMember());
   return o;
 }
 
-checkUnnamed464(core.List<api.Member> o) {
+checkUnnamed489(core.List<api.Member> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMember(o[0]);
   checkMember(o[1]);
@@ -481,7 +481,7 @@
   if (buildCounterMembers < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.members = buildUnnamed464();
+    o.members = buildUnnamed489();
     o.nextPageToken = "foo";
   }
   buildCounterMembers--;
@@ -493,20 +493,20 @@
   if (buildCounterMembers < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed464(o.members);
+    checkUnnamed489(o.members);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterMembers--;
 }
 
-buildUnnamed465() {
+buildUnnamed490() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed465(core.List<core.String> o) {
+checkUnnamed490(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -519,7 +519,7 @@
   if (buildCounterMobileDeviceApplications < 3) {
     o.displayName = "foo";
     o.packageName = "foo";
-    o.permission = buildUnnamed465();
+    o.permission = buildUnnamed490();
     o.versionCode = 42;
     o.versionName = "foo";
   }
@@ -532,47 +532,47 @@
   if (buildCounterMobileDeviceApplications < 3) {
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.packageName, unittest.equals('foo'));
-    checkUnnamed465(o.permission);
+    checkUnnamed490(o.permission);
     unittest.expect(o.versionCode, unittest.equals(42));
     unittest.expect(o.versionName, unittest.equals('foo'));
   }
   buildCounterMobileDeviceApplications--;
 }
 
-buildUnnamed466() {
+buildUnnamed491() {
   var o = new core.List<api.MobileDeviceApplications>();
   o.add(buildMobileDeviceApplications());
   o.add(buildMobileDeviceApplications());
   return o;
 }
 
-checkUnnamed466(core.List<api.MobileDeviceApplications> o) {
+checkUnnamed491(core.List<api.MobileDeviceApplications> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMobileDeviceApplications(o[0]);
   checkMobileDeviceApplications(o[1]);
 }
 
-buildUnnamed467() {
+buildUnnamed492() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed467(core.List<core.String> o) {
+checkUnnamed492(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed468() {
+buildUnnamed493() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed468(core.List<core.String> o) {
+checkUnnamed493(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -583,13 +583,13 @@
   var o = new api.MobileDevice();
   buildCounterMobileDevice++;
   if (buildCounterMobileDevice < 3) {
-    o.applications = buildUnnamed466();
+    o.applications = buildUnnamed491();
     o.basebandVersion = "foo";
     o.buildNumber = "foo";
     o.defaultLanguage = "foo";
     o.deviceCompromisedStatus = "foo";
     o.deviceId = "foo";
-    o.email = buildUnnamed467();
+    o.email = buildUnnamed492();
     o.etag = "foo";
     o.firstSync = core.DateTime.parse("2002-02-27T14:01:02");
     o.hardwareId = "foo";
@@ -600,7 +600,7 @@
     o.managedAccountIsOnOwnerProfile = true;
     o.meid = "foo";
     o.model = "foo";
-    o.name = buildUnnamed468();
+    o.name = buildUnnamed493();
     o.networkOperator = "foo";
     o.os = "foo";
     o.resourceId = "foo";
@@ -617,13 +617,13 @@
 checkMobileDevice(api.MobileDevice o) {
   buildCounterMobileDevice++;
   if (buildCounterMobileDevice < 3) {
-    checkUnnamed466(o.applications);
+    checkUnnamed491(o.applications);
     unittest.expect(o.basebandVersion, unittest.equals('foo'));
     unittest.expect(o.buildNumber, unittest.equals('foo'));
     unittest.expect(o.defaultLanguage, unittest.equals('foo'));
     unittest.expect(o.deviceCompromisedStatus, unittest.equals('foo'));
     unittest.expect(o.deviceId, unittest.equals('foo'));
-    checkUnnamed467(o.email);
+    checkUnnamed492(o.email);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.firstSync, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.hardwareId, unittest.equals('foo'));
@@ -634,7 +634,7 @@
     unittest.expect(o.managedAccountIsOnOwnerProfile, unittest.isTrue);
     unittest.expect(o.meid, unittest.equals('foo'));
     unittest.expect(o.model, unittest.equals('foo'));
-    checkUnnamed468(o.name);
+    checkUnnamed493(o.name);
     unittest.expect(o.networkOperator, unittest.equals('foo'));
     unittest.expect(o.os, unittest.equals('foo'));
     unittest.expect(o.resourceId, unittest.equals('foo'));
@@ -666,14 +666,14 @@
   buildCounterMobileDeviceAction--;
 }
 
-buildUnnamed469() {
+buildUnnamed494() {
   var o = new core.List<api.MobileDevice>();
   o.add(buildMobileDevice());
   o.add(buildMobileDevice());
   return o;
 }
 
-checkUnnamed469(core.List<api.MobileDevice> o) {
+checkUnnamed494(core.List<api.MobileDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMobileDevice(o[0]);
   checkMobileDevice(o[1]);
@@ -686,7 +686,7 @@
   if (buildCounterMobileDevices < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.mobiledevices = buildUnnamed469();
+    o.mobiledevices = buildUnnamed494();
     o.nextPageToken = "foo";
   }
   buildCounterMobileDevices--;
@@ -698,7 +698,7 @@
   if (buildCounterMobileDevices < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed469(o.mobiledevices);
+    checkUnnamed494(o.mobiledevices);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterMobileDevices--;
@@ -737,14 +737,14 @@
   buildCounterNotification--;
 }
 
-buildUnnamed470() {
+buildUnnamed495() {
   var o = new core.List<api.Notification>();
   o.add(buildNotification());
   o.add(buildNotification());
   return o;
 }
 
-checkUnnamed470(core.List<api.Notification> o) {
+checkUnnamed495(core.List<api.Notification> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNotification(o[0]);
   checkNotification(o[1]);
@@ -756,7 +756,7 @@
   buildCounterNotifications++;
   if (buildCounterNotifications < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed470();
+    o.items = buildUnnamed495();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.unreadNotificationsCount = 42;
@@ -769,7 +769,7 @@
   buildCounterNotifications++;
   if (buildCounterNotifications < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed470(o.items);
+    checkUnnamed495(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.unreadNotificationsCount, unittest.equals(42));
@@ -808,14 +808,14 @@
   buildCounterOrgUnit--;
 }
 
-buildUnnamed471() {
+buildUnnamed496() {
   var o = new core.List<api.OrgUnit>();
   o.add(buildOrgUnit());
   o.add(buildOrgUnit());
   return o;
 }
 
-checkUnnamed471(core.List<api.OrgUnit> o) {
+checkUnnamed496(core.List<api.OrgUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrgUnit(o[0]);
   checkOrgUnit(o[1]);
@@ -828,7 +828,7 @@
   if (buildCounterOrgUnits < 3) {
     o.etag = "foo";
     o.kind = "foo";
-    o.organizationUnits = buildUnnamed471();
+    o.organizationUnits = buildUnnamed496();
   }
   buildCounterOrgUnits--;
   return o;
@@ -839,19 +839,151 @@
   if (buildCounterOrgUnits < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed471(o.organizationUnits);
+    checkUnnamed496(o.organizationUnits);
   }
   buildCounterOrgUnits--;
 }
 
-buildUnnamed472() {
+buildUnnamed497() {
+  var o = new core.List<api.SchemaFieldSpec>();
+  o.add(buildSchemaFieldSpec());
+  o.add(buildSchemaFieldSpec());
+  return o;
+}
+
+checkUnnamed497(core.List<api.SchemaFieldSpec> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkSchemaFieldSpec(o[0]);
+  checkSchemaFieldSpec(o[1]);
+}
+
+core.int buildCounterSchema = 0;
+buildSchema() {
+  var o = new api.Schema();
+  buildCounterSchema++;
+  if (buildCounterSchema < 3) {
+    o.etag = "foo";
+    o.fields = buildUnnamed497();
+    o.kind = "foo";
+    o.schemaId = "foo";
+    o.schemaName = "foo";
+  }
+  buildCounterSchema--;
+  return o;
+}
+
+checkSchema(api.Schema o) {
+  buildCounterSchema++;
+  if (buildCounterSchema < 3) {
+    unittest.expect(o.etag, unittest.equals('foo'));
+    checkUnnamed497(o.fields);
+    unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.schemaId, unittest.equals('foo'));
+    unittest.expect(o.schemaName, unittest.equals('foo'));
+  }
+  buildCounterSchema--;
+}
+
+core.int buildCounterSchemaFieldSpecNumericIndexingSpec = 0;
+buildSchemaFieldSpecNumericIndexingSpec() {
+  var o = new api.SchemaFieldSpecNumericIndexingSpec();
+  buildCounterSchemaFieldSpecNumericIndexingSpec++;
+  if (buildCounterSchemaFieldSpecNumericIndexingSpec < 3) {
+    o.maxValue = 42.0;
+    o.minValue = 42.0;
+  }
+  buildCounterSchemaFieldSpecNumericIndexingSpec--;
+  return o;
+}
+
+checkSchemaFieldSpecNumericIndexingSpec(api.SchemaFieldSpecNumericIndexingSpec o) {
+  buildCounterSchemaFieldSpecNumericIndexingSpec++;
+  if (buildCounterSchemaFieldSpecNumericIndexingSpec < 3) {
+    unittest.expect(o.maxValue, unittest.equals(42.0));
+    unittest.expect(o.minValue, unittest.equals(42.0));
+  }
+  buildCounterSchemaFieldSpecNumericIndexingSpec--;
+}
+
+core.int buildCounterSchemaFieldSpec = 0;
+buildSchemaFieldSpec() {
+  var o = new api.SchemaFieldSpec();
+  buildCounterSchemaFieldSpec++;
+  if (buildCounterSchemaFieldSpec < 3) {
+    o.etag = "foo";
+    o.fieldId = "foo";
+    o.fieldName = "foo";
+    o.fieldType = "foo";
+    o.indexed = true;
+    o.kind = "foo";
+    o.multiValued = true;
+    o.numericIndexingSpec = buildSchemaFieldSpecNumericIndexingSpec();
+    o.readAccessType = "foo";
+  }
+  buildCounterSchemaFieldSpec--;
+  return o;
+}
+
+checkSchemaFieldSpec(api.SchemaFieldSpec o) {
+  buildCounterSchemaFieldSpec++;
+  if (buildCounterSchemaFieldSpec < 3) {
+    unittest.expect(o.etag, unittest.equals('foo'));
+    unittest.expect(o.fieldId, unittest.equals('foo'));
+    unittest.expect(o.fieldName, unittest.equals('foo'));
+    unittest.expect(o.fieldType, unittest.equals('foo'));
+    unittest.expect(o.indexed, unittest.isTrue);
+    unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.multiValued, unittest.isTrue);
+    checkSchemaFieldSpecNumericIndexingSpec(o.numericIndexingSpec);
+    unittest.expect(o.readAccessType, unittest.equals('foo'));
+  }
+  buildCounterSchemaFieldSpec--;
+}
+
+buildUnnamed498() {
+  var o = new core.List<api.Schema>();
+  o.add(buildSchema());
+  o.add(buildSchema());
+  return o;
+}
+
+checkUnnamed498(core.List<api.Schema> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkSchema(o[0]);
+  checkSchema(o[1]);
+}
+
+core.int buildCounterSchemas = 0;
+buildSchemas() {
+  var o = new api.Schemas();
+  buildCounterSchemas++;
+  if (buildCounterSchemas < 3) {
+    o.etag = "foo";
+    o.kind = "foo";
+    o.schemas = buildUnnamed498();
+  }
+  buildCounterSchemas--;
+  return o;
+}
+
+checkSchemas(api.Schemas o) {
+  buildCounterSchemas++;
+  if (buildCounterSchemas < 3) {
+    unittest.expect(o.etag, unittest.equals('foo'));
+    unittest.expect(o.kind, unittest.equals('foo'));
+    checkUnnamed498(o.schemas);
+  }
+  buildCounterSchemas--;
+}
+
+buildUnnamed499() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed472(core.List<core.String> o) {
+checkUnnamed499(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -868,7 +1000,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nativeApp = true;
-    o.scopes = buildUnnamed472();
+    o.scopes = buildUnnamed499();
     o.userKey = "foo";
   }
   buildCounterToken--;
@@ -884,20 +1016,20 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nativeApp, unittest.isTrue);
-    checkUnnamed472(o.scopes);
+    checkUnnamed499(o.scopes);
     unittest.expect(o.userKey, unittest.equals('foo'));
   }
   buildCounterToken--;
 }
 
-buildUnnamed473() {
+buildUnnamed500() {
   var o = new core.List<api.Token>();
   o.add(buildToken());
   o.add(buildToken());
   return o;
 }
 
-checkUnnamed473(core.List<api.Token> o) {
+checkUnnamed500(core.List<api.Token> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkToken(o[0]);
   checkToken(o[1]);
@@ -909,7 +1041,7 @@
   buildCounterTokens++;
   if (buildCounterTokens < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed473();
+    o.items = buildUnnamed500();
     o.kind = "foo";
   }
   buildCounterTokens--;
@@ -920,33 +1052,46 @@
   buildCounterTokens++;
   if (buildCounterTokens < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed473(o.items);
+    checkUnnamed500(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTokens--;
 }
 
-buildUnnamed474() {
+buildUnnamed501() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed474(core.List<core.String> o) {
+checkUnnamed501(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed475() {
+buildUnnamed502() {
+  var o = new core.Map<core.String, api.UserCustomProperties>();
+  o["x"] = buildUserCustomProperties();
+  o["y"] = buildUserCustomProperties();
+  return o;
+}
+
+checkUnnamed502(core.Map<core.String, api.UserCustomProperties> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkUserCustomProperties(o["x"]);
+  checkUserCustomProperties(o["y"]);
+}
+
+buildUnnamed503() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed475(core.List<core.String> o) {
+checkUnnamed503(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -959,9 +1104,10 @@
   if (buildCounterUser < 3) {
     o.addresses = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
     o.agreedToTerms = true;
-    o.aliases = buildUnnamed474();
+    o.aliases = buildUnnamed501();
     o.changePasswordAtNextLogin = true;
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
+    o.customSchemas = buildUnnamed502();
     o.customerId = "foo";
     o.deletionTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.emails = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
@@ -978,7 +1124,7 @@
     o.kind = "foo";
     o.lastLoginTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.name = buildUserName();
-    o.nonEditableAliases = buildUnnamed475();
+    o.nonEditableAliases = buildUnnamed503();
     o.orgUnitPath = "foo";
     o.organizations = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
     o.password = "foo";
@@ -998,9 +1144,10 @@
   if (buildCounterUser < 3) {
     var casted1 = (o.addresses) 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')); 
     unittest.expect(o.agreedToTerms, unittest.isTrue);
-    checkUnnamed474(o.aliases);
+    checkUnnamed501(o.aliases);
     unittest.expect(o.changePasswordAtNextLogin, unittest.isTrue);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    checkUnnamed502(o.customSchemas);
     unittest.expect(o.customerId, unittest.equals('foo'));
     unittest.expect(o.deletionTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     var casted2 = (o.emails) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
@@ -1017,7 +1164,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastLoginTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkUserName(o.name);
-    checkUnnamed475(o.nonEditableAliases);
+    checkUnnamed503(o.nonEditableAliases);
     unittest.expect(o.orgUnitPath, unittest.equals('foo'));
     var casted5 = (o.organizations) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
     unittest.expect(o.password, unittest.equals('foo'));
@@ -1074,6 +1221,19 @@
   buildCounterUserAddress--;
 }
 
+buildUserCustomProperties() {
+  var o = new api.UserCustomProperties();
+  o["a"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  o["b"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
+  return o;
+}
+
+checkUserCustomProperties(api.UserCustomProperties o) {
+  unittest.expect(o, unittest.hasLength(2));
+  var casted8 = (o["a"]) as core.Map; unittest.expect(casted8, unittest.hasLength(3)); unittest.expect(casted8["list"], unittest.equals([1, 2, 3])); unittest.expect(casted8["bool"], unittest.equals(true)); unittest.expect(casted8["string"], unittest.equals('foo')); 
+  var casted9 = (o["b"]) as core.Map; unittest.expect(casted9, unittest.hasLength(3)); unittest.expect(casted9["list"], unittest.equals([1, 2, 3])); unittest.expect(casted9["bool"], unittest.equals(true)); unittest.expect(casted9["string"], unittest.equals('foo')); 
+}
+
 core.int buildCounterUserEmail = 0;
 buildUserEmail() {
   var o = new api.UserEmail();
@@ -1332,14 +1492,14 @@
   buildCounterUserUndelete--;
 }
 
-buildUnnamed476() {
+buildUnnamed504() {
   var o = new core.List<api.User>();
   o.add(buildUser());
   o.add(buildUser());
   return o;
 }
 
-checkUnnamed476(core.List<api.User> o) {
+checkUnnamed504(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUser(o[0]);
   checkUser(o[1]);
@@ -1354,7 +1514,7 @@
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.triggerEvent = "foo";
-    o.users = buildUnnamed476();
+    o.users = buildUnnamed504();
   }
   buildCounterUsers--;
   return o;
@@ -1367,7 +1527,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.triggerEvent, unittest.equals('foo'));
-    checkUnnamed476(o.users);
+    checkUnnamed504(o.users);
   }
   buildCounterUsers--;
 }
@@ -1397,14 +1557,14 @@
   buildCounterVerificationCode--;
 }
 
-buildUnnamed477() {
+buildUnnamed505() {
   var o = new core.List<api.VerificationCode>();
   o.add(buildVerificationCode());
   o.add(buildVerificationCode());
   return o;
 }
 
-checkUnnamed477(core.List<api.VerificationCode> o) {
+checkUnnamed505(core.List<api.VerificationCode> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVerificationCode(o[0]);
   checkVerificationCode(o[1]);
@@ -1416,7 +1576,7 @@
   buildCounterVerificationCodes++;
   if (buildCounterVerificationCodes < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed477();
+    o.items = buildUnnamed505();
     o.kind = "foo";
   }
   buildCounterVerificationCodes--;
@@ -1427,59 +1587,59 @@
   buildCounterVerificationCodes++;
   if (buildCounterVerificationCodes < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed477(o.items);
+    checkUnnamed505(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterVerificationCodes--;
 }
 
-buildUnnamed478() {
+buildUnnamed506() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed478(core.List<core.String> o) {
+checkUnnamed506(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed479() {
+buildUnnamed507() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed479(core.List<core.String> o) {
+checkUnnamed507(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed480() {
+buildUnnamed508() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed480(core.List<core.String> o) {
+checkUnnamed508(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed481() {
+buildUnnamed509() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed481(core.List<core.String> o) {
+checkUnnamed509(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1667,6 +1827,42 @@
   });
 
 
+  unittest.group("obj-schema-Schema", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSchema();
+      var od = new api.Schema.fromJson(o.toJson());
+      checkSchema(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-SchemaFieldSpecNumericIndexingSpec", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSchemaFieldSpecNumericIndexingSpec();
+      var od = new api.SchemaFieldSpecNumericIndexingSpec.fromJson(o.toJson());
+      checkSchemaFieldSpecNumericIndexingSpec(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-SchemaFieldSpec", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSchemaFieldSpec();
+      var od = new api.SchemaFieldSpec.fromJson(o.toJson());
+      checkSchemaFieldSpec(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-Schemas", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSchemas();
+      var od = new api.Schemas.fromJson(o.toJson());
+      checkSchemas(od);
+    });
+  });
+
+
   unittest.group("obj-schema-Token", () {
     unittest.test("to-json--from-json", () {
       var o = buildToken();
@@ -1703,6 +1899,15 @@
   });
 
 
+  unittest.group("obj-schema-UserCustomProperties", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildUserCustomProperties();
+      var od = new api.UserCustomProperties.fromJson(o.toJson());
+      checkUserCustomProperties(od);
+    });
+  });
+
+
   unittest.group("obj-schema-UserEmail", () {
     unittest.test("to-json--from-json", () {
       var o = buildUserEmail();
@@ -1832,8 +2037,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/asps/", pathOffset);
@@ -1885,8 +2092,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/asps/", pathOffset);
@@ -1939,8 +2148,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/asps", pathOffset);
@@ -1997,8 +2208,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 33), unittest.equals("/admin/directory_v1/channels/stop"));
-        pathOffset += 33;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("admin/directory_v1/channels/stop"));
+        pathOffset += 32;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2043,8 +2256,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/devices/chromeos/", pathOffset);
@@ -2104,8 +2319,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/devices/chromeos", pathOffset);
@@ -2167,8 +2384,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/devices/chromeos/", pathOffset);
@@ -2228,8 +2447,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/devices/chromeos/", pathOffset);
@@ -2287,8 +2508,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2332,8 +2555,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2382,8 +2607,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("groups"));
         pathOffset += 6;
 
@@ -2430,8 +2657,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("groups"));
         pathOffset += 6;
 
@@ -2483,8 +2712,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2534,8 +2765,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2586,8 +2819,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
         pathOffset += 7;
         index = path.indexOf("/aliases/", pathOffset);
@@ -2642,8 +2877,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
         pathOffset += 7;
         index = path.indexOf("/aliases", pathOffset);
@@ -2693,8 +2930,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
         pathOffset += 7;
         index = path.indexOf("/aliases", pathOffset);
@@ -2749,8 +2988,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
         pathOffset += 7;
         index = path.indexOf("/members/", pathOffset);
@@ -2802,8 +3043,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
         pathOffset += 7;
         index = path.indexOf("/members/", pathOffset);
@@ -2860,8 +3103,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
         pathOffset += 7;
         index = path.indexOf("/members", pathOffset);
@@ -2914,8 +3159,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
         pathOffset += 7;
         index = path.indexOf("/members", pathOffset);
@@ -2973,8 +3220,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
         pathOffset += 7;
         index = path.indexOf("/members/", pathOffset);
@@ -3032,8 +3281,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("groups/"));
         pathOffset += 7;
         index = path.indexOf("/members/", pathOffset);
@@ -3095,8 +3346,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/devices/mobile/", pathOffset);
@@ -3152,8 +3405,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/devices/mobile/", pathOffset);
@@ -3206,8 +3461,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/devices/mobile/", pathOffset);
@@ -3267,8 +3524,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/devices/mobile", pathOffset);
@@ -3329,8 +3588,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/notifications/", pathOffset);
@@ -3382,8 +3643,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/notifications/", pathOffset);
@@ -3439,8 +3702,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/notifications", pathOffset);
@@ -3498,8 +3763,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/notifications/", pathOffset);
@@ -3557,8 +3824,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/notifications/", pathOffset);
@@ -3610,14 +3879,16 @@
       var mock = new common_test.HttpServerMock();
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed478();
+      var arg_orgUnitPath = buildUnnamed506();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/orgunits", pathOffset);
@@ -3662,14 +3933,16 @@
       var mock = new common_test.HttpServerMock();
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed479();
+      var arg_orgUnitPath = buildUnnamed507();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/orgunits", pathOffset);
@@ -3725,8 +3998,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/orgunits", pathOffset);
@@ -3778,8 +4053,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/orgunits", pathOffset);
@@ -3827,7 +4104,7 @@
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_request = buildOrgUnit();
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed480();
+      var arg_orgUnitPath = buildUnnamed508();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var obj = new api.OrgUnit.fromJson(json);
         checkOrgUnit(obj);
@@ -3836,8 +4113,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/orgunits", pathOffset);
@@ -3885,7 +4164,7 @@
       api.OrgunitsResourceApi res = new api.AdminApi(mock).orgunits;
       var arg_request = buildOrgUnit();
       var arg_customerId = "foo";
-      var arg_orgUnitPath = buildUnnamed481();
+      var arg_orgUnitPath = buildUnnamed509();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var obj = new api.OrgUnit.fromJson(json);
         checkOrgUnit(obj);
@@ -3894,8 +4173,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
         pathOffset += 9;
         index = path.indexOf("/orgunits", pathOffset);
@@ -3940,6 +4221,354 @@
   });
 
 
+  unittest.group("resource-SchemasResourceApi", () {
+    unittest.test("method--delete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.SchemasResourceApi res = new api.AdminApi(mock).schemas;
+      var arg_customerId = "foo";
+      var arg_schemaKey = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        pathOffset += 9;
+        index = path.indexOf("/schemas/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_customerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/schemas/"));
+        pathOffset += 9;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_schemaKey"));
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_customerId, arg_schemaKey).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.SchemasResourceApi res = new api.AdminApi(mock).schemas;
+      var arg_customerId = "foo";
+      var arg_schemaKey = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        pathOffset += 9;
+        index = path.indexOf("/schemas/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_customerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/schemas/"));
+        pathOffset += 9;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_schemaKey"));
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildSchema());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_customerId, arg_schemaKey).then(unittest.expectAsync(((api.Schema response) {
+        checkSchema(response);
+      })));
+    });
+
+    unittest.test("method--insert", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.SchemasResourceApi res = new api.AdminApi(mock).schemas;
+      var arg_request = buildSchema();
+      var arg_customerId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Schema.fromJson(json);
+        checkSchema(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        pathOffset += 9;
+        index = path.indexOf("/schemas", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_customerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/schemas"));
+        pathOffset += 8;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildSchema());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.insert(arg_request, arg_customerId).then(unittest.expectAsync(((api.Schema response) {
+        checkSchema(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.SchemasResourceApi res = new api.AdminApi(mock).schemas;
+      var arg_customerId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        pathOffset += 9;
+        index = path.indexOf("/schemas", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_customerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/schemas"));
+        pathOffset += 8;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildSchemas());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_customerId).then(unittest.expectAsync(((api.Schemas response) {
+        checkSchemas(response);
+      })));
+    });
+
+    unittest.test("method--patch", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.SchemasResourceApi res = new api.AdminApi(mock).schemas;
+      var arg_request = buildSchema();
+      var arg_customerId = "foo";
+      var arg_schemaKey = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Schema.fromJson(json);
+        checkSchema(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        pathOffset += 9;
+        index = path.indexOf("/schemas/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_customerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/schemas/"));
+        pathOffset += 9;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_schemaKey"));
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildSchema());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.patch(arg_request, arg_customerId, arg_schemaKey).then(unittest.expectAsync(((api.Schema response) {
+        checkSchema(response);
+      })));
+    });
+
+    unittest.test("method--update", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.SchemasResourceApi res = new api.AdminApi(mock).schemas;
+      var arg_request = buildSchema();
+      var arg_customerId = "foo";
+      var arg_schemaKey = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.Schema.fromJson(json);
+        checkSchema(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customer/"));
+        pathOffset += 9;
+        index = path.indexOf("/schemas/", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_customerId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/schemas/"));
+        pathOffset += 9;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_schemaKey"));
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildSchema());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.update(arg_request, arg_customerId, arg_schemaKey).then(unittest.expectAsync(((api.Schema response) {
+        checkSchema(response);
+      })));
+    });
+
+  });
+
+
   unittest.group("resource-TokensResourceApi", () {
     unittest.test("method--delete", () {
 
@@ -3952,8 +4581,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/tokens/", pathOffset);
@@ -4005,8 +4636,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/tokens/", pathOffset);
@@ -4059,8 +4692,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/tokens", pathOffset);
@@ -4114,8 +4749,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -4154,13 +4791,18 @@
       var mock = new common_test.HttpServerMock();
       api.UsersResourceApi res = new api.AdminApi(mock).users;
       var arg_userKey = "foo";
+      var arg_customFieldMask = "foo";
+      var arg_projection = "foo";
+      var arg_viewType = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -4183,6 +4825,9 @@
             addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["customFieldMask"].first, unittest.equals(arg_customFieldMask));
+        unittest.expect(queryMap["projection"].first, unittest.equals(arg_projection));
+        unittest.expect(queryMap["viewType"].first, unittest.equals(arg_viewType));
 
 
         var h = {
@@ -4191,7 +4836,7 @@
         var resp = convert.JSON.encode(buildUser());
         return new async.Future.value(common_test.stringResponse(200, h, resp));
       }), true);
-      res.get(arg_userKey).then(unittest.expectAsync(((api.User response) {
+      res.get(arg_userKey, customFieldMask: arg_customFieldMask, projection: arg_projection, viewType: arg_viewType).then(unittest.expectAsync(((api.User response) {
         checkUser(response);
       })));
     });
@@ -4209,8 +4854,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("users"));
         pathOffset += 5;
 
@@ -4247,22 +4894,27 @@
 
       var mock = new common_test.HttpServerMock();
       api.UsersResourceApi res = new api.AdminApi(mock).users;
+      var arg_customFieldMask = "foo";
       var arg_customer = "foo";
       var arg_domain = "foo";
       var arg_event = "foo";
       var arg_maxResults = 42;
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
+      var arg_projection = "foo";
       var arg_query = "foo";
       var arg_showDeleted = "foo";
       var arg_sortOrder = "foo";
+      var arg_viewType = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("users"));
         pathOffset += 5;
 
@@ -4282,15 +4934,18 @@
             addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["customFieldMask"].first, unittest.equals(arg_customFieldMask));
         unittest.expect(queryMap["customer"].first, unittest.equals(arg_customer));
         unittest.expect(queryMap["domain"].first, unittest.equals(arg_domain));
         unittest.expect(queryMap["event"].first, unittest.equals(arg_event));
         unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
         unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
         unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(queryMap["projection"].first, unittest.equals(arg_projection));
         unittest.expect(queryMap["query"].first, unittest.equals(arg_query));
         unittest.expect(queryMap["showDeleted"].first, unittest.equals(arg_showDeleted));
         unittest.expect(queryMap["sortOrder"].first, unittest.equals(arg_sortOrder));
+        unittest.expect(queryMap["viewType"].first, unittest.equals(arg_viewType));
 
 
         var h = {
@@ -4299,7 +4954,7 @@
         var resp = convert.JSON.encode(buildUsers());
         return new async.Future.value(common_test.stringResponse(200, h, resp));
       }), true);
-      res.list(customer: arg_customer, domain: arg_domain, event: arg_event, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken, query: arg_query, showDeleted: arg_showDeleted, sortOrder: arg_sortOrder).then(unittest.expectAsync(((api.Users response) {
+      res.list(customFieldMask: arg_customFieldMask, customer: arg_customer, domain: arg_domain, event: arg_event, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken, projection: arg_projection, query: arg_query, showDeleted: arg_showDeleted, sortOrder: arg_sortOrder, viewType: arg_viewType).then(unittest.expectAsync(((api.Users response) {
         checkUsers(response);
       })));
     });
@@ -4318,8 +4973,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/makeAdmin", pathOffset);
@@ -4371,8 +5028,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -4422,8 +5081,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/undelete", pathOffset);
@@ -4475,8 +5136,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -4517,15 +5180,18 @@
       var mock = new common_test.HttpServerMock();
       api.UsersResourceApi res = new api.AdminApi(mock).users;
       var arg_request = buildChannel();
+      var arg_customFieldMask = "foo";
       var arg_customer = "foo";
       var arg_domain = "foo";
       var arg_event = "foo";
       var arg_maxResults = 42;
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
+      var arg_projection = "foo";
       var arg_query = "foo";
       var arg_showDeleted = "foo";
       var arg_sortOrder = "foo";
+      var arg_viewType = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var obj = new api.Channel.fromJson(json);
         checkChannel(obj);
@@ -4534,8 +5200,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("users/watch"));
         pathOffset += 11;
 
@@ -4555,15 +5223,18 @@
             addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
           }
         }
+        unittest.expect(queryMap["customFieldMask"].first, unittest.equals(arg_customFieldMask));
         unittest.expect(queryMap["customer"].first, unittest.equals(arg_customer));
         unittest.expect(queryMap["domain"].first, unittest.equals(arg_domain));
         unittest.expect(queryMap["event"].first, unittest.equals(arg_event));
         unittest.expect(core.int.parse(queryMap["maxResults"].first), unittest.equals(arg_maxResults));
         unittest.expect(queryMap["orderBy"].first, unittest.equals(arg_orderBy));
         unittest.expect(queryMap["pageToken"].first, unittest.equals(arg_pageToken));
+        unittest.expect(queryMap["projection"].first, unittest.equals(arg_projection));
         unittest.expect(queryMap["query"].first, unittest.equals(arg_query));
         unittest.expect(queryMap["showDeleted"].first, unittest.equals(arg_showDeleted));
         unittest.expect(queryMap["sortOrder"].first, unittest.equals(arg_sortOrder));
+        unittest.expect(queryMap["viewType"].first, unittest.equals(arg_viewType));
 
 
         var h = {
@@ -4572,7 +5243,7 @@
         var resp = convert.JSON.encode(buildChannel());
         return new async.Future.value(common_test.stringResponse(200, h, resp));
       }), true);
-      res.watch(arg_request, customer: arg_customer, domain: arg_domain, event: arg_event, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken, query: arg_query, showDeleted: arg_showDeleted, sortOrder: arg_sortOrder).then(unittest.expectAsync(((api.Channel response) {
+      res.watch(arg_request, customFieldMask: arg_customFieldMask, customer: arg_customer, domain: arg_domain, event: arg_event, maxResults: arg_maxResults, orderBy: arg_orderBy, pageToken: arg_pageToken, projection: arg_projection, query: arg_query, showDeleted: arg_showDeleted, sortOrder: arg_sortOrder, viewType: arg_viewType).then(unittest.expectAsync(((api.Channel response) {
         checkChannel(response);
       })));
     });
@@ -4592,8 +5263,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/aliases/", pathOffset);
@@ -4648,8 +5321,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/aliases", pathOffset);
@@ -4700,8 +5375,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/aliases", pathOffset);
@@ -4757,8 +5434,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/aliases/watch", pathOffset);
@@ -4813,8 +5492,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/photos/thumbnail", pathOffset);
@@ -4862,8 +5543,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/photos/thumbnail", pathOffset);
@@ -4917,8 +5600,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/photos/thumbnail", pathOffset);
@@ -4972,8 +5657,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/photos/thumbnail", pathOffset);
@@ -5027,8 +5714,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/verificationCodes/generate", pathOffset);
@@ -5076,8 +5765,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/verificationCodes/invalidate", pathOffset);
@@ -5125,8 +5816,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/admin/directory/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("admin/directory/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/verificationCodes", pathOffset);
diff --git a/generated/googleapis/test/admin/email_migration_v2_test.dart b/generated/googleapis/test/admin/email_migration_v2_test.dart
index 900efc2..8bb3315 100644
--- a/generated/googleapis/test/admin/email_migration_v2_test.dart
+++ b/generated/googleapis/test/admin/email_migration_v2_test.dart
@@ -92,15 +92,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/email/v2/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/mail", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userKey"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/mail"));
-        pathOffset += 5;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
diff --git a/generated/googleapis/test/admin/reports_v1_test.dart b/generated/googleapis/test/admin/reports_v1_test.dart
index 9a9ae01..ae6300c 100644
--- a/generated/googleapis/test/admin/reports_v1_test.dart
+++ b/generated/googleapis/test/admin/reports_v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed384() {
+buildUnnamed407() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed384(core.List<api.Activity> o) {
+checkUnnamed407(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -35,7 +35,7 @@
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed384();
+    o.items = buildUnnamed407();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -47,7 +47,7 @@
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed384(o.items);
+    checkUnnamed407(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -79,6 +79,32 @@
   buildCounterActivityActor--;
 }
 
+buildUnnamed408() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed408(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed409() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed409(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
 core.int buildCounterActivityEventsParameters = 0;
 buildActivityEventsParameters() {
   var o = new api.ActivityEventsParameters();
@@ -86,6 +112,8 @@
   if (buildCounterActivityEventsParameters < 3) {
     o.boolValue = true;
     o.intValue = "foo";
+    o.multiIntValue = buildUnnamed408();
+    o.multiValue = buildUnnamed409();
     o.name = "foo";
     o.value = "foo";
   }
@@ -98,20 +126,22 @@
   if (buildCounterActivityEventsParameters < 3) {
     unittest.expect(o.boolValue, unittest.isTrue);
     unittest.expect(o.intValue, unittest.equals('foo'));
+    checkUnnamed408(o.multiIntValue);
+    checkUnnamed409(o.multiValue);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterActivityEventsParameters--;
 }
 
-buildUnnamed385() {
+buildUnnamed410() {
   var o = new core.List<api.ActivityEventsParameters>();
   o.add(buildActivityEventsParameters());
   o.add(buildActivityEventsParameters());
   return o;
 }
 
-checkUnnamed385(core.List<api.ActivityEventsParameters> o) {
+checkUnnamed410(core.List<api.ActivityEventsParameters> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityEventsParameters(o[0]);
   checkActivityEventsParameters(o[1]);
@@ -123,7 +153,7 @@
   buildCounterActivityEvents++;
   if (buildCounterActivityEvents < 3) {
     o.name = "foo";
-    o.parameters = buildUnnamed385();
+    o.parameters = buildUnnamed410();
     o.type = "foo";
   }
   buildCounterActivityEvents--;
@@ -134,20 +164,20 @@
   buildCounterActivityEvents++;
   if (buildCounterActivityEvents < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed385(o.parameters);
+    checkUnnamed410(o.parameters);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterActivityEvents--;
 }
 
-buildUnnamed386() {
+buildUnnamed411() {
   var o = new core.List<api.ActivityEvents>();
   o.add(buildActivityEvents());
   o.add(buildActivityEvents());
   return o;
 }
 
-checkUnnamed386(core.List<api.ActivityEvents> o) {
+checkUnnamed411(core.List<api.ActivityEvents> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityEvents(o[0]);
   checkActivityEvents(o[1]);
@@ -185,7 +215,7 @@
   if (buildCounterActivity < 3) {
     o.actor = buildActivityActor();
     o.etag = "foo";
-    o.events = buildUnnamed386();
+    o.events = buildUnnamed411();
     o.id = buildActivityId();
     o.ipAddress = "foo";
     o.kind = "foo";
@@ -200,7 +230,7 @@
   if (buildCounterActivity < 3) {
     checkActivityActor(o.actor);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed386(o.events);
+    checkUnnamed411(o.events);
     checkActivityId(o.id);
     unittest.expect(o.ipAddress, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -209,14 +239,14 @@
   buildCounterActivity--;
 }
 
-buildUnnamed387() {
+buildUnnamed412() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed387(core.Map<core.String, core.String> o) {
+checkUnnamed412(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -231,7 +261,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed387();
+    o.params = buildUnnamed412();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -249,7 +279,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed387(o.params);
+    checkUnnamed412(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -284,30 +314,30 @@
   buildCounterUsageReportEntity--;
 }
 
-buildUnnamed388() {
+buildUnnamed413() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
   o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
   return o;
 }
 
-checkUnnamed388(core.Map<core.String, core.Object> o) {
+checkUnnamed413(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o["x"]) 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')); 
   var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
 }
 
-buildUnnamed389() {
+buildUnnamed414() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed388());
-  o.add(buildUnnamed388());
+  o.add(buildUnnamed413());
+  o.add(buildUnnamed413());
   return o;
 }
 
-checkUnnamed389(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed414(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed388(o[0]);
-  checkUnnamed388(o[1]);
+  checkUnnamed413(o[0]);
+  checkUnnamed413(o[1]);
 }
 
 core.int buildCounterUsageReportParameters = 0;
@@ -318,7 +348,7 @@
     o.boolValue = true;
     o.datetimeValue = core.DateTime.parse("2002-02-27T14:01:02");
     o.intValue = "foo";
-    o.msgValue = buildUnnamed389();
+    o.msgValue = buildUnnamed414();
     o.name = "foo";
     o.stringValue = "foo";
   }
@@ -332,21 +362,21 @@
     unittest.expect(o.boolValue, unittest.isTrue);
     unittest.expect(o.datetimeValue, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.intValue, unittest.equals('foo'));
-    checkUnnamed389(o.msgValue);
+    checkUnnamed414(o.msgValue);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.stringValue, unittest.equals('foo'));
   }
   buildCounterUsageReportParameters--;
 }
 
-buildUnnamed390() {
+buildUnnamed415() {
   var o = new core.List<api.UsageReportParameters>();
   o.add(buildUsageReportParameters());
   o.add(buildUsageReportParameters());
   return o;
 }
 
-checkUnnamed390(core.List<api.UsageReportParameters> o) {
+checkUnnamed415(core.List<api.UsageReportParameters> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReportParameters(o[0]);
   checkUsageReportParameters(o[1]);
@@ -361,7 +391,7 @@
     o.entity = buildUsageReportEntity();
     o.etag = "foo";
     o.kind = "foo";
-    o.parameters = buildUnnamed390();
+    o.parameters = buildUnnamed415();
   }
   buildCounterUsageReport--;
   return o;
@@ -374,19 +404,19 @@
     checkUsageReportEntity(o.entity);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed390(o.parameters);
+    checkUnnamed415(o.parameters);
   }
   buildCounterUsageReport--;
 }
 
-buildUnnamed391() {
+buildUnnamed416() {
   var o = new core.List<api.UsageReport>();
   o.add(buildUsageReport());
   o.add(buildUsageReport());
   return o;
 }
 
-checkUnnamed391(core.List<api.UsageReport> o) {
+checkUnnamed416(core.List<api.UsageReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReport(o[0]);
   checkUsageReport(o[1]);
@@ -413,14 +443,14 @@
   buildCounterUsageReportsWarningsData--;
 }
 
-buildUnnamed392() {
+buildUnnamed417() {
   var o = new core.List<api.UsageReportsWarningsData>();
   o.add(buildUsageReportsWarningsData());
   o.add(buildUsageReportsWarningsData());
   return o;
 }
 
-checkUnnamed392(core.List<api.UsageReportsWarningsData> o) {
+checkUnnamed417(core.List<api.UsageReportsWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReportsWarningsData(o[0]);
   checkUsageReportsWarningsData(o[1]);
@@ -432,7 +462,7 @@
   buildCounterUsageReportsWarnings++;
   if (buildCounterUsageReportsWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed392();
+    o.data = buildUnnamed417();
     o.message = "foo";
   }
   buildCounterUsageReportsWarnings--;
@@ -443,20 +473,20 @@
   buildCounterUsageReportsWarnings++;
   if (buildCounterUsageReportsWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed392(o.data);
+    checkUnnamed417(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterUsageReportsWarnings--;
 }
 
-buildUnnamed393() {
+buildUnnamed418() {
   var o = new core.List<api.UsageReportsWarnings>();
   o.add(buildUsageReportsWarnings());
   o.add(buildUsageReportsWarnings());
   return o;
 }
 
-checkUnnamed393(core.List<api.UsageReportsWarnings> o) {
+checkUnnamed418(core.List<api.UsageReportsWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUsageReportsWarnings(o[0]);
   checkUsageReportsWarnings(o[1]);
@@ -470,8 +500,8 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.usageReports = buildUnnamed391();
-    o.warnings = buildUnnamed393();
+    o.usageReports = buildUnnamed416();
+    o.warnings = buildUnnamed418();
   }
   buildCounterUsageReports--;
   return o;
@@ -483,8 +513,8 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed391(o.usageReports);
-    checkUnnamed393(o.warnings);
+    checkUnnamed416(o.usageReports);
+    checkUnnamed418(o.warnings);
   }
   buildCounterUsageReports--;
 }
@@ -628,8 +658,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/admin/reports/v1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("admin/reports/v1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("activity/users/"));
         pathOffset += 15;
         index = path.indexOf("/applications/", pathOffset);
@@ -703,8 +735,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/admin/reports/v1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("admin/reports/v1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("activity/users/"));
         pathOffset += 15;
         index = path.indexOf("/applications/", pathOffset);
@@ -776,8 +810,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 31), unittest.equals("/admin/reports_v1/channels/stop"));
-        pathOffset += 31;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 30), unittest.equals("admin/reports_v1/channels/stop"));
+        pathOffset += 30;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -823,8 +859,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/admin/reports/v1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("admin/reports/v1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("usage/dates/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -883,8 +921,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/admin/reports/v1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("admin/reports/v1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("usage/users/"));
         pathOffset += 12;
         index = path.indexOf("/dates/", pathOffset);
diff --git a/generated/googleapis/test/adsense/v1_4_test.dart b/generated/googleapis/test/adsense/v1_4_test.dart
index 219c3b0..f524bce 100644
--- a/generated/googleapis/test/adsense/v1_4_test.dart
+++ b/generated/googleapis/test/adsense/v1_4_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed807() {
+buildUnnamed835() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed807(core.List<api.Account> o) {
+checkUnnamed835(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -38,7 +38,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.premium = true;
-    o.subAccounts = buildUnnamed807();
+    o.subAccounts = buildUnnamed835();
     o.timezone = "foo";
   }
   buildCounterAccount--;
@@ -52,20 +52,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.premium, unittest.isTrue);
-    checkUnnamed807(o.subAccounts);
+    checkUnnamed835(o.subAccounts);
     unittest.expect(o.timezone, unittest.equals('foo'));
   }
   buildCounterAccount--;
 }
 
-buildUnnamed808() {
+buildUnnamed836() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed808(core.List<api.Account> o) {
+checkUnnamed836(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -77,7 +77,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed808();
+    o.items = buildUnnamed836();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -89,7 +89,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed808(o.items);
+    checkUnnamed836(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -125,14 +125,14 @@
   buildCounterAdClient--;
 }
 
-buildUnnamed809() {
+buildUnnamed837() {
   var o = new core.List<api.AdClient>();
   o.add(buildAdClient());
   o.add(buildAdClient());
   return o;
 }
 
-checkUnnamed809(core.List<api.AdClient> o) {
+checkUnnamed837(core.List<api.AdClient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdClient(o[0]);
   checkAdClient(o[1]);
@@ -144,7 +144,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed809();
+    o.items = buildUnnamed837();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -156,7 +156,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed809(o.items);
+    checkUnnamed837(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -390,14 +390,14 @@
   buildCounterAdUnit--;
 }
 
-buildUnnamed810() {
+buildUnnamed838() {
   var o = new core.List<api.AdUnit>();
   o.add(buildAdUnit());
   o.add(buildAdUnit());
   return o;
 }
 
-checkUnnamed810(core.List<api.AdUnit> o) {
+checkUnnamed838(core.List<api.AdUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdUnit(o[0]);
   checkAdUnit(o[1]);
@@ -409,7 +409,7 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed810();
+    o.items = buildUnnamed838();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -421,21 +421,21 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed810(o.items);
+    checkUnnamed838(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAdUnits--;
 }
 
-buildUnnamed811() {
+buildUnnamed839() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed811(core.List<core.String> o) {
+checkUnnamed839(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -464,66 +464,66 @@
   buildCounterAdsenseReportsGenerateResponseHeaders--;
 }
 
-buildUnnamed812() {
+buildUnnamed840() {
   var o = new core.List<api.AdsenseReportsGenerateResponseHeaders>();
   o.add(buildAdsenseReportsGenerateResponseHeaders());
   o.add(buildAdsenseReportsGenerateResponseHeaders());
   return o;
 }
 
-checkUnnamed812(core.List<api.AdsenseReportsGenerateResponseHeaders> o) {
+checkUnnamed840(core.List<api.AdsenseReportsGenerateResponseHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdsenseReportsGenerateResponseHeaders(o[0]);
   checkAdsenseReportsGenerateResponseHeaders(o[1]);
 }
 
-buildUnnamed813() {
+buildUnnamed841() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed813(core.List<core.String> o) {
+checkUnnamed841(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed814() {
+buildUnnamed842() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed813());
-  o.add(buildUnnamed813());
+  o.add(buildUnnamed841());
+  o.add(buildUnnamed841());
   return o;
 }
 
-checkUnnamed814(core.List<core.List<core.String>> o) {
+checkUnnamed842(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed813(o[0]);
-  checkUnnamed813(o[1]);
+  checkUnnamed841(o[0]);
+  checkUnnamed841(o[1]);
 }
 
-buildUnnamed815() {
+buildUnnamed843() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed815(core.List<core.String> o) {
+checkUnnamed843(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed816() {
+buildUnnamed844() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed816(core.List<core.String> o) {
+checkUnnamed844(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -534,15 +534,15 @@
   var o = new api.AdsenseReportsGenerateResponse();
   buildCounterAdsenseReportsGenerateResponse++;
   if (buildCounterAdsenseReportsGenerateResponse < 3) {
-    o.averages = buildUnnamed811();
+    o.averages = buildUnnamed839();
     o.endDate = "foo";
-    o.headers = buildUnnamed812();
+    o.headers = buildUnnamed840();
     o.kind = "foo";
-    o.rows = buildUnnamed814();
+    o.rows = buildUnnamed842();
     o.startDate = "foo";
     o.totalMatchedRows = "foo";
-    o.totals = buildUnnamed815();
-    o.warnings = buildUnnamed816();
+    o.totals = buildUnnamed843();
+    o.warnings = buildUnnamed844();
   }
   buildCounterAdsenseReportsGenerateResponse--;
   return o;
@@ -551,15 +551,15 @@
 checkAdsenseReportsGenerateResponse(api.AdsenseReportsGenerateResponse o) {
   buildCounterAdsenseReportsGenerateResponse++;
   if (buildCounterAdsenseReportsGenerateResponse < 3) {
-    checkUnnamed811(o.averages);
+    checkUnnamed839(o.averages);
     unittest.expect(o.endDate, unittest.equals('foo'));
-    checkUnnamed812(o.headers);
+    checkUnnamed840(o.headers);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed814(o.rows);
+    checkUnnamed842(o.rows);
     unittest.expect(o.startDate, unittest.equals('foo'));
     unittest.expect(o.totalMatchedRows, unittest.equals('foo'));
-    checkUnnamed815(o.totals);
-    checkUnnamed816(o.warnings);
+    checkUnnamed843(o.totals);
+    checkUnnamed844(o.warnings);
   }
   buildCounterAdsenseReportsGenerateResponse--;
 }
@@ -593,14 +593,14 @@
   buildCounterAlert--;
 }
 
-buildUnnamed817() {
+buildUnnamed845() {
   var o = new core.List<api.Alert>();
   o.add(buildAlert());
   o.add(buildAlert());
   return o;
 }
 
-checkUnnamed817(core.List<api.Alert> o) {
+checkUnnamed845(core.List<api.Alert> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAlert(o[0]);
   checkAlert(o[1]);
@@ -611,7 +611,7 @@
   var o = new api.Alerts();
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    o.items = buildUnnamed817();
+    o.items = buildUnnamed845();
     o.kind = "foo";
   }
   buildCounterAlerts--;
@@ -621,7 +621,7 @@
 checkAlerts(api.Alerts o) {
   buildCounterAlerts++;
   if (buildCounterAlerts < 3) {
-    checkUnnamed817(o.items);
+    checkUnnamed845(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAlerts--;
@@ -679,14 +679,14 @@
   buildCounterCustomChannel--;
 }
 
-buildUnnamed818() {
+buildUnnamed846() {
   var o = new core.List<api.CustomChannel>();
   o.add(buildCustomChannel());
   o.add(buildCustomChannel());
   return o;
 }
 
-checkUnnamed818(core.List<api.CustomChannel> o) {
+checkUnnamed846(core.List<api.CustomChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomChannel(o[0]);
   checkCustomChannel(o[1]);
@@ -698,7 +698,7 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed818();
+    o.items = buildUnnamed846();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -710,21 +710,21 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed818(o.items);
+    checkUnnamed846(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCustomChannels--;
 }
 
-buildUnnamed819() {
+buildUnnamed847() {
   var o = new core.List<api.ReportingMetadataEntry>();
   o.add(buildReportingMetadataEntry());
   o.add(buildReportingMetadataEntry());
   return o;
 }
 
-checkUnnamed819(core.List<api.ReportingMetadataEntry> o) {
+checkUnnamed847(core.List<api.ReportingMetadataEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportingMetadataEntry(o[0]);
   checkReportingMetadataEntry(o[1]);
@@ -735,7 +735,7 @@
   var o = new api.Metadata();
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    o.items = buildUnnamed819();
+    o.items = buildUnnamed847();
     o.kind = "foo";
   }
   buildCounterMetadata--;
@@ -745,7 +745,7 @@
 checkMetadata(api.Metadata o) {
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
-    checkUnnamed819(o.items);
+    checkUnnamed847(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterMetadata--;
@@ -778,14 +778,14 @@
   buildCounterPayment--;
 }
 
-buildUnnamed820() {
+buildUnnamed848() {
   var o = new core.List<api.Payment>();
   o.add(buildPayment());
   o.add(buildPayment());
   return o;
 }
 
-checkUnnamed820(core.List<api.Payment> o) {
+checkUnnamed848(core.List<api.Payment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPayment(o[0]);
   checkPayment(o[1]);
@@ -796,7 +796,7 @@
   var o = new api.Payments();
   buildCounterPayments++;
   if (buildCounterPayments < 3) {
-    o.items = buildUnnamed820();
+    o.items = buildUnnamed848();
     o.kind = "foo";
   }
   buildCounterPayments--;
@@ -806,72 +806,72 @@
 checkPayments(api.Payments o) {
   buildCounterPayments++;
   if (buildCounterPayments < 3) {
-    checkUnnamed820(o.items);
+    checkUnnamed848(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPayments--;
 }
 
-buildUnnamed821() {
+buildUnnamed849() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed821(core.List<core.String> o) {
+checkUnnamed849(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed822() {
+buildUnnamed850() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed822(core.List<core.String> o) {
+checkUnnamed850(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed823() {
+buildUnnamed851() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed823(core.List<core.String> o) {
+checkUnnamed851(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed824() {
+buildUnnamed852() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed824(core.List<core.String> o) {
+checkUnnamed852(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed825() {
+buildUnnamed853() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed825(core.List<core.String> o) {
+checkUnnamed853(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -882,13 +882,13 @@
   var o = new api.ReportingMetadataEntry();
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    o.compatibleDimensions = buildUnnamed821();
-    o.compatibleMetrics = buildUnnamed822();
+    o.compatibleDimensions = buildUnnamed849();
+    o.compatibleMetrics = buildUnnamed850();
     o.id = "foo";
     o.kind = "foo";
-    o.requiredDimensions = buildUnnamed823();
-    o.requiredMetrics = buildUnnamed824();
-    o.supportedProducts = buildUnnamed825();
+    o.requiredDimensions = buildUnnamed851();
+    o.requiredMetrics = buildUnnamed852();
+    o.supportedProducts = buildUnnamed853();
   }
   buildCounterReportingMetadataEntry--;
   return o;
@@ -897,13 +897,13 @@
 checkReportingMetadataEntry(api.ReportingMetadataEntry o) {
   buildCounterReportingMetadataEntry++;
   if (buildCounterReportingMetadataEntry < 3) {
-    checkUnnamed821(o.compatibleDimensions);
-    checkUnnamed822(o.compatibleMetrics);
+    checkUnnamed849(o.compatibleDimensions);
+    checkUnnamed850(o.compatibleMetrics);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed823(o.requiredDimensions);
-    checkUnnamed824(o.requiredMetrics);
-    checkUnnamed825(o.supportedProducts);
+    checkUnnamed851(o.requiredDimensions);
+    checkUnnamed852(o.requiredMetrics);
+    checkUnnamed853(o.supportedProducts);
   }
   buildCounterReportingMetadataEntry--;
 }
@@ -933,14 +933,14 @@
   buildCounterSavedAdStyle--;
 }
 
-buildUnnamed826() {
+buildUnnamed854() {
   var o = new core.List<api.SavedAdStyle>();
   o.add(buildSavedAdStyle());
   o.add(buildSavedAdStyle());
   return o;
 }
 
-checkUnnamed826(core.List<api.SavedAdStyle> o) {
+checkUnnamed854(core.List<api.SavedAdStyle> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedAdStyle(o[0]);
   checkSavedAdStyle(o[1]);
@@ -952,7 +952,7 @@
   buildCounterSavedAdStyles++;
   if (buildCounterSavedAdStyles < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed826();
+    o.items = buildUnnamed854();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -964,7 +964,7 @@
   buildCounterSavedAdStyles++;
   if (buildCounterSavedAdStyles < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed826(o.items);
+    checkUnnamed854(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -994,14 +994,14 @@
   buildCounterSavedReport--;
 }
 
-buildUnnamed827() {
+buildUnnamed855() {
   var o = new core.List<api.SavedReport>();
   o.add(buildSavedReport());
   o.add(buildSavedReport());
   return o;
 }
 
-checkUnnamed827(core.List<api.SavedReport> o) {
+checkUnnamed855(core.List<api.SavedReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedReport(o[0]);
   checkSavedReport(o[1]);
@@ -1013,7 +1013,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed827();
+    o.items = buildUnnamed855();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1025,7 +1025,7 @@
   buildCounterSavedReports++;
   if (buildCounterSavedReports < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed827(o.items);
+    checkUnnamed855(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1055,14 +1055,14 @@
   buildCounterUrlChannel--;
 }
 
-buildUnnamed828() {
+buildUnnamed856() {
   var o = new core.List<api.UrlChannel>();
   o.add(buildUrlChannel());
   o.add(buildUrlChannel());
   return o;
 }
 
-checkUnnamed828(core.List<api.UrlChannel> o) {
+checkUnnamed856(core.List<api.UrlChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlChannel(o[0]);
   checkUrlChannel(o[1]);
@@ -1074,7 +1074,7 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed828();
+    o.items = buildUnnamed856();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1086,125 +1086,125 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed828(o.items);
+    checkUnnamed856(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterUrlChannels--;
 }
 
-buildUnnamed829() {
+buildUnnamed857() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed829(core.List<core.String> o) {
+checkUnnamed857(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed830() {
+buildUnnamed858() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed830(core.List<core.String> o) {
+checkUnnamed858(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed831() {
+buildUnnamed859() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed831(core.List<core.String> o) {
+checkUnnamed859(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed832() {
+buildUnnamed860() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed832(core.List<core.String> o) {
+checkUnnamed860(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed833() {
+buildUnnamed861() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed833(core.List<core.String> o) {
+checkUnnamed861(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed834() {
+buildUnnamed862() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed834(core.List<core.String> o) {
+checkUnnamed862(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed835() {
+buildUnnamed863() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed835(core.List<core.String> o) {
+checkUnnamed863(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed836() {
+buildUnnamed864() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed836(core.List<core.String> o) {
+checkUnnamed864(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed837() {
+buildUnnamed865() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed837(core.List<core.String> o) {
+checkUnnamed865(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1503,8 +1503,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1552,8 +1554,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("accounts"));
         pathOffset += 8;
 
@@ -1604,8 +1608,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/adclients", pathOffset);
@@ -1663,8 +1669,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/adclients/", pathOffset);
@@ -1726,8 +1734,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/adclients/", pathOffset);
@@ -1795,8 +1805,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/adclients/", pathOffset);
@@ -1864,8 +1876,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/adclients/", pathOffset);
@@ -1936,8 +1950,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/alerts/", pathOffset);
@@ -1989,8 +2005,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/alerts", pathOffset);
@@ -2047,8 +2065,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/adclients/", pathOffset);
@@ -2111,8 +2131,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/adclients/", pathOffset);
@@ -2180,8 +2202,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/adclients/", pathOffset);
@@ -2252,8 +2276,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/payments", pathOffset);
@@ -2307,12 +2333,12 @@
       var arg_startDate = "foo";
       var arg_endDate = "foo";
       var arg_currency = "foo";
-      var arg_dimension = buildUnnamed829();
-      var arg_filter = buildUnnamed830();
+      var arg_dimension = buildUnnamed857();
+      var arg_filter = buildUnnamed858();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed831();
-      var arg_sort = buildUnnamed832();
+      var arg_metric = buildUnnamed859();
+      var arg_sort = buildUnnamed860();
       var arg_startIndex = 42;
       var arg_useTimezoneReporting = true;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
@@ -2320,8 +2346,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/reports", pathOffset);
@@ -2390,8 +2418,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/reports/", pathOffset);
@@ -2449,8 +2479,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/reports/saved", pathOffset);
@@ -2507,8 +2539,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/savedadstyles/", pathOffset);
@@ -2563,8 +2597,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/savedadstyles", pathOffset);
@@ -2623,8 +2659,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/adclients/", pathOffset);
@@ -2688,8 +2726,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("adclients"));
         pathOffset += 9;
 
@@ -2739,8 +2779,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/adunits/", pathOffset);
@@ -2794,8 +2836,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/adunits/", pathOffset);
@@ -2855,8 +2899,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/adunits", pathOffset);
@@ -2916,8 +2962,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/adunits/", pathOffset);
@@ -2980,8 +3028,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("alerts/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -3025,8 +3075,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("alerts"));
         pathOffset += 6;
 
@@ -3075,8 +3127,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/customchannels/", pathOffset);
@@ -3131,8 +3185,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/customchannels", pathOffset);
@@ -3192,8 +3248,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/customchannels/", pathOffset);
@@ -3256,8 +3314,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("metadata/dimensions"));
         pathOffset += 19;
 
@@ -3303,8 +3363,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("metadata/metrics"));
         pathOffset += 16;
 
@@ -3350,8 +3412,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("payments"));
         pathOffset += 8;
 
@@ -3396,14 +3460,14 @@
       api.ReportsResourceApi res = new api.AdsenseApi(mock).reports;
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_accountId = buildUnnamed833();
+      var arg_accountId = buildUnnamed861();
       var arg_currency = "foo";
-      var arg_dimension = buildUnnamed834();
-      var arg_filter = buildUnnamed835();
+      var arg_dimension = buildUnnamed862();
+      var arg_filter = buildUnnamed863();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed836();
-      var arg_sort = buildUnnamed837();
+      var arg_metric = buildUnnamed864();
+      var arg_sort = buildUnnamed865();
       var arg_startIndex = 42;
       var arg_useTimezoneReporting = true;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
@@ -3411,8 +3475,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("reports"));
         pathOffset += 7;
 
@@ -3474,8 +3540,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("reports/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -3525,8 +3593,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("reports/saved"));
         pathOffset += 13;
 
@@ -3575,8 +3645,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("savedadstyles/"));
         pathOffset += 14;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -3623,8 +3695,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("savedadstyles"));
         pathOffset += 13;
 
@@ -3675,8 +3749,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/adsense/v1.4/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("adsense/v1.4/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/urlchannels", pathOffset);
diff --git a/generated/googleapis/test/adsensehost/v4_1_test.dart b/generated/googleapis/test/adsensehost/v4_1_test.dart
index caadc34..3c9f6d2 100644
--- a/generated/googleapis/test/adsensehost/v4_1_test.dart
+++ b/generated/googleapis/test/adsensehost/v4_1_test.dart
@@ -41,14 +41,14 @@
   buildCounterAccount--;
 }
 
-buildUnnamed967() {
+buildUnnamed995() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed967(core.List<api.Account> o) {
+checkUnnamed995(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -60,7 +60,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed967();
+    o.items = buildUnnamed995();
     o.kind = "foo";
   }
   buildCounterAccounts--;
@@ -71,7 +71,7 @@
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed967(o.items);
+    checkUnnamed995(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccounts--;
@@ -104,14 +104,14 @@
   buildCounterAdClient--;
 }
 
-buildUnnamed968() {
+buildUnnamed996() {
   var o = new core.List<api.AdClient>();
   o.add(buildAdClient());
   o.add(buildAdClient());
   return o;
 }
 
-checkUnnamed968(core.List<api.AdClient> o) {
+checkUnnamed996(core.List<api.AdClient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdClient(o[0]);
   checkAdClient(o[1]);
@@ -123,7 +123,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed968();
+    o.items = buildUnnamed996();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -135,7 +135,7 @@
   buildCounterAdClients++;
   if (buildCounterAdClients < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed968(o.items);
+    checkUnnamed996(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -340,14 +340,14 @@
   buildCounterAdUnit--;
 }
 
-buildUnnamed969() {
+buildUnnamed997() {
   var o = new core.List<api.AdUnit>();
   o.add(buildAdUnit());
   o.add(buildAdUnit());
   return o;
 }
 
-checkUnnamed969(core.List<api.AdUnit> o) {
+checkUnnamed997(core.List<api.AdUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdUnit(o[0]);
   checkAdUnit(o[1]);
@@ -359,7 +359,7 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed969();
+    o.items = buildUnnamed997();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -371,21 +371,21 @@
   buildCounterAdUnits++;
   if (buildCounterAdUnits < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed969(o.items);
+    checkUnnamed997(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAdUnits--;
 }
 
-buildUnnamed970() {
+buildUnnamed998() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed970(core.List<core.String> o) {
+checkUnnamed998(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -399,7 +399,7 @@
     o.accountId = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.productCodes = buildUnnamed970();
+    o.productCodes = buildUnnamed998();
     o.redirectUrl = "foo";
     o.status = "foo";
     o.userLocale = "foo";
@@ -416,7 +416,7 @@
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed970(o.productCodes);
+    checkUnnamed998(o.productCodes);
     unittest.expect(o.redirectUrl, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.userLocale, unittest.equals('foo'));
@@ -451,14 +451,14 @@
   buildCounterCustomChannel--;
 }
 
-buildUnnamed971() {
+buildUnnamed999() {
   var o = new core.List<api.CustomChannel>();
   o.add(buildCustomChannel());
   o.add(buildCustomChannel());
   return o;
 }
 
-checkUnnamed971(core.List<api.CustomChannel> o) {
+checkUnnamed999(core.List<api.CustomChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomChannel(o[0]);
   checkCustomChannel(o[1]);
@@ -470,7 +470,7 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed971();
+    o.items = buildUnnamed999();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -482,21 +482,21 @@
   buildCounterCustomChannels++;
   if (buildCounterCustomChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed971(o.items);
+    checkUnnamed999(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterCustomChannels--;
 }
 
-buildUnnamed972() {
+buildUnnamed1000() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed972(core.List<core.String> o) {
+checkUnnamed1000(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -525,66 +525,66 @@
   buildCounterReportHeaders--;
 }
 
-buildUnnamed973() {
+buildUnnamed1001() {
   var o = new core.List<api.ReportHeaders>();
   o.add(buildReportHeaders());
   o.add(buildReportHeaders());
   return o;
 }
 
-checkUnnamed973(core.List<api.ReportHeaders> o) {
+checkUnnamed1001(core.List<api.ReportHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportHeaders(o[0]);
   checkReportHeaders(o[1]);
 }
 
-buildUnnamed974() {
+buildUnnamed1002() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed974(core.List<core.String> o) {
+checkUnnamed1002(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed975() {
+buildUnnamed1003() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed974());
-  o.add(buildUnnamed974());
+  o.add(buildUnnamed1002());
+  o.add(buildUnnamed1002());
   return o;
 }
 
-checkUnnamed975(core.List<core.List<core.String>> o) {
+checkUnnamed1003(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed974(o[0]);
-  checkUnnamed974(o[1]);
+  checkUnnamed1002(o[0]);
+  checkUnnamed1002(o[1]);
 }
 
-buildUnnamed976() {
+buildUnnamed1004() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed976(core.List<core.String> o) {
+checkUnnamed1004(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed977() {
+buildUnnamed1005() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed977(core.List<core.String> o) {
+checkUnnamed1005(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -595,13 +595,13 @@
   var o = new api.Report();
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    o.averages = buildUnnamed972();
-    o.headers = buildUnnamed973();
+    o.averages = buildUnnamed1000();
+    o.headers = buildUnnamed1001();
     o.kind = "foo";
-    o.rows = buildUnnamed975();
+    o.rows = buildUnnamed1003();
     o.totalMatchedRows = "foo";
-    o.totals = buildUnnamed976();
-    o.warnings = buildUnnamed977();
+    o.totals = buildUnnamed1004();
+    o.warnings = buildUnnamed1005();
   }
   buildCounterReport--;
   return o;
@@ -610,13 +610,13 @@
 checkReport(api.Report o) {
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    checkUnnamed972(o.averages);
-    checkUnnamed973(o.headers);
+    checkUnnamed1000(o.averages);
+    checkUnnamed1001(o.headers);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed975(o.rows);
+    checkUnnamed1003(o.rows);
     unittest.expect(o.totalMatchedRows, unittest.equals('foo'));
-    checkUnnamed976(o.totals);
-    checkUnnamed977(o.warnings);
+    checkUnnamed1004(o.totals);
+    checkUnnamed1005(o.warnings);
   }
   buildCounterReport--;
 }
@@ -644,14 +644,14 @@
   buildCounterUrlChannel--;
 }
 
-buildUnnamed978() {
+buildUnnamed1006() {
   var o = new core.List<api.UrlChannel>();
   o.add(buildUrlChannel());
   o.add(buildUrlChannel());
   return o;
 }
 
-checkUnnamed978(core.List<api.UrlChannel> o) {
+checkUnnamed1006(core.List<api.UrlChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlChannel(o[0]);
   checkUrlChannel(o[1]);
@@ -663,7 +663,7 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed978();
+    o.items = buildUnnamed1006();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -675,151 +675,151 @@
   buildCounterUrlChannels++;
   if (buildCounterUrlChannels < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed978(o.items);
+    checkUnnamed1006(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterUrlChannels--;
 }
 
-buildUnnamed979() {
+buildUnnamed1007() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed979(core.List<core.String> o) {
+checkUnnamed1007(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed980() {
+buildUnnamed1008() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed980(core.List<core.String> o) {
+checkUnnamed1008(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed981() {
+buildUnnamed1009() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed981(core.List<core.String> o) {
+checkUnnamed1009(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed982() {
+buildUnnamed1010() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed982(core.List<core.String> o) {
+checkUnnamed1010(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed983() {
+buildUnnamed1011() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed983(core.List<core.String> o) {
+checkUnnamed1011(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed984() {
+buildUnnamed1012() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed984(core.List<core.String> o) {
+checkUnnamed1012(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed985() {
+buildUnnamed1013() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed985(core.List<core.String> o) {
+checkUnnamed1013(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed986() {
+buildUnnamed1014() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed986(core.List<core.String> o) {
+checkUnnamed1014(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed987() {
+buildUnnamed1015() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed987(core.List<core.String> o) {
+checkUnnamed1015(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed988() {
+buildUnnamed1016() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed988(core.List<core.String> o) {
+checkUnnamed1016(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed989() {
+buildUnnamed1017() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed989(core.List<core.String> o) {
+checkUnnamed1017(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1018,8 +1018,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1059,14 +1061,16 @@
 
       var mock = new common_test.HttpServerMock();
       api.AccountsResourceApi res = new api.AdsensehostApi(mock).accounts;
-      var arg_filterAdClientId = buildUnnamed979();
+      var arg_filterAdClientId = buildUnnamed1007();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("accounts"));
         pathOffset += 8;
 
@@ -1115,8 +1119,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/adclients/", pathOffset);
@@ -1171,8 +1177,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/adclients", pathOffset);
@@ -1230,8 +1238,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/adclients/", pathOffset);
@@ -1293,8 +1303,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/adclients/", pathOffset);
@@ -1351,14 +1363,16 @@
       var arg_accountId = "foo";
       var arg_adClientId = "foo";
       var arg_adUnitId = "foo";
-      var arg_hostCustomChannelId = buildUnnamed980();
+      var arg_hostCustomChannelId = buildUnnamed1008();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/adclients/", pathOffset);
@@ -1428,8 +1442,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/adclients/", pathOffset);
@@ -1490,8 +1506,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/adclients/", pathOffset);
@@ -1557,8 +1575,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/adclients/", pathOffset);
@@ -1621,8 +1641,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/adclients/", pathOffset);
@@ -1680,20 +1702,22 @@
       var arg_accountId = "foo";
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_dimension = buildUnnamed981();
-      var arg_filter = buildUnnamed982();
+      var arg_dimension = buildUnnamed1009();
+      var arg_filter = buildUnnamed1010();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed983();
-      var arg_sort = buildUnnamed984();
+      var arg_metric = buildUnnamed1011();
+      var arg_sort = buildUnnamed1012();
       var arg_startIndex = 42;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/reports", pathOffset);
@@ -1756,8 +1780,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1804,8 +1830,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("adclients"));
         pathOffset += 9;
 
@@ -1848,7 +1876,7 @@
 
       var mock = new common_test.HttpServerMock();
       api.AssociationsessionsResourceApi res = new api.AdsensehostApi(mock).associationsessions;
-      var arg_productCode = buildUnnamed985();
+      var arg_productCode = buildUnnamed1013();
       var arg_websiteUrl = "foo";
       var arg_userLocale = "foo";
       var arg_websiteLocale = "foo";
@@ -1857,8 +1885,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("associationsessions/start"));
         pathOffset += 25;
 
@@ -1905,8 +1935,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("associationsessions/verify"));
         pathOffset += 26;
 
@@ -1955,8 +1987,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/customchannels/", pathOffset);
@@ -2010,8 +2044,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/customchannels/", pathOffset);
@@ -2068,8 +2104,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/customchannels", pathOffset);
@@ -2121,8 +2159,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/customchannels", pathOffset);
@@ -2179,8 +2219,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/customchannels", pathOffset);
@@ -2235,8 +2277,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/customchannels", pathOffset);
@@ -2286,20 +2330,22 @@
       api.ReportsResourceApi res = new api.AdsensehostApi(mock).reports;
       var arg_startDate = "foo";
       var arg_endDate = "foo";
-      var arg_dimension = buildUnnamed986();
-      var arg_filter = buildUnnamed987();
+      var arg_dimension = buildUnnamed1014();
+      var arg_filter = buildUnnamed1015();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_metric = buildUnnamed988();
-      var arg_sort = buildUnnamed989();
+      var arg_metric = buildUnnamed1016();
+      var arg_sort = buildUnnamed1017();
       var arg_startIndex = 42;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("reports"));
         pathOffset += 7;
 
@@ -2356,8 +2402,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/urlchannels/", pathOffset);
@@ -2414,8 +2462,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/urlchannels", pathOffset);
@@ -2467,8 +2517,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/adsensehost/v4.1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("adsensehost/v4.1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("adclients/"));
         pathOffset += 10;
         index = path.indexOf("/urlchannels", pathOffset);
diff --git a/generated/googleapis/test/analytics/v3_test.dart b/generated/googleapis/test/analytics/v3_test.dart
index 49e2fa8..3d132bd 100644
--- a/generated/googleapis/test/analytics/v3_test.dart
+++ b/generated/googleapis/test/analytics/v3_test.dart
@@ -37,14 +37,14 @@
   buildCounterAccountChildLink--;
 }
 
-buildUnnamed581() {
+buildUnnamed609() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed581(core.List<core.String> o) {
+checkUnnamed609(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -55,7 +55,7 @@
   var o = new api.AccountPermissions();
   buildCounterAccountPermissions++;
   if (buildCounterAccountPermissions < 3) {
-    o.effective = buildUnnamed581();
+    o.effective = buildUnnamed609();
   }
   buildCounterAccountPermissions--;
   return o;
@@ -64,7 +64,7 @@
 checkAccountPermissions(api.AccountPermissions o) {
   buildCounterAccountPermissions++;
   if (buildCounterAccountPermissions < 3) {
-    checkUnnamed581(o.effective);
+    checkUnnamed609(o.effective);
   }
   buildCounterAccountPermissions--;
 }
@@ -127,14 +127,14 @@
   buildCounterAccountRef--;
 }
 
-buildUnnamed582() {
+buildUnnamed610() {
   var o = new core.List<api.AccountSummary>();
   o.add(buildAccountSummary());
   o.add(buildAccountSummary());
   return o;
 }
 
-checkUnnamed582(core.List<api.AccountSummary> o) {
+checkUnnamed610(core.List<api.AccountSummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountSummary(o[0]);
   checkAccountSummary(o[1]);
@@ -145,7 +145,7 @@
   var o = new api.AccountSummaries();
   buildCounterAccountSummaries++;
   if (buildCounterAccountSummaries < 3) {
-    o.items = buildUnnamed582();
+    o.items = buildUnnamed610();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -161,7 +161,7 @@
 checkAccountSummaries(api.AccountSummaries o) {
   buildCounterAccountSummaries++;
   if (buildCounterAccountSummaries < 3) {
-    checkUnnamed582(o.items);
+    checkUnnamed610(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -173,14 +173,14 @@
   buildCounterAccountSummaries--;
 }
 
-buildUnnamed583() {
+buildUnnamed611() {
   var o = new core.List<api.WebPropertySummary>();
   o.add(buildWebPropertySummary());
   o.add(buildWebPropertySummary());
   return o;
 }
 
-checkUnnamed583(core.List<api.WebPropertySummary> o) {
+checkUnnamed611(core.List<api.WebPropertySummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebPropertySummary(o[0]);
   checkWebPropertySummary(o[1]);
@@ -194,7 +194,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.webProperties = buildUnnamed583();
+    o.webProperties = buildUnnamed611();
   }
   buildCounterAccountSummary--;
   return o;
@@ -206,7 +206,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed583(o.webProperties);
+    checkUnnamed611(o.webProperties);
   }
   buildCounterAccountSummary--;
 }
@@ -240,14 +240,14 @@
   buildCounterAccountTicket--;
 }
 
-buildUnnamed584() {
+buildUnnamed612() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed584(core.List<api.Account> o) {
+checkUnnamed612(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -258,7 +258,7 @@
   var o = new api.Accounts();
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
-    o.items = buildUnnamed584();
+    o.items = buildUnnamed612();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -274,7 +274,7 @@
 checkAccounts(api.Accounts o) {
   buildCounterAccounts++;
   if (buildCounterAccounts < 3) {
-    checkUnnamed584(o.items);
+    checkUnnamed612(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -309,14 +309,14 @@
   buildCounterAdWordsAccount--;
 }
 
-buildUnnamed585() {
+buildUnnamed613() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed585(core.List<core.String> o) {
+checkUnnamed613(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -327,7 +327,7 @@
   var o = new api.AnalyticsDataimportDeleteUploadDataRequest();
   buildCounterAnalyticsDataimportDeleteUploadDataRequest++;
   if (buildCounterAnalyticsDataimportDeleteUploadDataRequest < 3) {
-    o.customDataImportUids = buildUnnamed585();
+    o.customDataImportUids = buildUnnamed613();
   }
   buildCounterAnalyticsDataimportDeleteUploadDataRequest--;
   return o;
@@ -336,19 +336,19 @@
 checkAnalyticsDataimportDeleteUploadDataRequest(api.AnalyticsDataimportDeleteUploadDataRequest o) {
   buildCounterAnalyticsDataimportDeleteUploadDataRequest++;
   if (buildCounterAnalyticsDataimportDeleteUploadDataRequest < 3) {
-    checkUnnamed585(o.customDataImportUids);
+    checkUnnamed613(o.customDataImportUids);
   }
   buildCounterAnalyticsDataimportDeleteUploadDataRequest--;
 }
 
-buildUnnamed586() {
+buildUnnamed614() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed586(core.Map<core.String, core.String> o) {
+checkUnnamed614(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -359,7 +359,7 @@
   var o = new api.Column();
   buildCounterColumn++;
   if (buildCounterColumn < 3) {
-    o.attributes = buildUnnamed586();
+    o.attributes = buildUnnamed614();
     o.id = "foo";
     o.kind = "foo";
   }
@@ -370,34 +370,34 @@
 checkColumn(api.Column o) {
   buildCounterColumn++;
   if (buildCounterColumn < 3) {
-    checkUnnamed586(o.attributes);
+    checkUnnamed614(o.attributes);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterColumn--;
 }
 
-buildUnnamed587() {
+buildUnnamed615() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed587(core.List<core.String> o) {
+checkUnnamed615(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed588() {
+buildUnnamed616() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed588(core.List<api.Column> o) {
+checkUnnamed616(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -408,9 +408,9 @@
   var o = new api.Columns();
   buildCounterColumns++;
   if (buildCounterColumns < 3) {
-    o.attributeNames = buildUnnamed587();
+    o.attributeNames = buildUnnamed615();
     o.etag = "foo";
-    o.items = buildUnnamed588();
+    o.items = buildUnnamed616();
     o.kind = "foo";
     o.totalResults = 42;
   }
@@ -421,9 +421,9 @@
 checkColumns(api.Columns o) {
   buildCounterColumns++;
   if (buildCounterColumns < 3) {
-    checkUnnamed587(o.attributeNames);
+    checkUnnamed615(o.attributeNames);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed588(o.items);
+    checkUnnamed616(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.totalResults, unittest.equals(42));
   }
@@ -472,14 +472,14 @@
   buildCounterCustomDataSourceParentLink--;
 }
 
-buildUnnamed589() {
+buildUnnamed617() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed589(core.List<core.String> o) {
+checkUnnamed617(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -499,7 +499,7 @@
     o.kind = "foo";
     o.name = "foo";
     o.parentLink = buildCustomDataSourceParentLink();
-    o.profilesLinked = buildUnnamed589();
+    o.profilesLinked = buildUnnamed617();
     o.selfLink = "foo";
     o.type = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
@@ -522,7 +522,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkCustomDataSourceParentLink(o.parentLink);
-    checkUnnamed589(o.profilesLinked);
+    checkUnnamed617(o.profilesLinked);
     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")));
@@ -532,14 +532,14 @@
   buildCounterCustomDataSource--;
 }
 
-buildUnnamed590() {
+buildUnnamed618() {
   var o = new core.List<api.CustomDataSource>();
   o.add(buildCustomDataSource());
   o.add(buildCustomDataSource());
   return o;
 }
 
-checkUnnamed590(core.List<api.CustomDataSource> o) {
+checkUnnamed618(core.List<api.CustomDataSource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomDataSource(o[0]);
   checkCustomDataSource(o[1]);
@@ -550,7 +550,7 @@
   var o = new api.CustomDataSources();
   buildCounterCustomDataSources++;
   if (buildCounterCustomDataSources < 3) {
-    o.items = buildUnnamed590();
+    o.items = buildUnnamed618();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -566,7 +566,7 @@
 checkCustomDataSources(api.CustomDataSources o) {
   buildCounterCustomDataSources++;
   if (buildCounterCustomDataSources < 3) {
-    checkUnnamed590(o.items);
+    checkUnnamed618(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -620,14 +620,14 @@
   buildCounterDailyUploadRecentChanges--;
 }
 
-buildUnnamed591() {
+buildUnnamed619() {
   var o = new core.List<api.DailyUploadRecentChanges>();
   o.add(buildDailyUploadRecentChanges());
   o.add(buildDailyUploadRecentChanges());
   return o;
 }
 
-checkUnnamed591(core.List<api.DailyUploadRecentChanges> o) {
+checkUnnamed619(core.List<api.DailyUploadRecentChanges> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDailyUploadRecentChanges(o[0]);
   checkDailyUploadRecentChanges(o[1]);
@@ -646,7 +646,7 @@
     o.kind = "foo";
     o.modifiedTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.parentLink = buildDailyUploadParentLink();
-    o.recentChanges = buildUnnamed591();
+    o.recentChanges = buildUnnamed619();
     o.selfLink = "foo";
     o.webPropertyId = "foo";
   }
@@ -665,7 +665,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.modifiedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkDailyUploadParentLink(o.parentLink);
-    checkUnnamed591(o.recentChanges);
+    checkUnnamed619(o.recentChanges);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.webPropertyId, unittest.equals('foo'));
   }
@@ -703,14 +703,14 @@
   buildCounterDailyUploadAppend--;
 }
 
-buildUnnamed592() {
+buildUnnamed620() {
   var o = new core.List<api.DailyUpload>();
   o.add(buildDailyUpload());
   o.add(buildDailyUpload());
   return o;
 }
 
-checkUnnamed592(core.List<api.DailyUpload> o) {
+checkUnnamed620(core.List<api.DailyUpload> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDailyUpload(o[0]);
   checkDailyUpload(o[1]);
@@ -721,7 +721,7 @@
   var o = new api.DailyUploads();
   buildCounterDailyUploads++;
   if (buildCounterDailyUploads < 3) {
-    o.items = buildUnnamed592();
+    o.items = buildUnnamed620();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -737,7 +737,7 @@
 checkDailyUploads(api.DailyUploads o) {
   buildCounterDailyUploads++;
   if (buildCounterDailyUploads < 3) {
-    checkUnnamed592(o.items);
+    checkUnnamed620(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -749,14 +749,14 @@
   buildCounterDailyUploads--;
 }
 
-buildUnnamed593() {
+buildUnnamed621() {
   var o = new core.List<api.AdWordsAccount>();
   o.add(buildAdWordsAccount());
   o.add(buildAdWordsAccount());
   return o;
 }
 
-checkUnnamed593(core.List<api.AdWordsAccount> o) {
+checkUnnamed621(core.List<api.AdWordsAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdWordsAccount(o[0]);
   checkAdWordsAccount(o[1]);
@@ -781,14 +781,14 @@
   buildCounterEntityAdWordsLinkEntity--;
 }
 
-buildUnnamed594() {
+buildUnnamed622() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed594(core.List<core.String> o) {
+checkUnnamed622(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -799,12 +799,12 @@
   var o = new api.EntityAdWordsLink();
   buildCounterEntityAdWordsLink++;
   if (buildCounterEntityAdWordsLink < 3) {
-    o.adWordsAccounts = buildUnnamed593();
+    o.adWordsAccounts = buildUnnamed621();
     o.entity = buildEntityAdWordsLinkEntity();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.profileIds = buildUnnamed594();
+    o.profileIds = buildUnnamed622();
     o.selfLink = "foo";
   }
   buildCounterEntityAdWordsLink--;
@@ -814,25 +814,25 @@
 checkEntityAdWordsLink(api.EntityAdWordsLink o) {
   buildCounterEntityAdWordsLink++;
   if (buildCounterEntityAdWordsLink < 3) {
-    checkUnnamed593(o.adWordsAccounts);
+    checkUnnamed621(o.adWordsAccounts);
     checkEntityAdWordsLinkEntity(o.entity);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed594(o.profileIds);
+    checkUnnamed622(o.profileIds);
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
   buildCounterEntityAdWordsLink--;
 }
 
-buildUnnamed595() {
+buildUnnamed623() {
   var o = new core.List<api.EntityAdWordsLink>();
   o.add(buildEntityAdWordsLink());
   o.add(buildEntityAdWordsLink());
   return o;
 }
 
-checkUnnamed595(core.List<api.EntityAdWordsLink> o) {
+checkUnnamed623(core.List<api.EntityAdWordsLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityAdWordsLink(o[0]);
   checkEntityAdWordsLink(o[1]);
@@ -843,7 +843,7 @@
   var o = new api.EntityAdWordsLinks();
   buildCounterEntityAdWordsLinks++;
   if (buildCounterEntityAdWordsLinks < 3) {
-    o.items = buildUnnamed595();
+    o.items = buildUnnamed623();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -858,7 +858,7 @@
 checkEntityAdWordsLinks(api.EntityAdWordsLinks o) {
   buildCounterEntityAdWordsLinks++;
   if (buildCounterEntityAdWordsLinks < 3) {
-    checkUnnamed595(o.items);
+    checkUnnamed623(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -892,27 +892,27 @@
   buildCounterEntityUserLinkEntity--;
 }
 
-buildUnnamed596() {
+buildUnnamed624() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed596(core.List<core.String> o) {
+checkUnnamed624(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed597() {
+buildUnnamed625() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed597(core.List<core.String> o) {
+checkUnnamed625(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -923,8 +923,8 @@
   var o = new api.EntityUserLinkPermissions();
   buildCounterEntityUserLinkPermissions++;
   if (buildCounterEntityUserLinkPermissions < 3) {
-    o.effective = buildUnnamed596();
-    o.local = buildUnnamed597();
+    o.effective = buildUnnamed624();
+    o.local = buildUnnamed625();
   }
   buildCounterEntityUserLinkPermissions--;
   return o;
@@ -933,8 +933,8 @@
 checkEntityUserLinkPermissions(api.EntityUserLinkPermissions o) {
   buildCounterEntityUserLinkPermissions++;
   if (buildCounterEntityUserLinkPermissions < 3) {
-    checkUnnamed596(o.effective);
-    checkUnnamed597(o.local);
+    checkUnnamed624(o.effective);
+    checkUnnamed625(o.local);
   }
   buildCounterEntityUserLinkPermissions--;
 }
@@ -968,14 +968,14 @@
   buildCounterEntityUserLink--;
 }
 
-buildUnnamed598() {
+buildUnnamed626() {
   var o = new core.List<api.EntityUserLink>();
   o.add(buildEntityUserLink());
   o.add(buildEntityUserLink());
   return o;
 }
 
-checkUnnamed598(core.List<api.EntityUserLink> o) {
+checkUnnamed626(core.List<api.EntityUserLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityUserLink(o[0]);
   checkEntityUserLink(o[1]);
@@ -986,7 +986,7 @@
   var o = new api.EntityUserLinks();
   buildCounterEntityUserLinks++;
   if (buildCounterEntityUserLinks < 3) {
-    o.items = buildUnnamed598();
+    o.items = buildUnnamed626();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -1001,7 +1001,7 @@
 checkEntityUserLinks(api.EntityUserLinks o) {
   buildCounterEntityUserLinks++;
   if (buildCounterEntityUserLinks < 3) {
-    checkUnnamed598(o.items);
+    checkUnnamed626(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -1060,14 +1060,14 @@
   buildCounterExperimentVariations--;
 }
 
-buildUnnamed599() {
+buildUnnamed627() {
   var o = new core.List<api.ExperimentVariations>();
   o.add(buildExperimentVariations());
   o.add(buildExperimentVariations());
   return o;
 }
 
-checkUnnamed599(core.List<api.ExperimentVariations> o) {
+checkUnnamed627(core.List<api.ExperimentVariations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExperimentVariations(o[0]);
   checkExperimentVariations(o[1]);
@@ -1102,7 +1102,7 @@
     o.status = "foo";
     o.trafficCoverage = 42.0;
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
-    o.variations = buildUnnamed599();
+    o.variations = buildUnnamed627();
     o.webPropertyId = "foo";
     o.winnerConfidenceLevel = 42.0;
     o.winnerFound = true;
@@ -1138,7 +1138,7 @@
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.trafficCoverage, unittest.equals(42.0));
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed599(o.variations);
+    checkUnnamed627(o.variations);
     unittest.expect(o.webPropertyId, unittest.equals('foo'));
     unittest.expect(o.winnerConfidenceLevel, unittest.equals(42.0));
     unittest.expect(o.winnerFound, unittest.isTrue);
@@ -1146,14 +1146,14 @@
   buildCounterExperiment--;
 }
 
-buildUnnamed600() {
+buildUnnamed628() {
   var o = new core.List<api.Experiment>();
   o.add(buildExperiment());
   o.add(buildExperiment());
   return o;
 }
 
-checkUnnamed600(core.List<api.Experiment> o) {
+checkUnnamed628(core.List<api.Experiment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExperiment(o[0]);
   checkExperiment(o[1]);
@@ -1164,7 +1164,7 @@
   var o = new api.Experiments();
   buildCounterExperiments++;
   if (buildCounterExperiments < 3) {
-    o.items = buildUnnamed600();
+    o.items = buildUnnamed628();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -1180,7 +1180,7 @@
 checkExperiments(api.Experiments o) {
   buildCounterExperiments++;
   if (buildCounterExperiments < 3) {
-    checkUnnamed600(o.items);
+    checkUnnamed628(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -1414,14 +1414,14 @@
   buildCounterFilterRef--;
 }
 
-buildUnnamed601() {
+buildUnnamed629() {
   var o = new core.List<api.Filter>();
   o.add(buildFilter());
   o.add(buildFilter());
   return o;
 }
 
-checkUnnamed601(core.List<api.Filter> o) {
+checkUnnamed629(core.List<api.Filter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilter(o[0]);
   checkFilter(o[1]);
@@ -1432,7 +1432,7 @@
   var o = new api.Filters();
   buildCounterFilters++;
   if (buildCounterFilters < 3) {
-    o.items = buildUnnamed601();
+    o.items = buildUnnamed629();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -1448,7 +1448,7 @@
 checkFilters(api.Filters o) {
   buildCounterFilters++;
   if (buildCounterFilters < 3) {
-    checkUnnamed601(o.items);
+    checkUnnamed629(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -1483,14 +1483,14 @@
   buildCounterGaDataColumnHeaders--;
 }
 
-buildUnnamed602() {
+buildUnnamed630() {
   var o = new core.List<api.GaDataColumnHeaders>();
   o.add(buildGaDataColumnHeaders());
   o.add(buildGaDataColumnHeaders());
   return o;
 }
 
-checkUnnamed602(core.List<api.GaDataColumnHeaders> o) {
+checkUnnamed630(core.List<api.GaDataColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataColumnHeaders(o[0]);
   checkGaDataColumnHeaders(o[1]);
@@ -1519,14 +1519,14 @@
   buildCounterGaDataDataTableCols--;
 }
 
-buildUnnamed603() {
+buildUnnamed631() {
   var o = new core.List<api.GaDataDataTableCols>();
   o.add(buildGaDataDataTableCols());
   o.add(buildGaDataDataTableCols());
   return o;
 }
 
-checkUnnamed603(core.List<api.GaDataDataTableCols> o) {
+checkUnnamed631(core.List<api.GaDataDataTableCols> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataDataTableCols(o[0]);
   checkGaDataDataTableCols(o[1]);
@@ -1551,14 +1551,14 @@
   buildCounterGaDataDataTableRowsC--;
 }
 
-buildUnnamed604() {
+buildUnnamed632() {
   var o = new core.List<api.GaDataDataTableRowsC>();
   o.add(buildGaDataDataTableRowsC());
   o.add(buildGaDataDataTableRowsC());
   return o;
 }
 
-checkUnnamed604(core.List<api.GaDataDataTableRowsC> o) {
+checkUnnamed632(core.List<api.GaDataDataTableRowsC> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataDataTableRowsC(o[0]);
   checkGaDataDataTableRowsC(o[1]);
@@ -1569,7 +1569,7 @@
   var o = new api.GaDataDataTableRows();
   buildCounterGaDataDataTableRows++;
   if (buildCounterGaDataDataTableRows < 3) {
-    o.c = buildUnnamed604();
+    o.c = buildUnnamed632();
   }
   buildCounterGaDataDataTableRows--;
   return o;
@@ -1578,19 +1578,19 @@
 checkGaDataDataTableRows(api.GaDataDataTableRows o) {
   buildCounterGaDataDataTableRows++;
   if (buildCounterGaDataDataTableRows < 3) {
-    checkUnnamed604(o.c);
+    checkUnnamed632(o.c);
   }
   buildCounterGaDataDataTableRows--;
 }
 
-buildUnnamed605() {
+buildUnnamed633() {
   var o = new core.List<api.GaDataDataTableRows>();
   o.add(buildGaDataDataTableRows());
   o.add(buildGaDataDataTableRows());
   return o;
 }
 
-checkUnnamed605(core.List<api.GaDataDataTableRows> o) {
+checkUnnamed633(core.List<api.GaDataDataTableRows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGaDataDataTableRows(o[0]);
   checkGaDataDataTableRows(o[1]);
@@ -1601,8 +1601,8 @@
   var o = new api.GaDataDataTable();
   buildCounterGaDataDataTable++;
   if (buildCounterGaDataDataTable < 3) {
-    o.cols = buildUnnamed603();
-    o.rows = buildUnnamed605();
+    o.cols = buildUnnamed631();
+    o.rows = buildUnnamed633();
   }
   buildCounterGaDataDataTable--;
   return o;
@@ -1611,8 +1611,8 @@
 checkGaDataDataTable(api.GaDataDataTable o) {
   buildCounterGaDataDataTable++;
   if (buildCounterGaDataDataTable < 3) {
-    checkUnnamed603(o.cols);
-    checkUnnamed605(o.rows);
+    checkUnnamed631(o.cols);
+    checkUnnamed633(o.rows);
   }
   buildCounterGaDataDataTable--;
 }
@@ -1646,27 +1646,27 @@
   buildCounterGaDataProfileInfo--;
 }
 
-buildUnnamed606() {
+buildUnnamed634() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed606(core.List<core.String> o) {
+checkUnnamed634(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed607() {
+buildUnnamed635() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed607(core.List<core.String> o) {
+checkUnnamed635(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1682,10 +1682,10 @@
     o.filters = "foo";
     o.ids = "foo";
     o.max_results = 42;
-    o.metrics = buildUnnamed606();
+    o.metrics = buildUnnamed634();
     o.samplingLevel = "foo";
     o.segment = "foo";
-    o.sort = buildUnnamed607();
+    o.sort = buildUnnamed635();
     o.start_date = "foo";
     o.start_index = 42;
   }
@@ -1701,50 +1701,50 @@
     unittest.expect(o.filters, unittest.equals('foo'));
     unittest.expect(o.ids, unittest.equals('foo'));
     unittest.expect(o.max_results, unittest.equals(42));
-    checkUnnamed606(o.metrics);
+    checkUnnamed634(o.metrics);
     unittest.expect(o.samplingLevel, unittest.equals('foo'));
     unittest.expect(o.segment, unittest.equals('foo'));
-    checkUnnamed607(o.sort);
+    checkUnnamed635(o.sort);
     unittest.expect(o.start_date, unittest.equals('foo'));
     unittest.expect(o.start_index, unittest.equals(42));
   }
   buildCounterGaDataQuery--;
 }
 
-buildUnnamed608() {
+buildUnnamed636() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed608(core.List<core.String> o) {
+checkUnnamed636(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed609() {
+buildUnnamed637() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed608());
-  o.add(buildUnnamed608());
+  o.add(buildUnnamed636());
+  o.add(buildUnnamed636());
   return o;
 }
 
-checkUnnamed609(core.List<core.List<core.String>> o) {
+checkUnnamed637(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed608(o[0]);
-  checkUnnamed608(o[1]);
+  checkUnnamed636(o[0]);
+  checkUnnamed636(o[1]);
 }
 
-buildUnnamed610() {
+buildUnnamed638() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed610(core.Map<core.String, core.String> o) {
+checkUnnamed638(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -1755,7 +1755,7 @@
   var o = new api.GaData();
   buildCounterGaData++;
   if (buildCounterGaData < 3) {
-    o.columnHeaders = buildUnnamed602();
+    o.columnHeaders = buildUnnamed630();
     o.containsSampledData = true;
     o.dataTable = buildGaDataDataTable();
     o.id = "foo";
@@ -1765,12 +1765,12 @@
     o.previousLink = "foo";
     o.profileInfo = buildGaDataProfileInfo();
     o.query = buildGaDataQuery();
-    o.rows = buildUnnamed609();
+    o.rows = buildUnnamed637();
     o.sampleSize = "foo";
     o.sampleSpace = "foo";
     o.selfLink = "foo";
     o.totalResults = 42;
-    o.totalsForAllResults = buildUnnamed610();
+    o.totalsForAllResults = buildUnnamed638();
   }
   buildCounterGaData--;
   return o;
@@ -1779,7 +1779,7 @@
 checkGaData(api.GaData o) {
   buildCounterGaData++;
   if (buildCounterGaData < 3) {
-    checkUnnamed602(o.columnHeaders);
+    checkUnnamed630(o.columnHeaders);
     unittest.expect(o.containsSampledData, unittest.isTrue);
     checkGaDataDataTable(o.dataTable);
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1789,12 +1789,12 @@
     unittest.expect(o.previousLink, unittest.equals('foo'));
     checkGaDataProfileInfo(o.profileInfo);
     checkGaDataQuery(o.query);
-    checkUnnamed609(o.rows);
+    checkUnnamed637(o.rows);
     unittest.expect(o.sampleSize, unittest.equals('foo'));
     unittest.expect(o.sampleSpace, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalResults, unittest.equals(42));
-    checkUnnamed610(o.totalsForAllResults);
+    checkUnnamed638(o.totalsForAllResults);
   }
   buildCounterGaData--;
 }
@@ -1826,14 +1826,14 @@
   buildCounterGoalEventDetailsEventConditions--;
 }
 
-buildUnnamed611() {
+buildUnnamed639() {
   var o = new core.List<api.GoalEventDetailsEventConditions>();
   o.add(buildGoalEventDetailsEventConditions());
   o.add(buildGoalEventDetailsEventConditions());
   return o;
 }
 
-checkUnnamed611(core.List<api.GoalEventDetailsEventConditions> o) {
+checkUnnamed639(core.List<api.GoalEventDetailsEventConditions> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoalEventDetailsEventConditions(o[0]);
   checkGoalEventDetailsEventConditions(o[1]);
@@ -1844,7 +1844,7 @@
   var o = new api.GoalEventDetails();
   buildCounterGoalEventDetails++;
   if (buildCounterGoalEventDetails < 3) {
-    o.eventConditions = buildUnnamed611();
+    o.eventConditions = buildUnnamed639();
     o.useEventValue = true;
   }
   buildCounterGoalEventDetails--;
@@ -1854,7 +1854,7 @@
 checkGoalEventDetails(api.GoalEventDetails o) {
   buildCounterGoalEventDetails++;
   if (buildCounterGoalEventDetails < 3) {
-    checkUnnamed611(o.eventConditions);
+    checkUnnamed639(o.eventConditions);
     unittest.expect(o.useEventValue, unittest.isTrue);
   }
   buildCounterGoalEventDetails--;
@@ -1904,14 +1904,14 @@
   buildCounterGoalUrlDestinationDetailsSteps--;
 }
 
-buildUnnamed612() {
+buildUnnamed640() {
   var o = new core.List<api.GoalUrlDestinationDetailsSteps>();
   o.add(buildGoalUrlDestinationDetailsSteps());
   o.add(buildGoalUrlDestinationDetailsSteps());
   return o;
 }
 
-checkUnnamed612(core.List<api.GoalUrlDestinationDetailsSteps> o) {
+checkUnnamed640(core.List<api.GoalUrlDestinationDetailsSteps> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoalUrlDestinationDetailsSteps(o[0]);
   checkGoalUrlDestinationDetailsSteps(o[1]);
@@ -1925,7 +1925,7 @@
     o.caseSensitive = true;
     o.firstStepRequired = true;
     o.matchType = "foo";
-    o.steps = buildUnnamed612();
+    o.steps = buildUnnamed640();
     o.url = "foo";
   }
   buildCounterGoalUrlDestinationDetails--;
@@ -1938,7 +1938,7 @@
     unittest.expect(o.caseSensitive, unittest.isTrue);
     unittest.expect(o.firstStepRequired, unittest.isTrue);
     unittest.expect(o.matchType, unittest.equals('foo'));
-    checkUnnamed612(o.steps);
+    checkUnnamed640(o.steps);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterGoalUrlDestinationDetails--;
@@ -2039,14 +2039,14 @@
   buildCounterGoal--;
 }
 
-buildUnnamed613() {
+buildUnnamed641() {
   var o = new core.List<api.Goal>();
   o.add(buildGoal());
   o.add(buildGoal());
   return o;
 }
 
-checkUnnamed613(core.List<api.Goal> o) {
+checkUnnamed641(core.List<api.Goal> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoal(o[0]);
   checkGoal(o[1]);
@@ -2057,7 +2057,7 @@
   var o = new api.Goals();
   buildCounterGoals++;
   if (buildCounterGoals < 3) {
-    o.items = buildUnnamed613();
+    o.items = buildUnnamed641();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2073,7 +2073,7 @@
 checkGoals(api.Goals o) {
   buildCounterGoals++;
   if (buildCounterGoals < 3) {
-    checkUnnamed613(o.items);
+    checkUnnamed641(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -2108,14 +2108,14 @@
   buildCounterMcfDataColumnHeaders--;
 }
 
-buildUnnamed614() {
+buildUnnamed642() {
   var o = new core.List<api.McfDataColumnHeaders>();
   o.add(buildMcfDataColumnHeaders());
   o.add(buildMcfDataColumnHeaders());
   return o;
 }
 
-checkUnnamed614(core.List<api.McfDataColumnHeaders> o) {
+checkUnnamed642(core.List<api.McfDataColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMcfDataColumnHeaders(o[0]);
   checkMcfDataColumnHeaders(o[1]);
@@ -2150,27 +2150,27 @@
   buildCounterMcfDataProfileInfo--;
 }
 
-buildUnnamed615() {
+buildUnnamed643() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed615(core.List<core.String> o) {
+checkUnnamed643(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed616() {
+buildUnnamed644() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed616(core.List<core.String> o) {
+checkUnnamed644(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2186,10 +2186,10 @@
     o.filters = "foo";
     o.ids = "foo";
     o.max_results = 42;
-    o.metrics = buildUnnamed615();
+    o.metrics = buildUnnamed643();
     o.samplingLevel = "foo";
     o.segment = "foo";
-    o.sort = buildUnnamed616();
+    o.sort = buildUnnamed644();
     o.start_date = "foo";
     o.start_index = 42;
   }
@@ -2205,10 +2205,10 @@
     unittest.expect(o.filters, unittest.equals('foo'));
     unittest.expect(o.ids, unittest.equals('foo'));
     unittest.expect(o.max_results, unittest.equals(42));
-    checkUnnamed615(o.metrics);
+    checkUnnamed643(o.metrics);
     unittest.expect(o.samplingLevel, unittest.equals('foo'));
     unittest.expect(o.segment, unittest.equals('foo'));
-    checkUnnamed616(o.sort);
+    checkUnnamed644(o.sort);
     unittest.expect(o.start_date, unittest.equals('foo'));
     unittest.expect(o.start_index, unittest.equals(42));
   }
@@ -2236,14 +2236,14 @@
   buildCounterMcfDataRowsConversionPathValue--;
 }
 
-buildUnnamed617() {
+buildUnnamed645() {
   var o = new core.List<api.McfDataRowsConversionPathValue>();
   o.add(buildMcfDataRowsConversionPathValue());
   o.add(buildMcfDataRowsConversionPathValue());
   return o;
 }
 
-checkUnnamed617(core.List<api.McfDataRowsConversionPathValue> o) {
+checkUnnamed645(core.List<api.McfDataRowsConversionPathValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMcfDataRowsConversionPathValue(o[0]);
   checkMcfDataRowsConversionPathValue(o[1]);
@@ -2254,7 +2254,7 @@
   var o = new api.McfDataRows();
   buildCounterMcfDataRows++;
   if (buildCounterMcfDataRows < 3) {
-    o.conversionPathValue = buildUnnamed617();
+    o.conversionPathValue = buildUnnamed645();
     o.primitiveValue = "foo";
   }
   buildCounterMcfDataRows--;
@@ -2264,46 +2264,46 @@
 checkMcfDataRows(api.McfDataRows o) {
   buildCounterMcfDataRows++;
   if (buildCounterMcfDataRows < 3) {
-    checkUnnamed617(o.conversionPathValue);
+    checkUnnamed645(o.conversionPathValue);
     unittest.expect(o.primitiveValue, unittest.equals('foo'));
   }
   buildCounterMcfDataRows--;
 }
 
-buildUnnamed618() {
+buildUnnamed646() {
   var o = new core.List<api.McfDataRows>();
   o.add(buildMcfDataRows());
   o.add(buildMcfDataRows());
   return o;
 }
 
-checkUnnamed618(core.List<api.McfDataRows> o) {
+checkUnnamed646(core.List<api.McfDataRows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMcfDataRows(o[0]);
   checkMcfDataRows(o[1]);
 }
 
-buildUnnamed619() {
+buildUnnamed647() {
   var o = new core.List<core.List<api.McfDataRows>>();
-  o.add(buildUnnamed618());
-  o.add(buildUnnamed618());
+  o.add(buildUnnamed646());
+  o.add(buildUnnamed646());
   return o;
 }
 
-checkUnnamed619(core.List<core.List<api.McfDataRows>> o) {
+checkUnnamed647(core.List<core.List<api.McfDataRows>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed618(o[0]);
-  checkUnnamed618(o[1]);
+  checkUnnamed646(o[0]);
+  checkUnnamed646(o[1]);
 }
 
-buildUnnamed620() {
+buildUnnamed648() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed620(core.Map<core.String, core.String> o) {
+checkUnnamed648(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -2314,7 +2314,7 @@
   var o = new api.McfData();
   buildCounterMcfData++;
   if (buildCounterMcfData < 3) {
-    o.columnHeaders = buildUnnamed614();
+    o.columnHeaders = buildUnnamed642();
     o.containsSampledData = true;
     o.id = "foo";
     o.itemsPerPage = 42;
@@ -2323,12 +2323,12 @@
     o.previousLink = "foo";
     o.profileInfo = buildMcfDataProfileInfo();
     o.query = buildMcfDataQuery();
-    o.rows = buildUnnamed619();
+    o.rows = buildUnnamed647();
     o.sampleSize = "foo";
     o.sampleSpace = "foo";
     o.selfLink = "foo";
     o.totalResults = 42;
-    o.totalsForAllResults = buildUnnamed620();
+    o.totalsForAllResults = buildUnnamed648();
   }
   buildCounterMcfData--;
   return o;
@@ -2337,7 +2337,7 @@
 checkMcfData(api.McfData o) {
   buildCounterMcfData++;
   if (buildCounterMcfData < 3) {
-    checkUnnamed614(o.columnHeaders);
+    checkUnnamed642(o.columnHeaders);
     unittest.expect(o.containsSampledData, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.itemsPerPage, unittest.equals(42));
@@ -2346,12 +2346,12 @@
     unittest.expect(o.previousLink, unittest.equals('foo'));
     checkMcfDataProfileInfo(o.profileInfo);
     checkMcfDataQuery(o.query);
-    checkUnnamed619(o.rows);
+    checkUnnamed647(o.rows);
     unittest.expect(o.sampleSize, unittest.equals('foo'));
     unittest.expect(o.sampleSpace, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalResults, unittest.equals(42));
-    checkUnnamed620(o.totalsForAllResults);
+    checkUnnamed648(o.totalsForAllResults);
   }
   buildCounterMcfData--;
 }
@@ -2398,14 +2398,14 @@
   buildCounterProfileParentLink--;
 }
 
-buildUnnamed621() {
+buildUnnamed649() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed621(core.List<core.String> o) {
+checkUnnamed649(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2416,7 +2416,7 @@
   var o = new api.ProfilePermissions();
   buildCounterProfilePermissions++;
   if (buildCounterProfilePermissions < 3) {
-    o.effective = buildUnnamed621();
+    o.effective = buildUnnamed649();
   }
   buildCounterProfilePermissions--;
   return o;
@@ -2425,7 +2425,7 @@
 checkProfilePermissions(api.ProfilePermissions o) {
   buildCounterProfilePermissions++;
   if (buildCounterProfilePermissions < 3) {
-    checkUnnamed621(o.effective);
+    checkUnnamed649(o.effective);
   }
   buildCounterProfilePermissions--;
 }
@@ -2522,14 +2522,14 @@
   buildCounterProfileFilterLink--;
 }
 
-buildUnnamed622() {
+buildUnnamed650() {
   var o = new core.List<api.ProfileFilterLink>();
   o.add(buildProfileFilterLink());
   o.add(buildProfileFilterLink());
   return o;
 }
 
-checkUnnamed622(core.List<api.ProfileFilterLink> o) {
+checkUnnamed650(core.List<api.ProfileFilterLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProfileFilterLink(o[0]);
   checkProfileFilterLink(o[1]);
@@ -2540,7 +2540,7 @@
   var o = new api.ProfileFilterLinks();
   buildCounterProfileFilterLinks++;
   if (buildCounterProfileFilterLinks < 3) {
-    o.items = buildUnnamed622();
+    o.items = buildUnnamed650();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2556,7 +2556,7 @@
 checkProfileFilterLinks(api.ProfileFilterLinks o) {
   buildCounterProfileFilterLinks++;
   if (buildCounterProfileFilterLinks < 3) {
-    checkUnnamed622(o.items);
+    checkUnnamed650(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -2624,14 +2624,14 @@
   buildCounterProfileSummary--;
 }
 
-buildUnnamed623() {
+buildUnnamed651() {
   var o = new core.List<api.Profile>();
   o.add(buildProfile());
   o.add(buildProfile());
   return o;
 }
 
-checkUnnamed623(core.List<api.Profile> o) {
+checkUnnamed651(core.List<api.Profile> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProfile(o[0]);
   checkProfile(o[1]);
@@ -2642,7 +2642,7 @@
   var o = new api.Profiles();
   buildCounterProfiles++;
   if (buildCounterProfiles < 3) {
-    o.items = buildUnnamed623();
+    o.items = buildUnnamed651();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2658,7 +2658,7 @@
 checkProfiles(api.Profiles o) {
   buildCounterProfiles++;
   if (buildCounterProfiles < 3) {
-    checkUnnamed623(o.items);
+    checkUnnamed651(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -2693,14 +2693,14 @@
   buildCounterRealtimeDataColumnHeaders--;
 }
 
-buildUnnamed624() {
+buildUnnamed652() {
   var o = new core.List<api.RealtimeDataColumnHeaders>();
   o.add(buildRealtimeDataColumnHeaders());
   o.add(buildRealtimeDataColumnHeaders());
   return o;
 }
 
-checkUnnamed624(core.List<api.RealtimeDataColumnHeaders> o) {
+checkUnnamed652(core.List<api.RealtimeDataColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRealtimeDataColumnHeaders(o[0]);
   checkRealtimeDataColumnHeaders(o[1]);
@@ -2735,27 +2735,27 @@
   buildCounterRealtimeDataProfileInfo--;
 }
 
-buildUnnamed625() {
+buildUnnamed653() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed625(core.List<core.String> o) {
+checkUnnamed653(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed626() {
+buildUnnamed654() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed626(core.List<core.String> o) {
+checkUnnamed654(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2770,8 +2770,8 @@
     o.filters = "foo";
     o.ids = "foo";
     o.max_results = 42;
-    o.metrics = buildUnnamed625();
-    o.sort = buildUnnamed626();
+    o.metrics = buildUnnamed653();
+    o.sort = buildUnnamed654();
   }
   buildCounterRealtimeDataQuery--;
   return o;
@@ -2784,46 +2784,46 @@
     unittest.expect(o.filters, unittest.equals('foo'));
     unittest.expect(o.ids, unittest.equals('foo'));
     unittest.expect(o.max_results, unittest.equals(42));
-    checkUnnamed625(o.metrics);
-    checkUnnamed626(o.sort);
+    checkUnnamed653(o.metrics);
+    checkUnnamed654(o.sort);
   }
   buildCounterRealtimeDataQuery--;
 }
 
-buildUnnamed627() {
+buildUnnamed655() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed627(core.List<core.String> o) {
+checkUnnamed655(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed628() {
+buildUnnamed656() {
   var o = new core.List<core.List<core.String>>();
-  o.add(buildUnnamed627());
-  o.add(buildUnnamed627());
+  o.add(buildUnnamed655());
+  o.add(buildUnnamed655());
   return o;
 }
 
-checkUnnamed628(core.List<core.List<core.String>> o) {
+checkUnnamed656(core.List<core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed627(o[0]);
-  checkUnnamed627(o[1]);
+  checkUnnamed655(o[0]);
+  checkUnnamed655(o[1]);
 }
 
-buildUnnamed629() {
+buildUnnamed657() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed629(core.Map<core.String, core.String> o) {
+checkUnnamed657(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -2834,15 +2834,15 @@
   var o = new api.RealtimeData();
   buildCounterRealtimeData++;
   if (buildCounterRealtimeData < 3) {
-    o.columnHeaders = buildUnnamed624();
+    o.columnHeaders = buildUnnamed652();
     o.id = "foo";
     o.kind = "foo";
     o.profileInfo = buildRealtimeDataProfileInfo();
     o.query = buildRealtimeDataQuery();
-    o.rows = buildUnnamed628();
+    o.rows = buildUnnamed656();
     o.selfLink = "foo";
     o.totalResults = 42;
-    o.totalsForAllResults = buildUnnamed629();
+    o.totalsForAllResults = buildUnnamed657();
   }
   buildCounterRealtimeData--;
   return o;
@@ -2851,15 +2851,15 @@
 checkRealtimeData(api.RealtimeData o) {
   buildCounterRealtimeData++;
   if (buildCounterRealtimeData < 3) {
-    checkUnnamed624(o.columnHeaders);
+    checkUnnamed652(o.columnHeaders);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkRealtimeDataProfileInfo(o.profileInfo);
     checkRealtimeDataQuery(o.query);
-    checkUnnamed628(o.rows);
+    checkUnnamed656(o.rows);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalResults, unittest.equals(42));
-    checkUnnamed629(o.totalsForAllResults);
+    checkUnnamed657(o.totalsForAllResults);
   }
   buildCounterRealtimeData--;
 }
@@ -2899,14 +2899,14 @@
   buildCounterSegment--;
 }
 
-buildUnnamed630() {
+buildUnnamed658() {
   var o = new core.List<api.Segment>();
   o.add(buildSegment());
   o.add(buildSegment());
   return o;
 }
 
-checkUnnamed630(core.List<api.Segment> o) {
+checkUnnamed658(core.List<api.Segment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSegment(o[0]);
   checkSegment(o[1]);
@@ -2917,7 +2917,7 @@
   var o = new api.Segments();
   buildCounterSegments++;
   if (buildCounterSegments < 3) {
-    o.items = buildUnnamed630();
+    o.items = buildUnnamed658();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -2933,7 +2933,7 @@
 checkSegments(api.Segments o) {
   buildCounterSegments++;
   if (buildCounterSegments < 3) {
-    checkUnnamed630(o.items);
+    checkUnnamed658(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3040,14 +3040,14 @@
   buildCounterUnsampledReport--;
 }
 
-buildUnnamed631() {
+buildUnnamed659() {
   var o = new core.List<api.UnsampledReport>();
   o.add(buildUnsampledReport());
   o.add(buildUnsampledReport());
   return o;
 }
 
-checkUnnamed631(core.List<api.UnsampledReport> o) {
+checkUnnamed659(core.List<api.UnsampledReport> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUnsampledReport(o[0]);
   checkUnsampledReport(o[1]);
@@ -3058,7 +3058,7 @@
   var o = new api.UnsampledReports();
   buildCounterUnsampledReports++;
   if (buildCounterUnsampledReports < 3) {
-    o.items = buildUnnamed631();
+    o.items = buildUnnamed659();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3074,7 +3074,7 @@
 checkUnsampledReports(api.UnsampledReports o) {
   buildCounterUnsampledReports++;
   if (buildCounterUnsampledReports < 3) {
-    checkUnnamed631(o.items);
+    checkUnnamed659(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3086,14 +3086,14 @@
   buildCounterUnsampledReports--;
 }
 
-buildUnnamed632() {
+buildUnnamed660() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed632(core.List<core.String> o) {
+checkUnnamed660(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3106,7 +3106,7 @@
   if (buildCounterUpload < 3) {
     o.accountId = "foo";
     o.customDataSourceId = "foo";
-    o.errors = buildUnnamed632();
+    o.errors = buildUnnamed660();
     o.id = "foo";
     o.kind = "foo";
     o.status = "foo";
@@ -3120,7 +3120,7 @@
   if (buildCounterUpload < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.customDataSourceId, unittest.equals('foo'));
-    checkUnnamed632(o.errors);
+    checkUnnamed660(o.errors);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -3128,14 +3128,14 @@
   buildCounterUpload--;
 }
 
-buildUnnamed633() {
+buildUnnamed661() {
   var o = new core.List<api.Upload>();
   o.add(buildUpload());
   o.add(buildUpload());
   return o;
 }
 
-checkUnnamed633(core.List<api.Upload> o) {
+checkUnnamed661(core.List<api.Upload> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUpload(o[0]);
   checkUpload(o[1]);
@@ -3146,7 +3146,7 @@
   var o = new api.Uploads();
   buildCounterUploads++;
   if (buildCounterUploads < 3) {
-    o.items = buildUnnamed633();
+    o.items = buildUnnamed661();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3161,7 +3161,7 @@
 checkUploads(api.Uploads o) {
   buildCounterUploads++;
   if (buildCounterUploads < 3) {
-    checkUnnamed633(o.items);
+    checkUnnamed661(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3224,14 +3224,14 @@
   buildCounterWebPropertyRef--;
 }
 
-buildUnnamed634() {
+buildUnnamed662() {
   var o = new core.List<api.ProfileSummary>();
   o.add(buildProfileSummary());
   o.add(buildProfileSummary());
   return o;
 }
 
-checkUnnamed634(core.List<api.ProfileSummary> o) {
+checkUnnamed662(core.List<api.ProfileSummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProfileSummary(o[0]);
   checkProfileSummary(o[1]);
@@ -3247,7 +3247,7 @@
     o.kind = "foo";
     o.level = "foo";
     o.name = "foo";
-    o.profiles = buildUnnamed634();
+    o.profiles = buildUnnamed662();
     o.websiteUrl = "foo";
   }
   buildCounterWebPropertySummary--;
@@ -3262,20 +3262,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.level, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed634(o.profiles);
+    checkUnnamed662(o.profiles);
     unittest.expect(o.websiteUrl, unittest.equals('foo'));
   }
   buildCounterWebPropertySummary--;
 }
 
-buildUnnamed635() {
+buildUnnamed663() {
   var o = new core.List<api.Webproperty>();
   o.add(buildWebproperty());
   o.add(buildWebproperty());
   return o;
 }
 
-checkUnnamed635(core.List<api.Webproperty> o) {
+checkUnnamed663(core.List<api.Webproperty> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebproperty(o[0]);
   checkWebproperty(o[1]);
@@ -3286,7 +3286,7 @@
   var o = new api.Webproperties();
   buildCounterWebproperties++;
   if (buildCounterWebproperties < 3) {
-    o.items = buildUnnamed635();
+    o.items = buildUnnamed663();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextLink = "foo";
@@ -3302,7 +3302,7 @@
 checkWebproperties(api.Webproperties o) {
   buildCounterWebproperties++;
   if (buildCounterWebproperties < 3) {
-    checkUnnamed635(o.items);
+    checkUnnamed663(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -3356,14 +3356,14 @@
   buildCounterWebpropertyParentLink--;
 }
 
-buildUnnamed636() {
+buildUnnamed664() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed636(core.List<core.String> o) {
+checkUnnamed664(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3374,7 +3374,7 @@
   var o = new api.WebpropertyPermissions();
   buildCounterWebpropertyPermissions++;
   if (buildCounterWebpropertyPermissions < 3) {
-    o.effective = buildUnnamed636();
+    o.effective = buildUnnamed664();
   }
   buildCounterWebpropertyPermissions--;
   return o;
@@ -3383,7 +3383,7 @@
 checkWebpropertyPermissions(api.WebpropertyPermissions o) {
   buildCounterWebpropertyPermissions++;
   if (buildCounterWebpropertyPermissions < 3) {
-    checkUnnamed636(o.effective);
+    checkUnnamed664(o.effective);
   }
   buildCounterWebpropertyPermissions--;
 }
@@ -4298,8 +4298,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("data/ga"));
         pathOffset += 7;
 
@@ -4367,8 +4369,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("data/mcf"));
         pathOffset += 8;
 
@@ -4430,8 +4434,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("data/realtime"));
         pathOffset += 13;
 
@@ -4485,8 +4491,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 27), unittest.equals("management/accountSummaries"));
         pathOffset += 27;
 
@@ -4536,8 +4544,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/entityUserLinks/", pathOffset);
@@ -4592,8 +4602,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/entityUserLinks", pathOffset);
@@ -4645,8 +4657,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/entityUserLinks", pathOffset);
@@ -4703,8 +4717,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/entityUserLinks/", pathOffset);
@@ -4762,8 +4778,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("management/accounts"));
         pathOffset += 19;
 
@@ -4815,8 +4833,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -4883,8 +4903,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -4956,8 +4978,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -5033,8 +5057,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -5115,8 +5141,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -5184,8 +5212,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -5258,8 +5288,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -5327,8 +5359,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -5401,8 +5435,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -5476,8 +5512,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -5549,8 +5587,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/filters/", pathOffset);
@@ -5604,8 +5644,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/filters/", pathOffset);
@@ -5662,8 +5704,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/filters", pathOffset);
@@ -5715,8 +5759,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/filters", pathOffset);
@@ -5773,8 +5819,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/filters/", pathOffset);
@@ -5832,8 +5880,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/filters/", pathOffset);
@@ -5893,8 +5943,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -5967,8 +6019,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -6036,8 +6090,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -6110,8 +6166,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -6185,8 +6243,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -6260,8 +6320,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -6329,8 +6391,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -6403,8 +6467,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -6472,8 +6538,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -6546,8 +6614,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -6621,8 +6691,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -6696,8 +6768,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -6768,8 +6842,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -6837,8 +6913,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -6911,8 +6989,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -6985,8 +7065,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -7046,8 +7128,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -7112,8 +7196,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -7173,8 +7259,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -7239,8 +7327,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -7306,8 +7396,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -7372,8 +7464,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("management/segments"));
         pathOffset += 19;
 
@@ -7425,8 +7519,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -7499,8 +7595,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -7568,8 +7666,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -7645,8 +7745,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -7711,8 +7813,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -7783,8 +7887,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -7852,8 +7958,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -7919,8 +8027,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -7990,8 +8100,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -8051,8 +8163,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -8117,8 +8231,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -8178,8 +8294,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -8244,8 +8362,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -8311,8 +8431,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -8377,8 +8499,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -8435,8 +8559,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties", pathOffset);
@@ -8488,8 +8614,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties", pathOffset);
@@ -8546,8 +8674,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -8605,8 +8735,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -8665,8 +8797,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -8729,8 +8863,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -8790,8 +8926,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -8856,8 +8994,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("management/accounts/"));
         pathOffset += 20;
         index = path.indexOf("/webproperties/", pathOffset);
@@ -8921,8 +9061,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("metadata/"));
         pathOffset += 9;
         index = path.indexOf("/columns", pathOffset);
@@ -8979,8 +9121,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/analytics/v3/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("analytics/v3/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("provisioning/createAccountTicket"));
         pathOffset += 32;
 
diff --git a/generated/googleapis/test/androidpublisher/v2_test.dart b/generated/googleapis/test/androidpublisher/v2_test.dart
index 6aafe60..f8d4462 100644
--- a/generated/googleapis/test/androidpublisher/v2_test.dart
+++ b/generated/googleapis/test/androidpublisher/v2_test.dart
@@ -77,14 +77,14 @@
   buildCounterApkListing--;
 }
 
-buildUnnamed953() {
+buildUnnamed981() {
   var o = new core.List<api.ApkListing>();
   o.add(buildApkListing());
   o.add(buildApkListing());
   return o;
 }
 
-checkUnnamed953(core.List<api.ApkListing> o) {
+checkUnnamed981(core.List<api.ApkListing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApkListing(o[0]);
   checkApkListing(o[1]);
@@ -96,7 +96,7 @@
   buildCounterApkListingsListResponse++;
   if (buildCounterApkListingsListResponse < 3) {
     o.kind = "foo";
-    o.listings = buildUnnamed953();
+    o.listings = buildUnnamed981();
   }
   buildCounterApkListingsListResponse--;
   return o;
@@ -106,19 +106,19 @@
   buildCounterApkListingsListResponse++;
   if (buildCounterApkListingsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed953(o.listings);
+    checkUnnamed981(o.listings);
   }
   buildCounterApkListingsListResponse--;
 }
 
-buildUnnamed954() {
+buildUnnamed982() {
   var o = new core.List<api.Apk>();
   o.add(buildApk());
   o.add(buildApk());
   return o;
 }
 
-checkUnnamed954(core.List<api.Apk> o) {
+checkUnnamed982(core.List<api.Apk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApk(o[0]);
   checkApk(o[1]);
@@ -129,7 +129,7 @@
   var o = new api.ApksListResponse();
   buildCounterApksListResponse++;
   if (buildCounterApksListResponse < 3) {
-    o.apks = buildUnnamed954();
+    o.apks = buildUnnamed982();
     o.kind = "foo";
   }
   buildCounterApksListResponse--;
@@ -139,7 +139,7 @@
 checkApksListResponse(api.ApksListResponse o) {
   buildCounterApksListResponse++;
   if (buildCounterApksListResponse < 3) {
-    checkUnnamed954(o.apks);
+    checkUnnamed982(o.apks);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterApksListResponse--;
@@ -254,14 +254,14 @@
   buildCounterImage--;
 }
 
-buildUnnamed955() {
+buildUnnamed983() {
   var o = new core.List<api.Image>();
   o.add(buildImage());
   o.add(buildImage());
   return o;
 }
 
-checkUnnamed955(core.List<api.Image> o) {
+checkUnnamed983(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImage(o[0]);
   checkImage(o[1]);
@@ -272,7 +272,7 @@
   var o = new api.ImagesDeleteAllResponse();
   buildCounterImagesDeleteAllResponse++;
   if (buildCounterImagesDeleteAllResponse < 3) {
-    o.deleted = buildUnnamed955();
+    o.deleted = buildUnnamed983();
   }
   buildCounterImagesDeleteAllResponse--;
   return o;
@@ -281,19 +281,19 @@
 checkImagesDeleteAllResponse(api.ImagesDeleteAllResponse o) {
   buildCounterImagesDeleteAllResponse++;
   if (buildCounterImagesDeleteAllResponse < 3) {
-    checkUnnamed955(o.deleted);
+    checkUnnamed983(o.deleted);
   }
   buildCounterImagesDeleteAllResponse--;
 }
 
-buildUnnamed956() {
+buildUnnamed984() {
   var o = new core.List<api.Image>();
   o.add(buildImage());
   o.add(buildImage());
   return o;
 }
 
-checkUnnamed956(core.List<api.Image> o) {
+checkUnnamed984(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImage(o[0]);
   checkImage(o[1]);
@@ -304,7 +304,7 @@
   var o = new api.ImagesListResponse();
   buildCounterImagesListResponse++;
   if (buildCounterImagesListResponse < 3) {
-    o.images = buildUnnamed956();
+    o.images = buildUnnamed984();
   }
   buildCounterImagesListResponse--;
   return o;
@@ -313,7 +313,7 @@
 checkImagesListResponse(api.ImagesListResponse o) {
   buildCounterImagesListResponse++;
   if (buildCounterImagesListResponse < 3) {
-    checkUnnamed956(o.images);
+    checkUnnamed984(o.images);
   }
   buildCounterImagesListResponse--;
 }
@@ -337,27 +337,27 @@
   buildCounterImagesUploadResponse--;
 }
 
-buildUnnamed957() {
+buildUnnamed985() {
   var o = new core.Map<core.String, api.InAppProductListing>();
   o["x"] = buildInAppProductListing();
   o["y"] = buildInAppProductListing();
   return o;
 }
 
-checkUnnamed957(core.Map<core.String, api.InAppProductListing> o) {
+checkUnnamed985(core.Map<core.String, api.InAppProductListing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInAppProductListing(o["x"]);
   checkInAppProductListing(o["y"]);
 }
 
-buildUnnamed958() {
+buildUnnamed986() {
   var o = new core.Map<core.String, api.Price>();
   o["x"] = buildPrice();
   o["y"] = buildPrice();
   return o;
 }
 
-checkUnnamed958(core.Map<core.String, api.Price> o) {
+checkUnnamed986(core.Map<core.String, api.Price> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPrice(o["x"]);
   checkPrice(o["y"]);
@@ -370,10 +370,11 @@
   if (buildCounterInAppProduct < 3) {
     o.defaultLanguage = "foo";
     o.defaultPrice = buildPrice();
-    o.listings = buildUnnamed957();
+    o.listings = buildUnnamed985();
     o.packageName = "foo";
-    o.prices = buildUnnamed958();
+    o.prices = buildUnnamed986();
     o.purchaseType = "foo";
+    o.season = buildSeason();
     o.sku = "foo";
     o.status = "foo";
     o.subscriptionPeriod = "foo";
@@ -388,10 +389,11 @@
   if (buildCounterInAppProduct < 3) {
     unittest.expect(o.defaultLanguage, unittest.equals('foo'));
     checkPrice(o.defaultPrice);
-    checkUnnamed957(o.listings);
+    checkUnnamed985(o.listings);
     unittest.expect(o.packageName, unittest.equals('foo'));
-    checkUnnamed958(o.prices);
+    checkUnnamed986(o.prices);
     unittest.expect(o.purchaseType, unittest.equals('foo'));
+    checkSeason(o.season);
     unittest.expect(o.sku, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.subscriptionPeriod, unittest.equals('foo'));
@@ -421,14 +423,14 @@
   buildCounterInAppProductListing--;
 }
 
-buildUnnamed959() {
+buildUnnamed987() {
   var o = new core.List<api.InappproductsBatchRequestEntry>();
   o.add(buildInappproductsBatchRequestEntry());
   o.add(buildInappproductsBatchRequestEntry());
   return o;
 }
 
-checkUnnamed959(core.List<api.InappproductsBatchRequestEntry> o) {
+checkUnnamed987(core.List<api.InappproductsBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInappproductsBatchRequestEntry(o[0]);
   checkInappproductsBatchRequestEntry(o[1]);
@@ -439,7 +441,7 @@
   var o = new api.InappproductsBatchRequest();
   buildCounterInappproductsBatchRequest++;
   if (buildCounterInappproductsBatchRequest < 3) {
-    o.entrys = buildUnnamed959();
+    o.entrys = buildUnnamed987();
   }
   buildCounterInappproductsBatchRequest--;
   return o;
@@ -448,7 +450,7 @@
 checkInappproductsBatchRequest(api.InappproductsBatchRequest o) {
   buildCounterInappproductsBatchRequest++;
   if (buildCounterInappproductsBatchRequest < 3) {
-    checkUnnamed959(o.entrys);
+    checkUnnamed987(o.entrys);
   }
   buildCounterInappproductsBatchRequest--;
 }
@@ -478,14 +480,14 @@
   buildCounterInappproductsBatchRequestEntry--;
 }
 
-buildUnnamed960() {
+buildUnnamed988() {
   var o = new core.List<api.InappproductsBatchResponseEntry>();
   o.add(buildInappproductsBatchResponseEntry());
   o.add(buildInappproductsBatchResponseEntry());
   return o;
 }
 
-checkUnnamed960(core.List<api.InappproductsBatchResponseEntry> o) {
+checkUnnamed988(core.List<api.InappproductsBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInappproductsBatchResponseEntry(o[0]);
   checkInappproductsBatchResponseEntry(o[1]);
@@ -496,7 +498,7 @@
   var o = new api.InappproductsBatchResponse();
   buildCounterInappproductsBatchResponse++;
   if (buildCounterInappproductsBatchResponse < 3) {
-    o.entrys = buildUnnamed960();
+    o.entrys = buildUnnamed988();
     o.kind = "foo";
   }
   buildCounterInappproductsBatchResponse--;
@@ -506,7 +508,7 @@
 checkInappproductsBatchResponse(api.InappproductsBatchResponse o) {
   buildCounterInappproductsBatchResponse++;
   if (buildCounterInappproductsBatchResponse < 3) {
-    checkUnnamed960(o.entrys);
+    checkUnnamed988(o.entrys);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterInappproductsBatchResponse--;
@@ -573,14 +575,14 @@
   buildCounterInappproductsInsertResponse--;
 }
 
-buildUnnamed961() {
+buildUnnamed989() {
   var o = new core.List<api.InAppProduct>();
   o.add(buildInAppProduct());
   o.add(buildInAppProduct());
   return o;
 }
 
-checkUnnamed961(core.List<api.InAppProduct> o) {
+checkUnnamed989(core.List<api.InAppProduct> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInAppProduct(o[0]);
   checkInAppProduct(o[1]);
@@ -591,7 +593,7 @@
   var o = new api.InappproductsListResponse();
   buildCounterInappproductsListResponse++;
   if (buildCounterInappproductsListResponse < 3) {
-    o.inappproduct = buildUnnamed961();
+    o.inappproduct = buildUnnamed989();
     o.kind = "foo";
     o.pageInfo = buildPageInfo();
     o.tokenPagination = buildTokenPagination();
@@ -603,7 +605,7 @@
 checkInappproductsListResponse(api.InappproductsListResponse o) {
   buildCounterInappproductsListResponse++;
   if (buildCounterInappproductsListResponse < 3) {
-    checkUnnamed961(o.inappproduct);
+    checkUnnamed989(o.inappproduct);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
     checkTokenPagination(o.tokenPagination);
@@ -676,14 +678,14 @@
   buildCounterListing--;
 }
 
-buildUnnamed962() {
+buildUnnamed990() {
   var o = new core.List<api.Listing>();
   o.add(buildListing());
   o.add(buildListing());
   return o;
 }
 
-checkUnnamed962(core.List<api.Listing> o) {
+checkUnnamed990(core.List<api.Listing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkListing(o[0]);
   checkListing(o[1]);
@@ -695,7 +697,7 @@
   buildCounterListingsListResponse++;
   if (buildCounterListingsListResponse < 3) {
     o.kind = "foo";
-    o.listings = buildUnnamed962();
+    o.listings = buildUnnamed990();
   }
   buildCounterListingsListResponse--;
   return o;
@@ -705,11 +707,32 @@
   buildCounterListingsListResponse++;
   if (buildCounterListingsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed962(o.listings);
+    checkUnnamed990(o.listings);
   }
   buildCounterListingsListResponse--;
 }
 
+core.int buildCounterMonthDay = 0;
+buildMonthDay() {
+  var o = new api.MonthDay();
+  buildCounterMonthDay++;
+  if (buildCounterMonthDay < 3) {
+    o.day = 42;
+    o.month = 42;
+  }
+  buildCounterMonthDay--;
+  return o;
+}
+
+checkMonthDay(api.MonthDay o) {
+  buildCounterMonthDay++;
+  if (buildCounterMonthDay < 3) {
+    unittest.expect(o.day, unittest.equals(42));
+    unittest.expect(o.month, unittest.equals(42));
+  }
+  buildCounterMonthDay--;
+}
+
 core.int buildCounterPageInfo = 0;
 buildPageInfo() {
   var o = new api.PageInfo();
@@ -781,6 +804,48 @@
   buildCounterProductPurchase--;
 }
 
+core.int buildCounterSeason = 0;
+buildSeason() {
+  var o = new api.Season();
+  buildCounterSeason++;
+  if (buildCounterSeason < 3) {
+    o.end = buildMonthDay();
+    o.start = buildMonthDay();
+  }
+  buildCounterSeason--;
+  return o;
+}
+
+checkSeason(api.Season o) {
+  buildCounterSeason++;
+  if (buildCounterSeason < 3) {
+    checkMonthDay(o.end);
+    checkMonthDay(o.start);
+  }
+  buildCounterSeason--;
+}
+
+core.int buildCounterSubscriptionDeferralInfo = 0;
+buildSubscriptionDeferralInfo() {
+  var o = new api.SubscriptionDeferralInfo();
+  buildCounterSubscriptionDeferralInfo++;
+  if (buildCounterSubscriptionDeferralInfo < 3) {
+    o.desiredExpiryTimeMillis = "foo";
+    o.expectedExpiryTimeMillis = "foo";
+  }
+  buildCounterSubscriptionDeferralInfo--;
+  return o;
+}
+
+checkSubscriptionDeferralInfo(api.SubscriptionDeferralInfo o) {
+  buildCounterSubscriptionDeferralInfo++;
+  if (buildCounterSubscriptionDeferralInfo < 3) {
+    unittest.expect(o.desiredExpiryTimeMillis, unittest.equals('foo'));
+    unittest.expect(o.expectedExpiryTimeMillis, unittest.equals('foo'));
+  }
+  buildCounterSubscriptionDeferralInfo--;
+}
+
 core.int buildCounterSubscriptionPurchase = 0;
 buildSubscriptionPurchase() {
   var o = new api.SubscriptionPurchase();
@@ -806,27 +871,65 @@
   buildCounterSubscriptionPurchase--;
 }
 
-buildUnnamed963() {
+core.int buildCounterSubscriptionPurchasesDeferRequest = 0;
+buildSubscriptionPurchasesDeferRequest() {
+  var o = new api.SubscriptionPurchasesDeferRequest();
+  buildCounterSubscriptionPurchasesDeferRequest++;
+  if (buildCounterSubscriptionPurchasesDeferRequest < 3) {
+    o.deferralInfo = buildSubscriptionDeferralInfo();
+  }
+  buildCounterSubscriptionPurchasesDeferRequest--;
+  return o;
+}
+
+checkSubscriptionPurchasesDeferRequest(api.SubscriptionPurchasesDeferRequest o) {
+  buildCounterSubscriptionPurchasesDeferRequest++;
+  if (buildCounterSubscriptionPurchasesDeferRequest < 3) {
+    checkSubscriptionDeferralInfo(o.deferralInfo);
+  }
+  buildCounterSubscriptionPurchasesDeferRequest--;
+}
+
+core.int buildCounterSubscriptionPurchasesDeferResponse = 0;
+buildSubscriptionPurchasesDeferResponse() {
+  var o = new api.SubscriptionPurchasesDeferResponse();
+  buildCounterSubscriptionPurchasesDeferResponse++;
+  if (buildCounterSubscriptionPurchasesDeferResponse < 3) {
+    o.newExpiryTimeMillis = "foo";
+  }
+  buildCounterSubscriptionPurchasesDeferResponse--;
+  return o;
+}
+
+checkSubscriptionPurchasesDeferResponse(api.SubscriptionPurchasesDeferResponse o) {
+  buildCounterSubscriptionPurchasesDeferResponse++;
+  if (buildCounterSubscriptionPurchasesDeferResponse < 3) {
+    unittest.expect(o.newExpiryTimeMillis, unittest.equals('foo'));
+  }
+  buildCounterSubscriptionPurchasesDeferResponse--;
+}
+
+buildUnnamed991() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed963(core.List<core.String> o) {
+checkUnnamed991(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed964() {
+buildUnnamed992() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed964(core.List<core.String> o) {
+checkUnnamed992(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -837,8 +940,8 @@
   var o = new api.Testers();
   buildCounterTesters++;
   if (buildCounterTesters < 3) {
-    o.googleGroups = buildUnnamed963();
-    o.googlePlusCommunities = buildUnnamed964();
+    o.googleGroups = buildUnnamed991();
+    o.googlePlusCommunities = buildUnnamed992();
   }
   buildCounterTesters--;
   return o;
@@ -847,8 +950,8 @@
 checkTesters(api.Testers o) {
   buildCounterTesters++;
   if (buildCounterTesters < 3) {
-    checkUnnamed963(o.googleGroups);
-    checkUnnamed964(o.googlePlusCommunities);
+    checkUnnamed991(o.googleGroups);
+    checkUnnamed992(o.googlePlusCommunities);
   }
   buildCounterTesters--;
 }
@@ -874,14 +977,14 @@
   buildCounterTokenPagination--;
 }
 
-buildUnnamed965() {
+buildUnnamed993() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed965(core.List<core.int> o) {
+checkUnnamed993(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
@@ -894,7 +997,7 @@
   if (buildCounterTrack < 3) {
     o.track = "foo";
     o.userFraction = 42.0;
-    o.versionCodes = buildUnnamed965();
+    o.versionCodes = buildUnnamed993();
   }
   buildCounterTrack--;
   return o;
@@ -905,19 +1008,19 @@
   if (buildCounterTrack < 3) {
     unittest.expect(o.track, unittest.equals('foo'));
     unittest.expect(o.userFraction, unittest.equals(42.0));
-    checkUnnamed965(o.versionCodes);
+    checkUnnamed993(o.versionCodes);
   }
   buildCounterTrack--;
 }
 
-buildUnnamed966() {
+buildUnnamed994() {
   var o = new core.List<api.Track>();
   o.add(buildTrack());
   o.add(buildTrack());
   return o;
 }
 
-checkUnnamed966(core.List<api.Track> o) {
+checkUnnamed994(core.List<api.Track> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTrack(o[0]);
   checkTrack(o[1]);
@@ -929,7 +1032,7 @@
   buildCounterTracksListResponse++;
   if (buildCounterTracksListResponse < 3) {
     o.kind = "foo";
-    o.tracks = buildUnnamed966();
+    o.tracks = buildUnnamed994();
   }
   buildCounterTracksListResponse--;
   return o;
@@ -939,7 +1042,7 @@
   buildCounterTracksListResponse++;
   if (buildCounterTracksListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed966(o.tracks);
+    checkUnnamed994(o.tracks);
   }
   buildCounterTracksListResponse--;
 }
@@ -1180,6 +1283,15 @@
   });
 
 
+  unittest.group("obj-schema-MonthDay", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildMonthDay();
+      var od = new api.MonthDay.fromJson(o.toJson());
+      checkMonthDay(od);
+    });
+  });
+
+
   unittest.group("obj-schema-PageInfo", () {
     unittest.test("to-json--from-json", () {
       var o = buildPageInfo();
@@ -1207,6 +1319,24 @@
   });
 
 
+  unittest.group("obj-schema-Season", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSeason();
+      var od = new api.Season.fromJson(o.toJson());
+      checkSeason(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-SubscriptionDeferralInfo", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSubscriptionDeferralInfo();
+      var od = new api.SubscriptionDeferralInfo.fromJson(o.toJson());
+      checkSubscriptionDeferralInfo(od);
+    });
+  });
+
+
   unittest.group("obj-schema-SubscriptionPurchase", () {
     unittest.test("to-json--from-json", () {
       var o = buildSubscriptionPurchase();
@@ -1216,6 +1346,24 @@
   });
 
 
+  unittest.group("obj-schema-SubscriptionPurchasesDeferRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSubscriptionPurchasesDeferRequest();
+      var od = new api.SubscriptionPurchasesDeferRequest.fromJson(o.toJson());
+      checkSubscriptionPurchasesDeferRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-SubscriptionPurchasesDeferResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSubscriptionPurchasesDeferResponse();
+      var od = new api.SubscriptionPurchasesDeferResponse.fromJson(o.toJson());
+      checkSubscriptionPurchasesDeferResponse(od);
+    });
+  });
+
+
   unittest.group("obj-schema-Testers", () {
     unittest.test("to-json--from-json", () {
       var o = buildTesters();
@@ -1264,22 +1412,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf(":commit", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals(":commit"));
-        pathOffset += 7;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1321,18 +1455,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1372,18 +1496,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1428,15 +1542,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/edits"));
-        pathOffset += 6;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1478,22 +1585,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf(":validate", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals(":validate"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1541,32 +1634,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/apks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/apks/"));
-        pathOffset += 6;
-        index = path.indexOf("/listings/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_apkVersionCode"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/listings/"));
-        pathOffset += 10;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_language"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1607,29 +1676,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/apks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/apks/"));
-        pathOffset += 6;
-        index = path.indexOf("/listings", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_apkVersionCode"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/listings"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1671,32 +1719,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/apks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/apks/"));
-        pathOffset += 6;
-        index = path.indexOf("/listings/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_apkVersionCode"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/listings/"));
-        pathOffset += 10;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_language"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1739,29 +1763,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/apks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/apks/"));
-        pathOffset += 6;
-        index = path.indexOf("/listings", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_apkVersionCode"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/listings"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1809,32 +1812,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/apks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/apks/"));
-        pathOffset += 6;
-        index = path.indexOf("/listings/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_apkVersionCode"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/listings/"));
-        pathOffset += 10;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_language"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1882,32 +1861,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/apks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/apks/"));
-        pathOffset += 6;
-        index = path.indexOf("/listings/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_apkVersionCode"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/listings/"));
-        pathOffset += 10;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_language"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1953,22 +1908,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/apks", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/apks"));
-        pathOffset += 5;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2012,22 +1953,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/apks", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/apks"));
-        pathOffset += 5;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2073,22 +2000,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/details", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/details"));
-        pathOffset += 8;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2134,22 +2047,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/details", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/details"));
-        pathOffset += 8;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2195,22 +2094,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/details", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/details"));
-        pathOffset += 8;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2258,32 +2143,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/apks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/apks/"));
-        pathOffset += 6;
-        index = path.indexOf("/expansionFiles/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_apkVersionCode"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/expansionFiles/"));
-        pathOffset += 16;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_expansionFileType"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2331,32 +2192,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/apks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/apks/"));
-        pathOffset += 6;
-        index = path.indexOf("/expansionFiles/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_apkVersionCode"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/expansionFiles/"));
-        pathOffset += 16;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_expansionFileType"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2404,32 +2241,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/apks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/apks/"));
-        pathOffset += 6;
-        index = path.indexOf("/expansionFiles/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_apkVersionCode"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/expansionFiles/"));
-        pathOffset += 16;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_expansionFileType"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2475,32 +2288,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/apks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/apks/"));
-        pathOffset += 6;
-        index = path.indexOf("/expansionFiles/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_apkVersionCode"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/expansionFiles/"));
-        pathOffset += 16;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_expansionFileType"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2549,39 +2338,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/listings/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/listings/"));
-        pathOffset += 10;
-        index = path.indexOf("/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_language"));
         unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        index = path.indexOf("/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_imageType"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
-        pathOffset += 1;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_imageId"));
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2623,32 +2381,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/listings/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/listings/"));
-        pathOffset += 10;
-        index = path.indexOf("/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_language"));
         unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_imageType"));
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2692,32 +2426,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/listings/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/listings/"));
-        pathOffset += 10;
-        index = path.indexOf("/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_language"));
         unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_imageType"));
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2763,32 +2473,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/listings/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/listings/"));
-        pathOffset += 10;
-        index = path.indexOf("/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_language"));
         unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
         pathOffset += 1;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_imageType"));
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2835,25 +2521,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/listings/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/listings/"));
-        pathOffset += 10;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_language"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2893,22 +2562,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/listings", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/listings"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2949,25 +2604,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/listings/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/listings/"));
-        pathOffset += 10;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_language"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3009,22 +2647,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/listings", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/listings"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3071,25 +2695,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/listings/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/listings/"));
-        pathOffset += 10;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_language"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3136,25 +2743,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/listings/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/listings/"));
-        pathOffset += 10;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_language"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3201,25 +2791,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/testers/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/testers/"));
-        pathOffset += 9;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_track"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3266,25 +2839,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/testers/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/testers/"));
-        pathOffset += 9;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_track"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3331,25 +2887,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/testers/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/testers/"));
-        pathOffset += 9;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_track"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3396,25 +2935,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/tracks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/tracks/"));
-        pathOffset += 8;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_track"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3456,22 +2978,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/tracks", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/tracks"));
-        pathOffset += 7;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3518,25 +3026,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/tracks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/tracks/"));
-        pathOffset += 8;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_track"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3583,25 +3074,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/edits/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/edits/"));
-        pathOffset += 7;
-        index = path.indexOf("/tracks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_editId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/tracks/"));
-        pathOffset += 8;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_track"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3649,8 +3123,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 33), unittest.equals("androidpublisher/v2/applications/"));
+        pathOffset += 33;
         unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("inappproducts/batch"));
         pathOffset += 19;
 
@@ -3694,18 +3170,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/inappproducts/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/inappproducts/"));
-        pathOffset += 15;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_sku"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3745,18 +3211,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/inappproducts/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/inappproducts/"));
-        pathOffset += 15;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_sku"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3802,15 +3258,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/inappproducts", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/inappproducts"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3855,15 +3304,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/inappproducts", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/inappproducts"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3913,18 +3355,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/inappproducts/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/inappproducts/"));
-        pathOffset += 15;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_sku"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3972,18 +3404,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/inappproducts/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/inappproducts/"));
-        pathOffset += 15;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_sku"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -4031,25 +3453,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/purchases/products/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/purchases/products/"));
-        pathOffset += 20;
-        index = path.indexOf("/tokens/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_productId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/tokens/"));
-        pathOffset += 8;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_token"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -4096,29 +3501,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/purchases/subscriptions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("/purchases/subscriptions/"));
-        pathOffset += 25;
-        index = path.indexOf("/tokens/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_subscriptionId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/tokens/"));
-        pathOffset += 8;
-        index = path.indexOf(":cancel", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_token"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals(":cancel"));
-        pathOffset += 7;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -4147,6 +3531,54 @@
       res.cancel(arg_packageName, arg_subscriptionId, arg_token).then(unittest.expectAsync((_) {}));
     });
 
+    unittest.test("method--defer", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.PurchasesSubscriptionsResourceApi res = new api.AndroidpublisherApi(mock).purchases.subscriptions;
+      var arg_request = buildSubscriptionPurchasesDeferRequest();
+      var arg_packageName = "foo";
+      var arg_subscriptionId = "foo";
+      var arg_token = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.SubscriptionPurchasesDeferRequest.fromJson(json);
+        checkSubscriptionPurchasesDeferRequest(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildSubscriptionPurchasesDeferResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.defer(arg_request, arg_packageName, arg_subscriptionId, arg_token).then(unittest.expectAsync(((api.SubscriptionPurchasesDeferResponse response) {
+        checkSubscriptionPurchasesDeferResponse(response);
+      })));
+    });
+
     unittest.test("method--get", () {
 
       var mock = new common_test.HttpServerMock();
@@ -4159,25 +3591,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/androidpublisher/v2/applications/"));
-        pathOffset += 34;
-        index = path.indexOf("/purchases/subscriptions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_packageName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("/purchases/subscriptions/"));
-        pathOffset += 25;
-        index = path.indexOf("/tokens/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_subscriptionId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/tokens/"));
-        pathOffset += 8;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_token"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -4208,6 +3623,90 @@
       })));
     });
 
+    unittest.test("method--refund", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.PurchasesSubscriptionsResourceApi res = new api.AndroidpublisherApi(mock).purchases.subscriptions;
+      var arg_packageName = "foo";
+      var arg_subscriptionId = "foo";
+      var arg_token = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.refund(arg_packageName, arg_subscriptionId, arg_token).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--revoke", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.PurchasesSubscriptionsResourceApi res = new api.AndroidpublisherApi(mock).purchases.subscriptions;
+      var arg_packageName = "foo";
+      var arg_subscriptionId = "foo";
+      var arg_token = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.revoke(arg_packageName, arg_subscriptionId, arg_token).then(unittest.expectAsync((_) {}));
+    });
+
   });
 
 
diff --git a/generated/googleapis/test/appsactivity/v1_test.dart b/generated/googleapis/test/appsactivity/v1_test.dart
index 32c9a9e..c66a102 100644
--- a/generated/googleapis/test/appsactivity/v1_test.dart
+++ b/generated/googleapis/test/appsactivity/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed656() {
+buildUnnamed684() {
   var o = new core.List<api.Event>();
   o.add(buildEvent());
   o.add(buildEvent());
   return o;
 }
 
-checkUnnamed656(core.List<api.Event> o) {
+checkUnnamed684(core.List<api.Event> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEvent(o[0]);
   checkEvent(o[1]);
@@ -35,7 +35,7 @@
   buildCounterActivity++;
   if (buildCounterActivity < 3) {
     o.combinedEvent = buildEvent();
-    o.singleEvents = buildUnnamed656();
+    o.singleEvents = buildUnnamed684();
   }
   buildCounterActivity--;
   return o;
@@ -45,32 +45,32 @@
   buildCounterActivity++;
   if (buildCounterActivity < 3) {
     checkEvent(o.combinedEvent);
-    checkUnnamed656(o.singleEvents);
+    checkUnnamed684(o.singleEvents);
   }
   buildCounterActivity--;
 }
 
-buildUnnamed657() {
+buildUnnamed685() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed657(core.List<core.String> o) {
+checkUnnamed685(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed658() {
+buildUnnamed686() {
   var o = new core.List<api.PermissionChange>();
   o.add(buildPermissionChange());
   o.add(buildPermissionChange());
   return o;
 }
 
-checkUnnamed658(core.List<api.PermissionChange> o) {
+checkUnnamed686(core.List<api.PermissionChange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermissionChange(o[0]);
   checkPermissionChange(o[1]);
@@ -81,11 +81,11 @@
   var o = new api.Event();
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
-    o.additionalEventTypes = buildUnnamed657();
+    o.additionalEventTypes = buildUnnamed685();
     o.eventTimeMillis = "foo";
     o.fromUserDeletion = true;
     o.move = buildMove();
-    o.permissionChanges = buildUnnamed658();
+    o.permissionChanges = buildUnnamed686();
     o.primaryEventType = "foo";
     o.rename = buildRename();
     o.target = buildTarget();
@@ -98,11 +98,11 @@
 checkEvent(api.Event o) {
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
-    checkUnnamed657(o.additionalEventTypes);
+    checkUnnamed685(o.additionalEventTypes);
     unittest.expect(o.eventTimeMillis, unittest.equals('foo'));
     unittest.expect(o.fromUserDeletion, unittest.isTrue);
     checkMove(o.move);
-    checkUnnamed658(o.permissionChanges);
+    checkUnnamed686(o.permissionChanges);
     unittest.expect(o.primaryEventType, unittest.equals('foo'));
     checkRename(o.rename);
     checkTarget(o.target);
@@ -111,14 +111,14 @@
   buildCounterEvent--;
 }
 
-buildUnnamed659() {
+buildUnnamed687() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed659(core.List<api.Activity> o) {
+checkUnnamed687(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -129,7 +129,7 @@
   var o = new api.ListActivitiesResponse();
   buildCounterListActivitiesResponse++;
   if (buildCounterListActivitiesResponse < 3) {
-    o.activities = buildUnnamed659();
+    o.activities = buildUnnamed687();
     o.nextPageToken = "foo";
   }
   buildCounterListActivitiesResponse--;
@@ -139,33 +139,33 @@
 checkListActivitiesResponse(api.ListActivitiesResponse o) {
   buildCounterListActivitiesResponse++;
   if (buildCounterListActivitiesResponse < 3) {
-    checkUnnamed659(o.activities);
+    checkUnnamed687(o.activities);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListActivitiesResponse--;
 }
 
-buildUnnamed660() {
+buildUnnamed688() {
   var o = new core.List<api.Parent>();
   o.add(buildParent());
   o.add(buildParent());
   return o;
 }
 
-checkUnnamed660(core.List<api.Parent> o) {
+checkUnnamed688(core.List<api.Parent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParent(o[0]);
   checkParent(o[1]);
 }
 
-buildUnnamed661() {
+buildUnnamed689() {
   var o = new core.List<api.Parent>();
   o.add(buildParent());
   o.add(buildParent());
   return o;
 }
 
-checkUnnamed661(core.List<api.Parent> o) {
+checkUnnamed689(core.List<api.Parent> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParent(o[0]);
   checkParent(o[1]);
@@ -176,8 +176,8 @@
   var o = new api.Move();
   buildCounterMove++;
   if (buildCounterMove < 3) {
-    o.addedParents = buildUnnamed660();
-    o.removedParents = buildUnnamed661();
+    o.addedParents = buildUnnamed688();
+    o.removedParents = buildUnnamed689();
   }
   buildCounterMove--;
   return o;
@@ -186,8 +186,8 @@
 checkMove(api.Move o) {
   buildCounterMove++;
   if (buildCounterMove < 3) {
-    checkUnnamed660(o.addedParents);
-    checkUnnamed661(o.removedParents);
+    checkUnnamed688(o.addedParents);
+    checkUnnamed689(o.removedParents);
   }
   buildCounterMove--;
 }
@@ -244,27 +244,27 @@
   buildCounterPermission--;
 }
 
-buildUnnamed662() {
+buildUnnamed690() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed662(core.List<api.Permission> o) {
+checkUnnamed690(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
 }
 
-buildUnnamed663() {
+buildUnnamed691() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed663(core.List<api.Permission> o) {
+checkUnnamed691(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
@@ -275,8 +275,8 @@
   var o = new api.PermissionChange();
   buildCounterPermissionChange++;
   if (buildCounterPermissionChange < 3) {
-    o.addedPermissions = buildUnnamed662();
-    o.removedPermissions = buildUnnamed663();
+    o.addedPermissions = buildUnnamed690();
+    o.removedPermissions = buildUnnamed691();
   }
   buildCounterPermissionChange--;
   return o;
@@ -285,8 +285,8 @@
 checkPermissionChange(api.PermissionChange o) {
   buildCounterPermissionChange++;
   if (buildCounterPermissionChange < 3) {
-    checkUnnamed662(o.addedPermissions);
-    checkUnnamed663(o.removedPermissions);
+    checkUnnamed690(o.addedPermissions);
+    checkUnnamed691(o.removedPermissions);
   }
   buildCounterPermissionChange--;
 }
@@ -493,8 +493,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/appsactivity/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("appsactivity/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("activities"));
         pathOffset += 10;
 
diff --git a/generated/googleapis/test/appstate/v1_test.dart b/generated/googleapis/test/appstate/v1_test.dart
index 17705ad..401abba 100644
--- a/generated/googleapis/test/appstate/v1_test.dart
+++ b/generated/googleapis/test/appstate/v1_test.dart
@@ -41,14 +41,14 @@
   buildCounterGetResponse--;
 }
 
-buildUnnamed943() {
+buildUnnamed971() {
   var o = new core.List<api.GetResponse>();
   o.add(buildGetResponse());
   o.add(buildGetResponse());
   return o;
 }
 
-checkUnnamed943(core.List<api.GetResponse> o) {
+checkUnnamed971(core.List<api.GetResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGetResponse(o[0]);
   checkGetResponse(o[1]);
@@ -59,7 +59,7 @@
   var o = new api.ListResponse();
   buildCounterListResponse++;
   if (buildCounterListResponse < 3) {
-    o.items = buildUnnamed943();
+    o.items = buildUnnamed971();
     o.kind = "foo";
     o.maximumKeyCount = 42;
   }
@@ -70,7 +70,7 @@
 checkListResponse(api.ListResponse o) {
   buildCounterListResponse++;
   if (buildCounterListResponse < 3) {
-    checkUnnamed943(o.items);
+    checkUnnamed971(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.maximumKeyCount, unittest.equals(42));
   }
@@ -171,8 +171,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/appstate/v1/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("appstate/v1/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("states/"));
         pathOffset += 7;
         index = path.indexOf("/clear", pathOffset);
@@ -223,8 +225,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/appstate/v1/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("appstate/v1/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("states/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -268,8 +272,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/appstate/v1/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("appstate/v1/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("states/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -315,8 +321,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/appstate/v1/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("appstate/v1/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("states"));
         pathOffset += 6;
 
@@ -365,8 +373,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/appstate/v1/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("appstate/v1/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("states/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
diff --git a/generated/googleapis/test/bigquery/v2_test.dart b/generated/googleapis/test/bigquery/v2_test.dart
index d3cb541..5f085da 100644
--- a/generated/googleapis/test/bigquery/v2_test.dart
+++ b/generated/googleapis/test/bigquery/v2_test.dart
@@ -45,14 +45,14 @@
   buildCounterDatasetAccess--;
 }
 
-buildUnnamed1013() {
+buildUnnamed1041() {
   var o = new core.List<api.DatasetAccess>();
   o.add(buildDatasetAccess());
   o.add(buildDatasetAccess());
   return o;
 }
 
-checkUnnamed1013(core.List<api.DatasetAccess> o) {
+checkUnnamed1041(core.List<api.DatasetAccess> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatasetAccess(o[0]);
   checkDatasetAccess(o[1]);
@@ -63,7 +63,7 @@
   var o = new api.Dataset();
   buildCounterDataset++;
   if (buildCounterDataset < 3) {
-    o.access = buildUnnamed1013();
+    o.access = buildUnnamed1041();
     o.creationTime = "foo";
     o.datasetReference = buildDatasetReference();
     o.description = "foo";
@@ -81,7 +81,7 @@
 checkDataset(api.Dataset o) {
   buildCounterDataset++;
   if (buildCounterDataset < 3) {
-    checkUnnamed1013(o.access);
+    checkUnnamed1041(o.access);
     unittest.expect(o.creationTime, unittest.equals('foo'));
     checkDatasetReference(o.datasetReference);
     unittest.expect(o.description, unittest.equals('foo'));
@@ -120,14 +120,14 @@
   buildCounterDatasetListDatasets--;
 }
 
-buildUnnamed1014() {
+buildUnnamed1042() {
   var o = new core.List<api.DatasetListDatasets>();
   o.add(buildDatasetListDatasets());
   o.add(buildDatasetListDatasets());
   return o;
 }
 
-checkUnnamed1014(core.List<api.DatasetListDatasets> o) {
+checkUnnamed1042(core.List<api.DatasetListDatasets> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatasetListDatasets(o[0]);
   checkDatasetListDatasets(o[1]);
@@ -138,7 +138,7 @@
   var o = new api.DatasetList();
   buildCounterDatasetList++;
   if (buildCounterDatasetList < 3) {
-    o.datasets = buildUnnamed1014();
+    o.datasets = buildUnnamed1042();
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -150,7 +150,7 @@
 checkDatasetList(api.DatasetList o) {
   buildCounterDatasetList++;
   if (buildCounterDatasetList < 3) {
-    checkUnnamed1014(o.datasets);
+    checkUnnamed1042(o.datasets);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -204,14 +204,14 @@
   buildCounterErrorProto--;
 }
 
-buildUnnamed1015() {
+buildUnnamed1043() {
   var o = new core.List<api.TableRow>();
   o.add(buildTableRow());
   o.add(buildTableRow());
   return o;
 }
 
-checkUnnamed1015(core.List<api.TableRow> o) {
+checkUnnamed1043(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableRow(o[0]);
   checkTableRow(o[1]);
@@ -228,7 +228,7 @@
     o.jobReference = buildJobReference();
     o.kind = "foo";
     o.pageToken = "foo";
-    o.rows = buildUnnamed1015();
+    o.rows = buildUnnamed1043();
     o.schema = buildTableSchema();
     o.totalRows = "foo";
   }
@@ -245,7 +245,7 @@
     checkJobReference(o.jobReference);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed1015(o.rows);
+    checkUnnamed1043(o.rows);
     checkTableSchema(o.schema);
     unittest.expect(o.totalRows, unittest.equals('foo'));
   }
@@ -314,14 +314,14 @@
   buildCounterJobConfiguration--;
 }
 
-buildUnnamed1016() {
+buildUnnamed1044() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1016(core.List<core.String> o) {
+checkUnnamed1044(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -335,7 +335,7 @@
     o.compression = "foo";
     o.destinationFormat = "foo";
     o.destinationUri = "foo";
-    o.destinationUris = buildUnnamed1016();
+    o.destinationUris = buildUnnamed1044();
     o.fieldDelimiter = "foo";
     o.printHeader = true;
     o.sourceTable = buildTableReference();
@@ -350,7 +350,7 @@
     unittest.expect(o.compression, unittest.equals('foo'));
     unittest.expect(o.destinationFormat, unittest.equals('foo'));
     unittest.expect(o.destinationUri, unittest.equals('foo'));
-    checkUnnamed1016(o.destinationUris);
+    checkUnnamed1044(o.destinationUris);
     unittest.expect(o.fieldDelimiter, unittest.equals('foo'));
     unittest.expect(o.printHeader, unittest.isTrue);
     checkTableReference(o.sourceTable);
@@ -358,14 +358,14 @@
   buildCounterJobConfigurationExtract--;
 }
 
-buildUnnamed1017() {
+buildUnnamed1045() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1017(core.List<core.String> o) {
+checkUnnamed1045(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -378,7 +378,7 @@
   if (buildCounterJobConfigurationLink < 3) {
     o.createDisposition = "foo";
     o.destinationTable = buildTableReference();
-    o.sourceUri = buildUnnamed1017();
+    o.sourceUri = buildUnnamed1045();
     o.writeDisposition = "foo";
   }
   buildCounterJobConfigurationLink--;
@@ -390,20 +390,20 @@
   if (buildCounterJobConfigurationLink < 3) {
     unittest.expect(o.createDisposition, unittest.equals('foo'));
     checkTableReference(o.destinationTable);
-    checkUnnamed1017(o.sourceUri);
+    checkUnnamed1045(o.sourceUri);
     unittest.expect(o.writeDisposition, unittest.equals('foo'));
   }
   buildCounterJobConfigurationLink--;
 }
 
-buildUnnamed1018() {
+buildUnnamed1046() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1018(core.List<core.String> o) {
+checkUnnamed1046(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -428,7 +428,7 @@
     o.schemaInlineFormat = "foo";
     o.skipLeadingRows = 42;
     o.sourceFormat = "foo";
-    o.sourceUris = buildUnnamed1018();
+    o.sourceUris = buildUnnamed1046();
     o.writeDisposition = "foo";
   }
   buildCounterJobConfigurationLoad--;
@@ -452,7 +452,7 @@
     unittest.expect(o.schemaInlineFormat, unittest.equals('foo'));
     unittest.expect(o.skipLeadingRows, unittest.equals(42));
     unittest.expect(o.sourceFormat, unittest.equals('foo'));
-    checkUnnamed1018(o.sourceUris);
+    checkUnnamed1046(o.sourceUris);
     unittest.expect(o.writeDisposition, unittest.equals('foo'));
   }
   buildCounterJobConfigurationLoad--;
@@ -495,14 +495,14 @@
   buildCounterJobConfigurationQuery--;
 }
 
-buildUnnamed1019() {
+buildUnnamed1047() {
   var o = new core.List<api.TableReference>();
   o.add(buildTableReference());
   o.add(buildTableReference());
   return o;
 }
 
-checkUnnamed1019(core.List<api.TableReference> o) {
+checkUnnamed1047(core.List<api.TableReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableReference(o[0]);
   checkTableReference(o[1]);
@@ -516,7 +516,7 @@
     o.createDisposition = "foo";
     o.destinationTable = buildTableReference();
     o.sourceTable = buildTableReference();
-    o.sourceTables = buildUnnamed1019();
+    o.sourceTables = buildUnnamed1047();
     o.writeDisposition = "foo";
   }
   buildCounterJobConfigurationTableCopy--;
@@ -529,7 +529,7 @@
     unittest.expect(o.createDisposition, unittest.equals('foo'));
     checkTableReference(o.destinationTable);
     checkTableReference(o.sourceTable);
-    checkUnnamed1019(o.sourceTables);
+    checkUnnamed1047(o.sourceTables);
     unittest.expect(o.writeDisposition, unittest.equals('foo'));
   }
   buildCounterJobConfigurationTableCopy--;
@@ -570,14 +570,14 @@
   buildCounterJobListJobs--;
 }
 
-buildUnnamed1020() {
+buildUnnamed1048() {
   var o = new core.List<api.JobListJobs>();
   o.add(buildJobListJobs());
   o.add(buildJobListJobs());
   return o;
 }
 
-checkUnnamed1020(core.List<api.JobListJobs> o) {
+checkUnnamed1048(core.List<api.JobListJobs> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJobListJobs(o[0]);
   checkJobListJobs(o[1]);
@@ -589,7 +589,7 @@
   buildCounterJobList++;
   if (buildCounterJobList < 3) {
     o.etag = "foo";
-    o.jobs = buildUnnamed1020();
+    o.jobs = buildUnnamed1048();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -602,7 +602,7 @@
   buildCounterJobList++;
   if (buildCounterJobList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1020(o.jobs);
+    checkUnnamed1048(o.jobs);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -706,14 +706,14 @@
   buildCounterJobStatistics3--;
 }
 
-buildUnnamed1021() {
+buildUnnamed1049() {
   var o = new core.List<api.ErrorProto>();
   o.add(buildErrorProto());
   o.add(buildErrorProto());
   return o;
 }
 
-checkUnnamed1021(core.List<api.ErrorProto> o) {
+checkUnnamed1049(core.List<api.ErrorProto> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkErrorProto(o[0]);
   checkErrorProto(o[1]);
@@ -725,7 +725,7 @@
   buildCounterJobStatus++;
   if (buildCounterJobStatus < 3) {
     o.errorResult = buildErrorProto();
-    o.errors = buildUnnamed1021();
+    o.errors = buildUnnamed1049();
     o.state = "foo";
   }
   buildCounterJobStatus--;
@@ -736,7 +736,7 @@
   buildCounterJobStatus++;
   if (buildCounterJobStatus < 3) {
     checkErrorProto(o.errorResult);
-    checkUnnamed1021(o.errors);
+    checkUnnamed1049(o.errors);
     unittest.expect(o.state, unittest.equals('foo'));
   }
   buildCounterJobStatus--;
@@ -782,14 +782,14 @@
   buildCounterProjectListProjects--;
 }
 
-buildUnnamed1022() {
+buildUnnamed1050() {
   var o = new core.List<api.ProjectListProjects>();
   o.add(buildProjectListProjects());
   o.add(buildProjectListProjects());
   return o;
 }
 
-checkUnnamed1022(core.List<api.ProjectListProjects> o) {
+checkUnnamed1050(core.List<api.ProjectListProjects> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProjectListProjects(o[0]);
   checkProjectListProjects(o[1]);
@@ -803,7 +803,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.projects = buildUnnamed1022();
+    o.projects = buildUnnamed1050();
     o.totalItems = 42;
   }
   buildCounterProjectList--;
@@ -816,7 +816,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1022(o.projects);
+    checkUnnamed1050(o.projects);
     unittest.expect(o.totalItems, unittest.equals(42));
   }
   buildCounterProjectList--;
@@ -874,14 +874,14 @@
   buildCounterQueryRequest--;
 }
 
-buildUnnamed1023() {
+buildUnnamed1051() {
   var o = new core.List<api.TableRow>();
   o.add(buildTableRow());
   o.add(buildTableRow());
   return o;
 }
 
-checkUnnamed1023(core.List<api.TableRow> o) {
+checkUnnamed1051(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableRow(o[0]);
   checkTableRow(o[1]);
@@ -897,7 +897,7 @@
     o.jobReference = buildJobReference();
     o.kind = "foo";
     o.pageToken = "foo";
-    o.rows = buildUnnamed1023();
+    o.rows = buildUnnamed1051();
     o.schema = buildTableSchema();
     o.totalBytesProcessed = "foo";
     o.totalRows = "foo";
@@ -914,7 +914,7 @@
     checkJobReference(o.jobReference);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed1023(o.rows);
+    checkUnnamed1051(o.rows);
     checkTableSchema(o.schema);
     unittest.expect(o.totalBytesProcessed, unittest.equals('foo'));
     unittest.expect(o.totalRows, unittest.equals('foo'));
@@ -1009,14 +1009,14 @@
   buildCounterTableDataInsertAllRequestRows--;
 }
 
-buildUnnamed1024() {
+buildUnnamed1052() {
   var o = new core.List<api.TableDataInsertAllRequestRows>();
   o.add(buildTableDataInsertAllRequestRows());
   o.add(buildTableDataInsertAllRequestRows());
   return o;
 }
 
-checkUnnamed1024(core.List<api.TableDataInsertAllRequestRows> o) {
+checkUnnamed1052(core.List<api.TableDataInsertAllRequestRows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableDataInsertAllRequestRows(o[0]);
   checkTableDataInsertAllRequestRows(o[1]);
@@ -1028,7 +1028,7 @@
   buildCounterTableDataInsertAllRequest++;
   if (buildCounterTableDataInsertAllRequest < 3) {
     o.kind = "foo";
-    o.rows = buildUnnamed1024();
+    o.rows = buildUnnamed1052();
   }
   buildCounterTableDataInsertAllRequest--;
   return o;
@@ -1038,19 +1038,19 @@
   buildCounterTableDataInsertAllRequest++;
   if (buildCounterTableDataInsertAllRequest < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1024(o.rows);
+    checkUnnamed1052(o.rows);
   }
   buildCounterTableDataInsertAllRequest--;
 }
 
-buildUnnamed1025() {
+buildUnnamed1053() {
   var o = new core.List<api.ErrorProto>();
   o.add(buildErrorProto());
   o.add(buildErrorProto());
   return o;
 }
 
-checkUnnamed1025(core.List<api.ErrorProto> o) {
+checkUnnamed1053(core.List<api.ErrorProto> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkErrorProto(o[0]);
   checkErrorProto(o[1]);
@@ -1061,7 +1061,7 @@
   var o = new api.TableDataInsertAllResponseInsertErrors();
   buildCounterTableDataInsertAllResponseInsertErrors++;
   if (buildCounterTableDataInsertAllResponseInsertErrors < 3) {
-    o.errors = buildUnnamed1025();
+    o.errors = buildUnnamed1053();
     o.index = 42;
   }
   buildCounterTableDataInsertAllResponseInsertErrors--;
@@ -1071,20 +1071,20 @@
 checkTableDataInsertAllResponseInsertErrors(api.TableDataInsertAllResponseInsertErrors o) {
   buildCounterTableDataInsertAllResponseInsertErrors++;
   if (buildCounterTableDataInsertAllResponseInsertErrors < 3) {
-    checkUnnamed1025(o.errors);
+    checkUnnamed1053(o.errors);
     unittest.expect(o.index, unittest.equals(42));
   }
   buildCounterTableDataInsertAllResponseInsertErrors--;
 }
 
-buildUnnamed1026() {
+buildUnnamed1054() {
   var o = new core.List<api.TableDataInsertAllResponseInsertErrors>();
   o.add(buildTableDataInsertAllResponseInsertErrors());
   o.add(buildTableDataInsertAllResponseInsertErrors());
   return o;
 }
 
-checkUnnamed1026(core.List<api.TableDataInsertAllResponseInsertErrors> o) {
+checkUnnamed1054(core.List<api.TableDataInsertAllResponseInsertErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableDataInsertAllResponseInsertErrors(o[0]);
   checkTableDataInsertAllResponseInsertErrors(o[1]);
@@ -1095,7 +1095,7 @@
   var o = new api.TableDataInsertAllResponse();
   buildCounterTableDataInsertAllResponse++;
   if (buildCounterTableDataInsertAllResponse < 3) {
-    o.insertErrors = buildUnnamed1026();
+    o.insertErrors = buildUnnamed1054();
     o.kind = "foo";
   }
   buildCounterTableDataInsertAllResponse--;
@@ -1105,20 +1105,20 @@
 checkTableDataInsertAllResponse(api.TableDataInsertAllResponse o) {
   buildCounterTableDataInsertAllResponse++;
   if (buildCounterTableDataInsertAllResponse < 3) {
-    checkUnnamed1026(o.insertErrors);
+    checkUnnamed1054(o.insertErrors);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTableDataInsertAllResponse--;
 }
 
-buildUnnamed1027() {
+buildUnnamed1055() {
   var o = new core.List<api.TableRow>();
   o.add(buildTableRow());
   o.add(buildTableRow());
   return o;
 }
 
-checkUnnamed1027(core.List<api.TableRow> o) {
+checkUnnamed1055(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableRow(o[0]);
   checkTableRow(o[1]);
@@ -1132,7 +1132,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.pageToken = "foo";
-    o.rows = buildUnnamed1027();
+    o.rows = buildUnnamed1055();
     o.totalRows = "foo";
   }
   buildCounterTableDataList--;
@@ -1145,20 +1145,20 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed1027(o.rows);
+    checkUnnamed1055(o.rows);
     unittest.expect(o.totalRows, unittest.equals('foo'));
   }
   buildCounterTableDataList--;
 }
 
-buildUnnamed1028() {
+buildUnnamed1056() {
   var o = new core.List<api.TableFieldSchema>();
   o.add(buildTableFieldSchema());
   o.add(buildTableFieldSchema());
   return o;
 }
 
-checkUnnamed1028(core.List<api.TableFieldSchema> o) {
+checkUnnamed1056(core.List<api.TableFieldSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableFieldSchema(o[0]);
   checkTableFieldSchema(o[1]);
@@ -1170,7 +1170,7 @@
   buildCounterTableFieldSchema++;
   if (buildCounterTableFieldSchema < 3) {
     o.description = "foo";
-    o.fields = buildUnnamed1028();
+    o.fields = buildUnnamed1056();
     o.mode = "foo";
     o.name = "foo";
     o.type = "foo";
@@ -1183,7 +1183,7 @@
   buildCounterTableFieldSchema++;
   if (buildCounterTableFieldSchema < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1028(o.fields);
+    checkUnnamed1056(o.fields);
     unittest.expect(o.mode, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -1218,14 +1218,14 @@
   buildCounterTableListTables--;
 }
 
-buildUnnamed1029() {
+buildUnnamed1057() {
   var o = new core.List<api.TableListTables>();
   o.add(buildTableListTables());
   o.add(buildTableListTables());
   return o;
 }
 
-checkUnnamed1029(core.List<api.TableListTables> o) {
+checkUnnamed1057(core.List<api.TableListTables> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableListTables(o[0]);
   checkTableListTables(o[1]);
@@ -1239,7 +1239,7 @@
     o.etag = "foo";
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.tables = buildUnnamed1029();
+    o.tables = buildUnnamed1057();
     o.totalItems = 42;
   }
   buildCounterTableList--;
@@ -1252,7 +1252,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1029(o.tables);
+    checkUnnamed1057(o.tables);
     unittest.expect(o.totalItems, unittest.equals(42));
   }
   buildCounterTableList--;
@@ -1281,14 +1281,14 @@
   buildCounterTableReference--;
 }
 
-buildUnnamed1030() {
+buildUnnamed1058() {
   var o = new core.List<api.TableCell>();
   o.add(buildTableCell());
   o.add(buildTableCell());
   return o;
 }
 
-checkUnnamed1030(core.List<api.TableCell> o) {
+checkUnnamed1058(core.List<api.TableCell> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableCell(o[0]);
   checkTableCell(o[1]);
@@ -1299,7 +1299,7 @@
   var o = new api.TableRow();
   buildCounterTableRow++;
   if (buildCounterTableRow < 3) {
-    o.f = buildUnnamed1030();
+    o.f = buildUnnamed1058();
   }
   buildCounterTableRow--;
   return o;
@@ -1308,19 +1308,19 @@
 checkTableRow(api.TableRow o) {
   buildCounterTableRow++;
   if (buildCounterTableRow < 3) {
-    checkUnnamed1030(o.f);
+    checkUnnamed1058(o.f);
   }
   buildCounterTableRow--;
 }
 
-buildUnnamed1031() {
+buildUnnamed1059() {
   var o = new core.List<api.TableFieldSchema>();
   o.add(buildTableFieldSchema());
   o.add(buildTableFieldSchema());
   return o;
 }
 
-checkUnnamed1031(core.List<api.TableFieldSchema> o) {
+checkUnnamed1059(core.List<api.TableFieldSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableFieldSchema(o[0]);
   checkTableFieldSchema(o[1]);
@@ -1331,7 +1331,7 @@
   var o = new api.TableSchema();
   buildCounterTableSchema++;
   if (buildCounterTableSchema < 3) {
-    o.fields = buildUnnamed1031();
+    o.fields = buildUnnamed1059();
   }
   buildCounterTableSchema--;
   return o;
@@ -1340,7 +1340,7 @@
 checkTableSchema(api.TableSchema o) {
   buildCounterTableSchema++;
   if (buildCounterTableSchema < 3) {
-    checkUnnamed1031(o.fields);
+    checkUnnamed1059(o.fields);
   }
   buildCounterTableSchema--;
 }
@@ -1364,14 +1364,14 @@
   buildCounterViewDefinition--;
 }
 
-buildUnnamed1032() {
+buildUnnamed1060() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1032(core.List<core.String> o) {
+checkUnnamed1060(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1761,8 +1761,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/bigquery/v2/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("bigquery/v2/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/datasets/", pathOffset);
@@ -1815,8 +1817,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/bigquery/v2/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("bigquery/v2/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/datasets/", pathOffset);
@@ -1873,8 +1877,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/bigquery/v2/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("bigquery/v2/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/datasets", pathOffset);
@@ -1927,8 +1933,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/bigquery/v2/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("bigquery/v2/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/datasets", pathOffset);
@@ -1986,8 +1994,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/bigquery/v2/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("bigquery/v2/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/datasets/", pathOffset);
@@ -2045,8 +2055,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/bigquery/v2/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("bigquery/v2/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/datasets/", pathOffset);
@@ -2104,8 +2116,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/bigquery/v2/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("bigquery/v2/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/jobs/", pathOffset);
@@ -2163,8 +2177,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/bigquery/v2/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("bigquery/v2/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/queries/", pathOffset);
@@ -2227,8 +2243,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/bigquery/v2/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("bigquery/v2/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/jobs", pathOffset);
@@ -2277,14 +2295,16 @@
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_projection = "foo";
-      var arg_stateFilter = buildUnnamed1032();
+      var arg_stateFilter = buildUnnamed1060();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/bigquery/v2/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("bigquery/v2/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/jobs", pathOffset);
@@ -2343,8 +2363,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/bigquery/v2/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("bigquery/v2/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/queries", pathOffset);
@@ -2399,8 +2421,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/bigquery/v2/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("bigquery/v2/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("projects"));
         pathOffset += 8;
 
@@ -2455,8 +2479,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/bigquery/v2/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("bigquery/v2/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/datasets/", pathOffset);
@@ -2525,8 +2551,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/bigquery/v2/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("bigquery/v2/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/datasets/", pathOffset);
@@ -2599,8 +2627,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/bigquery/v2/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("bigquery/v2/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/datasets/", pathOffset);
@@ -2660,8 +2690,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/bigquery/v2/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("bigquery/v2/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/datasets/", pathOffset);
@@ -2726,8 +2758,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/bigquery/v2/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("bigquery/v2/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/datasets/", pathOffset);
@@ -2787,8 +2821,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/bigquery/v2/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("bigquery/v2/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/datasets/", pathOffset);
@@ -2853,8 +2889,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/bigquery/v2/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("bigquery/v2/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/datasets/", pathOffset);
@@ -2920,8 +2958,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/bigquery/v2/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("bigquery/v2/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/datasets/", pathOffset);
diff --git a/generated/googleapis/test/blogger/v3_test.dart b/generated/googleapis/test/blogger/v3_test.dart
index 2f6e843..3adb479 100644
--- a/generated/googleapis/test/blogger/v3_test.dart
+++ b/generated/googleapis/test/blogger/v3_test.dart
@@ -60,14 +60,14 @@
   buildCounterBlogPages--;
 }
 
-buildUnnamed701() {
+buildUnnamed729() {
   var o = new core.List<api.Post>();
   o.add(buildPost());
   o.add(buildPost());
   return o;
 }
 
-checkUnnamed701(core.List<api.Post> o) {
+checkUnnamed729(core.List<api.Post> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPost(o[0]);
   checkPost(o[1]);
@@ -78,7 +78,7 @@
   var o = new api.BlogPosts();
   buildCounterBlogPosts++;
   if (buildCounterBlogPosts < 3) {
-    o.items = buildUnnamed701();
+    o.items = buildUnnamed729();
     o.selfLink = "foo";
     o.totalItems = 42;
   }
@@ -89,7 +89,7 @@
 checkBlogPosts(api.BlogPosts o) {
   buildCounterBlogPosts++;
   if (buildCounterBlogPosts < 3) {
-    checkUnnamed701(o.items);
+    checkUnnamed729(o.items);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
   }
@@ -139,27 +139,27 @@
   buildCounterBlog--;
 }
 
-buildUnnamed702() {
+buildUnnamed730() {
   var o = new core.List<api.BlogUserInfo>();
   o.add(buildBlogUserInfo());
   o.add(buildBlogUserInfo());
   return o;
 }
 
-checkUnnamed702(core.List<api.BlogUserInfo> o) {
+checkUnnamed730(core.List<api.BlogUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBlogUserInfo(o[0]);
   checkBlogUserInfo(o[1]);
 }
 
-buildUnnamed703() {
+buildUnnamed731() {
   var o = new core.List<api.Blog>();
   o.add(buildBlog());
   o.add(buildBlog());
   return o;
 }
 
-checkUnnamed703(core.List<api.Blog> o) {
+checkUnnamed731(core.List<api.Blog> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBlog(o[0]);
   checkBlog(o[1]);
@@ -170,8 +170,8 @@
   var o = new api.BlogList();
   buildCounterBlogList++;
   if (buildCounterBlogList < 3) {
-    o.blogUserInfos = buildUnnamed702();
-    o.items = buildUnnamed703();
+    o.blogUserInfos = buildUnnamed730();
+    o.items = buildUnnamed731();
     o.kind = "foo";
   }
   buildCounterBlogList--;
@@ -181,8 +181,8 @@
 checkBlogList(api.BlogList o) {
   buildCounterBlogList++;
   if (buildCounterBlogList < 3) {
-    checkUnnamed702(o.blogUserInfos);
-    checkUnnamed703(o.items);
+    checkUnnamed730(o.blogUserInfos);
+    checkUnnamed731(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBlogList--;
@@ -380,14 +380,14 @@
   buildCounterComment--;
 }
 
-buildUnnamed704() {
+buildUnnamed732() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed704(core.List<api.Comment> o) {
+checkUnnamed732(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -398,7 +398,7 @@
   var o = new api.CommentList();
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    o.items = buildUnnamed704();
+    o.items = buildUnnamed732();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.prevPageToken = "foo";
@@ -410,7 +410,7 @@
 checkCommentList(api.CommentList o) {
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    checkUnnamed704(o.items);
+    checkUnnamed732(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.prevPageToken, unittest.equals('foo'));
@@ -522,14 +522,14 @@
   buildCounterPage--;
 }
 
-buildUnnamed705() {
+buildUnnamed733() {
   var o = new core.List<api.Page>();
   o.add(buildPage());
   o.add(buildPage());
   return o;
 }
 
-checkUnnamed705(core.List<api.Page> o) {
+checkUnnamed733(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPage(o[0]);
   checkPage(o[1]);
@@ -540,7 +540,7 @@
   var o = new api.PageList();
   buildCounterPageList++;
   if (buildCounterPageList < 3) {
-    o.items = buildUnnamed705();
+    o.items = buildUnnamed733();
     o.kind = "foo";
   }
   buildCounterPageList--;
@@ -550,7 +550,7 @@
 checkPageList(api.PageList o) {
   buildCounterPageList++;
   if (buildCounterPageList < 3) {
-    checkUnnamed705(o.items);
+    checkUnnamed733(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPageList--;
@@ -577,14 +577,14 @@
   buildCounterPageviewsCounts--;
 }
 
-buildUnnamed706() {
+buildUnnamed734() {
   var o = new core.List<api.PageviewsCounts>();
   o.add(buildPageviewsCounts());
   o.add(buildPageviewsCounts());
   return o;
 }
 
-checkUnnamed706(core.List<api.PageviewsCounts> o) {
+checkUnnamed734(core.List<api.PageviewsCounts> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPageviewsCounts(o[0]);
   checkPageviewsCounts(o[1]);
@@ -596,7 +596,7 @@
   buildCounterPageviews++;
   if (buildCounterPageviews < 3) {
     o.blogId = "foo";
-    o.counts = buildUnnamed706();
+    o.counts = buildUnnamed734();
     o.kind = "foo";
   }
   buildCounterPageviews--;
@@ -607,7 +607,7 @@
   buildCounterPageviews++;
   if (buildCounterPageviews < 3) {
     unittest.expect(o.blogId, unittest.equals('foo'));
-    checkUnnamed706(o.counts);
+    checkUnnamed734(o.counts);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterPageviews--;
@@ -695,27 +695,27 @@
   buildCounterPostImages--;
 }
 
-buildUnnamed707() {
+buildUnnamed735() {
   var o = new core.List<api.PostImages>();
   o.add(buildPostImages());
   o.add(buildPostImages());
   return o;
 }
 
-checkUnnamed707(core.List<api.PostImages> o) {
+checkUnnamed735(core.List<api.PostImages> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPostImages(o[0]);
   checkPostImages(o[1]);
 }
 
-buildUnnamed708() {
+buildUnnamed736() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed708(core.List<core.String> o) {
+checkUnnamed736(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -746,14 +746,14 @@
   buildCounterPostLocation--;
 }
 
-buildUnnamed709() {
+buildUnnamed737() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed709(core.List<api.Comment> o) {
+checkUnnamed737(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -764,7 +764,7 @@
   var o = new api.PostReplies();
   buildCounterPostReplies++;
   if (buildCounterPostReplies < 3) {
-    o.items = buildUnnamed709();
+    o.items = buildUnnamed737();
     o.selfLink = "foo";
     o.totalItems = "foo";
   }
@@ -775,7 +775,7 @@
 checkPostReplies(api.PostReplies o) {
   buildCounterPostReplies++;
   if (buildCounterPostReplies < 3) {
-    checkUnnamed709(o.items);
+    checkUnnamed737(o.items);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals('foo'));
   }
@@ -793,9 +793,9 @@
     o.customMetaData = "foo";
     o.etag = "foo";
     o.id = "foo";
-    o.images = buildUnnamed707();
+    o.images = buildUnnamed735();
     o.kind = "foo";
-    o.labels = buildUnnamed708();
+    o.labels = buildUnnamed736();
     o.location = buildPostLocation();
     o.published = core.DateTime.parse("2002-02-27T14:01:02");
     o.readerComments = "foo";
@@ -820,9 +820,9 @@
     unittest.expect(o.customMetaData, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed707(o.images);
+    checkUnnamed735(o.images);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed708(o.labels);
+    checkUnnamed736(o.labels);
     checkPostLocation(o.location);
     unittest.expect(o.published, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.readerComments, unittest.equals('foo'));
@@ -837,14 +837,14 @@
   buildCounterPost--;
 }
 
-buildUnnamed710() {
+buildUnnamed738() {
   var o = new core.List<api.Post>();
   o.add(buildPost());
   o.add(buildPost());
   return o;
 }
 
-checkUnnamed710(core.List<api.Post> o) {
+checkUnnamed738(core.List<api.Post> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPost(o[0]);
   checkPost(o[1]);
@@ -855,7 +855,7 @@
   var o = new api.PostList();
   buildCounterPostList++;
   if (buildCounterPostList < 3) {
-    o.items = buildUnnamed710();
+    o.items = buildUnnamed738();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -866,7 +866,7 @@
 checkPostList(api.PostList o) {
   buildCounterPostList++;
   if (buildCounterPostList < 3) {
-    checkUnnamed710(o.items);
+    checkUnnamed738(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -923,14 +923,14 @@
   buildCounterPostUserInfo--;
 }
 
-buildUnnamed711() {
+buildUnnamed739() {
   var o = new core.List<api.PostUserInfo>();
   o.add(buildPostUserInfo());
   o.add(buildPostUserInfo());
   return o;
 }
 
-checkUnnamed711(core.List<api.PostUserInfo> o) {
+checkUnnamed739(core.List<api.PostUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPostUserInfo(o[0]);
   checkPostUserInfo(o[1]);
@@ -941,7 +941,7 @@
   var o = new api.PostUserInfosList();
   buildCounterPostUserInfosList++;
   if (buildCounterPostUserInfosList < 3) {
-    o.items = buildUnnamed711();
+    o.items = buildUnnamed739();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -952,7 +952,7 @@
 checkPostUserInfosList(api.PostUserInfosList o) {
   buildCounterPostUserInfosList++;
   if (buildCounterPostUserInfosList < 3) {
-    checkUnnamed711(o.items);
+    checkUnnamed739(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1036,92 +1036,92 @@
   buildCounterUser--;
 }
 
-buildUnnamed712() {
+buildUnnamed740() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed712(core.List<core.String> o) {
+checkUnnamed740(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed713() {
+buildUnnamed741() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed713(core.List<core.String> o) {
+checkUnnamed741(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed714() {
+buildUnnamed742() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed714(core.List<core.String> o) {
+checkUnnamed742(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed715() {
+buildUnnamed743() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed715(core.List<core.String> o) {
+checkUnnamed743(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed716() {
+buildUnnamed744() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed716(core.List<core.String> o) {
+checkUnnamed744(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed717() {
+buildUnnamed745() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed717(core.List<core.String> o) {
+checkUnnamed745(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed718() {
+buildUnnamed746() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed718(core.List<core.String> o) {
+checkUnnamed746(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1457,8 +1457,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/blogs/", pathOffset);
@@ -1518,8 +1520,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1568,8 +1572,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogs/byurl"));
         pathOffset += 11;
 
@@ -1610,16 +1616,18 @@
       api.BlogsResourceApi res = new api.BloggerApi(mock).blogs;
       var arg_userId = "foo";
       var arg_fetchUserInfo = true;
-      var arg_role = buildUnnamed712();
-      var arg_status = buildUnnamed713();
+      var arg_role = buildUnnamed740();
+      var arg_status = buildUnnamed741();
       var arg_view = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/blogs", pathOffset);
@@ -1679,8 +1687,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/posts/", pathOffset);
@@ -1746,8 +1756,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/posts/", pathOffset);
@@ -1808,8 +1820,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/posts/", pathOffset);
@@ -1871,15 +1885,17 @@
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_startDate = core.DateTime.parse("2002-02-27T14:01:02");
-      var arg_status = buildUnnamed714();
+      var arg_status = buildUnnamed742();
       var arg_view = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/posts/", pathOffset);
@@ -1948,8 +1964,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/comments", pathOffset);
@@ -2006,8 +2024,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/posts/", pathOffset);
@@ -2073,8 +2093,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/posts/", pathOffset);
@@ -2137,14 +2159,16 @@
       var mock = new common_test.HttpServerMock();
       api.PageViewsResourceApi res = new api.BloggerApi(mock).pageViews;
       var arg_blogId = "foo";
-      var arg_range = buildUnnamed715();
+      var arg_range = buildUnnamed743();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/pageviews", pathOffset);
@@ -2200,8 +2224,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/pages/", pathOffset);
@@ -2254,8 +2280,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/pages/", pathOffset);
@@ -2314,8 +2342,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/pages", pathOffset);
@@ -2362,15 +2392,17 @@
       api.PagesResourceApi res = new api.BloggerApi(mock).pages;
       var arg_blogId = "foo";
       var arg_fetchBodies = true;
-      var arg_status = buildUnnamed716();
+      var arg_status = buildUnnamed744();
       var arg_view = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/pages", pathOffset);
@@ -2430,8 +2462,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/pages/", pathOffset);
@@ -2487,8 +2521,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/pages/", pathOffset);
@@ -2546,8 +2582,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/pages/", pathOffset);
@@ -2611,8 +2649,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/pages/", pathOffset);
@@ -2674,8 +2714,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/blogs/", pathOffset);
@@ -2739,15 +2781,17 @@
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
       var arg_startDate = core.DateTime.parse("2002-02-27T14:01:02");
-      var arg_status = buildUnnamed717();
+      var arg_status = buildUnnamed745();
       var arg_view = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/blogs/", pathOffset);
@@ -2818,8 +2862,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/posts/", pathOffset);
@@ -2875,8 +2921,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/posts/", pathOffset);
@@ -2936,8 +2984,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/posts/bypath", pathOffset);
@@ -2997,8 +3047,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/posts", pathOffset);
@@ -3054,15 +3106,17 @@
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
       var arg_startDate = core.DateTime.parse("2002-02-27T14:01:02");
-      var arg_status = buildUnnamed718();
+      var arg_status = buildUnnamed746();
       var arg_view = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/posts", pathOffset);
@@ -3132,8 +3186,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/posts/", pathOffset);
@@ -3193,8 +3249,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/posts/", pathOffset);
@@ -3253,8 +3311,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/posts/", pathOffset);
@@ -3314,8 +3374,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/posts/search", pathOffset);
@@ -3378,8 +3440,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("blogs/"));
         pathOffset += 6;
         index = path.indexOf("/posts/", pathOffset);
@@ -3441,8 +3505,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/blogger/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("blogger/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
diff --git a/generated/googleapis/test/books/v1_test.dart b/generated/googleapis/test/books/v1_test.dart
index edf7a33..d37cc46 100644
--- a/generated/googleapis/test/books/v1_test.dart
+++ b/generated/googleapis/test/books/v1_test.dart
@@ -93,14 +93,14 @@
   buildCounterAnnotationLayerSummary--;
 }
 
-buildUnnamed498() {
+buildUnnamed526() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed498(core.List<core.String> o) {
+checkUnnamed526(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -123,7 +123,7 @@
     o.kind = "foo";
     o.layerId = "foo";
     o.layerSummary = buildAnnotationLayerSummary();
-    o.pageIds = buildUnnamed498();
+    o.pageIds = buildUnnamed526();
     o.selectedText = "foo";
     o.selfLink = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
@@ -148,7 +148,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.layerId, unittest.equals('foo'));
     checkAnnotationLayerSummary(o.layerSummary);
-    checkUnnamed498(o.pageIds);
+    checkUnnamed526(o.pageIds);
     unittest.expect(o.selectedText, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -192,14 +192,14 @@
   buildCounterAnnotationdata--;
 }
 
-buildUnnamed499() {
+buildUnnamed527() {
   var o = new core.List<api.Annotation>();
   o.add(buildAnnotation());
   o.add(buildAnnotation());
   return o;
 }
 
-checkUnnamed499(core.List<api.Annotation> o) {
+checkUnnamed527(core.List<api.Annotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotation(o[0]);
   checkAnnotation(o[1]);
@@ -210,7 +210,7 @@
   var o = new api.Annotations();
   buildCounterAnnotations++;
   if (buildCounterAnnotations < 3) {
-    o.items = buildUnnamed499();
+    o.items = buildUnnamed527();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -222,7 +222,7 @@
 checkAnnotations(api.Annotations o) {
   buildCounterAnnotations++;
   if (buildCounterAnnotations < 3) {
-    checkUnnamed499(o.items);
+    checkUnnamed527(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -257,14 +257,14 @@
   buildCounterAnnotationsSummaryLayers--;
 }
 
-buildUnnamed500() {
+buildUnnamed528() {
   var o = new core.List<api.AnnotationsSummaryLayers>();
   o.add(buildAnnotationsSummaryLayers());
   o.add(buildAnnotationsSummaryLayers());
   return o;
 }
 
-checkUnnamed500(core.List<api.AnnotationsSummaryLayers> o) {
+checkUnnamed528(core.List<api.AnnotationsSummaryLayers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotationsSummaryLayers(o[0]);
   checkAnnotationsSummaryLayers(o[1]);
@@ -276,7 +276,7 @@
   buildCounterAnnotationsSummary++;
   if (buildCounterAnnotationsSummary < 3) {
     o.kind = "foo";
-    o.layers = buildUnnamed500();
+    o.layers = buildUnnamed528();
   }
   buildCounterAnnotationsSummary--;
   return o;
@@ -286,19 +286,19 @@
   buildCounterAnnotationsSummary++;
   if (buildCounterAnnotationsSummary < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed500(o.layers);
+    checkUnnamed528(o.layers);
   }
   buildCounterAnnotationsSummary--;
 }
 
-buildUnnamed501() {
+buildUnnamed529() {
   var o = new core.List<api.Annotationdata>();
   o.add(buildAnnotationdata());
   o.add(buildAnnotationdata());
   return o;
 }
 
-checkUnnamed501(core.List<api.Annotationdata> o) {
+checkUnnamed529(core.List<api.Annotationdata> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnnotationdata(o[0]);
   checkAnnotationdata(o[1]);
@@ -309,7 +309,7 @@
   var o = new api.Annotationsdata();
   buildCounterAnnotationsdata++;
   if (buildCounterAnnotationsdata < 3) {
-    o.items = buildUnnamed501();
+    o.items = buildUnnamed529();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -321,7 +321,7 @@
 checkAnnotationsdata(api.Annotationsdata o) {
   buildCounterAnnotationsdata++;
   if (buildCounterAnnotationsdata < 3) {
-    checkUnnamed501(o.items);
+    checkUnnamed529(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -435,14 +435,14 @@
   buildCounterBookshelf--;
 }
 
-buildUnnamed502() {
+buildUnnamed530() {
   var o = new core.List<api.Bookshelf>();
   o.add(buildBookshelf());
   o.add(buildBookshelf());
   return o;
 }
 
-checkUnnamed502(core.List<api.Bookshelf> o) {
+checkUnnamed530(core.List<api.Bookshelf> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBookshelf(o[0]);
   checkBookshelf(o[1]);
@@ -453,7 +453,7 @@
   var o = new api.Bookshelves();
   buildCounterBookshelves++;
   if (buildCounterBookshelves < 3) {
-    o.items = buildUnnamed502();
+    o.items = buildUnnamed530();
     o.kind = "foo";
   }
   buildCounterBookshelves--;
@@ -463,7 +463,7 @@
 checkBookshelves(api.Bookshelves o) {
   buildCounterBookshelves++;
   if (buildCounterBookshelves < 3) {
-    checkUnnamed502(o.items);
+    checkUnnamed530(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBookshelves--;
@@ -590,14 +590,14 @@
   buildCounterDictlayerdataDictWordsDerivatives--;
 }
 
-buildUnnamed503() {
+buildUnnamed531() {
   var o = new core.List<api.DictlayerdataDictWordsDerivatives>();
   o.add(buildDictlayerdataDictWordsDerivatives());
   o.add(buildDictlayerdataDictWordsDerivatives());
   return o;
 }
 
-checkUnnamed503(core.List<api.DictlayerdataDictWordsDerivatives> o) {
+checkUnnamed531(core.List<api.DictlayerdataDictWordsDerivatives> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsDerivatives(o[0]);
   checkDictlayerdataDictWordsDerivatives(o[1]);
@@ -645,14 +645,14 @@
   buildCounterDictlayerdataDictWordsExamples--;
 }
 
-buildUnnamed504() {
+buildUnnamed532() {
   var o = new core.List<api.DictlayerdataDictWordsExamples>();
   o.add(buildDictlayerdataDictWordsExamples());
   o.add(buildDictlayerdataDictWordsExamples());
   return o;
 }
 
-checkUnnamed504(core.List<api.DictlayerdataDictWordsExamples> o) {
+checkUnnamed532(core.List<api.DictlayerdataDictWordsExamples> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsExamples(o[0]);
   checkDictlayerdataDictWordsExamples(o[1]);
@@ -679,14 +679,14 @@
   buildCounterDictlayerdataDictWordsSensesConjugations--;
 }
 
-buildUnnamed505() {
+buildUnnamed533() {
   var o = new core.List<api.DictlayerdataDictWordsSensesConjugations>();
   o.add(buildDictlayerdataDictWordsSensesConjugations());
   o.add(buildDictlayerdataDictWordsSensesConjugations());
   return o;
 }
 
-checkUnnamed505(core.List<api.DictlayerdataDictWordsSensesConjugations> o) {
+checkUnnamed533(core.List<api.DictlayerdataDictWordsSensesConjugations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSensesConjugations(o[0]);
   checkDictlayerdataDictWordsSensesConjugations(o[1]);
@@ -734,14 +734,14 @@
   buildCounterDictlayerdataDictWordsSensesDefinitionsExamples--;
 }
 
-buildUnnamed506() {
+buildUnnamed534() {
   var o = new core.List<api.DictlayerdataDictWordsSensesDefinitionsExamples>();
   o.add(buildDictlayerdataDictWordsSensesDefinitionsExamples());
   o.add(buildDictlayerdataDictWordsSensesDefinitionsExamples());
   return o;
 }
 
-checkUnnamed506(core.List<api.DictlayerdataDictWordsSensesDefinitionsExamples> o) {
+checkUnnamed534(core.List<api.DictlayerdataDictWordsSensesDefinitionsExamples> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSensesDefinitionsExamples(o[0]);
   checkDictlayerdataDictWordsSensesDefinitionsExamples(o[1]);
@@ -753,7 +753,7 @@
   buildCounterDictlayerdataDictWordsSensesDefinitions++;
   if (buildCounterDictlayerdataDictWordsSensesDefinitions < 3) {
     o.definition = "foo";
-    o.examples = buildUnnamed506();
+    o.examples = buildUnnamed534();
   }
   buildCounterDictlayerdataDictWordsSensesDefinitions--;
   return o;
@@ -763,19 +763,19 @@
   buildCounterDictlayerdataDictWordsSensesDefinitions++;
   if (buildCounterDictlayerdataDictWordsSensesDefinitions < 3) {
     unittest.expect(o.definition, unittest.equals('foo'));
-    checkUnnamed506(o.examples);
+    checkUnnamed534(o.examples);
   }
   buildCounterDictlayerdataDictWordsSensesDefinitions--;
 }
 
-buildUnnamed507() {
+buildUnnamed535() {
   var o = new core.List<api.DictlayerdataDictWordsSensesDefinitions>();
   o.add(buildDictlayerdataDictWordsSensesDefinitions());
   o.add(buildDictlayerdataDictWordsSensesDefinitions());
   return o;
 }
 
-checkUnnamed507(core.List<api.DictlayerdataDictWordsSensesDefinitions> o) {
+checkUnnamed535(core.List<api.DictlayerdataDictWordsSensesDefinitions> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSensesDefinitions(o[0]);
   checkDictlayerdataDictWordsSensesDefinitions(o[1]);
@@ -844,14 +844,14 @@
   buildCounterDictlayerdataDictWordsSensesSynonyms--;
 }
 
-buildUnnamed508() {
+buildUnnamed536() {
   var o = new core.List<api.DictlayerdataDictWordsSensesSynonyms>();
   o.add(buildDictlayerdataDictWordsSensesSynonyms());
   o.add(buildDictlayerdataDictWordsSensesSynonyms());
   return o;
 }
 
-checkUnnamed508(core.List<api.DictlayerdataDictWordsSensesSynonyms> o) {
+checkUnnamed536(core.List<api.DictlayerdataDictWordsSensesSynonyms> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSensesSynonyms(o[0]);
   checkDictlayerdataDictWordsSensesSynonyms(o[1]);
@@ -862,14 +862,14 @@
   var o = new api.DictlayerdataDictWordsSenses();
   buildCounterDictlayerdataDictWordsSenses++;
   if (buildCounterDictlayerdataDictWordsSenses < 3) {
-    o.conjugations = buildUnnamed505();
-    o.definitions = buildUnnamed507();
+    o.conjugations = buildUnnamed533();
+    o.definitions = buildUnnamed535();
     o.partOfSpeech = "foo";
     o.pronunciation = "foo";
     o.pronunciationUrl = "foo";
     o.source = buildDictlayerdataDictWordsSensesSource();
     o.syllabification = "foo";
-    o.synonyms = buildUnnamed508();
+    o.synonyms = buildUnnamed536();
   }
   buildCounterDictlayerdataDictWordsSenses--;
   return o;
@@ -878,26 +878,26 @@
 checkDictlayerdataDictWordsSenses(api.DictlayerdataDictWordsSenses o) {
   buildCounterDictlayerdataDictWordsSenses++;
   if (buildCounterDictlayerdataDictWordsSenses < 3) {
-    checkUnnamed505(o.conjugations);
-    checkUnnamed507(o.definitions);
+    checkUnnamed533(o.conjugations);
+    checkUnnamed535(o.definitions);
     unittest.expect(o.partOfSpeech, unittest.equals('foo'));
     unittest.expect(o.pronunciation, unittest.equals('foo'));
     unittest.expect(o.pronunciationUrl, unittest.equals('foo'));
     checkDictlayerdataDictWordsSensesSource(o.source);
     unittest.expect(o.syllabification, unittest.equals('foo'));
-    checkUnnamed508(o.synonyms);
+    checkUnnamed536(o.synonyms);
   }
   buildCounterDictlayerdataDictWordsSenses--;
 }
 
-buildUnnamed509() {
+buildUnnamed537() {
   var o = new core.List<api.DictlayerdataDictWordsSenses>();
   o.add(buildDictlayerdataDictWordsSenses());
   o.add(buildDictlayerdataDictWordsSenses());
   return o;
 }
 
-checkUnnamed509(core.List<api.DictlayerdataDictWordsSenses> o) {
+checkUnnamed537(core.List<api.DictlayerdataDictWordsSenses> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWordsSenses(o[0]);
   checkDictlayerdataDictWordsSenses(o[1]);
@@ -929,9 +929,9 @@
   var o = new api.DictlayerdataDictWords();
   buildCounterDictlayerdataDictWords++;
   if (buildCounterDictlayerdataDictWords < 3) {
-    o.derivatives = buildUnnamed503();
-    o.examples = buildUnnamed504();
-    o.senses = buildUnnamed509();
+    o.derivatives = buildUnnamed531();
+    o.examples = buildUnnamed532();
+    o.senses = buildUnnamed537();
     o.source = buildDictlayerdataDictWordsSource();
   }
   buildCounterDictlayerdataDictWords--;
@@ -941,22 +941,22 @@
 checkDictlayerdataDictWords(api.DictlayerdataDictWords o) {
   buildCounterDictlayerdataDictWords++;
   if (buildCounterDictlayerdataDictWords < 3) {
-    checkUnnamed503(o.derivatives);
-    checkUnnamed504(o.examples);
-    checkUnnamed509(o.senses);
+    checkUnnamed531(o.derivatives);
+    checkUnnamed532(o.examples);
+    checkUnnamed537(o.senses);
     checkDictlayerdataDictWordsSource(o.source);
   }
   buildCounterDictlayerdataDictWords--;
 }
 
-buildUnnamed510() {
+buildUnnamed538() {
   var o = new core.List<api.DictlayerdataDictWords>();
   o.add(buildDictlayerdataDictWords());
   o.add(buildDictlayerdataDictWords());
   return o;
 }
 
-checkUnnamed510(core.List<api.DictlayerdataDictWords> o) {
+checkUnnamed538(core.List<api.DictlayerdataDictWords> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDictlayerdataDictWords(o[0]);
   checkDictlayerdataDictWords(o[1]);
@@ -968,7 +968,7 @@
   buildCounterDictlayerdataDict++;
   if (buildCounterDictlayerdataDict < 3) {
     o.source = buildDictlayerdataDictSource();
-    o.words = buildUnnamed510();
+    o.words = buildUnnamed538();
   }
   buildCounterDictlayerdataDict--;
   return o;
@@ -978,7 +978,7 @@
   buildCounterDictlayerdataDict++;
   if (buildCounterDictlayerdataDict < 3) {
     checkDictlayerdataDictSource(o.source);
-    checkUnnamed510(o.words);
+    checkUnnamed538(o.words);
   }
   buildCounterDictlayerdataDict--;
 }
@@ -1047,14 +1047,14 @@
   buildCounterDownloadAccessRestriction--;
 }
 
-buildUnnamed511() {
+buildUnnamed539() {
   var o = new core.List<api.DownloadAccessRestriction>();
   o.add(buildDownloadAccessRestriction());
   o.add(buildDownloadAccessRestriction());
   return o;
 }
 
-checkUnnamed511(core.List<api.DownloadAccessRestriction> o) {
+checkUnnamed539(core.List<api.DownloadAccessRestriction> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDownloadAccessRestriction(o[0]);
   checkDownloadAccessRestriction(o[1]);
@@ -1065,7 +1065,7 @@
   var o = new api.DownloadAccesses();
   buildCounterDownloadAccesses++;
   if (buildCounterDownloadAccesses < 3) {
-    o.downloadAccessList = buildUnnamed511();
+    o.downloadAccessList = buildUnnamed539();
     o.kind = "foo";
   }
   buildCounterDownloadAccesses--;
@@ -1075,7 +1075,7 @@
 checkDownloadAccesses(api.DownloadAccesses o) {
   buildCounterDownloadAccesses++;
   if (buildCounterDownloadAccesses < 3) {
-    checkUnnamed511(o.downloadAccessList);
+    checkUnnamed539(o.downloadAccessList);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDownloadAccesses--;
@@ -1129,30 +1129,30 @@
   buildCounterGeolayerdataGeoBoundary--;
 }
 
-buildUnnamed512() {
+buildUnnamed540() {
   var o = new core.List<api.GeolayerdataGeoBoundary>();
   o.add(buildGeolayerdataGeoBoundary());
   o.add(buildGeolayerdataGeoBoundary());
   return o;
 }
 
-checkUnnamed512(core.List<api.GeolayerdataGeoBoundary> o) {
+checkUnnamed540(core.List<api.GeolayerdataGeoBoundary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeolayerdataGeoBoundary(o[0]);
   checkGeolayerdataGeoBoundary(o[1]);
 }
 
-buildUnnamed513() {
+buildUnnamed541() {
   var o = new core.List<core.List<api.GeolayerdataGeoBoundary>>();
-  o.add(buildUnnamed512());
-  o.add(buildUnnamed512());
+  o.add(buildUnnamed540());
+  o.add(buildUnnamed540());
   return o;
 }
 
-checkUnnamed513(core.List<core.List<api.GeolayerdataGeoBoundary>> o) {
+checkUnnamed541(core.List<core.List<api.GeolayerdataGeoBoundary>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed512(o[0]);
-  checkUnnamed512(o[1]);
+  checkUnnamed540(o[0]);
+  checkUnnamed540(o[1]);
 }
 
 core.int buildCounterGeolayerdataGeoViewportHi = 0;
@@ -1223,7 +1223,7 @@
   var o = new api.GeolayerdataGeo();
   buildCounterGeolayerdataGeo++;
   if (buildCounterGeolayerdataGeo < 3) {
-    o.boundary = buildUnnamed513();
+    o.boundary = buildUnnamed541();
     o.cachePolicy = "foo";
     o.countryCode = "foo";
     o.latitude = 42.0;
@@ -1239,7 +1239,7 @@
 checkGeolayerdataGeo(api.GeolayerdataGeo o) {
   buildCounterGeolayerdataGeo++;
   if (buildCounterGeolayerdataGeo < 3) {
-    checkUnnamed513(o.boundary);
+    checkUnnamed541(o.boundary);
     unittest.expect(o.cachePolicy, unittest.equals('foo'));
     unittest.expect(o.countryCode, unittest.equals('foo'));
     unittest.expect(o.latitude, unittest.equals(42.0));
@@ -1274,14 +1274,14 @@
   buildCounterGeolayerdata--;
 }
 
-buildUnnamed514() {
+buildUnnamed542() {
   var o = new core.List<api.Layersummary>();
   o.add(buildLayersummary());
   o.add(buildLayersummary());
   return o;
 }
 
-checkUnnamed514(core.List<api.Layersummary> o) {
+checkUnnamed542(core.List<api.Layersummary> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLayersummary(o[0]);
   checkLayersummary(o[1]);
@@ -1292,7 +1292,7 @@
   var o = new api.Layersummaries();
   buildCounterLayersummaries++;
   if (buildCounterLayersummaries < 3) {
-    o.items = buildUnnamed514();
+    o.items = buildUnnamed542();
     o.kind = "foo";
     o.totalItems = 42;
   }
@@ -1303,21 +1303,21 @@
 checkLayersummaries(api.Layersummaries o) {
   buildCounterLayersummaries++;
   if (buildCounterLayersummaries < 3) {
-    checkUnnamed514(o.items);
+    checkUnnamed542(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
   }
   buildCounterLayersummaries--;
 }
 
-buildUnnamed515() {
+buildUnnamed543() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed515(core.List<core.String> o) {
+checkUnnamed543(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1329,7 +1329,7 @@
   buildCounterLayersummary++;
   if (buildCounterLayersummary < 3) {
     o.annotationCount = 42;
-    o.annotationTypes = buildUnnamed515();
+    o.annotationTypes = buildUnnamed543();
     o.annotationsDataLink = "foo";
     o.annotationsLink = "foo";
     o.contentVersion = "foo";
@@ -1350,7 +1350,7 @@
   buildCounterLayersummary++;
   if (buildCounterLayersummary < 3) {
     unittest.expect(o.annotationCount, unittest.equals(42));
-    checkUnnamed515(o.annotationTypes);
+    checkUnnamed543(o.annotationTypes);
     unittest.expect(o.annotationsDataLink, unittest.equals('foo'));
     unittest.expect(o.annotationsLink, unittest.equals('foo'));
     unittest.expect(o.contentVersion, unittest.equals('foo'));
@@ -1395,14 +1395,14 @@
   buildCounterOffersItemsItems--;
 }
 
-buildUnnamed516() {
+buildUnnamed544() {
   var o = new core.List<api.OffersItemsItems>();
   o.add(buildOffersItemsItems());
   o.add(buildOffersItemsItems());
   return o;
 }
 
-checkUnnamed516(core.List<api.OffersItemsItems> o) {
+checkUnnamed544(core.List<api.OffersItemsItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffersItemsItems(o[0]);
   checkOffersItemsItems(o[1]);
@@ -1415,7 +1415,7 @@
   if (buildCounterOffersItems < 3) {
     o.artUrl = "foo";
     o.id = "foo";
-    o.items = buildUnnamed516();
+    o.items = buildUnnamed544();
   }
   buildCounterOffersItems--;
   return o;
@@ -1426,19 +1426,19 @@
   if (buildCounterOffersItems < 3) {
     unittest.expect(o.artUrl, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed516(o.items);
+    checkUnnamed544(o.items);
   }
   buildCounterOffersItems--;
 }
 
-buildUnnamed517() {
+buildUnnamed545() {
   var o = new core.List<api.OffersItems>();
   o.add(buildOffersItems());
   o.add(buildOffersItems());
   return o;
 }
 
-checkUnnamed517(core.List<api.OffersItems> o) {
+checkUnnamed545(core.List<api.OffersItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffersItems(o[0]);
   checkOffersItems(o[1]);
@@ -1449,7 +1449,7 @@
   var o = new api.Offers();
   buildCounterOffers++;
   if (buildCounterOffers < 3) {
-    o.items = buildUnnamed517();
+    o.items = buildUnnamed545();
     o.kind = "foo";
   }
   buildCounterOffers--;
@@ -1459,7 +1459,7 @@
 checkOffers(api.Offers o) {
   buildCounterOffers++;
   if (buildCounterOffers < 3) {
-    checkUnnamed517(o.items);
+    checkUnnamed545(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterOffers--;
@@ -1710,14 +1710,14 @@
   buildCounterVolumeLayerInfoLayers--;
 }
 
-buildUnnamed518() {
+buildUnnamed546() {
   var o = new core.List<api.VolumeLayerInfoLayers>();
   o.add(buildVolumeLayerInfoLayers());
   o.add(buildVolumeLayerInfoLayers());
   return o;
 }
 
-checkUnnamed518(core.List<api.VolumeLayerInfoLayers> o) {
+checkUnnamed546(core.List<api.VolumeLayerInfoLayers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeLayerInfoLayers(o[0]);
   checkVolumeLayerInfoLayers(o[1]);
@@ -1728,7 +1728,7 @@
   var o = new api.VolumeLayerInfo();
   buildCounterVolumeLayerInfo++;
   if (buildCounterVolumeLayerInfo < 3) {
-    o.layers = buildUnnamed518();
+    o.layers = buildUnnamed546();
   }
   buildCounterVolumeLayerInfo--;
   return o;
@@ -1737,7 +1737,7 @@
 checkVolumeLayerInfo(api.VolumeLayerInfo o) {
   buildCounterVolumeLayerInfo++;
   if (buildCounterVolumeLayerInfo < 3) {
-    checkUnnamed518(o.layers);
+    checkUnnamed546(o.layers);
   }
   buildCounterVolumeLayerInfo--;
 }
@@ -1870,14 +1870,14 @@
   buildCounterVolumeSaleInfoOffers--;
 }
 
-buildUnnamed519() {
+buildUnnamed547() {
   var o = new core.List<api.VolumeSaleInfoOffers>();
   o.add(buildVolumeSaleInfoOffers());
   o.add(buildVolumeSaleInfoOffers());
   return o;
 }
 
-checkUnnamed519(core.List<api.VolumeSaleInfoOffers> o) {
+checkUnnamed547(core.List<api.VolumeSaleInfoOffers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeSaleInfoOffers(o[0]);
   checkVolumeSaleInfoOffers(o[1]);
@@ -1913,7 +1913,7 @@
     o.country = "foo";
     o.isEbook = true;
     o.listPrice = buildVolumeSaleInfoListPrice();
-    o.offers = buildUnnamed519();
+    o.offers = buildUnnamed547();
     o.onSaleDate = core.DateTime.parse("2002-02-27T14:01:02");
     o.retailPrice = buildVolumeSaleInfoRetailPrice();
     o.saleability = "foo";
@@ -1929,7 +1929,7 @@
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.isEbook, unittest.isTrue);
     checkVolumeSaleInfoListPrice(o.listPrice);
-    checkUnnamed519(o.offers);
+    checkUnnamed547(o.offers);
     unittest.expect(o.onSaleDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkVolumeSaleInfoRetailPrice(o.retailPrice);
     unittest.expect(o.saleability, unittest.equals('foo'));
@@ -2060,27 +2060,27 @@
   buildCounterVolumeUserInfo--;
 }
 
-buildUnnamed520() {
+buildUnnamed548() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed520(core.List<core.String> o) {
+checkUnnamed548(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed521() {
+buildUnnamed549() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed521(core.List<core.String> o) {
+checkUnnamed549(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2159,14 +2159,14 @@
   buildCounterVolumeVolumeInfoIndustryIdentifiers--;
 }
 
-buildUnnamed522() {
+buildUnnamed550() {
   var o = new core.List<api.VolumeVolumeInfoIndustryIdentifiers>();
   o.add(buildVolumeVolumeInfoIndustryIdentifiers());
   o.add(buildVolumeVolumeInfoIndustryIdentifiers());
   return o;
 }
 
-checkUnnamed522(core.List<api.VolumeVolumeInfoIndustryIdentifiers> o) {
+checkUnnamed550(core.List<api.VolumeVolumeInfoIndustryIdentifiers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeVolumeInfoIndustryIdentifiers(o[0]);
   checkVolumeVolumeInfoIndustryIdentifiers(o[1]);
@@ -2177,15 +2177,15 @@
   var o = new api.VolumeVolumeInfo();
   buildCounterVolumeVolumeInfo++;
   if (buildCounterVolumeVolumeInfo < 3) {
-    o.authors = buildUnnamed520();
+    o.authors = buildUnnamed548();
     o.averageRating = 42.0;
     o.canonicalVolumeLink = "foo";
-    o.categories = buildUnnamed521();
+    o.categories = buildUnnamed549();
     o.contentVersion = "foo";
     o.description = "foo";
     o.dimensions = buildVolumeVolumeInfoDimensions();
     o.imageLinks = buildVolumeVolumeInfoImageLinks();
-    o.industryIdentifiers = buildUnnamed522();
+    o.industryIdentifiers = buildUnnamed550();
     o.infoLink = "foo";
     o.language = "foo";
     o.mainCategory = "foo";
@@ -2207,15 +2207,15 @@
 checkVolumeVolumeInfo(api.VolumeVolumeInfo o) {
   buildCounterVolumeVolumeInfo++;
   if (buildCounterVolumeVolumeInfo < 3) {
-    checkUnnamed520(o.authors);
+    checkUnnamed548(o.authors);
     unittest.expect(o.averageRating, unittest.equals(42.0));
     unittest.expect(o.canonicalVolumeLink, unittest.equals('foo'));
-    checkUnnamed521(o.categories);
+    checkUnnamed549(o.categories);
     unittest.expect(o.contentVersion, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     checkVolumeVolumeInfoDimensions(o.dimensions);
     checkVolumeVolumeInfoImageLinks(o.imageLinks);
-    checkUnnamed522(o.industryIdentifiers);
+    checkUnnamed550(o.industryIdentifiers);
     unittest.expect(o.infoLink, unittest.equals('foo'));
     unittest.expect(o.language, unittest.equals('foo'));
     unittest.expect(o.mainCategory, unittest.equals('foo'));
@@ -2297,14 +2297,14 @@
   buildCounterVolumeannotationContentRanges--;
 }
 
-buildUnnamed523() {
+buildUnnamed551() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed523(core.List<core.String> o) {
+checkUnnamed551(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2324,7 +2324,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.layerId = "foo";
-    o.pageIds = buildUnnamed523();
+    o.pageIds = buildUnnamed551();
     o.selectedText = "foo";
     o.selfLink = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
@@ -2346,7 +2346,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.layerId, unittest.equals('foo'));
-    checkUnnamed523(o.pageIds);
+    checkUnnamed551(o.pageIds);
     unittest.expect(o.selectedText, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -2355,14 +2355,14 @@
   buildCounterVolumeannotation--;
 }
 
-buildUnnamed524() {
+buildUnnamed552() {
   var o = new core.List<api.Volumeannotation>();
   o.add(buildVolumeannotation());
   o.add(buildVolumeannotation());
   return o;
 }
 
-checkUnnamed524(core.List<api.Volumeannotation> o) {
+checkUnnamed552(core.List<api.Volumeannotation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolumeannotation(o[0]);
   checkVolumeannotation(o[1]);
@@ -2373,7 +2373,7 @@
   var o = new api.Volumeannotations();
   buildCounterVolumeannotations++;
   if (buildCounterVolumeannotations < 3) {
-    o.items = buildUnnamed524();
+    o.items = buildUnnamed552();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -2386,7 +2386,7 @@
 checkVolumeannotations(api.Volumeannotations o) {
   buildCounterVolumeannotations++;
   if (buildCounterVolumeannotations < 3) {
-    checkUnnamed524(o.items);
+    checkUnnamed552(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -2395,14 +2395,14 @@
   buildCounterVolumeannotations--;
 }
 
-buildUnnamed525() {
+buildUnnamed553() {
   var o = new core.List<api.Volume>();
   o.add(buildVolume());
   o.add(buildVolume());
   return o;
 }
 
-checkUnnamed525(core.List<api.Volume> o) {
+checkUnnamed553(core.List<api.Volume> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVolume(o[0]);
   checkVolume(o[1]);
@@ -2413,7 +2413,7 @@
   var o = new api.Volumes();
   buildCounterVolumes++;
   if (buildCounterVolumes < 3) {
-    o.items = buildUnnamed525();
+    o.items = buildUnnamed553();
     o.kind = "foo";
     o.totalItems = 42;
   }
@@ -2424,151 +2424,151 @@
 checkVolumes(api.Volumes o) {
   buildCounterVolumes++;
   if (buildCounterVolumes < 3) {
-    checkUnnamed525(o.items);
+    checkUnnamed553(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
   }
   buildCounterVolumes--;
 }
 
-buildUnnamed526() {
+buildUnnamed554() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed526(core.List<core.String> o) {
+checkUnnamed554(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed527() {
+buildUnnamed555() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed527(core.List<core.String> o) {
+checkUnnamed555(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed528() {
+buildUnnamed556() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed528(core.List<core.String> o) {
+checkUnnamed556(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed529() {
+buildUnnamed557() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed529(core.List<core.String> o) {
+checkUnnamed557(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed530() {
+buildUnnamed558() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed530(core.List<core.String> o) {
+checkUnnamed558(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed531() {
+buildUnnamed559() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed531(core.List<core.String> o) {
+checkUnnamed559(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed532() {
+buildUnnamed560() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed532(core.List<core.String> o) {
+checkUnnamed560(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed533() {
+buildUnnamed561() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed533(core.List<core.String> o) {
+checkUnnamed561(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed534() {
+buildUnnamed562() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed534(core.List<core.String> o) {
+checkUnnamed562(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed535() {
+buildUnnamed563() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed535(core.List<core.String> o) {
+checkUnnamed563(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed536() {
+buildUnnamed564() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed536(core.List<core.String> o) {
+checkUnnamed564(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3300,8 +3300,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/bookshelves/", pathOffset);
@@ -3356,8 +3358,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/bookshelves", pathOffset);
@@ -3417,8 +3421,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("users/"));
         pathOffset += 6;
         index = path.indexOf("/bookshelves/", pathOffset);
@@ -3486,8 +3492,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("cloudloading/addBook"));
         pathOffset += 20;
 
@@ -3534,8 +3542,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("cloudloading/deleteBook"));
         pathOffset += 23;
 
@@ -3580,8 +3590,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("cloudloading/updateBook"));
         pathOffset += 23;
 
@@ -3631,8 +3643,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("volumes/"));
         pathOffset += 8;
         index = path.indexOf("/layersummary/", pathOffset);
@@ -3691,8 +3705,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("volumes/"));
         pathOffset += 8;
         index = path.indexOf("/layersummary", pathOffset);
@@ -3759,8 +3775,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("volumes/"));
         pathOffset += 8;
         index = path.indexOf("/layers/", pathOffset);
@@ -3824,7 +3842,7 @@
       var arg_volumeId = "foo";
       var arg_layerId = "foo";
       var arg_contentVersion = "foo";
-      var arg_annotationDataId = buildUnnamed526();
+      var arg_annotationDataId = buildUnnamed554();
       var arg_h = 42;
       var arg_locale = "foo";
       var arg_maxResults = 42;
@@ -3839,8 +3857,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("volumes/"));
         pathOffset += 8;
         index = path.indexOf("/layers/", pathOffset);
@@ -3916,8 +3936,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("volumes/"));
         pathOffset += 8;
         index = path.indexOf("/layers/", pathOffset);
@@ -3993,8 +4015,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("volumes/"));
         pathOffset += 8;
         index = path.indexOf("/layers/", pathOffset);
@@ -4058,7 +4082,7 @@
 
       var mock = new common_test.HttpServerMock();
       api.MyconfigResourceApi res = new api.BooksApi(mock).myconfig;
-      var arg_volumeIds = buildUnnamed527();
+      var arg_volumeIds = buildUnnamed555();
       var arg_cpksver = "foo";
       var arg_locale = "foo";
       var arg_source = "foo";
@@ -4067,8 +4091,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 30), unittest.equals("myconfig/releaseDownloadAccess"));
         pathOffset += 30;
 
@@ -4120,8 +4146,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("myconfig/requestAccess"));
         pathOffset += 22;
 
@@ -4167,17 +4195,19 @@
       var arg_source = "foo";
       var arg_nonce = "foo";
       var arg_cpksver = "foo";
-      var arg_features = buildUnnamed528();
+      var arg_features = buildUnnamed556();
       var arg_locale = "foo";
       var arg_showPreorders = true;
-      var arg_volumeIds = buildUnnamed529();
+      var arg_volumeIds = buildUnnamed557();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 27), unittest.equals("myconfig/syncVolumeLicenses"));
         pathOffset += 27;
 
@@ -4232,8 +4262,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("mylibrary/annotations/"));
         pathOffset += 22;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -4279,8 +4311,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("mylibrary/annotations/"));
         pathOffset += 22;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -4332,8 +4366,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("mylibrary/annotations"));
         pathOffset += 21;
 
@@ -4374,9 +4410,9 @@
       api.MylibraryAnnotationsResourceApi res = new api.BooksApi(mock).mylibrary.annotations;
       var arg_contentVersion = "foo";
       var arg_layerId = "foo";
-      var arg_layerIds = buildUnnamed530();
+      var arg_layerIds = buildUnnamed558();
       var arg_maxResults = 42;
-      var arg_pageIds = buildUnnamed531();
+      var arg_pageIds = buildUnnamed559();
       var arg_pageToken = "foo";
       var arg_showDeleted = true;
       var arg_source = "foo";
@@ -4388,8 +4424,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("mylibrary/annotations"));
         pathOffset += 21;
 
@@ -4437,15 +4475,17 @@
 
       var mock = new common_test.HttpServerMock();
       api.MylibraryAnnotationsResourceApi res = new api.BooksApi(mock).mylibrary.annotations;
-      var arg_layerIds = buildUnnamed532();
+      var arg_layerIds = buildUnnamed560();
       var arg_volumeId = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 29), unittest.equals("mylibrary/annotations/summary"));
         pathOffset += 29;
 
@@ -4495,8 +4535,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("mylibrary/annotations/"));
         pathOffset += 22;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -4549,8 +4591,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("mylibrary/bookshelves/"));
         pathOffset += 22;
         index = path.indexOf("/addVolume", pathOffset);
@@ -4601,8 +4645,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("mylibrary/bookshelves/"));
         pathOffset += 22;
         index = path.indexOf("/clearVolumes", pathOffset);
@@ -4652,8 +4698,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("mylibrary/bookshelves/"));
         pathOffset += 22;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -4700,8 +4748,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("mylibrary/bookshelves"));
         pathOffset += 21;
 
@@ -4748,8 +4798,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("mylibrary/bookshelves/"));
         pathOffset += 22;
         index = path.indexOf("/moveVolume", pathOffset);
@@ -4802,8 +4854,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("mylibrary/bookshelves/"));
         pathOffset += 22;
         index = path.indexOf("/removeVolume", pathOffset);
@@ -4864,8 +4918,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("mylibrary/bookshelves/"));
         pathOffset += 22;
         index = path.indexOf("/volumes", pathOffset);
@@ -4928,8 +4984,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 27), unittest.equals("mylibrary/readingpositions/"));
         pathOffset += 27;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -4983,8 +5041,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 27), unittest.equals("mylibrary/readingpositions/"));
         pathOffset += 27;
         index = path.indexOf("/setPosition", pathOffset);
@@ -5049,8 +5109,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("promooffer/accept"));
         pathOffset += 17;
 
@@ -5105,8 +5167,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("promooffer/dismiss"));
         pathOffset += 18;
 
@@ -5159,8 +5223,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("promooffer/get"));
         pathOffset += 14;
 
@@ -5217,8 +5283,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("volumes/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -5280,8 +5348,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("volumes"));
         pathOffset += 7;
 
@@ -5344,8 +5414,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("volumes/"));
         pathOffset += 8;
         index = path.indexOf("/associated", pathOffset);
@@ -5396,10 +5468,10 @@
 
       var mock = new common_test.HttpServerMock();
       api.VolumesMybooksResourceApi res = new api.BooksApi(mock).volumes.mybooks;
-      var arg_acquireMethod = buildUnnamed533();
+      var arg_acquireMethod = buildUnnamed561();
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_processingState = buildUnnamed534();
+      var arg_processingState = buildUnnamed562();
       var arg_source = "foo";
       var arg_startIndex = 42;
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
@@ -5407,8 +5479,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("volumes/mybooks"));
         pathOffset += 15;
 
@@ -5462,8 +5536,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("volumes/recommended"));
         pathOffset += 19;
 
@@ -5511,8 +5587,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("volumes/recommended/rate"));
         pathOffset += 24;
 
@@ -5559,17 +5637,19 @@
       api.VolumesUseruploadedResourceApi res = new api.BooksApi(mock).volumes.useruploaded;
       var arg_locale = "foo";
       var arg_maxResults = 42;
-      var arg_processingState = buildUnnamed535();
+      var arg_processingState = buildUnnamed563();
       var arg_source = "foo";
       var arg_startIndex = 42;
-      var arg_volumeId = buildUnnamed536();
+      var arg_volumeId = buildUnnamed564();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/books/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("books/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("volumes/useruploaded"));
         pathOffset += 20;
 
diff --git a/generated/googleapis/test/calendar/v3_test.dart b/generated/googleapis/test/calendar/v3_test.dart
index ab770de..37f4a4d 100644
--- a/generated/googleapis/test/calendar/v3_test.dart
+++ b/generated/googleapis/test/calendar/v3_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed664() {
+buildUnnamed692() {
   var o = new core.List<api.AclRule>();
   o.add(buildAclRule());
   o.add(buildAclRule());
   return o;
 }
 
-checkUnnamed664(core.List<api.AclRule> o) {
+checkUnnamed692(core.List<api.AclRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAclRule(o[0]);
   checkAclRule(o[1]);
@@ -35,7 +35,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed664();
+    o.items = buildUnnamed692();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
@@ -48,7 +48,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed664(o.items);
+    checkUnnamed692(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
@@ -135,14 +135,14 @@
   buildCounterCalendar--;
 }
 
-buildUnnamed665() {
+buildUnnamed693() {
   var o = new core.List<api.CalendarListEntry>();
   o.add(buildCalendarListEntry());
   o.add(buildCalendarListEntry());
   return o;
 }
 
-checkUnnamed665(core.List<api.CalendarListEntry> o) {
+checkUnnamed693(core.List<api.CalendarListEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCalendarListEntry(o[0]);
   checkCalendarListEntry(o[1]);
@@ -154,7 +154,7 @@
   buildCounterCalendarList++;
   if (buildCounterCalendarList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed665();
+    o.items = buildUnnamed693();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
@@ -167,7 +167,7 @@
   buildCounterCalendarList++;
   if (buildCounterCalendarList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed665(o.items);
+    checkUnnamed693(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
@@ -175,27 +175,27 @@
   buildCounterCalendarList--;
 }
 
-buildUnnamed666() {
+buildUnnamed694() {
   var o = new core.List<api.EventReminder>();
   o.add(buildEventReminder());
   o.add(buildEventReminder());
   return o;
 }
 
-checkUnnamed666(core.List<api.EventReminder> o) {
+checkUnnamed694(core.List<api.EventReminder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventReminder(o[0]);
   checkEventReminder(o[1]);
 }
 
-buildUnnamed667() {
+buildUnnamed695() {
   var o = new core.List<api.CalendarNotification>();
   o.add(buildCalendarNotification());
   o.add(buildCalendarNotification());
   return o;
 }
 
-checkUnnamed667(core.List<api.CalendarNotification> o) {
+checkUnnamed695(core.List<api.CalendarNotification> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCalendarNotification(o[0]);
   checkCalendarNotification(o[1]);
@@ -206,7 +206,7 @@
   var o = new api.CalendarListEntryNotificationSettings();
   buildCounterCalendarListEntryNotificationSettings++;
   if (buildCounterCalendarListEntryNotificationSettings < 3) {
-    o.notifications = buildUnnamed667();
+    o.notifications = buildUnnamed695();
   }
   buildCounterCalendarListEntryNotificationSettings--;
   return o;
@@ -215,7 +215,7 @@
 checkCalendarListEntryNotificationSettings(api.CalendarListEntryNotificationSettings o) {
   buildCounterCalendarListEntryNotificationSettings++;
   if (buildCounterCalendarListEntryNotificationSettings < 3) {
-    checkUnnamed667(o.notifications);
+    checkUnnamed695(o.notifications);
   }
   buildCounterCalendarListEntryNotificationSettings--;
 }
@@ -228,7 +228,7 @@
     o.accessRole = "foo";
     o.backgroundColor = "foo";
     o.colorId = "foo";
-    o.defaultReminders = buildUnnamed666();
+    o.defaultReminders = buildUnnamed694();
     o.deleted = true;
     o.description = "foo";
     o.etag = "foo";
@@ -254,7 +254,7 @@
     unittest.expect(o.accessRole, unittest.equals('foo'));
     unittest.expect(o.backgroundColor, unittest.equals('foo'));
     unittest.expect(o.colorId, unittest.equals('foo'));
-    checkUnnamed666(o.defaultReminders);
+    checkUnnamed694(o.defaultReminders);
     unittest.expect(o.deleted, unittest.isTrue);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
@@ -294,14 +294,14 @@
   buildCounterCalendarNotification--;
 }
 
-buildUnnamed668() {
+buildUnnamed696() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed668(core.Map<core.String, core.String> o) {
+checkUnnamed696(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -316,7 +316,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed668();
+    o.params = buildUnnamed696();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -334,7 +334,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed668(o.params);
+    checkUnnamed696(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -365,27 +365,27 @@
   buildCounterColorDefinition--;
 }
 
-buildUnnamed669() {
+buildUnnamed697() {
   var o = new core.Map<core.String, api.ColorDefinition>();
   o["x"] = buildColorDefinition();
   o["y"] = buildColorDefinition();
   return o;
 }
 
-checkUnnamed669(core.Map<core.String, api.ColorDefinition> o) {
+checkUnnamed697(core.Map<core.String, api.ColorDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColorDefinition(o["x"]);
   checkColorDefinition(o["y"]);
 }
 
-buildUnnamed670() {
+buildUnnamed698() {
   var o = new core.Map<core.String, api.ColorDefinition>();
   o["x"] = buildColorDefinition();
   o["y"] = buildColorDefinition();
   return o;
 }
 
-checkUnnamed670(core.Map<core.String, api.ColorDefinition> o) {
+checkUnnamed698(core.Map<core.String, api.ColorDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColorDefinition(o["x"]);
   checkColorDefinition(o["y"]);
@@ -396,8 +396,8 @@
   var o = new api.Colors();
   buildCounterColors++;
   if (buildCounterColors < 3) {
-    o.calendar = buildUnnamed669();
-    o.event = buildUnnamed670();
+    o.calendar = buildUnnamed697();
+    o.event = buildUnnamed698();
     o.kind = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
   }
@@ -408,8 +408,8 @@
 checkColors(api.Colors o) {
   buildCounterColors++;
   if (buildCounterColors < 3) {
-    checkUnnamed669(o.calendar);
-    checkUnnamed670(o.event);
+    checkUnnamed697(o.calendar);
+    checkUnnamed698(o.event);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
@@ -437,14 +437,14 @@
   buildCounterError--;
 }
 
-buildUnnamed671() {
+buildUnnamed699() {
   var o = new core.List<api.EventAttendee>();
   o.add(buildEventAttendee());
   o.add(buildEventAttendee());
   return o;
 }
 
-checkUnnamed671(core.List<api.EventAttendee> o) {
+checkUnnamed699(core.List<api.EventAttendee> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventAttendee(o[0]);
   checkEventAttendee(o[1]);
@@ -475,27 +475,27 @@
   buildCounterEventCreator--;
 }
 
-buildUnnamed672() {
+buildUnnamed700() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed672(core.Map<core.String, core.String> o) {
+checkUnnamed700(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed673() {
+buildUnnamed701() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed673(core.Map<core.String, core.String> o) {
+checkUnnamed701(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -506,8 +506,8 @@
   var o = new api.EventExtendedProperties();
   buildCounterEventExtendedProperties++;
   if (buildCounterEventExtendedProperties < 3) {
-    o.private = buildUnnamed672();
-    o.shared = buildUnnamed673();
+    o.private = buildUnnamed700();
+    o.shared = buildUnnamed701();
   }
   buildCounterEventExtendedProperties--;
   return o;
@@ -516,20 +516,20 @@
 checkEventExtendedProperties(api.EventExtendedProperties o) {
   buildCounterEventExtendedProperties++;
   if (buildCounterEventExtendedProperties < 3) {
-    checkUnnamed672(o.private);
-    checkUnnamed673(o.shared);
+    checkUnnamed700(o.private);
+    checkUnnamed701(o.shared);
   }
   buildCounterEventExtendedProperties--;
 }
 
-buildUnnamed674() {
+buildUnnamed702() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed674(core.Map<core.String, core.String> o) {
+checkUnnamed702(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -544,7 +544,7 @@
     o.height = 42;
     o.iconLink = "foo";
     o.link = "foo";
-    o.preferences = buildUnnamed674();
+    o.preferences = buildUnnamed702();
     o.title = "foo";
     o.type = "foo";
     o.width = 42;
@@ -560,7 +560,7 @@
     unittest.expect(o.height, unittest.equals(42));
     unittest.expect(o.iconLink, unittest.equals('foo'));
     unittest.expect(o.link, unittest.equals('foo'));
-    checkUnnamed674(o.preferences);
+    checkUnnamed702(o.preferences);
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.width, unittest.equals(42));
@@ -593,27 +593,27 @@
   buildCounterEventOrganizer--;
 }
 
-buildUnnamed675() {
+buildUnnamed703() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed675(core.List<core.String> o) {
+checkUnnamed703(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed676() {
+buildUnnamed704() {
   var o = new core.List<api.EventReminder>();
   o.add(buildEventReminder());
   o.add(buildEventReminder());
   return o;
 }
 
-checkUnnamed676(core.List<api.EventReminder> o) {
+checkUnnamed704(core.List<api.EventReminder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventReminder(o[0]);
   checkEventReminder(o[1]);
@@ -624,7 +624,7 @@
   var o = new api.EventReminders();
   buildCounterEventReminders++;
   if (buildCounterEventReminders < 3) {
-    o.overrides = buildUnnamed676();
+    o.overrides = buildUnnamed704();
     o.useDefault = true;
   }
   buildCounterEventReminders--;
@@ -634,7 +634,7 @@
 checkEventReminders(api.EventReminders o) {
   buildCounterEventReminders++;
   if (buildCounterEventReminders < 3) {
-    checkUnnamed676(o.overrides);
+    checkUnnamed704(o.overrides);
     unittest.expect(o.useDefault, unittest.isTrue);
   }
   buildCounterEventReminders--;
@@ -667,7 +667,7 @@
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
     o.anyoneCanAddSelf = true;
-    o.attendees = buildUnnamed671();
+    o.attendees = buildUnnamed699();
     o.attendeesOmitted = true;
     o.colorId = "foo";
     o.created = core.DateTime.parse("2002-02-27T14:01:02");
@@ -691,7 +691,7 @@
     o.organizer = buildEventOrganizer();
     o.originalStartTime = buildEventDateTime();
     o.privateCopy = true;
-    o.recurrence = buildUnnamed675();
+    o.recurrence = buildUnnamed703();
     o.recurringEventId = "foo";
     o.reminders = buildEventReminders();
     o.sequence = 42;
@@ -711,7 +711,7 @@
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
     unittest.expect(o.anyoneCanAddSelf, unittest.isTrue);
-    checkUnnamed671(o.attendees);
+    checkUnnamed699(o.attendees);
     unittest.expect(o.attendeesOmitted, unittest.isTrue);
     unittest.expect(o.colorId, unittest.equals('foo'));
     unittest.expect(o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -735,7 +735,7 @@
     checkEventOrganizer(o.organizer);
     checkEventDateTime(o.originalStartTime);
     unittest.expect(o.privateCopy, unittest.isTrue);
-    checkUnnamed675(o.recurrence);
+    checkUnnamed703(o.recurrence);
     unittest.expect(o.recurringEventId, unittest.equals('foo'));
     checkEventReminders(o.reminders);
     unittest.expect(o.sequence, unittest.equals(42));
@@ -831,27 +831,27 @@
   buildCounterEventReminder--;
 }
 
-buildUnnamed677() {
+buildUnnamed705() {
   var o = new core.List<api.EventReminder>();
   o.add(buildEventReminder());
   o.add(buildEventReminder());
   return o;
 }
 
-checkUnnamed677(core.List<api.EventReminder> o) {
+checkUnnamed705(core.List<api.EventReminder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEventReminder(o[0]);
   checkEventReminder(o[1]);
 }
 
-buildUnnamed678() {
+buildUnnamed706() {
   var o = new core.List<api.Event>();
   o.add(buildEvent());
   o.add(buildEvent());
   return o;
 }
 
-checkUnnamed678(core.List<api.Event> o) {
+checkUnnamed706(core.List<api.Event> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEvent(o[0]);
   checkEvent(o[1]);
@@ -863,10 +863,10 @@
   buildCounterEvents++;
   if (buildCounterEvents < 3) {
     o.accessRole = "foo";
-    o.defaultReminders = buildUnnamed677();
+    o.defaultReminders = buildUnnamed705();
     o.description = "foo";
     o.etag = "foo";
-    o.items = buildUnnamed678();
+    o.items = buildUnnamed706();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
@@ -882,10 +882,10 @@
   buildCounterEvents++;
   if (buildCounterEvents < 3) {
     unittest.expect(o.accessRole, unittest.equals('foo'));
-    checkUnnamed677(o.defaultReminders);
+    checkUnnamed705(o.defaultReminders);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed678(o.items);
+    checkUnnamed706(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
@@ -896,27 +896,27 @@
   buildCounterEvents--;
 }
 
-buildUnnamed679() {
+buildUnnamed707() {
   var o = new core.List<api.TimePeriod>();
   o.add(buildTimePeriod());
   o.add(buildTimePeriod());
   return o;
 }
 
-checkUnnamed679(core.List<api.TimePeriod> o) {
+checkUnnamed707(core.List<api.TimePeriod> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimePeriod(o[0]);
   checkTimePeriod(o[1]);
 }
 
-buildUnnamed680() {
+buildUnnamed708() {
   var o = new core.List<api.Error>();
   o.add(buildError());
   o.add(buildError());
   return o;
 }
 
-checkUnnamed680(core.List<api.Error> o) {
+checkUnnamed708(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkError(o[0]);
   checkError(o[1]);
@@ -927,8 +927,8 @@
   var o = new api.FreeBusyCalendar();
   buildCounterFreeBusyCalendar++;
   if (buildCounterFreeBusyCalendar < 3) {
-    o.busy = buildUnnamed679();
-    o.errors = buildUnnamed680();
+    o.busy = buildUnnamed707();
+    o.errors = buildUnnamed708();
   }
   buildCounterFreeBusyCalendar--;
   return o;
@@ -937,33 +937,33 @@
 checkFreeBusyCalendar(api.FreeBusyCalendar o) {
   buildCounterFreeBusyCalendar++;
   if (buildCounterFreeBusyCalendar < 3) {
-    checkUnnamed679(o.busy);
-    checkUnnamed680(o.errors);
+    checkUnnamed707(o.busy);
+    checkUnnamed708(o.errors);
   }
   buildCounterFreeBusyCalendar--;
 }
 
-buildUnnamed681() {
+buildUnnamed709() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed681(core.List<core.String> o) {
+checkUnnamed709(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed682() {
+buildUnnamed710() {
   var o = new core.List<api.Error>();
   o.add(buildError());
   o.add(buildError());
   return o;
 }
 
-checkUnnamed682(core.List<api.Error> o) {
+checkUnnamed710(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkError(o[0]);
   checkError(o[1]);
@@ -974,8 +974,8 @@
   var o = new api.FreeBusyGroup();
   buildCounterFreeBusyGroup++;
   if (buildCounterFreeBusyGroup < 3) {
-    o.calendars = buildUnnamed681();
-    o.errors = buildUnnamed682();
+    o.calendars = buildUnnamed709();
+    o.errors = buildUnnamed710();
   }
   buildCounterFreeBusyGroup--;
   return o;
@@ -984,20 +984,20 @@
 checkFreeBusyGroup(api.FreeBusyGroup o) {
   buildCounterFreeBusyGroup++;
   if (buildCounterFreeBusyGroup < 3) {
-    checkUnnamed681(o.calendars);
-    checkUnnamed682(o.errors);
+    checkUnnamed709(o.calendars);
+    checkUnnamed710(o.errors);
   }
   buildCounterFreeBusyGroup--;
 }
 
-buildUnnamed683() {
+buildUnnamed711() {
   var o = new core.List<api.FreeBusyRequestItem>();
   o.add(buildFreeBusyRequestItem());
   o.add(buildFreeBusyRequestItem());
   return o;
 }
 
-checkUnnamed683(core.List<api.FreeBusyRequestItem> o) {
+checkUnnamed711(core.List<api.FreeBusyRequestItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFreeBusyRequestItem(o[0]);
   checkFreeBusyRequestItem(o[1]);
@@ -1010,7 +1010,7 @@
   if (buildCounterFreeBusyRequest < 3) {
     o.calendarExpansionMax = 42;
     o.groupExpansionMax = 42;
-    o.items = buildUnnamed683();
+    o.items = buildUnnamed711();
     o.timeMax = core.DateTime.parse("2002-02-27T14:01:02");
     o.timeMin = core.DateTime.parse("2002-02-27T14:01:02");
     o.timeZone = "foo";
@@ -1024,7 +1024,7 @@
   if (buildCounterFreeBusyRequest < 3) {
     unittest.expect(o.calendarExpansionMax, unittest.equals(42));
     unittest.expect(o.groupExpansionMax, unittest.equals(42));
-    checkUnnamed683(o.items);
+    checkUnnamed711(o.items);
     unittest.expect(o.timeMax, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.timeMin, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.timeZone, unittest.equals('foo'));
@@ -1051,27 +1051,27 @@
   buildCounterFreeBusyRequestItem--;
 }
 
-buildUnnamed684() {
+buildUnnamed712() {
   var o = new core.Map<core.String, api.FreeBusyCalendar>();
   o["x"] = buildFreeBusyCalendar();
   o["y"] = buildFreeBusyCalendar();
   return o;
 }
 
-checkUnnamed684(core.Map<core.String, api.FreeBusyCalendar> o) {
+checkUnnamed712(core.Map<core.String, api.FreeBusyCalendar> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFreeBusyCalendar(o["x"]);
   checkFreeBusyCalendar(o["y"]);
 }
 
-buildUnnamed685() {
+buildUnnamed713() {
   var o = new core.Map<core.String, api.FreeBusyGroup>();
   o["x"] = buildFreeBusyGroup();
   o["y"] = buildFreeBusyGroup();
   return o;
 }
 
-checkUnnamed685(core.Map<core.String, api.FreeBusyGroup> o) {
+checkUnnamed713(core.Map<core.String, api.FreeBusyGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFreeBusyGroup(o["x"]);
   checkFreeBusyGroup(o["y"]);
@@ -1082,8 +1082,8 @@
   var o = new api.FreeBusyResponse();
   buildCounterFreeBusyResponse++;
   if (buildCounterFreeBusyResponse < 3) {
-    o.calendars = buildUnnamed684();
-    o.groups = buildUnnamed685();
+    o.calendars = buildUnnamed712();
+    o.groups = buildUnnamed713();
     o.kind = "foo";
     o.timeMax = core.DateTime.parse("2002-02-27T14:01:02");
     o.timeMin = core.DateTime.parse("2002-02-27T14:01:02");
@@ -1095,8 +1095,8 @@
 checkFreeBusyResponse(api.FreeBusyResponse o) {
   buildCounterFreeBusyResponse++;
   if (buildCounterFreeBusyResponse < 3) {
-    checkUnnamed684(o.calendars);
-    checkUnnamed685(o.groups);
+    checkUnnamed712(o.calendars);
+    checkUnnamed713(o.groups);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.timeMax, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.timeMin, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -1129,14 +1129,14 @@
   buildCounterSetting--;
 }
 
-buildUnnamed686() {
+buildUnnamed714() {
   var o = new core.List<api.Setting>();
   o.add(buildSetting());
   o.add(buildSetting());
   return o;
 }
 
-checkUnnamed686(core.List<api.Setting> o) {
+checkUnnamed714(core.List<api.Setting> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSetting(o[0]);
   checkSetting(o[1]);
@@ -1148,7 +1148,7 @@
   buildCounterSettings++;
   if (buildCounterSettings < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed686();
+    o.items = buildUnnamed714();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.nextSyncToken = "foo";
@@ -1161,7 +1161,7 @@
   buildCounterSettings++;
   if (buildCounterSettings < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed686(o.items);
+    checkUnnamed714(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.nextSyncToken, unittest.equals('foo'));
@@ -1190,53 +1190,53 @@
   buildCounterTimePeriod--;
 }
 
-buildUnnamed687() {
+buildUnnamed715() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed687(core.List<core.String> o) {
+checkUnnamed715(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed688() {
+buildUnnamed716() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed688(core.List<core.String> o) {
+checkUnnamed716(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed689() {
+buildUnnamed717() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed689(core.List<core.String> o) {
+checkUnnamed717(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed690() {
+buildUnnamed718() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed690(core.List<core.String> o) {
+checkUnnamed718(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1535,8 +1535,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         index = path.indexOf("/acl/", pathOffset);
@@ -1588,8 +1590,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         index = path.indexOf("/acl/", pathOffset);
@@ -1646,8 +1650,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         index = path.indexOf("/acl", pathOffset);
@@ -1701,8 +1707,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         index = path.indexOf("/acl", pathOffset);
@@ -1761,8 +1769,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         index = path.indexOf("/acl/", pathOffset);
@@ -1820,8 +1830,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         index = path.indexOf("/acl/", pathOffset);
@@ -1882,8 +1894,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         index = path.indexOf("/acl/watch", pathOffset);
@@ -1941,8 +1955,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("users/me/calendarList/"));
         pathOffset += 22;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1986,8 +2002,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("users/me/calendarList/"));
         pathOffset += 22;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2037,8 +2055,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("users/me/calendarList"));
         pathOffset += 21;
 
@@ -2087,8 +2107,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("users/me/calendarList"));
         pathOffset += 21;
 
@@ -2142,8 +2164,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("users/me/calendarList/"));
         pathOffset += 22;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2195,8 +2219,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("users/me/calendarList/"));
         pathOffset += 22;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2252,8 +2278,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 27), unittest.equals("users/me/calendarList/watch"));
         pathOffset += 27;
 
@@ -2306,8 +2334,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         index = path.indexOf("/clear", pathOffset);
@@ -2355,8 +2385,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2400,8 +2432,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2450,8 +2484,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("calendars"));
         pathOffset += 9;
 
@@ -2498,8 +2534,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2549,8 +2587,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2603,8 +2643,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("channels/stop"));
         pathOffset += 13;
 
@@ -2648,8 +2690,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("colors"));
         pathOffset += 6;
 
@@ -2698,8 +2742,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         index = path.indexOf("/events/", pathOffset);
@@ -2755,8 +2801,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         index = path.indexOf("/events/", pathOffset);
@@ -2816,8 +2864,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         index = path.indexOf("/events/import", pathOffset);
@@ -2873,8 +2923,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         index = path.indexOf("/events", pathOffset);
@@ -2936,8 +2988,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         index = path.indexOf("/events/", pathOffset);
@@ -3004,9 +3058,9 @@
       var arg_maxResults = 42;
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
-      var arg_privateExtendedProperty = buildUnnamed687();
+      var arg_privateExtendedProperty = buildUnnamed715();
       var arg_q = "foo";
-      var arg_sharedExtendedProperty = buildUnnamed688();
+      var arg_sharedExtendedProperty = buildUnnamed716();
       var arg_showDeleted = true;
       var arg_showHiddenInvitations = true;
       var arg_singleEvents = true;
@@ -3020,8 +3074,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         index = path.indexOf("/events", pathOffset);
@@ -3091,8 +3147,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         index = path.indexOf("/events/", pathOffset);
@@ -3159,8 +3217,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         index = path.indexOf("/events/", pathOffset);
@@ -3218,8 +3278,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         index = path.indexOf("/events/quickAdd", pathOffset);
@@ -3279,8 +3341,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         index = path.indexOf("/events/", pathOffset);
@@ -3338,9 +3402,9 @@
       var arg_maxResults = 42;
       var arg_orderBy = "foo";
       var arg_pageToken = "foo";
-      var arg_privateExtendedProperty = buildUnnamed689();
+      var arg_privateExtendedProperty = buildUnnamed717();
       var arg_q = "foo";
-      var arg_sharedExtendedProperty = buildUnnamed690();
+      var arg_sharedExtendedProperty = buildUnnamed718();
       var arg_showDeleted = true;
       var arg_showHiddenInvitations = true;
       var arg_singleEvents = true;
@@ -3357,8 +3421,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("calendars/"));
         pathOffset += 10;
         index = path.indexOf("/events/watch", pathOffset);
@@ -3432,8 +3498,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("freeBusy"));
         pathOffset += 8;
 
@@ -3480,8 +3548,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("users/me/settings/"));
         pathOffset += 18;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -3529,8 +3599,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("users/me/settings"));
         pathOffset += 17;
 
@@ -3582,8 +3654,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/calendar/v3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("calendar/v3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("users/me/settings/watch"));
         pathOffset += 23;
 
diff --git a/generated/googleapis/test/civicinfo/us_v1_test.dart b/generated/googleapis/test/civicinfo/us_v1_test.dart
index e852db4..3030091 100644
--- a/generated/googleapis/test/civicinfo/us_v1_test.dart
+++ b/generated/googleapis/test/civicinfo/us_v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed781() {
+buildUnnamed809() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed781(core.List<api.Source> o) {
+checkUnnamed809(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -38,7 +38,7 @@
     o.id = "foo";
     o.localJurisdiction = buildAdministrationRegion();
     o.name = "foo";
-    o.sources = buildUnnamed781();
+    o.sources = buildUnnamed809();
   }
   buildCounterAdministrationRegion--;
   return o;
@@ -51,32 +51,32 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkAdministrationRegion(o.localJurisdiction);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed781(o.sources);
+    checkUnnamed809(o.sources);
   }
   buildCounterAdministrationRegion--;
 }
 
-buildUnnamed782() {
+buildUnnamed810() {
   var o = new core.List<api.ElectionOfficial>();
   o.add(buildElectionOfficial());
   o.add(buildElectionOfficial());
   return o;
 }
 
-checkUnnamed782(core.List<api.ElectionOfficial> o) {
+checkUnnamed810(core.List<api.ElectionOfficial> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElectionOfficial(o[0]);
   checkElectionOfficial(o[1]);
 }
 
-buildUnnamed783() {
+buildUnnamed811() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed783(core.List<core.String> o) {
+checkUnnamed811(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -91,14 +91,14 @@
     o.ballotInfoUrl = "foo";
     o.correspondenceAddress = buildSimpleAddressType();
     o.electionInfoUrl = "foo";
-    o.electionOfficials = buildUnnamed782();
+    o.electionOfficials = buildUnnamed810();
     o.electionRegistrationConfirmationUrl = "foo";
     o.electionRegistrationUrl = "foo";
     o.electionRulesUrl = "foo";
     o.hoursOfOperation = "foo";
     o.name = "foo";
     o.physicalAddress = buildSimpleAddressType();
-    o.voterServices = buildUnnamed783();
+    o.voterServices = buildUnnamed811();
     o.votingLocationFinderUrl = "foo";
   }
   buildCounterAdministrativeBody--;
@@ -112,27 +112,27 @@
     unittest.expect(o.ballotInfoUrl, unittest.equals('foo'));
     checkSimpleAddressType(o.correspondenceAddress);
     unittest.expect(o.electionInfoUrl, unittest.equals('foo'));
-    checkUnnamed782(o.electionOfficials);
+    checkUnnamed810(o.electionOfficials);
     unittest.expect(o.electionRegistrationConfirmationUrl, unittest.equals('foo'));
     unittest.expect(o.electionRegistrationUrl, unittest.equals('foo'));
     unittest.expect(o.electionRulesUrl, unittest.equals('foo'));
     unittest.expect(o.hoursOfOperation, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkSimpleAddressType(o.physicalAddress);
-    checkUnnamed783(o.voterServices);
+    checkUnnamed811(o.voterServices);
     unittest.expect(o.votingLocationFinderUrl, unittest.equals('foo'));
   }
   buildCounterAdministrativeBody--;
 }
 
-buildUnnamed784() {
+buildUnnamed812() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed784(core.List<api.Channel> o) {
+checkUnnamed812(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
@@ -144,7 +144,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     o.candidateUrl = "foo";
-    o.channels = buildUnnamed784();
+    o.channels = buildUnnamed812();
     o.email = "foo";
     o.name = "foo";
     o.orderOnBallot = "foo";
@@ -160,7 +160,7 @@
   buildCounterCandidate++;
   if (buildCounterCandidate < 3) {
     unittest.expect(o.candidateUrl, unittest.equals('foo'));
-    checkUnnamed784(o.channels);
+    checkUnnamed812(o.channels);
     unittest.expect(o.email, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.orderOnBallot, unittest.equals('foo'));
@@ -192,27 +192,27 @@
   buildCounterChannel--;
 }
 
-buildUnnamed785() {
+buildUnnamed813() {
   var o = new core.List<api.Candidate>();
   o.add(buildCandidate());
   o.add(buildCandidate());
   return o;
 }
 
-checkUnnamed785(core.List<api.Candidate> o) {
+checkUnnamed813(core.List<api.Candidate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCandidate(o[0]);
   checkCandidate(o[1]);
 }
 
-buildUnnamed786() {
+buildUnnamed814() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed786(core.List<api.Source> o) {
+checkUnnamed814(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -224,7 +224,7 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     o.ballotPlacement = "foo";
-    o.candidates = buildUnnamed785();
+    o.candidates = buildUnnamed813();
     o.district = buildElectoralDistrict();
     o.electorateSpecifications = "foo";
     o.id = "foo";
@@ -236,7 +236,7 @@
     o.referendumSubtitle = "foo";
     o.referendumTitle = "foo";
     o.referendumUrl = "foo";
-    o.sources = buildUnnamed786();
+    o.sources = buildUnnamed814();
     o.special = "foo";
     o.type = "foo";
   }
@@ -248,7 +248,7 @@
   buildCounterContest++;
   if (buildCounterContest < 3) {
     unittest.expect(o.ballotPlacement, unittest.equals('foo'));
-    checkUnnamed785(o.candidates);
+    checkUnnamed813(o.candidates);
     checkElectoralDistrict(o.district);
     unittest.expect(o.electorateSpecifications, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -260,21 +260,21 @@
     unittest.expect(o.referendumSubtitle, unittest.equals('foo'));
     unittest.expect(o.referendumTitle, unittest.equals('foo'));
     unittest.expect(o.referendumUrl, unittest.equals('foo'));
-    checkUnnamed786(o.sources);
+    checkUnnamed814(o.sources);
     unittest.expect(o.special, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterContest--;
 }
 
-buildUnnamed787() {
+buildUnnamed815() {
   var o = new core.List<api.DivisionSearchResult>();
   o.add(buildDivisionSearchResult());
   o.add(buildDivisionSearchResult());
   return o;
 }
 
-checkUnnamed787(core.List<api.DivisionSearchResult> o) {
+checkUnnamed815(core.List<api.DivisionSearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDivisionSearchResult(o[0]);
   checkDivisionSearchResult(o[1]);
@@ -286,7 +286,7 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     o.kind = "foo";
-    o.results = buildUnnamed787();
+    o.results = buildUnnamed815();
     o.status = "foo";
   }
   buildCounterDivisionSearchResponse--;
@@ -297,20 +297,20 @@
   buildCounterDivisionSearchResponse++;
   if (buildCounterDivisionSearchResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed787(o.results);
+    checkUnnamed815(o.results);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterDivisionSearchResponse--;
 }
 
-buildUnnamed788() {
+buildUnnamed816() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed788(core.List<core.String> o) {
+checkUnnamed816(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -321,7 +321,7 @@
   var o = new api.DivisionSearchResult();
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    o.aliases = buildUnnamed788();
+    o.aliases = buildUnnamed816();
     o.name = "foo";
     o.ocdId = "foo";
   }
@@ -332,7 +332,7 @@
 checkDivisionSearchResult(api.DivisionSearchResult o) {
   buildCounterDivisionSearchResult++;
   if (buildCounterDivisionSearchResult < 3) {
-    checkUnnamed788(o.aliases);
+    checkUnnamed816(o.aliases);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.ocdId, unittest.equals('foo'));
   }
@@ -389,14 +389,14 @@
   buildCounterElectionOfficial--;
 }
 
-buildUnnamed789() {
+buildUnnamed817() {
   var o = new core.List<api.Election>();
   o.add(buildElection());
   o.add(buildElection());
   return o;
 }
 
-checkUnnamed789(core.List<api.Election> o) {
+checkUnnamed817(core.List<api.Election> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkElection(o[0]);
   checkElection(o[1]);
@@ -407,7 +407,7 @@
   var o = new api.ElectionsQueryResponse();
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    o.elections = buildUnnamed789();
+    o.elections = buildUnnamed817();
     o.kind = "foo";
   }
   buildCounterElectionsQueryResponse--;
@@ -417,7 +417,7 @@
 checkElectionsQueryResponse(api.ElectionsQueryResponse o) {
   buildCounterElectionsQueryResponse++;
   if (buildCounterElectionsQueryResponse < 3) {
-    checkUnnamed789(o.elections);
+    checkUnnamed817(o.elections);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterElectionsQueryResponse--;
@@ -446,27 +446,27 @@
   buildCounterElectoralDistrict--;
 }
 
-buildUnnamed790() {
+buildUnnamed818() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed790(core.List<core.String> o) {
+checkUnnamed818(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed791() {
+buildUnnamed819() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed791(core.List<core.String> o) {
+checkUnnamed819(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -477,9 +477,9 @@
   var o = new api.GeographicDivision();
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    o.alsoKnownAs = buildUnnamed790();
+    o.alsoKnownAs = buildUnnamed818();
     o.name = "foo";
-    o.officeIds = buildUnnamed791();
+    o.officeIds = buildUnnamed819();
     o.scope = "foo";
   }
   buildCounterGeographicDivision--;
@@ -489,35 +489,35 @@
 checkGeographicDivision(api.GeographicDivision o) {
   buildCounterGeographicDivision++;
   if (buildCounterGeographicDivision < 3) {
-    checkUnnamed790(o.alsoKnownAs);
+    checkUnnamed818(o.alsoKnownAs);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed791(o.officeIds);
+    checkUnnamed819(o.officeIds);
     unittest.expect(o.scope, unittest.equals('foo'));
   }
   buildCounterGeographicDivision--;
 }
 
-buildUnnamed792() {
+buildUnnamed820() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed792(core.List<core.String> o) {
+checkUnnamed820(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed793() {
+buildUnnamed821() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed793(core.List<api.Source> o) {
+checkUnnamed821(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -531,8 +531,8 @@
     o.divisionId = "foo";
     o.level = "foo";
     o.name = "foo";
-    o.officialIds = buildUnnamed792();
-    o.sources = buildUnnamed793();
+    o.officialIds = buildUnnamed820();
+    o.sources = buildUnnamed821();
   }
   buildCounterOffice--;
   return o;
@@ -544,72 +544,72 @@
     unittest.expect(o.divisionId, unittest.equals('foo'));
     unittest.expect(o.level, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed792(o.officialIds);
-    checkUnnamed793(o.sources);
+    checkUnnamed820(o.officialIds);
+    checkUnnamed821(o.sources);
   }
   buildCounterOffice--;
 }
 
-buildUnnamed794() {
+buildUnnamed822() {
   var o = new core.List<api.SimpleAddressType>();
   o.add(buildSimpleAddressType());
   o.add(buildSimpleAddressType());
   return o;
 }
 
-checkUnnamed794(core.List<api.SimpleAddressType> o) {
+checkUnnamed822(core.List<api.SimpleAddressType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSimpleAddressType(o[0]);
   checkSimpleAddressType(o[1]);
 }
 
-buildUnnamed795() {
+buildUnnamed823() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed795(core.List<api.Channel> o) {
+checkUnnamed823(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
 }
 
-buildUnnamed796() {
+buildUnnamed824() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed796(core.List<core.String> o) {
+checkUnnamed824(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed797() {
+buildUnnamed825() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed797(core.List<core.String> o) {
+checkUnnamed825(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed798() {
+buildUnnamed826() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed798(core.List<core.String> o) {
+checkUnnamed826(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -620,14 +620,14 @@
   var o = new api.Official();
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    o.address = buildUnnamed794();
-    o.channels = buildUnnamed795();
-    o.emails = buildUnnamed796();
+    o.address = buildUnnamed822();
+    o.channels = buildUnnamed823();
+    o.emails = buildUnnamed824();
     o.name = "foo";
     o.party = "foo";
-    o.phones = buildUnnamed797();
+    o.phones = buildUnnamed825();
     o.photoUrl = "foo";
-    o.urls = buildUnnamed798();
+    o.urls = buildUnnamed826();
   }
   buildCounterOfficial--;
   return o;
@@ -636,26 +636,26 @@
 checkOfficial(api.Official o) {
   buildCounterOfficial++;
   if (buildCounterOfficial < 3) {
-    checkUnnamed794(o.address);
-    checkUnnamed795(o.channels);
-    checkUnnamed796(o.emails);
+    checkUnnamed822(o.address);
+    checkUnnamed823(o.channels);
+    checkUnnamed824(o.emails);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.party, unittest.equals('foo'));
-    checkUnnamed797(o.phones);
+    checkUnnamed825(o.phones);
     unittest.expect(o.photoUrl, unittest.equals('foo'));
-    checkUnnamed798(o.urls);
+    checkUnnamed826(o.urls);
   }
   buildCounterOfficial--;
 }
 
-buildUnnamed799() {
+buildUnnamed827() {
   var o = new core.List<api.Source>();
   o.add(buildSource());
   o.add(buildSource());
   return o;
 }
 
-checkUnnamed799(core.List<api.Source> o) {
+checkUnnamed827(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSource(o[0]);
   checkSource(o[1]);
@@ -672,7 +672,7 @@
     o.name = "foo";
     o.notes = "foo";
     o.pollingHours = "foo";
-    o.sources = buildUnnamed799();
+    o.sources = buildUnnamed827();
     o.startDate = "foo";
     o.voterServices = "foo";
   }
@@ -689,7 +689,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
     unittest.expect(o.pollingHours, unittest.equals('foo'));
-    checkUnnamed799(o.sources);
+    checkUnnamed827(o.sources);
     unittest.expect(o.startDate, unittest.equals('foo'));
     unittest.expect(o.voterServices, unittest.equals('foo'));
   }
@@ -715,40 +715,40 @@
   buildCounterRepresentativeInfoRequest--;
 }
 
-buildUnnamed800() {
+buildUnnamed828() {
   var o = new core.Map<core.String, api.GeographicDivision>();
   o["x"] = buildGeographicDivision();
   o["y"] = buildGeographicDivision();
   return o;
 }
 
-checkUnnamed800(core.Map<core.String, api.GeographicDivision> o) {
+checkUnnamed828(core.Map<core.String, api.GeographicDivision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGeographicDivision(o["x"]);
   checkGeographicDivision(o["y"]);
 }
 
-buildUnnamed801() {
+buildUnnamed829() {
   var o = new core.Map<core.String, api.Office>();
   o["x"] = buildOffice();
   o["y"] = buildOffice();
   return o;
 }
 
-checkUnnamed801(core.Map<core.String, api.Office> o) {
+checkUnnamed829(core.Map<core.String, api.Office> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOffice(o["x"]);
   checkOffice(o["y"]);
 }
 
-buildUnnamed802() {
+buildUnnamed830() {
   var o = new core.Map<core.String, api.Official>();
   o["x"] = buildOfficial();
   o["y"] = buildOfficial();
   return o;
 }
 
-checkUnnamed802(core.Map<core.String, api.Official> o) {
+checkUnnamed830(core.Map<core.String, api.Official> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOfficial(o["x"]);
   checkOfficial(o["y"]);
@@ -759,11 +759,11 @@
   var o = new api.RepresentativeInfoResponse();
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    o.divisions = buildUnnamed800();
+    o.divisions = buildUnnamed828();
     o.kind = "foo";
     o.normalizedInput = buildSimpleAddressType();
-    o.offices = buildUnnamed801();
-    o.officials = buildUnnamed802();
+    o.offices = buildUnnamed829();
+    o.officials = buildUnnamed830();
     o.status = "foo";
   }
   buildCounterRepresentativeInfoResponse--;
@@ -773,11 +773,11 @@
 checkRepresentativeInfoResponse(api.RepresentativeInfoResponse o) {
   buildCounterRepresentativeInfoResponse++;
   if (buildCounterRepresentativeInfoResponse < 3) {
-    checkUnnamed800(o.divisions);
+    checkUnnamed828(o.divisions);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed801(o.offices);
-    checkUnnamed802(o.officials);
+    checkUnnamed829(o.offices);
+    checkUnnamed830(o.officials);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterRepresentativeInfoResponse--;
@@ -854,53 +854,53 @@
   buildCounterVoterInfoRequest--;
 }
 
-buildUnnamed803() {
+buildUnnamed831() {
   var o = new core.List<api.Contest>();
   o.add(buildContest());
   o.add(buildContest());
   return o;
 }
 
-checkUnnamed803(core.List<api.Contest> o) {
+checkUnnamed831(core.List<api.Contest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContest(o[0]);
   checkContest(o[1]);
 }
 
-buildUnnamed804() {
+buildUnnamed832() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed804(core.List<api.PollingLocation> o) {
+checkUnnamed832(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed805() {
+buildUnnamed833() {
   var o = new core.List<api.PollingLocation>();
   o.add(buildPollingLocation());
   o.add(buildPollingLocation());
   return o;
 }
 
-checkUnnamed805(core.List<api.PollingLocation> o) {
+checkUnnamed833(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPollingLocation(o[0]);
   checkPollingLocation(o[1]);
 }
 
-buildUnnamed806() {
+buildUnnamed834() {
   var o = new core.List<api.AdministrationRegion>();
   o.add(buildAdministrationRegion());
   o.add(buildAdministrationRegion());
   return o;
 }
 
-checkUnnamed806(core.List<api.AdministrationRegion> o) {
+checkUnnamed834(core.List<api.AdministrationRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAdministrationRegion(o[0]);
   checkAdministrationRegion(o[1]);
@@ -911,13 +911,13 @@
   var o = new api.VoterInfoResponse();
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    o.contests = buildUnnamed803();
-    o.earlyVoteSites = buildUnnamed804();
+    o.contests = buildUnnamed831();
+    o.earlyVoteSites = buildUnnamed832();
     o.election = buildElection();
     o.kind = "foo";
     o.normalizedInput = buildSimpleAddressType();
-    o.pollingLocations = buildUnnamed805();
-    o.state = buildUnnamed806();
+    o.pollingLocations = buildUnnamed833();
+    o.state = buildUnnamed834();
     o.status = "foo";
   }
   buildCounterVoterInfoResponse--;
@@ -927,13 +927,13 @@
 checkVoterInfoResponse(api.VoterInfoResponse o) {
   buildCounterVoterInfoResponse++;
   if (buildCounterVoterInfoResponse < 3) {
-    checkUnnamed803(o.contests);
-    checkUnnamed804(o.earlyVoteSites);
+    checkUnnamed831(o.contests);
+    checkUnnamed832(o.earlyVoteSites);
     checkElection(o.election);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkSimpleAddressType(o.normalizedInput);
-    checkUnnamed805(o.pollingLocations);
-    checkUnnamed806(o.state);
+    checkUnnamed833(o.pollingLocations);
+    checkUnnamed834(o.state);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterVoterInfoResponse--;
@@ -1141,8 +1141,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/civicinfo/us_v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("civicinfo/us_v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 31), unittest.equals("representatives/division_search"));
         pathOffset += 31;
 
@@ -1189,8 +1191,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/civicinfo/us_v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("civicinfo/us_v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("elections"));
         pathOffset += 9;
 
@@ -1238,8 +1242,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/civicinfo/us_v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("civicinfo/us_v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("voterinfo/"));
         pathOffset += 10;
         index = path.indexOf("/lookup", pathOffset);
@@ -1300,8 +1306,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/civicinfo/us_v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("civicinfo/us_v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("representatives/lookup"));
         pathOffset += 22;
 
diff --git a/generated/googleapis/test/civicinfo/v1_test.dart b/generated/googleapis/test/civicinfo/v1_test.dart
index 433190b..58d9291 100644
--- a/generated/googleapis/test/civicinfo/v1_test.dart
+++ b/generated/googleapis/test/civicinfo/v1_test.dart
@@ -1141,8 +1141,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/civicinfo/v1/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("civicinfo/v1/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 31), unittest.equals("representatives/division_search"));
         pathOffset += 31;
 
@@ -1189,8 +1191,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/civicinfo/v1/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("civicinfo/v1/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("elections"));
         pathOffset += 9;
 
@@ -1238,8 +1242,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/civicinfo/v1/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("civicinfo/v1/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("voterinfo/"));
         pathOffset += 10;
         index = path.indexOf("/lookup", pathOffset);
@@ -1300,8 +1306,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/civicinfo/v1/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("civicinfo/v1/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("representatives/lookup"));
         pathOffset += 22;
 
diff --git a/generated/googleapis/test/common/common_internal_test.dart b/generated/googleapis/test/common/common_internal_test.dart
index afae3ba..54fd309 100644
--- a/generated/googleapis/test/common/common_internal_test.dart
+++ b/generated/googleapis/test/common/common_internal_test.dart
@@ -7,6 +7,7 @@
 import 'package:googleapis/src/common_internal.dart';
 import 'package:http/http.dart' as http;
 import 'package:unittest/unittest.dart';
+
 class HttpServerMock extends http.BaseClient {
   Function _callback;
   bool _expectJson;
@@ -307,7 +308,7 @@
       setUp(() {
         httpMock = new HttpServerMock();
         rootUrl = 'http://example.com/';
-        basePath = '/base/';
+        basePath = 'base/';
         requester = new ApiRequester(httpMock, rootUrl, basePath);
       });
 
@@ -731,6 +732,17 @@
                      1024*1024], false);
           });
 
+          test('length-big-block-parts-non-divisible', () {
+            runTest(1, 1024 * 1024 + 1,
+                    [1,
+                     256*1024-1,
+                     256*1024,
+                     256*1024+1,
+                     1024*1024-1,
+                     1024*1024,
+                     1024*1024+1], false);
+          });
+
           test('stream-small-block', () {
             runTest(1, 10, [10], true);
           });
diff --git a/generated/googleapis/test/compute/v1_test.dart b/generated/googleapis/test/compute/v1_test.dart
index 24ba5a1..6cfbefb 100644
--- a/generated/googleapis/test/compute/v1_test.dart
+++ b/generated/googleapis/test/compute/v1_test.dart
@@ -41,14 +41,14 @@
   buildCounterAccessConfig--;
 }
 
-buildUnnamed839() {
+buildUnnamed867() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed839(core.List<core.String> o) {
+checkUnnamed867(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -68,7 +68,7 @@
     o.region = "foo";
     o.selfLink = "foo";
     o.status = "foo";
-    o.users = buildUnnamed839();
+    o.users = buildUnnamed867();
   }
   buildCounterAddress--;
   return o;
@@ -86,19 +86,19 @@
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed839(o.users);
+    checkUnnamed867(o.users);
   }
   buildCounterAddress--;
 }
 
-buildUnnamed840() {
+buildUnnamed868() {
   var o = new core.Map<core.String, api.AddressesScopedList>();
   o["x"] = buildAddressesScopedList();
   o["y"] = buildAddressesScopedList();
   return o;
 }
 
-checkUnnamed840(core.Map<core.String, api.AddressesScopedList> o) {
+checkUnnamed868(core.Map<core.String, api.AddressesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddressesScopedList(o["x"]);
   checkAddressesScopedList(o["y"]);
@@ -110,7 +110,7 @@
   buildCounterAddressAggregatedList++;
   if (buildCounterAddressAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed840();
+    o.items = buildUnnamed868();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -123,7 +123,7 @@
   buildCounterAddressAggregatedList++;
   if (buildCounterAddressAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed840(o.items);
+    checkUnnamed868(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -131,14 +131,14 @@
   buildCounterAddressAggregatedList--;
 }
 
-buildUnnamed841() {
+buildUnnamed869() {
   var o = new core.List<api.Address>();
   o.add(buildAddress());
   o.add(buildAddress());
   return o;
 }
 
-checkUnnamed841(core.List<api.Address> o) {
+checkUnnamed869(core.List<api.Address> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddress(o[0]);
   checkAddress(o[1]);
@@ -150,7 +150,7 @@
   buildCounterAddressList++;
   if (buildCounterAddressList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed841();
+    o.items = buildUnnamed869();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -163,7 +163,7 @@
   buildCounterAddressList++;
   if (buildCounterAddressList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed841(o.items);
+    checkUnnamed869(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -171,14 +171,14 @@
   buildCounterAddressList--;
 }
 
-buildUnnamed842() {
+buildUnnamed870() {
   var o = new core.List<api.Address>();
   o.add(buildAddress());
   o.add(buildAddress());
   return o;
 }
 
-checkUnnamed842(core.List<api.Address> o) {
+checkUnnamed870(core.List<api.Address> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddress(o[0]);
   checkAddress(o[1]);
@@ -205,14 +205,14 @@
   buildCounterAddressesScopedListWarningData--;
 }
 
-buildUnnamed843() {
+buildUnnamed871() {
   var o = new core.List<api.AddressesScopedListWarningData>();
   o.add(buildAddressesScopedListWarningData());
   o.add(buildAddressesScopedListWarningData());
   return o;
 }
 
-checkUnnamed843(core.List<api.AddressesScopedListWarningData> o) {
+checkUnnamed871(core.List<api.AddressesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAddressesScopedListWarningData(o[0]);
   checkAddressesScopedListWarningData(o[1]);
@@ -224,7 +224,7 @@
   buildCounterAddressesScopedListWarning++;
   if (buildCounterAddressesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed843();
+    o.data = buildUnnamed871();
     o.message = "foo";
   }
   buildCounterAddressesScopedListWarning--;
@@ -235,7 +235,7 @@
   buildCounterAddressesScopedListWarning++;
   if (buildCounterAddressesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed843(o.data);
+    checkUnnamed871(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterAddressesScopedListWarning--;
@@ -246,7 +246,7 @@
   var o = new api.AddressesScopedList();
   buildCounterAddressesScopedList++;
   if (buildCounterAddressesScopedList < 3) {
-    o.addresses = buildUnnamed842();
+    o.addresses = buildUnnamed870();
     o.warning = buildAddressesScopedListWarning();
   }
   buildCounterAddressesScopedList--;
@@ -256,20 +256,20 @@
 checkAddressesScopedList(api.AddressesScopedList o) {
   buildCounterAddressesScopedList++;
   if (buildCounterAddressesScopedList < 3) {
-    checkUnnamed842(o.addresses);
+    checkUnnamed870(o.addresses);
     checkAddressesScopedListWarning(o.warning);
   }
   buildCounterAddressesScopedList--;
 }
 
-buildUnnamed844() {
+buildUnnamed872() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed844(core.List<core.String> o) {
+checkUnnamed872(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -286,7 +286,7 @@
     o.index = 42;
     o.initializeParams = buildAttachedDiskInitializeParams();
     o.kind = "foo";
-    o.licenses = buildUnnamed844();
+    o.licenses = buildUnnamed872();
     o.mode = "foo";
     o.source = "foo";
     o.type = "foo";
@@ -304,7 +304,7 @@
     unittest.expect(o.index, unittest.equals(42));
     checkAttachedDiskInitializeParams(o.initializeParams);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed844(o.licenses);
+    checkUnnamed872(o.licenses);
     unittest.expect(o.mode, unittest.equals('foo'));
     unittest.expect(o.source, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -368,27 +368,27 @@
   buildCounterBackend--;
 }
 
-buildUnnamed845() {
+buildUnnamed873() {
   var o = new core.List<api.Backend>();
   o.add(buildBackend());
   o.add(buildBackend());
   return o;
 }
 
-checkUnnamed845(core.List<api.Backend> o) {
+checkUnnamed873(core.List<api.Backend> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackend(o[0]);
   checkBackend(o[1]);
 }
 
-buildUnnamed846() {
+buildUnnamed874() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed846(core.List<core.String> o) {
+checkUnnamed874(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -399,11 +399,11 @@
   var o = new api.BackendService();
   buildCounterBackendService++;
   if (buildCounterBackendService < 3) {
-    o.backends = buildUnnamed845();
+    o.backends = buildUnnamed873();
     o.creationTimestamp = "foo";
     o.description = "foo";
     o.fingerprint = "foo";
-    o.healthChecks = buildUnnamed846();
+    o.healthChecks = buildUnnamed874();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
@@ -420,11 +420,11 @@
 checkBackendService(api.BackendService o) {
   buildCounterBackendService++;
   if (buildCounterBackendService < 3) {
-    checkUnnamed845(o.backends);
+    checkUnnamed873(o.backends);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed846(o.healthChecks);
+    checkUnnamed874(o.healthChecks);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -437,14 +437,14 @@
   buildCounterBackendService--;
 }
 
-buildUnnamed847() {
+buildUnnamed875() {
   var o = new core.List<api.HealthStatus>();
   o.add(buildHealthStatus());
   o.add(buildHealthStatus());
   return o;
 }
 
-checkUnnamed847(core.List<api.HealthStatus> o) {
+checkUnnamed875(core.List<api.HealthStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthStatus(o[0]);
   checkHealthStatus(o[1]);
@@ -455,7 +455,7 @@
   var o = new api.BackendServiceGroupHealth();
   buildCounterBackendServiceGroupHealth++;
   if (buildCounterBackendServiceGroupHealth < 3) {
-    o.healthStatus = buildUnnamed847();
+    o.healthStatus = buildUnnamed875();
     o.kind = "foo";
   }
   buildCounterBackendServiceGroupHealth--;
@@ -465,20 +465,20 @@
 checkBackendServiceGroupHealth(api.BackendServiceGroupHealth o) {
   buildCounterBackendServiceGroupHealth++;
   if (buildCounterBackendServiceGroupHealth < 3) {
-    checkUnnamed847(o.healthStatus);
+    checkUnnamed875(o.healthStatus);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBackendServiceGroupHealth--;
 }
 
-buildUnnamed848() {
+buildUnnamed876() {
   var o = new core.List<api.BackendService>();
   o.add(buildBackendService());
   o.add(buildBackendService());
   return o;
 }
 
-checkUnnamed848(core.List<api.BackendService> o) {
+checkUnnamed876(core.List<api.BackendService> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackendService(o[0]);
   checkBackendService(o[1]);
@@ -490,7 +490,7 @@
   buildCounterBackendServiceList++;
   if (buildCounterBackendServiceList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed848();
+    o.items = buildUnnamed876();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -503,7 +503,7 @@
   buildCounterBackendServiceList++;
   if (buildCounterBackendServiceList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed848(o.items);
+    checkUnnamed876(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -538,14 +538,14 @@
   buildCounterDeprecationStatus--;
 }
 
-buildUnnamed849() {
+buildUnnamed877() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed849(core.List<core.String> o) {
+checkUnnamed877(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -560,7 +560,7 @@
     o.description = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.licenses = buildUnnamed849();
+    o.licenses = buildUnnamed877();
     o.name = "foo";
     o.options = "foo";
     o.selfLink = "foo";
@@ -584,7 +584,7 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed849(o.licenses);
+    checkUnnamed877(o.licenses);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.options, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -600,14 +600,14 @@
   buildCounterDisk--;
 }
 
-buildUnnamed850() {
+buildUnnamed878() {
   var o = new core.Map<core.String, api.DisksScopedList>();
   o["x"] = buildDisksScopedList();
   o["y"] = buildDisksScopedList();
   return o;
 }
 
-checkUnnamed850(core.Map<core.String, api.DisksScopedList> o) {
+checkUnnamed878(core.Map<core.String, api.DisksScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisksScopedList(o["x"]);
   checkDisksScopedList(o["y"]);
@@ -619,7 +619,7 @@
   buildCounterDiskAggregatedList++;
   if (buildCounterDiskAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed850();
+    o.items = buildUnnamed878();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -632,7 +632,7 @@
   buildCounterDiskAggregatedList++;
   if (buildCounterDiskAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed850(o.items);
+    checkUnnamed878(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -640,14 +640,14 @@
   buildCounterDiskAggregatedList--;
 }
 
-buildUnnamed851() {
+buildUnnamed879() {
   var o = new core.List<api.Disk>();
   o.add(buildDisk());
   o.add(buildDisk());
   return o;
 }
 
-checkUnnamed851(core.List<api.Disk> o) {
+checkUnnamed879(core.List<api.Disk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisk(o[0]);
   checkDisk(o[1]);
@@ -659,7 +659,7 @@
   buildCounterDiskList++;
   if (buildCounterDiskList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed851();
+    o.items = buildUnnamed879();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -672,7 +672,7 @@
   buildCounterDiskList++;
   if (buildCounterDiskList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed851(o.items);
+    checkUnnamed879(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -717,14 +717,14 @@
   buildCounterDiskType--;
 }
 
-buildUnnamed852() {
+buildUnnamed880() {
   var o = new core.Map<core.String, api.DiskTypesScopedList>();
   o["x"] = buildDiskTypesScopedList();
   o["y"] = buildDiskTypesScopedList();
   return o;
 }
 
-checkUnnamed852(core.Map<core.String, api.DiskTypesScopedList> o) {
+checkUnnamed880(core.Map<core.String, api.DiskTypesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskTypesScopedList(o["x"]);
   checkDiskTypesScopedList(o["y"]);
@@ -736,7 +736,7 @@
   buildCounterDiskTypeAggregatedList++;
   if (buildCounterDiskTypeAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed852();
+    o.items = buildUnnamed880();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -749,7 +749,7 @@
   buildCounterDiskTypeAggregatedList++;
   if (buildCounterDiskTypeAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed852(o.items);
+    checkUnnamed880(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -757,14 +757,14 @@
   buildCounterDiskTypeAggregatedList--;
 }
 
-buildUnnamed853() {
+buildUnnamed881() {
   var o = new core.List<api.DiskType>();
   o.add(buildDiskType());
   o.add(buildDiskType());
   return o;
 }
 
-checkUnnamed853(core.List<api.DiskType> o) {
+checkUnnamed881(core.List<api.DiskType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskType(o[0]);
   checkDiskType(o[1]);
@@ -776,7 +776,7 @@
   buildCounterDiskTypeList++;
   if (buildCounterDiskTypeList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed853();
+    o.items = buildUnnamed881();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -789,7 +789,7 @@
   buildCounterDiskTypeList++;
   if (buildCounterDiskTypeList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed853(o.items);
+    checkUnnamed881(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -797,14 +797,14 @@
   buildCounterDiskTypeList--;
 }
 
-buildUnnamed854() {
+buildUnnamed882() {
   var o = new core.List<api.DiskType>();
   o.add(buildDiskType());
   o.add(buildDiskType());
   return o;
 }
 
-checkUnnamed854(core.List<api.DiskType> o) {
+checkUnnamed882(core.List<api.DiskType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskType(o[0]);
   checkDiskType(o[1]);
@@ -831,14 +831,14 @@
   buildCounterDiskTypesScopedListWarningData--;
 }
 
-buildUnnamed855() {
+buildUnnamed883() {
   var o = new core.List<api.DiskTypesScopedListWarningData>();
   o.add(buildDiskTypesScopedListWarningData());
   o.add(buildDiskTypesScopedListWarningData());
   return o;
 }
 
-checkUnnamed855(core.List<api.DiskTypesScopedListWarningData> o) {
+checkUnnamed883(core.List<api.DiskTypesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDiskTypesScopedListWarningData(o[0]);
   checkDiskTypesScopedListWarningData(o[1]);
@@ -850,7 +850,7 @@
   buildCounterDiskTypesScopedListWarning++;
   if (buildCounterDiskTypesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed855();
+    o.data = buildUnnamed883();
     o.message = "foo";
   }
   buildCounterDiskTypesScopedListWarning--;
@@ -861,7 +861,7 @@
   buildCounterDiskTypesScopedListWarning++;
   if (buildCounterDiskTypesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed855(o.data);
+    checkUnnamed883(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterDiskTypesScopedListWarning--;
@@ -872,7 +872,7 @@
   var o = new api.DiskTypesScopedList();
   buildCounterDiskTypesScopedList++;
   if (buildCounterDiskTypesScopedList < 3) {
-    o.diskTypes = buildUnnamed854();
+    o.diskTypes = buildUnnamed882();
     o.warning = buildDiskTypesScopedListWarning();
   }
   buildCounterDiskTypesScopedList--;
@@ -882,20 +882,20 @@
 checkDiskTypesScopedList(api.DiskTypesScopedList o) {
   buildCounterDiskTypesScopedList++;
   if (buildCounterDiskTypesScopedList < 3) {
-    checkUnnamed854(o.diskTypes);
+    checkUnnamed882(o.diskTypes);
     checkDiskTypesScopedListWarning(o.warning);
   }
   buildCounterDiskTypesScopedList--;
 }
 
-buildUnnamed856() {
+buildUnnamed884() {
   var o = new core.List<api.Disk>();
   o.add(buildDisk());
   o.add(buildDisk());
   return o;
 }
 
-checkUnnamed856(core.List<api.Disk> o) {
+checkUnnamed884(core.List<api.Disk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisk(o[0]);
   checkDisk(o[1]);
@@ -922,14 +922,14 @@
   buildCounterDisksScopedListWarningData--;
 }
 
-buildUnnamed857() {
+buildUnnamed885() {
   var o = new core.List<api.DisksScopedListWarningData>();
   o.add(buildDisksScopedListWarningData());
   o.add(buildDisksScopedListWarningData());
   return o;
 }
 
-checkUnnamed857(core.List<api.DisksScopedListWarningData> o) {
+checkUnnamed885(core.List<api.DisksScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisksScopedListWarningData(o[0]);
   checkDisksScopedListWarningData(o[1]);
@@ -941,7 +941,7 @@
   buildCounterDisksScopedListWarning++;
   if (buildCounterDisksScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed857();
+    o.data = buildUnnamed885();
     o.message = "foo";
   }
   buildCounterDisksScopedListWarning--;
@@ -952,7 +952,7 @@
   buildCounterDisksScopedListWarning++;
   if (buildCounterDisksScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed857(o.data);
+    checkUnnamed885(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterDisksScopedListWarning--;
@@ -963,7 +963,7 @@
   var o = new api.DisksScopedList();
   buildCounterDisksScopedList++;
   if (buildCounterDisksScopedList < 3) {
-    o.disks = buildUnnamed856();
+    o.disks = buildUnnamed884();
     o.warning = buildDisksScopedListWarning();
   }
   buildCounterDisksScopedList--;
@@ -973,20 +973,20 @@
 checkDisksScopedList(api.DisksScopedList o) {
   buildCounterDisksScopedList++;
   if (buildCounterDisksScopedList < 3) {
-    checkUnnamed856(o.disks);
+    checkUnnamed884(o.disks);
     checkDisksScopedListWarning(o.warning);
   }
   buildCounterDisksScopedList--;
 }
 
-buildUnnamed858() {
+buildUnnamed886() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed858(core.List<core.String> o) {
+checkUnnamed886(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -998,7 +998,7 @@
   buildCounterFirewallAllowed++;
   if (buildCounterFirewallAllowed < 3) {
     o.IPProtocol = "foo";
-    o.ports = buildUnnamed858();
+    o.ports = buildUnnamed886();
   }
   buildCounterFirewallAllowed--;
   return o;
@@ -1008,58 +1008,58 @@
   buildCounterFirewallAllowed++;
   if (buildCounterFirewallAllowed < 3) {
     unittest.expect(o.IPProtocol, unittest.equals('foo'));
-    checkUnnamed858(o.ports);
+    checkUnnamed886(o.ports);
   }
   buildCounterFirewallAllowed--;
 }
 
-buildUnnamed859() {
+buildUnnamed887() {
   var o = new core.List<api.FirewallAllowed>();
   o.add(buildFirewallAllowed());
   o.add(buildFirewallAllowed());
   return o;
 }
 
-checkUnnamed859(core.List<api.FirewallAllowed> o) {
+checkUnnamed887(core.List<api.FirewallAllowed> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFirewallAllowed(o[0]);
   checkFirewallAllowed(o[1]);
 }
 
-buildUnnamed860() {
+buildUnnamed888() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed860(core.List<core.String> o) {
+checkUnnamed888(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed861() {
+buildUnnamed889() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed861(core.List<core.String> o) {
+checkUnnamed889(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed862() {
+buildUnnamed890() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed862(core.List<core.String> o) {
+checkUnnamed890(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1070,7 +1070,7 @@
   var o = new api.Firewall();
   buildCounterFirewall++;
   if (buildCounterFirewall < 3) {
-    o.allowed = buildUnnamed859();
+    o.allowed = buildUnnamed887();
     o.creationTimestamp = "foo";
     o.description = "foo";
     o.id = "foo";
@@ -1078,9 +1078,9 @@
     o.name = "foo";
     o.network = "foo";
     o.selfLink = "foo";
-    o.sourceRanges = buildUnnamed860();
-    o.sourceTags = buildUnnamed861();
-    o.targetTags = buildUnnamed862();
+    o.sourceRanges = buildUnnamed888();
+    o.sourceTags = buildUnnamed889();
+    o.targetTags = buildUnnamed890();
   }
   buildCounterFirewall--;
   return o;
@@ -1089,7 +1089,7 @@
 checkFirewall(api.Firewall o) {
   buildCounterFirewall++;
   if (buildCounterFirewall < 3) {
-    checkUnnamed859(o.allowed);
+    checkUnnamed887(o.allowed);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1097,21 +1097,21 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed860(o.sourceRanges);
-    checkUnnamed861(o.sourceTags);
-    checkUnnamed862(o.targetTags);
+    checkUnnamed888(o.sourceRanges);
+    checkUnnamed889(o.sourceTags);
+    checkUnnamed890(o.targetTags);
   }
   buildCounterFirewall--;
 }
 
-buildUnnamed863() {
+buildUnnamed891() {
   var o = new core.List<api.Firewall>();
   o.add(buildFirewall());
   o.add(buildFirewall());
   return o;
 }
 
-checkUnnamed863(core.List<api.Firewall> o) {
+checkUnnamed891(core.List<api.Firewall> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFirewall(o[0]);
   checkFirewall(o[1]);
@@ -1123,7 +1123,7 @@
   buildCounterFirewallList++;
   if (buildCounterFirewallList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed863();
+    o.items = buildUnnamed891();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1136,7 +1136,7 @@
   buildCounterFirewallList++;
   if (buildCounterFirewallList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed863(o.items);
+    checkUnnamed891(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1183,14 +1183,14 @@
   buildCounterForwardingRule--;
 }
 
-buildUnnamed864() {
+buildUnnamed892() {
   var o = new core.Map<core.String, api.ForwardingRulesScopedList>();
   o["x"] = buildForwardingRulesScopedList();
   o["y"] = buildForwardingRulesScopedList();
   return o;
 }
 
-checkUnnamed864(core.Map<core.String, api.ForwardingRulesScopedList> o) {
+checkUnnamed892(core.Map<core.String, api.ForwardingRulesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRulesScopedList(o["x"]);
   checkForwardingRulesScopedList(o["y"]);
@@ -1202,7 +1202,7 @@
   buildCounterForwardingRuleAggregatedList++;
   if (buildCounterForwardingRuleAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed864();
+    o.items = buildUnnamed892();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1215,7 +1215,7 @@
   buildCounterForwardingRuleAggregatedList++;
   if (buildCounterForwardingRuleAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed864(o.items);
+    checkUnnamed892(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1223,14 +1223,14 @@
   buildCounterForwardingRuleAggregatedList--;
 }
 
-buildUnnamed865() {
+buildUnnamed893() {
   var o = new core.List<api.ForwardingRule>();
   o.add(buildForwardingRule());
   o.add(buildForwardingRule());
   return o;
 }
 
-checkUnnamed865(core.List<api.ForwardingRule> o) {
+checkUnnamed893(core.List<api.ForwardingRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRule(o[0]);
   checkForwardingRule(o[1]);
@@ -1242,7 +1242,7 @@
   buildCounterForwardingRuleList++;
   if (buildCounterForwardingRuleList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed865();
+    o.items = buildUnnamed893();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1255,7 +1255,7 @@
   buildCounterForwardingRuleList++;
   if (buildCounterForwardingRuleList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed865(o.items);
+    checkUnnamed893(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1263,14 +1263,14 @@
   buildCounterForwardingRuleList--;
 }
 
-buildUnnamed866() {
+buildUnnamed894() {
   var o = new core.List<api.ForwardingRule>();
   o.add(buildForwardingRule());
   o.add(buildForwardingRule());
   return o;
 }
 
-checkUnnamed866(core.List<api.ForwardingRule> o) {
+checkUnnamed894(core.List<api.ForwardingRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRule(o[0]);
   checkForwardingRule(o[1]);
@@ -1297,14 +1297,14 @@
   buildCounterForwardingRulesScopedListWarningData--;
 }
 
-buildUnnamed867() {
+buildUnnamed895() {
   var o = new core.List<api.ForwardingRulesScopedListWarningData>();
   o.add(buildForwardingRulesScopedListWarningData());
   o.add(buildForwardingRulesScopedListWarningData());
   return o;
 }
 
-checkUnnamed867(core.List<api.ForwardingRulesScopedListWarningData> o) {
+checkUnnamed895(core.List<api.ForwardingRulesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkForwardingRulesScopedListWarningData(o[0]);
   checkForwardingRulesScopedListWarningData(o[1]);
@@ -1316,7 +1316,7 @@
   buildCounterForwardingRulesScopedListWarning++;
   if (buildCounterForwardingRulesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed867();
+    o.data = buildUnnamed895();
     o.message = "foo";
   }
   buildCounterForwardingRulesScopedListWarning--;
@@ -1327,7 +1327,7 @@
   buildCounterForwardingRulesScopedListWarning++;
   if (buildCounterForwardingRulesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed867(o.data);
+    checkUnnamed895(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterForwardingRulesScopedListWarning--;
@@ -1338,7 +1338,7 @@
   var o = new api.ForwardingRulesScopedList();
   buildCounterForwardingRulesScopedList++;
   if (buildCounterForwardingRulesScopedList < 3) {
-    o.forwardingRules = buildUnnamed866();
+    o.forwardingRules = buildUnnamed894();
     o.warning = buildForwardingRulesScopedListWarning();
   }
   buildCounterForwardingRulesScopedList--;
@@ -1348,7 +1348,7 @@
 checkForwardingRulesScopedList(api.ForwardingRulesScopedList o) {
   buildCounterForwardingRulesScopedList++;
   if (buildCounterForwardingRulesScopedList < 3) {
-    checkUnnamed866(o.forwardingRules);
+    checkUnnamed894(o.forwardingRules);
     checkForwardingRulesScopedListWarning(o.warning);
   }
   buildCounterForwardingRulesScopedList--;
@@ -1398,14 +1398,14 @@
   buildCounterHealthStatus--;
 }
 
-buildUnnamed868() {
+buildUnnamed896() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed868(core.List<core.String> o) {
+checkUnnamed896(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1417,7 +1417,7 @@
   buildCounterHostRule++;
   if (buildCounterHostRule < 3) {
     o.description = "foo";
-    o.hosts = buildUnnamed868();
+    o.hosts = buildUnnamed896();
     o.pathMatcher = "foo";
   }
   buildCounterHostRule--;
@@ -1428,7 +1428,7 @@
   buildCounterHostRule++;
   if (buildCounterHostRule < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed868(o.hosts);
+    checkUnnamed896(o.hosts);
     unittest.expect(o.pathMatcher, unittest.equals('foo'));
   }
   buildCounterHostRule--;
@@ -1477,14 +1477,14 @@
   buildCounterHttpHealthCheck--;
 }
 
-buildUnnamed869() {
+buildUnnamed897() {
   var o = new core.List<api.HttpHealthCheck>();
   o.add(buildHttpHealthCheck());
   o.add(buildHttpHealthCheck());
   return o;
 }
 
-checkUnnamed869(core.List<api.HttpHealthCheck> o) {
+checkUnnamed897(core.List<api.HttpHealthCheck> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHttpHealthCheck(o[0]);
   checkHttpHealthCheck(o[1]);
@@ -1496,7 +1496,7 @@
   buildCounterHttpHealthCheckList++;
   if (buildCounterHttpHealthCheckList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed869();
+    o.items = buildUnnamed897();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1509,7 +1509,7 @@
   buildCounterHttpHealthCheckList++;
   if (buildCounterHttpHealthCheckList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed869(o.items);
+    checkUnnamed897(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1517,14 +1517,14 @@
   buildCounterHttpHealthCheckList--;
 }
 
-buildUnnamed870() {
+buildUnnamed898() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed870(core.List<core.String> o) {
+checkUnnamed898(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1565,7 +1565,7 @@
     o.diskSizeGb = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.licenses = buildUnnamed870();
+    o.licenses = buildUnnamed898();
     o.name = "foo";
     o.rawDisk = buildImageRawDisk();
     o.selfLink = "foo";
@@ -1588,7 +1588,7 @@
     unittest.expect(o.diskSizeGb, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed870(o.licenses);
+    checkUnnamed898(o.licenses);
     unittest.expect(o.name, unittest.equals('foo'));
     checkImageRawDisk(o.rawDisk);
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1600,14 +1600,14 @@
   buildCounterImage--;
 }
 
-buildUnnamed871() {
+buildUnnamed899() {
   var o = new core.List<api.Image>();
   o.add(buildImage());
   o.add(buildImage());
   return o;
 }
 
-checkUnnamed871(core.List<api.Image> o) {
+checkUnnamed899(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkImage(o[0]);
   checkImage(o[1]);
@@ -1619,7 +1619,7 @@
   buildCounterImageList++;
   if (buildCounterImageList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed871();
+    o.items = buildUnnamed899();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1632,7 +1632,7 @@
   buildCounterImageList++;
   if (buildCounterImageList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed871(o.items);
+    checkUnnamed899(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1640,40 +1640,40 @@
   buildCounterImageList--;
 }
 
-buildUnnamed872() {
+buildUnnamed900() {
   var o = new core.List<api.AttachedDisk>();
   o.add(buildAttachedDisk());
   o.add(buildAttachedDisk());
   return o;
 }
 
-checkUnnamed872(core.List<api.AttachedDisk> o) {
+checkUnnamed900(core.List<api.AttachedDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachedDisk(o[0]);
   checkAttachedDisk(o[1]);
 }
 
-buildUnnamed873() {
+buildUnnamed901() {
   var o = new core.List<api.NetworkInterface>();
   o.add(buildNetworkInterface());
   o.add(buildNetworkInterface());
   return o;
 }
 
-checkUnnamed873(core.List<api.NetworkInterface> o) {
+checkUnnamed901(core.List<api.NetworkInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetworkInterface(o[0]);
   checkNetworkInterface(o[1]);
 }
 
-buildUnnamed874() {
+buildUnnamed902() {
   var o = new core.List<api.ServiceAccount>();
   o.add(buildServiceAccount());
   o.add(buildServiceAccount());
   return o;
 }
 
-checkUnnamed874(core.List<api.ServiceAccount> o) {
+checkUnnamed902(core.List<api.ServiceAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceAccount(o[0]);
   checkServiceAccount(o[1]);
@@ -1687,16 +1687,16 @@
     o.canIpForward = true;
     o.creationTimestamp = "foo";
     o.description = "foo";
-    o.disks = buildUnnamed872();
+    o.disks = buildUnnamed900();
     o.id = "foo";
     o.kind = "foo";
     o.machineType = "foo";
     o.metadata = buildMetadata();
     o.name = "foo";
-    o.networkInterfaces = buildUnnamed873();
+    o.networkInterfaces = buildUnnamed901();
     o.scheduling = buildScheduling();
     o.selfLink = "foo";
-    o.serviceAccounts = buildUnnamed874();
+    o.serviceAccounts = buildUnnamed902();
     o.status = "foo";
     o.statusMessage = "foo";
     o.tags = buildTags();
@@ -1712,16 +1712,16 @@
     unittest.expect(o.canIpForward, unittest.isTrue);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed872(o.disks);
+    checkUnnamed900(o.disks);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.machineType, unittest.equals('foo'));
     checkMetadata(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed873(o.networkInterfaces);
+    checkUnnamed901(o.networkInterfaces);
     checkScheduling(o.scheduling);
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed874(o.serviceAccounts);
+    checkUnnamed902(o.serviceAccounts);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.statusMessage, unittest.equals('foo'));
     checkTags(o.tags);
@@ -1730,14 +1730,14 @@
   buildCounterInstance--;
 }
 
-buildUnnamed875() {
+buildUnnamed903() {
   var o = new core.Map<core.String, api.InstancesScopedList>();
   o["x"] = buildInstancesScopedList();
   o["y"] = buildInstancesScopedList();
   return o;
 }
 
-checkUnnamed875(core.Map<core.String, api.InstancesScopedList> o) {
+checkUnnamed903(core.Map<core.String, api.InstancesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstancesScopedList(o["x"]);
   checkInstancesScopedList(o["y"]);
@@ -1749,7 +1749,7 @@
   buildCounterInstanceAggregatedList++;
   if (buildCounterInstanceAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed875();
+    o.items = buildUnnamed903();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1762,7 +1762,7 @@
   buildCounterInstanceAggregatedList++;
   if (buildCounterInstanceAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed875(o.items);
+    checkUnnamed903(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1770,14 +1770,14 @@
   buildCounterInstanceAggregatedList--;
 }
 
-buildUnnamed876() {
+buildUnnamed904() {
   var o = new core.List<api.Instance>();
   o.add(buildInstance());
   o.add(buildInstance());
   return o;
 }
 
-checkUnnamed876(core.List<api.Instance> o) {
+checkUnnamed904(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstance(o[0]);
   checkInstance(o[1]);
@@ -1789,7 +1789,7 @@
   buildCounterInstanceList++;
   if (buildCounterInstanceList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed876();
+    o.items = buildUnnamed904();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1802,7 +1802,7 @@
   buildCounterInstanceList++;
   if (buildCounterInstanceList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed876(o.items);
+    checkUnnamed904(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1829,14 +1829,14 @@
   buildCounterInstanceReference--;
 }
 
-buildUnnamed877() {
+buildUnnamed905() {
   var o = new core.List<api.Instance>();
   o.add(buildInstance());
   o.add(buildInstance());
   return o;
 }
 
-checkUnnamed877(core.List<api.Instance> o) {
+checkUnnamed905(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstance(o[0]);
   checkInstance(o[1]);
@@ -1863,14 +1863,14 @@
   buildCounterInstancesScopedListWarningData--;
 }
 
-buildUnnamed878() {
+buildUnnamed906() {
   var o = new core.List<api.InstancesScopedListWarningData>();
   o.add(buildInstancesScopedListWarningData());
   o.add(buildInstancesScopedListWarningData());
   return o;
 }
 
-checkUnnamed878(core.List<api.InstancesScopedListWarningData> o) {
+checkUnnamed906(core.List<api.InstancesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstancesScopedListWarningData(o[0]);
   checkInstancesScopedListWarningData(o[1]);
@@ -1882,7 +1882,7 @@
   buildCounterInstancesScopedListWarning++;
   if (buildCounterInstancesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed878();
+    o.data = buildUnnamed906();
     o.message = "foo";
   }
   buildCounterInstancesScopedListWarning--;
@@ -1893,7 +1893,7 @@
   buildCounterInstancesScopedListWarning++;
   if (buildCounterInstancesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed878(o.data);
+    checkUnnamed906(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterInstancesScopedListWarning--;
@@ -1904,7 +1904,7 @@
   var o = new api.InstancesScopedList();
   buildCounterInstancesScopedList++;
   if (buildCounterInstancesScopedList < 3) {
-    o.instances = buildUnnamed877();
+    o.instances = buildUnnamed905();
     o.warning = buildInstancesScopedListWarning();
   }
   buildCounterInstancesScopedList--;
@@ -1914,7 +1914,7 @@
 checkInstancesScopedList(api.InstancesScopedList o) {
   buildCounterInstancesScopedList++;
   if (buildCounterInstancesScopedList < 3) {
-    checkUnnamed877(o.instances);
+    checkUnnamed905(o.instances);
     checkInstancesScopedListWarning(o.warning);
   }
   buildCounterInstancesScopedList--;
@@ -1964,14 +1964,14 @@
   buildCounterMachineTypeScratchDisks--;
 }
 
-buildUnnamed879() {
+buildUnnamed907() {
   var o = new core.List<api.MachineTypeScratchDisks>();
   o.add(buildMachineTypeScratchDisks());
   o.add(buildMachineTypeScratchDisks());
   return o;
 }
 
-checkUnnamed879(core.List<api.MachineTypeScratchDisks> o) {
+checkUnnamed907(core.List<api.MachineTypeScratchDisks> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineTypeScratchDisks(o[0]);
   checkMachineTypeScratchDisks(o[1]);
@@ -1993,7 +1993,7 @@
     o.maximumPersistentDisksSizeGb = "foo";
     o.memoryMb = 42;
     o.name = "foo";
-    o.scratchDisks = buildUnnamed879();
+    o.scratchDisks = buildUnnamed907();
     o.selfLink = "foo";
     o.zone = "foo";
   }
@@ -2015,21 +2015,21 @@
     unittest.expect(o.maximumPersistentDisksSizeGb, unittest.equals('foo'));
     unittest.expect(o.memoryMb, unittest.equals(42));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed879(o.scratchDisks);
+    checkUnnamed907(o.scratchDisks);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterMachineType--;
 }
 
-buildUnnamed880() {
+buildUnnamed908() {
   var o = new core.Map<core.String, api.MachineTypesScopedList>();
   o["x"] = buildMachineTypesScopedList();
   o["y"] = buildMachineTypesScopedList();
   return o;
 }
 
-checkUnnamed880(core.Map<core.String, api.MachineTypesScopedList> o) {
+checkUnnamed908(core.Map<core.String, api.MachineTypesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineTypesScopedList(o["x"]);
   checkMachineTypesScopedList(o["y"]);
@@ -2041,7 +2041,7 @@
   buildCounterMachineTypeAggregatedList++;
   if (buildCounterMachineTypeAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed880();
+    o.items = buildUnnamed908();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2054,7 +2054,7 @@
   buildCounterMachineTypeAggregatedList++;
   if (buildCounterMachineTypeAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed880(o.items);
+    checkUnnamed908(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2062,14 +2062,14 @@
   buildCounterMachineTypeAggregatedList--;
 }
 
-buildUnnamed881() {
+buildUnnamed909() {
   var o = new core.List<api.MachineType>();
   o.add(buildMachineType());
   o.add(buildMachineType());
   return o;
 }
 
-checkUnnamed881(core.List<api.MachineType> o) {
+checkUnnamed909(core.List<api.MachineType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineType(o[0]);
   checkMachineType(o[1]);
@@ -2081,7 +2081,7 @@
   buildCounterMachineTypeList++;
   if (buildCounterMachineTypeList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed881();
+    o.items = buildUnnamed909();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2094,7 +2094,7 @@
   buildCounterMachineTypeList++;
   if (buildCounterMachineTypeList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed881(o.items);
+    checkUnnamed909(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2102,14 +2102,14 @@
   buildCounterMachineTypeList--;
 }
 
-buildUnnamed882() {
+buildUnnamed910() {
   var o = new core.List<api.MachineType>();
   o.add(buildMachineType());
   o.add(buildMachineType());
   return o;
 }
 
-checkUnnamed882(core.List<api.MachineType> o) {
+checkUnnamed910(core.List<api.MachineType> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineType(o[0]);
   checkMachineType(o[1]);
@@ -2136,14 +2136,14 @@
   buildCounterMachineTypesScopedListWarningData--;
 }
 
-buildUnnamed883() {
+buildUnnamed911() {
   var o = new core.List<api.MachineTypesScopedListWarningData>();
   o.add(buildMachineTypesScopedListWarningData());
   o.add(buildMachineTypesScopedListWarningData());
   return o;
 }
 
-checkUnnamed883(core.List<api.MachineTypesScopedListWarningData> o) {
+checkUnnamed911(core.List<api.MachineTypesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMachineTypesScopedListWarningData(o[0]);
   checkMachineTypesScopedListWarningData(o[1]);
@@ -2155,7 +2155,7 @@
   buildCounterMachineTypesScopedListWarning++;
   if (buildCounterMachineTypesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed883();
+    o.data = buildUnnamed911();
     o.message = "foo";
   }
   buildCounterMachineTypesScopedListWarning--;
@@ -2166,7 +2166,7 @@
   buildCounterMachineTypesScopedListWarning++;
   if (buildCounterMachineTypesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed883(o.data);
+    checkUnnamed911(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterMachineTypesScopedListWarning--;
@@ -2177,7 +2177,7 @@
   var o = new api.MachineTypesScopedList();
   buildCounterMachineTypesScopedList++;
   if (buildCounterMachineTypesScopedList < 3) {
-    o.machineTypes = buildUnnamed882();
+    o.machineTypes = buildUnnamed910();
     o.warning = buildMachineTypesScopedListWarning();
   }
   buildCounterMachineTypesScopedList--;
@@ -2187,7 +2187,7 @@
 checkMachineTypesScopedList(api.MachineTypesScopedList o) {
   buildCounterMachineTypesScopedList++;
   if (buildCounterMachineTypesScopedList < 3) {
-    checkUnnamed882(o.machineTypes);
+    checkUnnamed910(o.machineTypes);
     checkMachineTypesScopedListWarning(o.warning);
   }
   buildCounterMachineTypesScopedList--;
@@ -2214,14 +2214,14 @@
   buildCounterMetadataItems--;
 }
 
-buildUnnamed884() {
+buildUnnamed912() {
   var o = new core.List<api.MetadataItems>();
   o.add(buildMetadataItems());
   o.add(buildMetadataItems());
   return o;
 }
 
-checkUnnamed884(core.List<api.MetadataItems> o) {
+checkUnnamed912(core.List<api.MetadataItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetadataItems(o[0]);
   checkMetadataItems(o[1]);
@@ -2233,7 +2233,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     o.fingerprint = "foo";
-    o.items = buildUnnamed884();
+    o.items = buildUnnamed912();
     o.kind = "foo";
   }
   buildCounterMetadata--;
@@ -2244,7 +2244,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed884(o.items);
+    checkUnnamed912(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterMetadata--;
@@ -2283,14 +2283,14 @@
   buildCounterNetwork--;
 }
 
-buildUnnamed885() {
+buildUnnamed913() {
   var o = new core.List<api.AccessConfig>();
   o.add(buildAccessConfig());
   o.add(buildAccessConfig());
   return o;
 }
 
-checkUnnamed885(core.List<api.AccessConfig> o) {
+checkUnnamed913(core.List<api.AccessConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccessConfig(o[0]);
   checkAccessConfig(o[1]);
@@ -2301,7 +2301,7 @@
   var o = new api.NetworkInterface();
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    o.accessConfigs = buildUnnamed885();
+    o.accessConfigs = buildUnnamed913();
     o.name = "foo";
     o.network = "foo";
     o.networkIP = "foo";
@@ -2313,7 +2313,7 @@
 checkNetworkInterface(api.NetworkInterface o) {
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    checkUnnamed885(o.accessConfigs);
+    checkUnnamed913(o.accessConfigs);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.networkIP, unittest.equals('foo'));
@@ -2321,14 +2321,14 @@
   buildCounterNetworkInterface--;
 }
 
-buildUnnamed886() {
+buildUnnamed914() {
   var o = new core.List<api.Network>();
   o.add(buildNetwork());
   o.add(buildNetwork());
   return o;
 }
 
-checkUnnamed886(core.List<api.Network> o) {
+checkUnnamed914(core.List<api.Network> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetwork(o[0]);
   checkNetwork(o[1]);
@@ -2340,7 +2340,7 @@
   buildCounterNetworkList++;
   if (buildCounterNetworkList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed886();
+    o.items = buildUnnamed914();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2353,7 +2353,7 @@
   buildCounterNetworkList++;
   if (buildCounterNetworkList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed886(o.items);
+    checkUnnamed914(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2384,14 +2384,14 @@
   buildCounterOperationErrorErrors--;
 }
 
-buildUnnamed887() {
+buildUnnamed915() {
   var o = new core.List<api.OperationErrorErrors>();
   o.add(buildOperationErrorErrors());
   o.add(buildOperationErrorErrors());
   return o;
 }
 
-checkUnnamed887(core.List<api.OperationErrorErrors> o) {
+checkUnnamed915(core.List<api.OperationErrorErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationErrorErrors(o[0]);
   checkOperationErrorErrors(o[1]);
@@ -2402,7 +2402,7 @@
   var o = new api.OperationError();
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    o.errors = buildUnnamed887();
+    o.errors = buildUnnamed915();
   }
   buildCounterOperationError--;
   return o;
@@ -2411,7 +2411,7 @@
 checkOperationError(api.OperationError o) {
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    checkUnnamed887(o.errors);
+    checkUnnamed915(o.errors);
   }
   buildCounterOperationError--;
 }
@@ -2437,14 +2437,14 @@
   buildCounterOperationWarningsData--;
 }
 
-buildUnnamed888() {
+buildUnnamed916() {
   var o = new core.List<api.OperationWarningsData>();
   o.add(buildOperationWarningsData());
   o.add(buildOperationWarningsData());
   return o;
 }
 
-checkUnnamed888(core.List<api.OperationWarningsData> o) {
+checkUnnamed916(core.List<api.OperationWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarningsData(o[0]);
   checkOperationWarningsData(o[1]);
@@ -2456,7 +2456,7 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed888();
+    o.data = buildUnnamed916();
     o.message = "foo";
   }
   buildCounterOperationWarnings--;
@@ -2467,20 +2467,20 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed888(o.data);
+    checkUnnamed916(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationWarnings--;
 }
 
-buildUnnamed889() {
+buildUnnamed917() {
   var o = new core.List<api.OperationWarnings>();
   o.add(buildOperationWarnings());
   o.add(buildOperationWarnings());
   return o;
 }
 
-checkUnnamed889(core.List<api.OperationWarnings> o) {
+checkUnnamed917(core.List<api.OperationWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarnings(o[0]);
   checkOperationWarnings(o[1]);
@@ -2511,7 +2511,7 @@
     o.targetId = "foo";
     o.targetLink = "foo";
     o.user = "foo";
-    o.warnings = buildUnnamed889();
+    o.warnings = buildUnnamed917();
     o.zone = "foo";
   }
   buildCounterOperation--;
@@ -2541,20 +2541,20 @@
     unittest.expect(o.targetId, unittest.equals('foo'));
     unittest.expect(o.targetLink, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed889(o.warnings);
+    checkUnnamed917(o.warnings);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterOperation--;
 }
 
-buildUnnamed890() {
+buildUnnamed918() {
   var o = new core.Map<core.String, api.OperationsScopedList>();
   o["x"] = buildOperationsScopedList();
   o["y"] = buildOperationsScopedList();
   return o;
 }
 
-checkUnnamed890(core.Map<core.String, api.OperationsScopedList> o) {
+checkUnnamed918(core.Map<core.String, api.OperationsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationsScopedList(o["x"]);
   checkOperationsScopedList(o["y"]);
@@ -2566,7 +2566,7 @@
   buildCounterOperationAggregatedList++;
   if (buildCounterOperationAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed890();
+    o.items = buildUnnamed918();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2579,7 +2579,7 @@
   buildCounterOperationAggregatedList++;
   if (buildCounterOperationAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed890(o.items);
+    checkUnnamed918(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2587,14 +2587,14 @@
   buildCounterOperationAggregatedList--;
 }
 
-buildUnnamed891() {
+buildUnnamed919() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed891(core.List<api.Operation> o) {
+checkUnnamed919(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -2606,7 +2606,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed891();
+    o.items = buildUnnamed919();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2619,7 +2619,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed891(o.items);
+    checkUnnamed919(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2627,14 +2627,14 @@
   buildCounterOperationList--;
 }
 
-buildUnnamed892() {
+buildUnnamed920() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed892(core.List<api.Operation> o) {
+checkUnnamed920(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -2661,14 +2661,14 @@
   buildCounterOperationsScopedListWarningData--;
 }
 
-buildUnnamed893() {
+buildUnnamed921() {
   var o = new core.List<api.OperationsScopedListWarningData>();
   o.add(buildOperationsScopedListWarningData());
   o.add(buildOperationsScopedListWarningData());
   return o;
 }
 
-checkUnnamed893(core.List<api.OperationsScopedListWarningData> o) {
+checkUnnamed921(core.List<api.OperationsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationsScopedListWarningData(o[0]);
   checkOperationsScopedListWarningData(o[1]);
@@ -2680,7 +2680,7 @@
   buildCounterOperationsScopedListWarning++;
   if (buildCounterOperationsScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed893();
+    o.data = buildUnnamed921();
     o.message = "foo";
   }
   buildCounterOperationsScopedListWarning--;
@@ -2691,7 +2691,7 @@
   buildCounterOperationsScopedListWarning++;
   if (buildCounterOperationsScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed893(o.data);
+    checkUnnamed921(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationsScopedListWarning--;
@@ -2702,7 +2702,7 @@
   var o = new api.OperationsScopedList();
   buildCounterOperationsScopedList++;
   if (buildCounterOperationsScopedList < 3) {
-    o.operations = buildUnnamed892();
+    o.operations = buildUnnamed920();
     o.warning = buildOperationsScopedListWarning();
   }
   buildCounterOperationsScopedList--;
@@ -2712,20 +2712,20 @@
 checkOperationsScopedList(api.OperationsScopedList o) {
   buildCounterOperationsScopedList++;
   if (buildCounterOperationsScopedList < 3) {
-    checkUnnamed892(o.operations);
+    checkUnnamed920(o.operations);
     checkOperationsScopedListWarning(o.warning);
   }
   buildCounterOperationsScopedList--;
 }
 
-buildUnnamed894() {
+buildUnnamed922() {
   var o = new core.List<api.PathRule>();
   o.add(buildPathRule());
   o.add(buildPathRule());
   return o;
 }
 
-checkUnnamed894(core.List<api.PathRule> o) {
+checkUnnamed922(core.List<api.PathRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPathRule(o[0]);
   checkPathRule(o[1]);
@@ -2739,7 +2739,7 @@
     o.defaultService = "foo";
     o.description = "foo";
     o.name = "foo";
-    o.pathRules = buildUnnamed894();
+    o.pathRules = buildUnnamed922();
   }
   buildCounterPathMatcher--;
   return o;
@@ -2751,19 +2751,19 @@
     unittest.expect(o.defaultService, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed894(o.pathRules);
+    checkUnnamed922(o.pathRules);
   }
   buildCounterPathMatcher--;
 }
 
-buildUnnamed895() {
+buildUnnamed923() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed895(core.List<core.String> o) {
+checkUnnamed923(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2774,7 +2774,7 @@
   var o = new api.PathRule();
   buildCounterPathRule++;
   if (buildCounterPathRule < 3) {
-    o.paths = buildUnnamed895();
+    o.paths = buildUnnamed923();
     o.service = "foo";
   }
   buildCounterPathRule--;
@@ -2784,20 +2784,20 @@
 checkPathRule(api.PathRule o) {
   buildCounterPathRule++;
   if (buildCounterPathRule < 3) {
-    checkUnnamed895(o.paths);
+    checkUnnamed923(o.paths);
     unittest.expect(o.service, unittest.equals('foo'));
   }
   buildCounterPathRule--;
 }
 
-buildUnnamed896() {
+buildUnnamed924() {
   var o = new core.List<api.Quota>();
   o.add(buildQuota());
   o.add(buildQuota());
   return o;
 }
 
-checkUnnamed896(core.List<api.Quota> o) {
+checkUnnamed924(core.List<api.Quota> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuota(o[0]);
   checkQuota(o[1]);
@@ -2814,7 +2814,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.quotas = buildUnnamed896();
+    o.quotas = buildUnnamed924();
     o.selfLink = "foo";
     o.usageExportLocation = buildUsageExportLocation();
   }
@@ -2831,7 +2831,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed896(o.quotas);
+    checkUnnamed924(o.quotas);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUsageExportLocation(o.usageExportLocation);
   }
@@ -2861,27 +2861,27 @@
   buildCounterQuota--;
 }
 
-buildUnnamed897() {
+buildUnnamed925() {
   var o = new core.List<api.Quota>();
   o.add(buildQuota());
   o.add(buildQuota());
   return o;
 }
 
-checkUnnamed897(core.List<api.Quota> o) {
+checkUnnamed925(core.List<api.Quota> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuota(o[0]);
   checkQuota(o[1]);
 }
 
-buildUnnamed898() {
+buildUnnamed926() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed898(core.List<core.String> o) {
+checkUnnamed926(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2898,10 +2898,10 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.quotas = buildUnnamed897();
+    o.quotas = buildUnnamed925();
     o.selfLink = "foo";
     o.status = "foo";
-    o.zones = buildUnnamed898();
+    o.zones = buildUnnamed926();
   }
   buildCounterRegion--;
   return o;
@@ -2916,22 +2916,22 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed897(o.quotas);
+    checkUnnamed925(o.quotas);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed898(o.zones);
+    checkUnnamed926(o.zones);
   }
   buildCounterRegion--;
 }
 
-buildUnnamed899() {
+buildUnnamed927() {
   var o = new core.List<api.Region>();
   o.add(buildRegion());
   o.add(buildRegion());
   return o;
 }
 
-checkUnnamed899(core.List<api.Region> o) {
+checkUnnamed927(core.List<api.Region> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRegion(o[0]);
   checkRegion(o[1]);
@@ -2943,7 +2943,7 @@
   buildCounterRegionList++;
   if (buildCounterRegionList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed899();
+    o.items = buildUnnamed927();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -2956,7 +2956,7 @@
   buildCounterRegionList++;
   if (buildCounterRegionList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed899(o.items);
+    checkUnnamed927(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -2983,14 +2983,14 @@
   buildCounterResourceGroupReference--;
 }
 
-buildUnnamed900() {
+buildUnnamed928() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed900(core.List<core.String> o) {
+checkUnnamed928(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3017,14 +3017,14 @@
   buildCounterRouteWarningsData--;
 }
 
-buildUnnamed901() {
+buildUnnamed929() {
   var o = new core.List<api.RouteWarningsData>();
   o.add(buildRouteWarningsData());
   o.add(buildRouteWarningsData());
   return o;
 }
 
-checkUnnamed901(core.List<api.RouteWarningsData> o) {
+checkUnnamed929(core.List<api.RouteWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouteWarningsData(o[0]);
   checkRouteWarningsData(o[1]);
@@ -3036,7 +3036,7 @@
   buildCounterRouteWarnings++;
   if (buildCounterRouteWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed901();
+    o.data = buildUnnamed929();
     o.message = "foo";
   }
   buildCounterRouteWarnings--;
@@ -3047,20 +3047,20 @@
   buildCounterRouteWarnings++;
   if (buildCounterRouteWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed901(o.data);
+    checkUnnamed929(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterRouteWarnings--;
 }
 
-buildUnnamed902() {
+buildUnnamed930() {
   var o = new core.List<api.RouteWarnings>();
   o.add(buildRouteWarnings());
   o.add(buildRouteWarnings());
   return o;
 }
 
-checkUnnamed902(core.List<api.RouteWarnings> o) {
+checkUnnamed930(core.List<api.RouteWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRouteWarnings(o[0]);
   checkRouteWarnings(o[1]);
@@ -3084,8 +3084,8 @@
     o.nextHopNetwork = "foo";
     o.priority = 42;
     o.selfLink = "foo";
-    o.tags = buildUnnamed900();
-    o.warnings = buildUnnamed902();
+    o.tags = buildUnnamed928();
+    o.warnings = buildUnnamed930();
   }
   buildCounterRoute--;
   return o;
@@ -3107,20 +3107,20 @@
     unittest.expect(o.nextHopNetwork, unittest.equals('foo'));
     unittest.expect(o.priority, unittest.equals(42));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed900(o.tags);
-    checkUnnamed902(o.warnings);
+    checkUnnamed928(o.tags);
+    checkUnnamed930(o.warnings);
   }
   buildCounterRoute--;
 }
 
-buildUnnamed903() {
+buildUnnamed931() {
   var o = new core.List<api.Route>();
   o.add(buildRoute());
   o.add(buildRoute());
   return o;
 }
 
-checkUnnamed903(core.List<api.Route> o) {
+checkUnnamed931(core.List<api.Route> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRoute(o[0]);
   checkRoute(o[1]);
@@ -3132,7 +3132,7 @@
   buildCounterRouteList++;
   if (buildCounterRouteList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed903();
+    o.items = buildUnnamed931();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3145,7 +3145,7 @@
   buildCounterRouteList++;
   if (buildCounterRouteList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed903(o.items);
+    checkUnnamed931(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3197,14 +3197,14 @@
   buildCounterSerialPortOutput--;
 }
 
-buildUnnamed904() {
+buildUnnamed932() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed904(core.List<core.String> o) {
+checkUnnamed932(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3216,7 +3216,7 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     o.email = "foo";
-    o.scopes = buildUnnamed904();
+    o.scopes = buildUnnamed932();
   }
   buildCounterServiceAccount--;
   return o;
@@ -3226,19 +3226,19 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     unittest.expect(o.email, unittest.equals('foo'));
-    checkUnnamed904(o.scopes);
+    checkUnnamed932(o.scopes);
   }
   buildCounterServiceAccount--;
 }
 
-buildUnnamed905() {
+buildUnnamed933() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed905(core.List<core.String> o) {
+checkUnnamed933(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3254,7 +3254,7 @@
     o.diskSizeGb = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.licenses = buildUnnamed905();
+    o.licenses = buildUnnamed933();
     o.name = "foo";
     o.selfLink = "foo";
     o.sourceDisk = "foo";
@@ -3275,7 +3275,7 @@
     unittest.expect(o.diskSizeGb, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed905(o.licenses);
+    checkUnnamed933(o.licenses);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.sourceDisk, unittest.equals('foo'));
@@ -3287,14 +3287,14 @@
   buildCounterSnapshot--;
 }
 
-buildUnnamed906() {
+buildUnnamed934() {
   var o = new core.List<api.Snapshot>();
   o.add(buildSnapshot());
   o.add(buildSnapshot());
   return o;
 }
 
-checkUnnamed906(core.List<api.Snapshot> o) {
+checkUnnamed934(core.List<api.Snapshot> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSnapshot(o[0]);
   checkSnapshot(o[1]);
@@ -3306,7 +3306,7 @@
   buildCounterSnapshotList++;
   if (buildCounterSnapshotList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed906();
+    o.items = buildUnnamed934();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3319,7 +3319,7 @@
   buildCounterSnapshotList++;
   if (buildCounterSnapshotList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed906(o.items);
+    checkUnnamed934(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3327,14 +3327,14 @@
   buildCounterSnapshotList--;
 }
 
-buildUnnamed907() {
+buildUnnamed935() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed907(core.List<core.String> o) {
+checkUnnamed935(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3346,7 +3346,7 @@
   buildCounterTags++;
   if (buildCounterTags < 3) {
     o.fingerprint = "foo";
-    o.items = buildUnnamed907();
+    o.items = buildUnnamed935();
   }
   buildCounterTags--;
   return o;
@@ -3356,7 +3356,7 @@
   buildCounterTags++;
   if (buildCounterTags < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed907(o.items);
+    checkUnnamed935(o.items);
   }
   buildCounterTags--;
 }
@@ -3392,14 +3392,14 @@
   buildCounterTargetHttpProxy--;
 }
 
-buildUnnamed908() {
+buildUnnamed936() {
   var o = new core.List<api.TargetHttpProxy>();
   o.add(buildTargetHttpProxy());
   o.add(buildTargetHttpProxy());
   return o;
 }
 
-checkUnnamed908(core.List<api.TargetHttpProxy> o) {
+checkUnnamed936(core.List<api.TargetHttpProxy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetHttpProxy(o[0]);
   checkTargetHttpProxy(o[1]);
@@ -3411,7 +3411,7 @@
   buildCounterTargetHttpProxyList++;
   if (buildCounterTargetHttpProxyList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed908();
+    o.items = buildUnnamed936();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3424,7 +3424,7 @@
   buildCounterTargetHttpProxyList++;
   if (buildCounterTargetHttpProxyList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed908(o.items);
+    checkUnnamed936(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3467,14 +3467,14 @@
   buildCounterTargetInstance--;
 }
 
-buildUnnamed909() {
+buildUnnamed937() {
   var o = new core.Map<core.String, api.TargetInstancesScopedList>();
   o["x"] = buildTargetInstancesScopedList();
   o["y"] = buildTargetInstancesScopedList();
   return o;
 }
 
-checkUnnamed909(core.Map<core.String, api.TargetInstancesScopedList> o) {
+checkUnnamed937(core.Map<core.String, api.TargetInstancesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstancesScopedList(o["x"]);
   checkTargetInstancesScopedList(o["y"]);
@@ -3486,7 +3486,7 @@
   buildCounterTargetInstanceAggregatedList++;
   if (buildCounterTargetInstanceAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed909();
+    o.items = buildUnnamed937();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3499,7 +3499,7 @@
   buildCounterTargetInstanceAggregatedList++;
   if (buildCounterTargetInstanceAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed909(o.items);
+    checkUnnamed937(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3507,14 +3507,14 @@
   buildCounterTargetInstanceAggregatedList--;
 }
 
-buildUnnamed910() {
+buildUnnamed938() {
   var o = new core.List<api.TargetInstance>();
   o.add(buildTargetInstance());
   o.add(buildTargetInstance());
   return o;
 }
 
-checkUnnamed910(core.List<api.TargetInstance> o) {
+checkUnnamed938(core.List<api.TargetInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstance(o[0]);
   checkTargetInstance(o[1]);
@@ -3526,7 +3526,7 @@
   buildCounterTargetInstanceList++;
   if (buildCounterTargetInstanceList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed910();
+    o.items = buildUnnamed938();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3539,7 +3539,7 @@
   buildCounterTargetInstanceList++;
   if (buildCounterTargetInstanceList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed910(o.items);
+    checkUnnamed938(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3547,14 +3547,14 @@
   buildCounterTargetInstanceList--;
 }
 
-buildUnnamed911() {
+buildUnnamed939() {
   var o = new core.List<api.TargetInstance>();
   o.add(buildTargetInstance());
   o.add(buildTargetInstance());
   return o;
 }
 
-checkUnnamed911(core.List<api.TargetInstance> o) {
+checkUnnamed939(core.List<api.TargetInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstance(o[0]);
   checkTargetInstance(o[1]);
@@ -3581,14 +3581,14 @@
   buildCounterTargetInstancesScopedListWarningData--;
 }
 
-buildUnnamed912() {
+buildUnnamed940() {
   var o = new core.List<api.TargetInstancesScopedListWarningData>();
   o.add(buildTargetInstancesScopedListWarningData());
   o.add(buildTargetInstancesScopedListWarningData());
   return o;
 }
 
-checkUnnamed912(core.List<api.TargetInstancesScopedListWarningData> o) {
+checkUnnamed940(core.List<api.TargetInstancesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetInstancesScopedListWarningData(o[0]);
   checkTargetInstancesScopedListWarningData(o[1]);
@@ -3600,7 +3600,7 @@
   buildCounterTargetInstancesScopedListWarning++;
   if (buildCounterTargetInstancesScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed912();
+    o.data = buildUnnamed940();
     o.message = "foo";
   }
   buildCounterTargetInstancesScopedListWarning--;
@@ -3611,7 +3611,7 @@
   buildCounterTargetInstancesScopedListWarning++;
   if (buildCounterTargetInstancesScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed912(o.data);
+    checkUnnamed940(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetInstancesScopedListWarning--;
@@ -3622,7 +3622,7 @@
   var o = new api.TargetInstancesScopedList();
   buildCounterTargetInstancesScopedList++;
   if (buildCounterTargetInstancesScopedList < 3) {
-    o.targetInstances = buildUnnamed911();
+    o.targetInstances = buildUnnamed939();
     o.warning = buildTargetInstancesScopedListWarning();
   }
   buildCounterTargetInstancesScopedList--;
@@ -3632,33 +3632,33 @@
 checkTargetInstancesScopedList(api.TargetInstancesScopedList o) {
   buildCounterTargetInstancesScopedList++;
   if (buildCounterTargetInstancesScopedList < 3) {
-    checkUnnamed911(o.targetInstances);
+    checkUnnamed939(o.targetInstances);
     checkTargetInstancesScopedListWarning(o.warning);
   }
   buildCounterTargetInstancesScopedList--;
 }
 
-buildUnnamed913() {
+buildUnnamed941() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed913(core.List<core.String> o) {
+checkUnnamed941(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed914() {
+buildUnnamed942() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed914(core.List<core.String> o) {
+checkUnnamed942(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3673,9 +3673,9 @@
     o.creationTimestamp = "foo";
     o.description = "foo";
     o.failoverRatio = 42.0;
-    o.healthChecks = buildUnnamed913();
+    o.healthChecks = buildUnnamed941();
     o.id = "foo";
-    o.instances = buildUnnamed914();
+    o.instances = buildUnnamed942();
     o.kind = "foo";
     o.name = "foo";
     o.region = "foo";
@@ -3693,9 +3693,9 @@
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.failoverRatio, unittest.equals(42.0));
-    checkUnnamed913(o.healthChecks);
+    checkUnnamed941(o.healthChecks);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed914(o.instances);
+    checkUnnamed942(o.instances);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
@@ -3705,14 +3705,14 @@
   buildCounterTargetPool--;
 }
 
-buildUnnamed915() {
+buildUnnamed943() {
   var o = new core.Map<core.String, api.TargetPoolsScopedList>();
   o["x"] = buildTargetPoolsScopedList();
   o["y"] = buildTargetPoolsScopedList();
   return o;
 }
 
-checkUnnamed915(core.Map<core.String, api.TargetPoolsScopedList> o) {
+checkUnnamed943(core.Map<core.String, api.TargetPoolsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPoolsScopedList(o["x"]);
   checkTargetPoolsScopedList(o["y"]);
@@ -3724,7 +3724,7 @@
   buildCounterTargetPoolAggregatedList++;
   if (buildCounterTargetPoolAggregatedList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed915();
+    o.items = buildUnnamed943();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3737,7 +3737,7 @@
   buildCounterTargetPoolAggregatedList++;
   if (buildCounterTargetPoolAggregatedList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed915(o.items);
+    checkUnnamed943(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3745,14 +3745,14 @@
   buildCounterTargetPoolAggregatedList--;
 }
 
-buildUnnamed916() {
+buildUnnamed944() {
   var o = new core.List<api.HealthStatus>();
   o.add(buildHealthStatus());
   o.add(buildHealthStatus());
   return o;
 }
 
-checkUnnamed916(core.List<api.HealthStatus> o) {
+checkUnnamed944(core.List<api.HealthStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthStatus(o[0]);
   checkHealthStatus(o[1]);
@@ -3763,7 +3763,7 @@
   var o = new api.TargetPoolInstanceHealth();
   buildCounterTargetPoolInstanceHealth++;
   if (buildCounterTargetPoolInstanceHealth < 3) {
-    o.healthStatus = buildUnnamed916();
+    o.healthStatus = buildUnnamed944();
     o.kind = "foo";
   }
   buildCounterTargetPoolInstanceHealth--;
@@ -3773,20 +3773,20 @@
 checkTargetPoolInstanceHealth(api.TargetPoolInstanceHealth o) {
   buildCounterTargetPoolInstanceHealth++;
   if (buildCounterTargetPoolInstanceHealth < 3) {
-    checkUnnamed916(o.healthStatus);
+    checkUnnamed944(o.healthStatus);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTargetPoolInstanceHealth--;
 }
 
-buildUnnamed917() {
+buildUnnamed945() {
   var o = new core.List<api.TargetPool>();
   o.add(buildTargetPool());
   o.add(buildTargetPool());
   return o;
 }
 
-checkUnnamed917(core.List<api.TargetPool> o) {
+checkUnnamed945(core.List<api.TargetPool> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPool(o[0]);
   checkTargetPool(o[1]);
@@ -3798,7 +3798,7 @@
   buildCounterTargetPoolList++;
   if (buildCounterTargetPoolList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed917();
+    o.items = buildUnnamed945();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -3811,7 +3811,7 @@
   buildCounterTargetPoolList++;
   if (buildCounterTargetPoolList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed917(o.items);
+    checkUnnamed945(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -3819,14 +3819,14 @@
   buildCounterTargetPoolList--;
 }
 
-buildUnnamed918() {
+buildUnnamed946() {
   var o = new core.List<api.HealthCheckReference>();
   o.add(buildHealthCheckReference());
   o.add(buildHealthCheckReference());
   return o;
 }
 
-checkUnnamed918(core.List<api.HealthCheckReference> o) {
+checkUnnamed946(core.List<api.HealthCheckReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthCheckReference(o[0]);
   checkHealthCheckReference(o[1]);
@@ -3837,7 +3837,7 @@
   var o = new api.TargetPoolsAddHealthCheckRequest();
   buildCounterTargetPoolsAddHealthCheckRequest++;
   if (buildCounterTargetPoolsAddHealthCheckRequest < 3) {
-    o.healthChecks = buildUnnamed918();
+    o.healthChecks = buildUnnamed946();
   }
   buildCounterTargetPoolsAddHealthCheckRequest--;
   return o;
@@ -3846,19 +3846,19 @@
 checkTargetPoolsAddHealthCheckRequest(api.TargetPoolsAddHealthCheckRequest o) {
   buildCounterTargetPoolsAddHealthCheckRequest++;
   if (buildCounterTargetPoolsAddHealthCheckRequest < 3) {
-    checkUnnamed918(o.healthChecks);
+    checkUnnamed946(o.healthChecks);
   }
   buildCounterTargetPoolsAddHealthCheckRequest--;
 }
 
-buildUnnamed919() {
+buildUnnamed947() {
   var o = new core.List<api.InstanceReference>();
   o.add(buildInstanceReference());
   o.add(buildInstanceReference());
   return o;
 }
 
-checkUnnamed919(core.List<api.InstanceReference> o) {
+checkUnnamed947(core.List<api.InstanceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceReference(o[0]);
   checkInstanceReference(o[1]);
@@ -3869,7 +3869,7 @@
   var o = new api.TargetPoolsAddInstanceRequest();
   buildCounterTargetPoolsAddInstanceRequest++;
   if (buildCounterTargetPoolsAddInstanceRequest < 3) {
-    o.instances = buildUnnamed919();
+    o.instances = buildUnnamed947();
   }
   buildCounterTargetPoolsAddInstanceRequest--;
   return o;
@@ -3878,19 +3878,19 @@
 checkTargetPoolsAddInstanceRequest(api.TargetPoolsAddInstanceRequest o) {
   buildCounterTargetPoolsAddInstanceRequest++;
   if (buildCounterTargetPoolsAddInstanceRequest < 3) {
-    checkUnnamed919(o.instances);
+    checkUnnamed947(o.instances);
   }
   buildCounterTargetPoolsAddInstanceRequest--;
 }
 
-buildUnnamed920() {
+buildUnnamed948() {
   var o = new core.List<api.HealthCheckReference>();
   o.add(buildHealthCheckReference());
   o.add(buildHealthCheckReference());
   return o;
 }
 
-checkUnnamed920(core.List<api.HealthCheckReference> o) {
+checkUnnamed948(core.List<api.HealthCheckReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthCheckReference(o[0]);
   checkHealthCheckReference(o[1]);
@@ -3901,7 +3901,7 @@
   var o = new api.TargetPoolsRemoveHealthCheckRequest();
   buildCounterTargetPoolsRemoveHealthCheckRequest++;
   if (buildCounterTargetPoolsRemoveHealthCheckRequest < 3) {
-    o.healthChecks = buildUnnamed920();
+    o.healthChecks = buildUnnamed948();
   }
   buildCounterTargetPoolsRemoveHealthCheckRequest--;
   return o;
@@ -3910,19 +3910,19 @@
 checkTargetPoolsRemoveHealthCheckRequest(api.TargetPoolsRemoveHealthCheckRequest o) {
   buildCounterTargetPoolsRemoveHealthCheckRequest++;
   if (buildCounterTargetPoolsRemoveHealthCheckRequest < 3) {
-    checkUnnamed920(o.healthChecks);
+    checkUnnamed948(o.healthChecks);
   }
   buildCounterTargetPoolsRemoveHealthCheckRequest--;
 }
 
-buildUnnamed921() {
+buildUnnamed949() {
   var o = new core.List<api.InstanceReference>();
   o.add(buildInstanceReference());
   o.add(buildInstanceReference());
   return o;
 }
 
-checkUnnamed921(core.List<api.InstanceReference> o) {
+checkUnnamed949(core.List<api.InstanceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceReference(o[0]);
   checkInstanceReference(o[1]);
@@ -3933,7 +3933,7 @@
   var o = new api.TargetPoolsRemoveInstanceRequest();
   buildCounterTargetPoolsRemoveInstanceRequest++;
   if (buildCounterTargetPoolsRemoveInstanceRequest < 3) {
-    o.instances = buildUnnamed921();
+    o.instances = buildUnnamed949();
   }
   buildCounterTargetPoolsRemoveInstanceRequest--;
   return o;
@@ -3942,19 +3942,19 @@
 checkTargetPoolsRemoveInstanceRequest(api.TargetPoolsRemoveInstanceRequest o) {
   buildCounterTargetPoolsRemoveInstanceRequest++;
   if (buildCounterTargetPoolsRemoveInstanceRequest < 3) {
-    checkUnnamed921(o.instances);
+    checkUnnamed949(o.instances);
   }
   buildCounterTargetPoolsRemoveInstanceRequest--;
 }
 
-buildUnnamed922() {
+buildUnnamed950() {
   var o = new core.List<api.TargetPool>();
   o.add(buildTargetPool());
   o.add(buildTargetPool());
   return o;
 }
 
-checkUnnamed922(core.List<api.TargetPool> o) {
+checkUnnamed950(core.List<api.TargetPool> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPool(o[0]);
   checkTargetPool(o[1]);
@@ -3981,14 +3981,14 @@
   buildCounterTargetPoolsScopedListWarningData--;
 }
 
-buildUnnamed923() {
+buildUnnamed951() {
   var o = new core.List<api.TargetPoolsScopedListWarningData>();
   o.add(buildTargetPoolsScopedListWarningData());
   o.add(buildTargetPoolsScopedListWarningData());
   return o;
 }
 
-checkUnnamed923(core.List<api.TargetPoolsScopedListWarningData> o) {
+checkUnnamed951(core.List<api.TargetPoolsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTargetPoolsScopedListWarningData(o[0]);
   checkTargetPoolsScopedListWarningData(o[1]);
@@ -4000,7 +4000,7 @@
   buildCounterTargetPoolsScopedListWarning++;
   if (buildCounterTargetPoolsScopedListWarning < 3) {
     o.code = "foo";
-    o.data = buildUnnamed923();
+    o.data = buildUnnamed951();
     o.message = "foo";
   }
   buildCounterTargetPoolsScopedListWarning--;
@@ -4011,7 +4011,7 @@
   buildCounterTargetPoolsScopedListWarning++;
   if (buildCounterTargetPoolsScopedListWarning < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed923(o.data);
+    checkUnnamed951(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterTargetPoolsScopedListWarning--;
@@ -4022,7 +4022,7 @@
   var o = new api.TargetPoolsScopedList();
   buildCounterTargetPoolsScopedList++;
   if (buildCounterTargetPoolsScopedList < 3) {
-    o.targetPools = buildUnnamed922();
+    o.targetPools = buildUnnamed950();
     o.warning = buildTargetPoolsScopedListWarning();
   }
   buildCounterTargetPoolsScopedList--;
@@ -4032,7 +4032,7 @@
 checkTargetPoolsScopedList(api.TargetPoolsScopedList o) {
   buildCounterTargetPoolsScopedList++;
   if (buildCounterTargetPoolsScopedList < 3) {
-    checkUnnamed922(o.targetPools);
+    checkUnnamed950(o.targetPools);
     checkTargetPoolsScopedListWarning(o.warning);
   }
   buildCounterTargetPoolsScopedList--;
@@ -4082,40 +4082,40 @@
   buildCounterTestFailure--;
 }
 
-buildUnnamed924() {
+buildUnnamed952() {
   var o = new core.List<api.HostRule>();
   o.add(buildHostRule());
   o.add(buildHostRule());
   return o;
 }
 
-checkUnnamed924(core.List<api.HostRule> o) {
+checkUnnamed952(core.List<api.HostRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHostRule(o[0]);
   checkHostRule(o[1]);
 }
 
-buildUnnamed925() {
+buildUnnamed953() {
   var o = new core.List<api.PathMatcher>();
   o.add(buildPathMatcher());
   o.add(buildPathMatcher());
   return o;
 }
 
-checkUnnamed925(core.List<api.PathMatcher> o) {
+checkUnnamed953(core.List<api.PathMatcher> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPathMatcher(o[0]);
   checkPathMatcher(o[1]);
 }
 
-buildUnnamed926() {
+buildUnnamed954() {
   var o = new core.List<api.UrlMapTest>();
   o.add(buildUrlMapTest());
   o.add(buildUrlMapTest());
   return o;
 }
 
-checkUnnamed926(core.List<api.UrlMapTest> o) {
+checkUnnamed954(core.List<api.UrlMapTest> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlMapTest(o[0]);
   checkUrlMapTest(o[1]);
@@ -4130,13 +4130,13 @@
     o.defaultService = "foo";
     o.description = "foo";
     o.fingerprint = "foo";
-    o.hostRules = buildUnnamed924();
+    o.hostRules = buildUnnamed952();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.pathMatchers = buildUnnamed925();
+    o.pathMatchers = buildUnnamed953();
     o.selfLink = "foo";
-    o.tests = buildUnnamed926();
+    o.tests = buildUnnamed954();
   }
   buildCounterUrlMap--;
   return o;
@@ -4149,25 +4149,25 @@
     unittest.expect(o.defaultService, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkUnnamed924(o.hostRules);
+    checkUnnamed952(o.hostRules);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed925(o.pathMatchers);
+    checkUnnamed953(o.pathMatchers);
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUnnamed926(o.tests);
+    checkUnnamed954(o.tests);
   }
   buildCounterUrlMap--;
 }
 
-buildUnnamed927() {
+buildUnnamed955() {
   var o = new core.List<api.UrlMap>();
   o.add(buildUrlMap());
   o.add(buildUrlMap());
   return o;
 }
 
-checkUnnamed927(core.List<api.UrlMap> o) {
+checkUnnamed955(core.List<api.UrlMap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrlMap(o[0]);
   checkUrlMap(o[1]);
@@ -4179,7 +4179,7 @@
   buildCounterUrlMapList++;
   if (buildCounterUrlMapList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed927();
+    o.items = buildUnnamed955();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -4192,7 +4192,7 @@
   buildCounterUrlMapList++;
   if (buildCounterUrlMapList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed927(o.items);
+    checkUnnamed955(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -4244,27 +4244,27 @@
   buildCounterUrlMapTest--;
 }
 
-buildUnnamed928() {
+buildUnnamed956() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed928(core.List<core.String> o) {
+checkUnnamed956(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed929() {
+buildUnnamed957() {
   var o = new core.List<api.TestFailure>();
   o.add(buildTestFailure());
   o.add(buildTestFailure());
   return o;
 }
 
-checkUnnamed929(core.List<api.TestFailure> o) {
+checkUnnamed957(core.List<api.TestFailure> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTestFailure(o[0]);
   checkTestFailure(o[1]);
@@ -4275,9 +4275,9 @@
   var o = new api.UrlMapValidationResult();
   buildCounterUrlMapValidationResult++;
   if (buildCounterUrlMapValidationResult < 3) {
-    o.loadErrors = buildUnnamed928();
+    o.loadErrors = buildUnnamed956();
     o.loadSucceeded = true;
-    o.testFailures = buildUnnamed929();
+    o.testFailures = buildUnnamed957();
     o.testPassed = true;
   }
   buildCounterUrlMapValidationResult--;
@@ -4287,9 +4287,9 @@
 checkUrlMapValidationResult(api.UrlMapValidationResult o) {
   buildCounterUrlMapValidationResult++;
   if (buildCounterUrlMapValidationResult < 3) {
-    checkUnnamed928(o.loadErrors);
+    checkUnnamed956(o.loadErrors);
     unittest.expect(o.loadSucceeded, unittest.isTrue);
-    checkUnnamed929(o.testFailures);
+    checkUnnamed957(o.testFailures);
     unittest.expect(o.testPassed, unittest.isTrue);
   }
   buildCounterUrlMapValidationResult--;
@@ -4379,14 +4379,14 @@
   buildCounterZoneMaintenanceWindows--;
 }
 
-buildUnnamed930() {
+buildUnnamed958() {
   var o = new core.List<api.ZoneMaintenanceWindows>();
   o.add(buildZoneMaintenanceWindows());
   o.add(buildZoneMaintenanceWindows());
   return o;
 }
 
-checkUnnamed930(core.List<api.ZoneMaintenanceWindows> o) {
+checkUnnamed958(core.List<api.ZoneMaintenanceWindows> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkZoneMaintenanceWindows(o[0]);
   checkZoneMaintenanceWindows(o[1]);
@@ -4402,7 +4402,7 @@
     o.description = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.maintenanceWindows = buildUnnamed930();
+    o.maintenanceWindows = buildUnnamed958();
     o.name = "foo";
     o.region = "foo";
     o.selfLink = "foo";
@@ -4420,7 +4420,7 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed930(o.maintenanceWindows);
+    checkUnnamed958(o.maintenanceWindows);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -4429,14 +4429,14 @@
   buildCounterZone--;
 }
 
-buildUnnamed931() {
+buildUnnamed959() {
   var o = new core.List<api.Zone>();
   o.add(buildZone());
   o.add(buildZone());
   return o;
 }
 
-checkUnnamed931(core.List<api.Zone> o) {
+checkUnnamed959(core.List<api.Zone> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkZone(o[0]);
   checkZone(o[1]);
@@ -4448,7 +4448,7 @@
   buildCounterZoneList++;
   if (buildCounterZoneList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed931();
+    o.items = buildUnnamed959();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -4461,7 +4461,7 @@
   buildCounterZoneList++;
   if (buildCounterZoneList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed931(o.items);
+    checkUnnamed959(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -5583,15 +5583,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/aggregated/addresses", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/aggregated/addresses"));
-        pathOffset += 21;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -5637,25 +5630,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/addresses/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/addresses/"));
-        pathOffset += 11;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_address"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -5698,25 +5674,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/addresses/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/addresses/"));
-        pathOffset += 11;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_address"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -5762,22 +5721,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/addresses", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/addresses"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -5822,22 +5767,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/addresses", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/addresses"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -5886,18 +5817,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/backendServices/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("/global/backendServices/"));
-        pathOffset += 24;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_backendService"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -5939,18 +5860,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/backendServices/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("/global/backendServices/"));
-        pathOffset += 24;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_backendService"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -5996,22 +5907,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/backendServices/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("/global/backendServices/"));
-        pathOffset += 24;
-        index = path.indexOf("/getHealth", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_backendService"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/getHealth"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -6056,15 +5953,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/backendServices", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/global/backendServices"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -6108,15 +5998,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/backendServices", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/global/backendServices"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -6165,18 +6048,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/backendServices/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("/global/backendServices/"));
-        pathOffset += 24;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_backendService"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -6222,18 +6095,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/backendServices/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("/global/backendServices/"));
-        pathOffset += 24;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_backendService"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -6281,15 +6144,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/aggregated/diskTypes", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/aggregated/diskTypes"));
-        pathOffset += 21;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -6335,25 +6191,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/diskTypes/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/diskTypes/"));
-        pathOffset += 11;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_diskType"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -6398,22 +6237,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/diskTypes", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/diskTypes"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -6464,15 +6289,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/aggregated/disks", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/aggregated/disks"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -6522,29 +6340,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/disks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/disks/"));
-        pathOffset += 7;
-        index = path.indexOf("/createSnapshot", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_disk"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/createSnapshot"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -6587,25 +6384,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/disks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/disks/"));
-        pathOffset += 7;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_disk"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -6648,25 +6428,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/disks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/disks/"));
-        pathOffset += 7;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_disk"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -6713,22 +6476,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/disks", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/disks"));
-        pathOffset += 6;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -6774,22 +6523,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/disks", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/disks"));
-        pathOffset += 6;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -6838,18 +6573,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/firewalls/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/global/firewalls/"));
-        pathOffset += 18;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_firewall"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -6891,18 +6616,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/firewalls/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/global/firewalls/"));
-        pathOffset += 18;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_firewall"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -6947,15 +6662,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/firewalls", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/global/firewalls"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -6999,15 +6707,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/firewalls", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/global/firewalls"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -7056,18 +6757,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/firewalls/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/global/firewalls/"));
-        pathOffset += 18;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_firewall"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -7113,18 +6804,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/firewalls/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/global/firewalls/"));
-        pathOffset += 18;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_firewall"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -7172,15 +6853,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/aggregated/forwardingRules", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 27), unittest.equals("/aggregated/forwardingRules"));
-        pathOffset += 27;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -7226,25 +6900,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/forwardingRules/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/forwardingRules/"));
-        pathOffset += 17;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_forwardingRule"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -7287,25 +6944,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/forwardingRules/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/forwardingRules/"));
-        pathOffset += 17;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_forwardingRule"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -7351,22 +6991,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/forwardingRules", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/forwardingRules"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -7411,22 +7037,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/forwardingRules", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/forwardingRules"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -7476,29 +7088,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/forwardingRules/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/forwardingRules/"));
-        pathOffset += 17;
-        index = path.indexOf("/setTarget", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_forwardingRule"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/setTarget"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -7544,18 +7135,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/addresses/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/global/addresses/"));
-        pathOffset += 18;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_address"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -7597,18 +7178,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/addresses/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/global/addresses/"));
-        pathOffset += 18;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_address"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -7653,15 +7224,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/addresses", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/global/addresses"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -7705,15 +7269,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/addresses", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/global/addresses"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -7762,18 +7319,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/forwardingRules/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("/global/forwardingRules/"));
-        pathOffset += 24;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_forwardingRule"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -7815,18 +7362,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/forwardingRules/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("/global/forwardingRules/"));
-        pathOffset += 24;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_forwardingRule"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -7871,15 +7408,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/forwardingRules", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/global/forwardingRules"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -7923,15 +7453,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/forwardingRules", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/global/forwardingRules"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -7980,22 +7503,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/forwardingRules/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("/global/forwardingRules/"));
-        pathOffset += 24;
-        index = path.indexOf("/setTarget", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_forwardingRule"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/setTarget"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -8043,15 +7552,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/aggregated/operations", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/aggregated/operations"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -8096,18 +7598,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/operations/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/global/operations/"));
-        pathOffset += 19;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_operation"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -8147,18 +7639,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/operations/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/global/operations/"));
-        pathOffset += 19;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_operation"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -8202,15 +7684,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/operations", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/global/operations"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -8259,18 +7734,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/httpHealthChecks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("/global/httpHealthChecks/"));
-        pathOffset += 25;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_httpHealthCheck"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -8312,18 +7777,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/httpHealthChecks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("/global/httpHealthChecks/"));
-        pathOffset += 25;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_httpHealthCheck"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -8368,15 +7823,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/httpHealthChecks", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("/global/httpHealthChecks"));
-        pathOffset += 24;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -8420,15 +7868,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/httpHealthChecks", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("/global/httpHealthChecks"));
-        pathOffset += 24;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -8477,18 +7918,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/httpHealthChecks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("/global/httpHealthChecks/"));
-        pathOffset += 25;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_httpHealthCheck"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -8534,18 +7965,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/httpHealthChecks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("/global/httpHealthChecks/"));
-        pathOffset += 25;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_httpHealthCheck"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -8591,18 +8012,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/images/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/global/images/"));
-        pathOffset += 15;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_image"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -8648,22 +8059,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/images/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/global/images/"));
-        pathOffset += 15;
-        index = path.indexOf("/deprecate", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_image"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/deprecate"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -8705,18 +8102,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/images/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/global/images/"));
-        pathOffset += 15;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_image"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -8761,15 +8148,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/images", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/global/images"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -8813,15 +8193,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/images", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/global/images"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -8876,29 +8249,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/instances/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/instances/"));
-        pathOffset += 11;
-        index = path.indexOf("/addAccessConfig", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_instance"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/addAccessConfig"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -8943,15 +8295,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/aggregated/instances", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/aggregated/instances"));
-        pathOffset += 21;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -9001,29 +8346,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/instances/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/instances/"));
-        pathOffset += 11;
-        index = path.indexOf("/attachDisk", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_instance"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/attachDisk"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -9066,25 +8390,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/instances/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/instances/"));
-        pathOffset += 11;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_instance"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -9129,29 +8436,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/instances/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/instances/"));
-        pathOffset += 11;
-        index = path.indexOf("/deleteAccessConfig", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_instance"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/deleteAccessConfig"));
-        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -9197,29 +8483,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/instances/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/instances/"));
-        pathOffset += 11;
-        index = path.indexOf("/detachDisk", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_instance"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/detachDisk"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -9263,25 +8528,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/instances/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/instances/"));
-        pathOffset += 11;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_instance"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -9324,29 +8572,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/instances/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/instances/"));
-        pathOffset += 11;
-        index = path.indexOf("/serialPort", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_instance"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/serialPort"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -9392,22 +8619,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/instances", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/instances"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -9452,22 +8665,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/instances", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/instances"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -9513,29 +8712,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/instances/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/instances/"));
-        pathOffset += 11;
-        index = path.indexOf("/reset", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_instance"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/reset"));
-        pathOffset += 6;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -9580,29 +8758,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/instances/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/instances/"));
-        pathOffset += 11;
-        index = path.indexOf("/setDiskAutoDelete", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_instance"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/setDiskAutoDelete"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -9651,29 +8808,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/instances/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/instances/"));
-        pathOffset += 11;
-        index = path.indexOf("/setMetadata", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_instance"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/setMetadata"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -9720,29 +8856,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/instances/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/instances/"));
-        pathOffset += 11;
-        index = path.indexOf("/setScheduling", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_instance"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/setScheduling"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -9789,29 +8904,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/instances/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/instances/"));
-        pathOffset += 11;
-        index = path.indexOf("/setTags", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_instance"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/setTags"));
-        pathOffset += 8;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -9857,18 +8951,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/licenses/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/global/licenses/"));
-        pathOffset += 17;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_license"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -9916,15 +9000,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/aggregated/machineTypes", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("/aggregated/machineTypes"));
-        pathOffset += 24;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -9970,25 +9047,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/machineTypes/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/machineTypes/"));
-        pathOffset += 14;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_machineType"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -10033,22 +9093,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/machineTypes", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/machineTypes"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -10097,18 +9143,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/networks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/global/networks/"));
-        pathOffset += 17;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_network"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -10150,18 +9186,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/networks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/global/networks/"));
-        pathOffset += 17;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_network"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -10206,15 +9232,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/networks", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/global/networks"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -10258,15 +9277,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/networks", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/global/networks"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -10314,11 +9326,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -10363,15 +9372,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/setCommonInstanceMetadata", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/setCommonInstanceMetadata"));
-        pathOffset += 26;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -10416,15 +9418,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/setUsageExportBucket", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/setUsageExportBucket"));
-        pathOffset += 21;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -10471,25 +9466,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/operations/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/operations/"));
-        pathOffset += 12;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_operation"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -10530,25 +9508,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/operations/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/operations/"));
-        pathOffset += 12;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_operation"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -10593,22 +9554,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/operations", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/operations"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -10657,18 +9604,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -10712,15 +9649,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/regions"));
-        pathOffset += 8;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -10769,18 +9699,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/routes/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/global/routes/"));
-        pathOffset += 15;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_route"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -10822,18 +9742,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/routes/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/global/routes/"));
-        pathOffset += 15;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_route"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -10878,15 +9788,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/routes", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/global/routes"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -10930,15 +9833,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/routes", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/global/routes"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -10987,18 +9883,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/snapshots/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/global/snapshots/"));
-        pathOffset += 18;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_snapshot"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -11040,18 +9926,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/snapshots/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/global/snapshots/"));
-        pathOffset += 18;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_snapshot"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -11095,15 +9971,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/snapshots", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/global/snapshots"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -11152,18 +10021,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/targetHttpProxies/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/global/targetHttpProxies/"));
-        pathOffset += 26;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_targetHttpProxy"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -11205,18 +10064,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/targetHttpProxies/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/global/targetHttpProxies/"));
-        pathOffset += 26;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_targetHttpProxy"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -11261,15 +10110,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/targetHttpProxies", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("/global/targetHttpProxies"));
-        pathOffset += 25;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -11313,15 +10155,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/targetHttpProxies", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("/global/targetHttpProxies"));
-        pathOffset += 25;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -11370,22 +10205,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/targetHttpProxies/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/targetHttpProxies/"));
-        pathOffset += 19;
-        index = path.indexOf("/setUrlMap", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_targetHttpProxy"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/setUrlMap"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -11433,15 +10254,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/aggregated/targetInstances", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 27), unittest.equals("/aggregated/targetInstances"));
-        pathOffset += 27;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -11487,25 +10301,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/targetInstances/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/targetInstances/"));
-        pathOffset += 17;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_targetInstance"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -11548,25 +10345,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/targetInstances/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/targetInstances/"));
-        pathOffset += 17;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_targetInstance"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -11612,22 +10392,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/targetInstances", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/targetInstances"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -11672,22 +10438,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/targetInstances", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/targetInstances"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -11741,29 +10493,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/targetPools/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/targetPools/"));
-        pathOffset += 13;
-        index = path.indexOf("/addHealthCheck", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_targetPool"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/addHealthCheck"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -11810,29 +10541,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/targetPools/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/targetPools/"));
-        pathOffset += 13;
-        index = path.indexOf("/addInstance", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_targetPool"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/addInstance"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -11876,15 +10586,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/aggregated/targetPools", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/aggregated/targetPools"));
-        pathOffset += 23;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -11930,25 +10633,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/targetPools/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/targetPools/"));
-        pathOffset += 13;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_targetPool"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -11991,25 +10677,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/targetPools/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/targetPools/"));
-        pathOffset += 13;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_targetPool"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -12056,29 +10725,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/targetPools/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/targetPools/"));
-        pathOffset += 13;
-        index = path.indexOf("/getHealth", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_targetPool"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/getHealth"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -12124,22 +10772,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/targetPools", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/targetPools"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -12184,22 +10818,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/targetPools", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/targetPools"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -12249,29 +10869,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/targetPools/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/targetPools/"));
-        pathOffset += 13;
-        index = path.indexOf("/removeHealthCheck", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_targetPool"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/removeHealthCheck"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -12318,29 +10917,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/targetPools/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/targetPools/"));
-        pathOffset += 13;
-        index = path.indexOf("/removeInstance", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_targetPool"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/removeInstance"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -12388,29 +10966,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/targetPools/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/targetPools/"));
-        pathOffset += 13;
-        index = path.indexOf("/setBackup", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_targetPool"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/setBackup"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -12457,18 +11014,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/urlMaps/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/global/urlMaps/"));
-        pathOffset += 16;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_urlMap"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -12510,18 +11057,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/urlMaps/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/global/urlMaps/"));
-        pathOffset += 16;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_urlMap"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -12566,15 +11103,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/urlMaps", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/global/urlMaps"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -12618,15 +11148,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/urlMaps", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/global/urlMaps"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -12675,18 +11198,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/urlMaps/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/global/urlMaps/"));
-        pathOffset += 16;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_urlMap"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -12732,18 +11245,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/urlMaps/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/global/urlMaps/"));
-        pathOffset += 16;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_urlMap"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -12789,22 +11292,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/global/urlMaps/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/global/urlMaps/"));
-        pathOffset += 16;
-        index = path.indexOf("/validate", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_urlMap"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/validate"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -12851,25 +11340,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/operations/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/operations/"));
-        pathOffset += 12;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_operation"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -12910,25 +11382,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/operations/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/operations/"));
-        pathOffset += 12;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_operation"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -12973,22 +11428,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/operations", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/operations"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -13037,18 +11478,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -13092,15 +11523,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/compute/v1/projects/"));
-        pathOffset += 21;
-        index = path.indexOf("/zones", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/zones"));
-        pathOffset += 6;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
diff --git a/generated/googleapis/test/content/v2_test.dart b/generated/googleapis/test/content/v2_test.dart
index 1a2447a..0f0ba44 100644
--- a/generated/googleapis/test/content/v2_test.dart
+++ b/generated/googleapis/test/content/v2_test.dart
@@ -16,27 +16,27 @@
 
 
 
-buildUnnamed299() {
+buildUnnamed322() {
   var o = new core.List<api.AccountAdwordsLink>();
   o.add(buildAccountAdwordsLink());
   o.add(buildAccountAdwordsLink());
   return o;
 }
 
-checkUnnamed299(core.List<api.AccountAdwordsLink> o) {
+checkUnnamed322(core.List<api.AccountAdwordsLink> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountAdwordsLink(o[0]);
   checkAccountAdwordsLink(o[1]);
 }
 
-buildUnnamed300() {
+buildUnnamed323() {
   var o = new core.List<api.AccountUser>();
   o.add(buildAccountUser());
   o.add(buildAccountUser());
   return o;
 }
 
-checkUnnamed300(core.List<api.AccountUser> o) {
+checkUnnamed323(core.List<api.AccountUser> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountUser(o[0]);
   checkAccountUser(o[1]);
@@ -48,13 +48,13 @@
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
     o.adultContent = true;
-    o.adwordsLinks = buildUnnamed299();
+    o.adwordsLinks = buildUnnamed322();
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
     o.reviewsUrl = "foo";
     o.sellerId = "foo";
-    o.users = buildUnnamed300();
+    o.users = buildUnnamed323();
     o.websiteUrl = "foo";
   }
   buildCounterAccount--;
@@ -65,13 +65,13 @@
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
     unittest.expect(o.adultContent, unittest.isTrue);
-    checkUnnamed299(o.adwordsLinks);
+    checkUnnamed322(o.adwordsLinks);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.reviewsUrl, unittest.equals('foo'));
     unittest.expect(o.sellerId, unittest.equals('foo'));
-    checkUnnamed300(o.users);
+    checkUnnamed323(o.users);
     unittest.expect(o.websiteUrl, unittest.equals('foo'));
   }
   buildCounterAccount--;
@@ -98,14 +98,14 @@
   buildCounterAccountAdwordsLink--;
 }
 
-buildUnnamed301() {
+buildUnnamed324() {
   var o = new core.List<api.AccountStatusDataQualityIssue>();
   o.add(buildAccountStatusDataQualityIssue());
   o.add(buildAccountStatusDataQualityIssue());
   return o;
 }
 
-checkUnnamed301(core.List<api.AccountStatusDataQualityIssue> o) {
+checkUnnamed324(core.List<api.AccountStatusDataQualityIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountStatusDataQualityIssue(o[0]);
   checkAccountStatusDataQualityIssue(o[1]);
@@ -117,7 +117,7 @@
   buildCounterAccountStatus++;
   if (buildCounterAccountStatus < 3) {
     o.accountId = "foo";
-    o.dataQualityIssues = buildUnnamed301();
+    o.dataQualityIssues = buildUnnamed324();
     o.kind = "foo";
   }
   buildCounterAccountStatus--;
@@ -128,20 +128,20 @@
   buildCounterAccountStatus++;
   if (buildCounterAccountStatus < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkUnnamed301(o.dataQualityIssues);
+    checkUnnamed324(o.dataQualityIssues);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountStatus--;
 }
 
-buildUnnamed302() {
+buildUnnamed325() {
   var o = new core.List<api.AccountStatusExampleItem>();
   o.add(buildAccountStatusExampleItem());
   o.add(buildAccountStatusExampleItem());
   return o;
 }
 
-checkUnnamed302(core.List<api.AccountStatusExampleItem> o) {
+checkUnnamed325(core.List<api.AccountStatusExampleItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountStatusExampleItem(o[0]);
   checkAccountStatusExampleItem(o[1]);
@@ -154,7 +154,7 @@
   if (buildCounterAccountStatusDataQualityIssue < 3) {
     o.country = "foo";
     o.displayedValue = "foo";
-    o.exampleItems = buildUnnamed302();
+    o.exampleItems = buildUnnamed325();
     o.id = "foo";
     o.lastChecked = "foo";
     o.numItems = 42;
@@ -170,7 +170,7 @@
   if (buildCounterAccountStatusDataQualityIssue < 3) {
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.displayedValue, unittest.equals('foo'));
-    checkUnnamed302(o.exampleItems);
+    checkUnnamed325(o.exampleItems);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.lastChecked, unittest.equals('foo'));
     unittest.expect(o.numItems, unittest.equals(42));
@@ -228,14 +228,14 @@
   buildCounterAccountUser--;
 }
 
-buildUnnamed303() {
+buildUnnamed326() {
   var o = new core.List<api.AccountsCustomBatchRequestEntry>();
   o.add(buildAccountsCustomBatchRequestEntry());
   o.add(buildAccountsCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed303(core.List<api.AccountsCustomBatchRequestEntry> o) {
+checkUnnamed326(core.List<api.AccountsCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountsCustomBatchRequestEntry(o[0]);
   checkAccountsCustomBatchRequestEntry(o[1]);
@@ -246,7 +246,7 @@
   var o = new api.AccountsCustomBatchRequest();
   buildCounterAccountsCustomBatchRequest++;
   if (buildCounterAccountsCustomBatchRequest < 3) {
-    o.entries = buildUnnamed303();
+    o.entries = buildUnnamed326();
   }
   buildCounterAccountsCustomBatchRequest--;
   return o;
@@ -255,7 +255,7 @@
 checkAccountsCustomBatchRequest(api.AccountsCustomBatchRequest o) {
   buildCounterAccountsCustomBatchRequest++;
   if (buildCounterAccountsCustomBatchRequest < 3) {
-    checkUnnamed303(o.entries);
+    checkUnnamed326(o.entries);
   }
   buildCounterAccountsCustomBatchRequest--;
 }
@@ -287,14 +287,14 @@
   buildCounterAccountsCustomBatchRequestEntry--;
 }
 
-buildUnnamed304() {
+buildUnnamed327() {
   var o = new core.List<api.AccountsCustomBatchResponseEntry>();
   o.add(buildAccountsCustomBatchResponseEntry());
   o.add(buildAccountsCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed304(core.List<api.AccountsCustomBatchResponseEntry> o) {
+checkUnnamed327(core.List<api.AccountsCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountsCustomBatchResponseEntry(o[0]);
   checkAccountsCustomBatchResponseEntry(o[1]);
@@ -305,7 +305,7 @@
   var o = new api.AccountsCustomBatchResponse();
   buildCounterAccountsCustomBatchResponse++;
   if (buildCounterAccountsCustomBatchResponse < 3) {
-    o.entries = buildUnnamed304();
+    o.entries = buildUnnamed327();
     o.kind = "foo";
   }
   buildCounterAccountsCustomBatchResponse--;
@@ -315,7 +315,7 @@
 checkAccountsCustomBatchResponse(api.AccountsCustomBatchResponse o) {
   buildCounterAccountsCustomBatchResponse++;
   if (buildCounterAccountsCustomBatchResponse < 3) {
-    checkUnnamed304(o.entries);
+    checkUnnamed327(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountsCustomBatchResponse--;
@@ -346,14 +346,14 @@
   buildCounterAccountsCustomBatchResponseEntry--;
 }
 
-buildUnnamed305() {
+buildUnnamed328() {
   var o = new core.List<api.Account>();
   o.add(buildAccount());
   o.add(buildAccount());
   return o;
 }
 
-checkUnnamed305(core.List<api.Account> o) {
+checkUnnamed328(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccount(o[0]);
   checkAccount(o[1]);
@@ -366,7 +366,7 @@
   if (buildCounterAccountsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed305();
+    o.resources = buildUnnamed328();
   }
   buildCounterAccountsListResponse--;
   return o;
@@ -377,19 +377,19 @@
   if (buildCounterAccountsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed305(o.resources);
+    checkUnnamed328(o.resources);
   }
   buildCounterAccountsListResponse--;
 }
 
-buildUnnamed306() {
+buildUnnamed329() {
   var o = new core.List<api.AccountstatusesCustomBatchRequestEntry>();
   o.add(buildAccountstatusesCustomBatchRequestEntry());
   o.add(buildAccountstatusesCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed306(core.List<api.AccountstatusesCustomBatchRequestEntry> o) {
+checkUnnamed329(core.List<api.AccountstatusesCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountstatusesCustomBatchRequestEntry(o[0]);
   checkAccountstatusesCustomBatchRequestEntry(o[1]);
@@ -400,7 +400,7 @@
   var o = new api.AccountstatusesCustomBatchRequest();
   buildCounterAccountstatusesCustomBatchRequest++;
   if (buildCounterAccountstatusesCustomBatchRequest < 3) {
-    o.entries = buildUnnamed306();
+    o.entries = buildUnnamed329();
   }
   buildCounterAccountstatusesCustomBatchRequest--;
   return o;
@@ -409,7 +409,7 @@
 checkAccountstatusesCustomBatchRequest(api.AccountstatusesCustomBatchRequest o) {
   buildCounterAccountstatusesCustomBatchRequest++;
   if (buildCounterAccountstatusesCustomBatchRequest < 3) {
-    checkUnnamed306(o.entries);
+    checkUnnamed329(o.entries);
   }
   buildCounterAccountstatusesCustomBatchRequest--;
 }
@@ -439,14 +439,14 @@
   buildCounterAccountstatusesCustomBatchRequestEntry--;
 }
 
-buildUnnamed307() {
+buildUnnamed330() {
   var o = new core.List<api.AccountstatusesCustomBatchResponseEntry>();
   o.add(buildAccountstatusesCustomBatchResponseEntry());
   o.add(buildAccountstatusesCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed307(core.List<api.AccountstatusesCustomBatchResponseEntry> o) {
+checkUnnamed330(core.List<api.AccountstatusesCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountstatusesCustomBatchResponseEntry(o[0]);
   checkAccountstatusesCustomBatchResponseEntry(o[1]);
@@ -457,7 +457,7 @@
   var o = new api.AccountstatusesCustomBatchResponse();
   buildCounterAccountstatusesCustomBatchResponse++;
   if (buildCounterAccountstatusesCustomBatchResponse < 3) {
-    o.entries = buildUnnamed307();
+    o.entries = buildUnnamed330();
     o.kind = "foo";
   }
   buildCounterAccountstatusesCustomBatchResponse--;
@@ -467,7 +467,7 @@
 checkAccountstatusesCustomBatchResponse(api.AccountstatusesCustomBatchResponse o) {
   buildCounterAccountstatusesCustomBatchResponse++;
   if (buildCounterAccountstatusesCustomBatchResponse < 3) {
-    checkUnnamed307(o.entries);
+    checkUnnamed330(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountstatusesCustomBatchResponse--;
@@ -496,14 +496,14 @@
   buildCounterAccountstatusesCustomBatchResponseEntry--;
 }
 
-buildUnnamed308() {
+buildUnnamed331() {
   var o = new core.List<api.AccountStatus>();
   o.add(buildAccountStatus());
   o.add(buildAccountStatus());
   return o;
 }
 
-checkUnnamed308(core.List<api.AccountStatus> o) {
+checkUnnamed331(core.List<api.AccountStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccountStatus(o[0]);
   checkAccountStatus(o[1]);
@@ -516,7 +516,7 @@
   if (buildCounterAccountstatusesListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed308();
+    o.resources = buildUnnamed331();
   }
   buildCounterAccountstatusesListResponse--;
   return o;
@@ -527,19 +527,19 @@
   if (buildCounterAccountstatusesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed308(o.resources);
+    checkUnnamed331(o.resources);
   }
   buildCounterAccountstatusesListResponse--;
 }
 
-buildUnnamed309() {
+buildUnnamed332() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed309(core.List<core.String> o) {
+checkUnnamed332(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -557,7 +557,7 @@
     o.fileName = "foo";
     o.format = buildDatafeedFormat();
     o.id = "foo";
-    o.intendedDestinations = buildUnnamed309();
+    o.intendedDestinations = buildUnnamed332();
     o.kind = "foo";
     o.name = "foo";
     o.targetCountry = "foo";
@@ -576,7 +576,7 @@
     unittest.expect(o.fileName, unittest.equals('foo'));
     checkDatafeedFormat(o.format);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed309(o.intendedDestinations);
+    checkUnnamed332(o.intendedDestinations);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.targetCountry, unittest.equals('foo'));
@@ -638,27 +638,27 @@
   buildCounterDatafeedFormat--;
 }
 
-buildUnnamed310() {
+buildUnnamed333() {
   var o = new core.List<api.DatafeedStatusError>();
   o.add(buildDatafeedStatusError());
   o.add(buildDatafeedStatusError());
   return o;
 }
 
-checkUnnamed310(core.List<api.DatafeedStatusError> o) {
+checkUnnamed333(core.List<api.DatafeedStatusError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedStatusError(o[0]);
   checkDatafeedStatusError(o[1]);
 }
 
-buildUnnamed311() {
+buildUnnamed334() {
   var o = new core.List<api.DatafeedStatusError>();
   o.add(buildDatafeedStatusError());
   o.add(buildDatafeedStatusError());
   return o;
 }
 
-checkUnnamed311(core.List<api.DatafeedStatusError> o) {
+checkUnnamed334(core.List<api.DatafeedStatusError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedStatusError(o[0]);
   checkDatafeedStatusError(o[1]);
@@ -670,12 +670,12 @@
   buildCounterDatafeedStatus++;
   if (buildCounterDatafeedStatus < 3) {
     o.datafeedId = "foo";
-    o.errors = buildUnnamed310();
+    o.errors = buildUnnamed333();
     o.itemsTotal = "foo";
     o.itemsValid = "foo";
     o.kind = "foo";
     o.processingStatus = "foo";
-    o.warnings = buildUnnamed311();
+    o.warnings = buildUnnamed334();
   }
   buildCounterDatafeedStatus--;
   return o;
@@ -685,24 +685,24 @@
   buildCounterDatafeedStatus++;
   if (buildCounterDatafeedStatus < 3) {
     unittest.expect(o.datafeedId, unittest.equals('foo'));
-    checkUnnamed310(o.errors);
+    checkUnnamed333(o.errors);
     unittest.expect(o.itemsTotal, unittest.equals('foo'));
     unittest.expect(o.itemsValid, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.processingStatus, unittest.equals('foo'));
-    checkUnnamed311(o.warnings);
+    checkUnnamed334(o.warnings);
   }
   buildCounterDatafeedStatus--;
 }
 
-buildUnnamed312() {
+buildUnnamed335() {
   var o = new core.List<api.DatafeedStatusExample>();
   o.add(buildDatafeedStatusExample());
   o.add(buildDatafeedStatusExample());
   return o;
 }
 
-checkUnnamed312(core.List<api.DatafeedStatusExample> o) {
+checkUnnamed335(core.List<api.DatafeedStatusExample> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedStatusExample(o[0]);
   checkDatafeedStatusExample(o[1]);
@@ -715,7 +715,7 @@
   if (buildCounterDatafeedStatusError < 3) {
     o.code = "foo";
     o.count = "foo";
-    o.examples = buildUnnamed312();
+    o.examples = buildUnnamed335();
     o.message = "foo";
   }
   buildCounterDatafeedStatusError--;
@@ -727,7 +727,7 @@
   if (buildCounterDatafeedStatusError < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
     unittest.expect(o.count, unittest.equals('foo'));
-    checkUnnamed312(o.examples);
+    checkUnnamed335(o.examples);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterDatafeedStatusError--;
@@ -756,14 +756,14 @@
   buildCounterDatafeedStatusExample--;
 }
 
-buildUnnamed313() {
+buildUnnamed336() {
   var o = new core.List<api.DatafeedsCustomBatchRequestEntry>();
   o.add(buildDatafeedsCustomBatchRequestEntry());
   o.add(buildDatafeedsCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed313(core.List<api.DatafeedsCustomBatchRequestEntry> o) {
+checkUnnamed336(core.List<api.DatafeedsCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedsCustomBatchRequestEntry(o[0]);
   checkDatafeedsCustomBatchRequestEntry(o[1]);
@@ -774,7 +774,7 @@
   var o = new api.DatafeedsCustomBatchRequest();
   buildCounterDatafeedsCustomBatchRequest++;
   if (buildCounterDatafeedsCustomBatchRequest < 3) {
-    o.entries = buildUnnamed313();
+    o.entries = buildUnnamed336();
   }
   buildCounterDatafeedsCustomBatchRequest--;
   return o;
@@ -783,7 +783,7 @@
 checkDatafeedsCustomBatchRequest(api.DatafeedsCustomBatchRequest o) {
   buildCounterDatafeedsCustomBatchRequest++;
   if (buildCounterDatafeedsCustomBatchRequest < 3) {
-    checkUnnamed313(o.entries);
+    checkUnnamed336(o.entries);
   }
   buildCounterDatafeedsCustomBatchRequest--;
 }
@@ -815,14 +815,14 @@
   buildCounterDatafeedsCustomBatchRequestEntry--;
 }
 
-buildUnnamed314() {
+buildUnnamed337() {
   var o = new core.List<api.DatafeedsCustomBatchResponseEntry>();
   o.add(buildDatafeedsCustomBatchResponseEntry());
   o.add(buildDatafeedsCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed314(core.List<api.DatafeedsCustomBatchResponseEntry> o) {
+checkUnnamed337(core.List<api.DatafeedsCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedsCustomBatchResponseEntry(o[0]);
   checkDatafeedsCustomBatchResponseEntry(o[1]);
@@ -833,7 +833,7 @@
   var o = new api.DatafeedsCustomBatchResponse();
   buildCounterDatafeedsCustomBatchResponse++;
   if (buildCounterDatafeedsCustomBatchResponse < 3) {
-    o.entries = buildUnnamed314();
+    o.entries = buildUnnamed337();
     o.kind = "foo";
   }
   buildCounterDatafeedsCustomBatchResponse--;
@@ -843,7 +843,7 @@
 checkDatafeedsCustomBatchResponse(api.DatafeedsCustomBatchResponse o) {
   buildCounterDatafeedsCustomBatchResponse++;
   if (buildCounterDatafeedsCustomBatchResponse < 3) {
-    checkUnnamed314(o.entries);
+    checkUnnamed337(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDatafeedsCustomBatchResponse--;
@@ -872,14 +872,14 @@
   buildCounterDatafeedsCustomBatchResponseEntry--;
 }
 
-buildUnnamed315() {
+buildUnnamed338() {
   var o = new core.List<api.Datafeed>();
   o.add(buildDatafeed());
   o.add(buildDatafeed());
   return o;
 }
 
-checkUnnamed315(core.List<api.Datafeed> o) {
+checkUnnamed338(core.List<api.Datafeed> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeed(o[0]);
   checkDatafeed(o[1]);
@@ -891,7 +891,7 @@
   buildCounterDatafeedsListResponse++;
   if (buildCounterDatafeedsListResponse < 3) {
     o.kind = "foo";
-    o.resources = buildUnnamed315();
+    o.resources = buildUnnamed338();
   }
   buildCounterDatafeedsListResponse--;
   return o;
@@ -901,19 +901,19 @@
   buildCounterDatafeedsListResponse++;
   if (buildCounterDatafeedsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed315(o.resources);
+    checkUnnamed338(o.resources);
   }
   buildCounterDatafeedsListResponse--;
 }
 
-buildUnnamed316() {
+buildUnnamed339() {
   var o = new core.List<api.DatafeedstatusesCustomBatchRequestEntry>();
   o.add(buildDatafeedstatusesCustomBatchRequestEntry());
   o.add(buildDatafeedstatusesCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed316(core.List<api.DatafeedstatusesCustomBatchRequestEntry> o) {
+checkUnnamed339(core.List<api.DatafeedstatusesCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedstatusesCustomBatchRequestEntry(o[0]);
   checkDatafeedstatusesCustomBatchRequestEntry(o[1]);
@@ -924,7 +924,7 @@
   var o = new api.DatafeedstatusesCustomBatchRequest();
   buildCounterDatafeedstatusesCustomBatchRequest++;
   if (buildCounterDatafeedstatusesCustomBatchRequest < 3) {
-    o.entries = buildUnnamed316();
+    o.entries = buildUnnamed339();
   }
   buildCounterDatafeedstatusesCustomBatchRequest--;
   return o;
@@ -933,7 +933,7 @@
 checkDatafeedstatusesCustomBatchRequest(api.DatafeedstatusesCustomBatchRequest o) {
   buildCounterDatafeedstatusesCustomBatchRequest++;
   if (buildCounterDatafeedstatusesCustomBatchRequest < 3) {
-    checkUnnamed316(o.entries);
+    checkUnnamed339(o.entries);
   }
   buildCounterDatafeedstatusesCustomBatchRequest--;
 }
@@ -963,14 +963,14 @@
   buildCounterDatafeedstatusesCustomBatchRequestEntry--;
 }
 
-buildUnnamed317() {
+buildUnnamed340() {
   var o = new core.List<api.DatafeedstatusesCustomBatchResponseEntry>();
   o.add(buildDatafeedstatusesCustomBatchResponseEntry());
   o.add(buildDatafeedstatusesCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed317(core.List<api.DatafeedstatusesCustomBatchResponseEntry> o) {
+checkUnnamed340(core.List<api.DatafeedstatusesCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedstatusesCustomBatchResponseEntry(o[0]);
   checkDatafeedstatusesCustomBatchResponseEntry(o[1]);
@@ -981,7 +981,7 @@
   var o = new api.DatafeedstatusesCustomBatchResponse();
   buildCounterDatafeedstatusesCustomBatchResponse++;
   if (buildCounterDatafeedstatusesCustomBatchResponse < 3) {
-    o.entries = buildUnnamed317();
+    o.entries = buildUnnamed340();
     o.kind = "foo";
   }
   buildCounterDatafeedstatusesCustomBatchResponse--;
@@ -991,7 +991,7 @@
 checkDatafeedstatusesCustomBatchResponse(api.DatafeedstatusesCustomBatchResponse o) {
   buildCounterDatafeedstatusesCustomBatchResponse++;
   if (buildCounterDatafeedstatusesCustomBatchResponse < 3) {
-    checkUnnamed317(o.entries);
+    checkUnnamed340(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDatafeedstatusesCustomBatchResponse--;
@@ -1020,14 +1020,14 @@
   buildCounterDatafeedstatusesCustomBatchResponseEntry--;
 }
 
-buildUnnamed318() {
+buildUnnamed341() {
   var o = new core.List<api.DatafeedStatus>();
   o.add(buildDatafeedStatus());
   o.add(buildDatafeedStatus());
   return o;
 }
 
-checkUnnamed318(core.List<api.DatafeedStatus> o) {
+checkUnnamed341(core.List<api.DatafeedStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatafeedStatus(o[0]);
   checkDatafeedStatus(o[1]);
@@ -1039,7 +1039,7 @@
   buildCounterDatafeedstatusesListResponse++;
   if (buildCounterDatafeedstatusesListResponse < 3) {
     o.kind = "foo";
-    o.resources = buildUnnamed318();
+    o.resources = buildUnnamed341();
   }
   buildCounterDatafeedstatusesListResponse--;
   return o;
@@ -1049,7 +1049,7 @@
   buildCounterDatafeedstatusesListResponse++;
   if (buildCounterDatafeedstatusesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed318(o.resources);
+    checkUnnamed341(o.resources);
   }
   buildCounterDatafeedstatusesListResponse--;
 }
@@ -1077,14 +1077,14 @@
   buildCounterError--;
 }
 
-buildUnnamed319() {
+buildUnnamed342() {
   var o = new core.List<api.Error>();
   o.add(buildError());
   o.add(buildError());
   return o;
 }
 
-checkUnnamed319(core.List<api.Error> o) {
+checkUnnamed342(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkError(o[0]);
   checkError(o[1]);
@@ -1096,7 +1096,7 @@
   buildCounterErrors++;
   if (buildCounterErrors < 3) {
     o.code = 42;
-    o.errors = buildUnnamed319();
+    o.errors = buildUnnamed342();
     o.message = "foo";
   }
   buildCounterErrors--;
@@ -1107,7 +1107,7 @@
   buildCounterErrors++;
   if (buildCounterErrors < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkUnnamed319(o.errors);
+    checkUnnamed342(o.errors);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterErrors--;
@@ -1142,14 +1142,14 @@
   buildCounterInventory--;
 }
 
-buildUnnamed320() {
+buildUnnamed343() {
   var o = new core.List<api.InventoryCustomBatchRequestEntry>();
   o.add(buildInventoryCustomBatchRequestEntry());
   o.add(buildInventoryCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed320(core.List<api.InventoryCustomBatchRequestEntry> o) {
+checkUnnamed343(core.List<api.InventoryCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInventoryCustomBatchRequestEntry(o[0]);
   checkInventoryCustomBatchRequestEntry(o[1]);
@@ -1160,7 +1160,7 @@
   var o = new api.InventoryCustomBatchRequest();
   buildCounterInventoryCustomBatchRequest++;
   if (buildCounterInventoryCustomBatchRequest < 3) {
-    o.entries = buildUnnamed320();
+    o.entries = buildUnnamed343();
   }
   buildCounterInventoryCustomBatchRequest--;
   return o;
@@ -1169,7 +1169,7 @@
 checkInventoryCustomBatchRequest(api.InventoryCustomBatchRequest o) {
   buildCounterInventoryCustomBatchRequest++;
   if (buildCounterInventoryCustomBatchRequest < 3) {
-    checkUnnamed320(o.entries);
+    checkUnnamed343(o.entries);
   }
   buildCounterInventoryCustomBatchRequest--;
 }
@@ -1201,14 +1201,14 @@
   buildCounterInventoryCustomBatchRequestEntry--;
 }
 
-buildUnnamed321() {
+buildUnnamed344() {
   var o = new core.List<api.InventoryCustomBatchResponseEntry>();
   o.add(buildInventoryCustomBatchResponseEntry());
   o.add(buildInventoryCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed321(core.List<api.InventoryCustomBatchResponseEntry> o) {
+checkUnnamed344(core.List<api.InventoryCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInventoryCustomBatchResponseEntry(o[0]);
   checkInventoryCustomBatchResponseEntry(o[1]);
@@ -1219,7 +1219,7 @@
   var o = new api.InventoryCustomBatchResponse();
   buildCounterInventoryCustomBatchResponse++;
   if (buildCounterInventoryCustomBatchResponse < 3) {
-    o.entries = buildUnnamed321();
+    o.entries = buildUnnamed344();
     o.kind = "foo";
   }
   buildCounterInventoryCustomBatchResponse--;
@@ -1229,7 +1229,7 @@
 checkInventoryCustomBatchResponse(api.InventoryCustomBatchResponse o) {
   buildCounterInventoryCustomBatchResponse++;
   if (buildCounterInventoryCustomBatchResponse < 3) {
-    checkUnnamed321(o.entries);
+    checkUnnamed344(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterInventoryCustomBatchResponse--;
@@ -1348,131 +1348,131 @@
   buildCounterPrice--;
 }
 
-buildUnnamed322() {
+buildUnnamed345() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed322(core.List<core.String> o) {
+checkUnnamed345(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed323() {
+buildUnnamed346() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed323(core.List<core.String> o) {
+checkUnnamed346(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed324() {
+buildUnnamed347() {
   var o = new core.List<api.ProductCustomAttribute>();
   o.add(buildProductCustomAttribute());
   o.add(buildProductCustomAttribute());
   return o;
 }
 
-checkUnnamed324(core.List<api.ProductCustomAttribute> o) {
+checkUnnamed347(core.List<api.ProductCustomAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductCustomAttribute(o[0]);
   checkProductCustomAttribute(o[1]);
 }
 
-buildUnnamed325() {
+buildUnnamed348() {
   var o = new core.List<api.ProductCustomGroup>();
   o.add(buildProductCustomGroup());
   o.add(buildProductCustomGroup());
   return o;
 }
 
-checkUnnamed325(core.List<api.ProductCustomGroup> o) {
+checkUnnamed348(core.List<api.ProductCustomGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductCustomGroup(o[0]);
   checkProductCustomGroup(o[1]);
 }
 
-buildUnnamed326() {
+buildUnnamed349() {
   var o = new core.List<api.ProductDestination>();
   o.add(buildProductDestination());
   o.add(buildProductDestination());
   return o;
 }
 
-checkUnnamed326(core.List<api.ProductDestination> o) {
+checkUnnamed349(core.List<api.ProductDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductDestination(o[0]);
   checkProductDestination(o[1]);
 }
 
-buildUnnamed327() {
+buildUnnamed350() {
   var o = new core.List<api.ProductShipping>();
   o.add(buildProductShipping());
   o.add(buildProductShipping());
   return o;
 }
 
-checkUnnamed327(core.List<api.ProductShipping> o) {
+checkUnnamed350(core.List<api.ProductShipping> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductShipping(o[0]);
   checkProductShipping(o[1]);
 }
 
-buildUnnamed328() {
+buildUnnamed351() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed328(core.List<core.String> o) {
+checkUnnamed351(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed329() {
+buildUnnamed352() {
   var o = new core.List<api.ProductTax>();
   o.add(buildProductTax());
   o.add(buildProductTax());
   return o;
 }
 
-checkUnnamed329(core.List<api.ProductTax> o) {
+checkUnnamed352(core.List<api.ProductTax> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductTax(o[0]);
   checkProductTax(o[1]);
 }
 
-buildUnnamed330() {
+buildUnnamed353() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed330(core.List<core.String> o) {
+checkUnnamed353(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed331() {
+buildUnnamed354() {
   var o = new core.List<api.Error>();
   o.add(buildError());
   o.add(buildError());
   return o;
 }
 
-checkUnnamed331(core.List<api.Error> o) {
+checkUnnamed354(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkError(o[0]);
   checkError(o[1]);
@@ -1483,10 +1483,10 @@
   var o = new api.Product();
   buildCounterProduct++;
   if (buildCounterProduct < 3) {
-    o.additionalImageLinks = buildUnnamed322();
+    o.additionalImageLinks = buildUnnamed345();
     o.adult = true;
     o.adwordsGrouping = "foo";
-    o.adwordsLabels = buildUnnamed323();
+    o.adwordsLabels = buildUnnamed346();
     o.adwordsRedirect = "foo";
     o.ageGroup = "foo";
     o.availability = "foo";
@@ -1496,15 +1496,15 @@
     o.color = "foo";
     o.condition = "foo";
     o.contentLanguage = "foo";
-    o.customAttributes = buildUnnamed324();
-    o.customGroups = buildUnnamed325();
+    o.customAttributes = buildUnnamed347();
+    o.customGroups = buildUnnamed348();
     o.customLabel0 = "foo";
     o.customLabel1 = "foo";
     o.customLabel2 = "foo";
     o.customLabel3 = "foo";
     o.customLabel4 = "foo";
     o.description = "foo";
-    o.destinations = buildUnnamed326();
+    o.destinations = buildUnnamed349();
     o.energyEfficiencyClass = "foo";
     o.expirationDate = "foo";
     o.gender = "foo";
@@ -1530,19 +1530,19 @@
     o.productType = "foo";
     o.salePrice = buildPrice();
     o.salePriceEffectiveDate = "foo";
-    o.shipping = buildUnnamed327();
+    o.shipping = buildUnnamed350();
     o.shippingLabel = "foo";
     o.shippingWeight = buildProductShippingWeight();
     o.sizeSystem = "foo";
     o.sizeType = "foo";
-    o.sizes = buildUnnamed328();
+    o.sizes = buildUnnamed351();
     o.targetCountry = "foo";
-    o.taxes = buildUnnamed329();
+    o.taxes = buildUnnamed352();
     o.title = "foo";
     o.unitPricingBaseMeasure = buildProductUnitPricingBaseMeasure();
     o.unitPricingMeasure = buildProductUnitPricingMeasure();
-    o.validatedDestinations = buildUnnamed330();
-    o.warnings = buildUnnamed331();
+    o.validatedDestinations = buildUnnamed353();
+    o.warnings = buildUnnamed354();
   }
   buildCounterProduct--;
   return o;
@@ -1551,10 +1551,10 @@
 checkProduct(api.Product o) {
   buildCounterProduct++;
   if (buildCounterProduct < 3) {
-    checkUnnamed322(o.additionalImageLinks);
+    checkUnnamed345(o.additionalImageLinks);
     unittest.expect(o.adult, unittest.isTrue);
     unittest.expect(o.adwordsGrouping, unittest.equals('foo'));
-    checkUnnamed323(o.adwordsLabels);
+    checkUnnamed346(o.adwordsLabels);
     unittest.expect(o.adwordsRedirect, unittest.equals('foo'));
     unittest.expect(o.ageGroup, unittest.equals('foo'));
     unittest.expect(o.availability, unittest.equals('foo'));
@@ -1564,15 +1564,15 @@
     unittest.expect(o.color, unittest.equals('foo'));
     unittest.expect(o.condition, unittest.equals('foo'));
     unittest.expect(o.contentLanguage, unittest.equals('foo'));
-    checkUnnamed324(o.customAttributes);
-    checkUnnamed325(o.customGroups);
+    checkUnnamed347(o.customAttributes);
+    checkUnnamed348(o.customGroups);
     unittest.expect(o.customLabel0, unittest.equals('foo'));
     unittest.expect(o.customLabel1, unittest.equals('foo'));
     unittest.expect(o.customLabel2, unittest.equals('foo'));
     unittest.expect(o.customLabel3, unittest.equals('foo'));
     unittest.expect(o.customLabel4, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed326(o.destinations);
+    checkUnnamed349(o.destinations);
     unittest.expect(o.energyEfficiencyClass, unittest.equals('foo'));
     unittest.expect(o.expirationDate, unittest.equals('foo'));
     unittest.expect(o.gender, unittest.equals('foo'));
@@ -1598,19 +1598,19 @@
     unittest.expect(o.productType, unittest.equals('foo'));
     checkPrice(o.salePrice);
     unittest.expect(o.salePriceEffectiveDate, unittest.equals('foo'));
-    checkUnnamed327(o.shipping);
+    checkUnnamed350(o.shipping);
     unittest.expect(o.shippingLabel, unittest.equals('foo'));
     checkProductShippingWeight(o.shippingWeight);
     unittest.expect(o.sizeSystem, unittest.equals('foo'));
     unittest.expect(o.sizeType, unittest.equals('foo'));
-    checkUnnamed328(o.sizes);
+    checkUnnamed351(o.sizes);
     unittest.expect(o.targetCountry, unittest.equals('foo'));
-    checkUnnamed329(o.taxes);
+    checkUnnamed352(o.taxes);
     unittest.expect(o.title, unittest.equals('foo'));
     checkProductUnitPricingBaseMeasure(o.unitPricingBaseMeasure);
     checkProductUnitPricingMeasure(o.unitPricingMeasure);
-    checkUnnamed330(o.validatedDestinations);
-    checkUnnamed331(o.warnings);
+    checkUnnamed353(o.validatedDestinations);
+    checkUnnamed354(o.warnings);
   }
   buildCounterProduct--;
 }
@@ -1640,14 +1640,14 @@
   buildCounterProductCustomAttribute--;
 }
 
-buildUnnamed332() {
+buildUnnamed355() {
   var o = new core.List<api.ProductCustomAttribute>();
   o.add(buildProductCustomAttribute());
   o.add(buildProductCustomAttribute());
   return o;
 }
 
-checkUnnamed332(core.List<api.ProductCustomAttribute> o) {
+checkUnnamed355(core.List<api.ProductCustomAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductCustomAttribute(o[0]);
   checkProductCustomAttribute(o[1]);
@@ -1658,7 +1658,7 @@
   var o = new api.ProductCustomGroup();
   buildCounterProductCustomGroup++;
   if (buildCounterProductCustomGroup < 3) {
-    o.attributes = buildUnnamed332();
+    o.attributes = buildUnnamed355();
     o.name = "foo";
   }
   buildCounterProductCustomGroup--;
@@ -1668,7 +1668,7 @@
 checkProductCustomGroup(api.ProductCustomGroup o) {
   buildCounterProductCustomGroup++;
   if (buildCounterProductCustomGroup < 3) {
-    checkUnnamed332(o.attributes);
+    checkUnnamed355(o.attributes);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterProductCustomGroup--;
@@ -1768,27 +1768,27 @@
   buildCounterProductShippingWeight--;
 }
 
-buildUnnamed333() {
+buildUnnamed356() {
   var o = new core.List<api.ProductStatusDataQualityIssue>();
   o.add(buildProductStatusDataQualityIssue());
   o.add(buildProductStatusDataQualityIssue());
   return o;
 }
 
-checkUnnamed333(core.List<api.ProductStatusDataQualityIssue> o) {
+checkUnnamed356(core.List<api.ProductStatusDataQualityIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductStatusDataQualityIssue(o[0]);
   checkProductStatusDataQualityIssue(o[1]);
 }
 
-buildUnnamed334() {
+buildUnnamed357() {
   var o = new core.List<api.ProductStatusDestinationStatus>();
   o.add(buildProductStatusDestinationStatus());
   o.add(buildProductStatusDestinationStatus());
   return o;
 }
 
-checkUnnamed334(core.List<api.ProductStatusDestinationStatus> o) {
+checkUnnamed357(core.List<api.ProductStatusDestinationStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductStatusDestinationStatus(o[0]);
   checkProductStatusDestinationStatus(o[1]);
@@ -1799,8 +1799,8 @@
   var o = new api.ProductStatus();
   buildCounterProductStatus++;
   if (buildCounterProductStatus < 3) {
-    o.dataQualityIssues = buildUnnamed333();
-    o.destinationStatuses = buildUnnamed334();
+    o.dataQualityIssues = buildUnnamed356();
+    o.destinationStatuses = buildUnnamed357();
     o.kind = "foo";
     o.link = "foo";
     o.productId = "foo";
@@ -1813,8 +1813,8 @@
 checkProductStatus(api.ProductStatus o) {
   buildCounterProductStatus++;
   if (buildCounterProductStatus < 3) {
-    checkUnnamed333(o.dataQualityIssues);
-    checkUnnamed334(o.destinationStatuses);
+    checkUnnamed356(o.dataQualityIssues);
+    checkUnnamed357(o.destinationStatuses);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.link, unittest.equals('foo'));
     unittest.expect(o.productId, unittest.equals('foo'));
@@ -1948,14 +1948,14 @@
   buildCounterProductUnitPricingMeasure--;
 }
 
-buildUnnamed335() {
+buildUnnamed358() {
   var o = new core.List<api.ProductsCustomBatchRequestEntry>();
   o.add(buildProductsCustomBatchRequestEntry());
   o.add(buildProductsCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed335(core.List<api.ProductsCustomBatchRequestEntry> o) {
+checkUnnamed358(core.List<api.ProductsCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductsCustomBatchRequestEntry(o[0]);
   checkProductsCustomBatchRequestEntry(o[1]);
@@ -1966,7 +1966,7 @@
   var o = new api.ProductsCustomBatchRequest();
   buildCounterProductsCustomBatchRequest++;
   if (buildCounterProductsCustomBatchRequest < 3) {
-    o.entries = buildUnnamed335();
+    o.entries = buildUnnamed358();
   }
   buildCounterProductsCustomBatchRequest--;
   return o;
@@ -1975,7 +1975,7 @@
 checkProductsCustomBatchRequest(api.ProductsCustomBatchRequest o) {
   buildCounterProductsCustomBatchRequest++;
   if (buildCounterProductsCustomBatchRequest < 3) {
-    checkUnnamed335(o.entries);
+    checkUnnamed358(o.entries);
   }
   buildCounterProductsCustomBatchRequest--;
 }
@@ -2007,14 +2007,14 @@
   buildCounterProductsCustomBatchRequestEntry--;
 }
 
-buildUnnamed336() {
+buildUnnamed359() {
   var o = new core.List<api.ProductsCustomBatchResponseEntry>();
   o.add(buildProductsCustomBatchResponseEntry());
   o.add(buildProductsCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed336(core.List<api.ProductsCustomBatchResponseEntry> o) {
+checkUnnamed359(core.List<api.ProductsCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductsCustomBatchResponseEntry(o[0]);
   checkProductsCustomBatchResponseEntry(o[1]);
@@ -2025,7 +2025,7 @@
   var o = new api.ProductsCustomBatchResponse();
   buildCounterProductsCustomBatchResponse++;
   if (buildCounterProductsCustomBatchResponse < 3) {
-    o.entries = buildUnnamed336();
+    o.entries = buildUnnamed359();
     o.kind = "foo";
   }
   buildCounterProductsCustomBatchResponse--;
@@ -2035,7 +2035,7 @@
 checkProductsCustomBatchResponse(api.ProductsCustomBatchResponse o) {
   buildCounterProductsCustomBatchResponse++;
   if (buildCounterProductsCustomBatchResponse < 3) {
-    checkUnnamed336(o.entries);
+    checkUnnamed359(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterProductsCustomBatchResponse--;
@@ -2066,14 +2066,14 @@
   buildCounterProductsCustomBatchResponseEntry--;
 }
 
-buildUnnamed337() {
+buildUnnamed360() {
   var o = new core.List<api.Product>();
   o.add(buildProduct());
   o.add(buildProduct());
   return o;
 }
 
-checkUnnamed337(core.List<api.Product> o) {
+checkUnnamed360(core.List<api.Product> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProduct(o[0]);
   checkProduct(o[1]);
@@ -2086,7 +2086,7 @@
   if (buildCounterProductsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed337();
+    o.resources = buildUnnamed360();
   }
   buildCounterProductsListResponse--;
   return o;
@@ -2097,19 +2097,19 @@
   if (buildCounterProductsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed337(o.resources);
+    checkUnnamed360(o.resources);
   }
   buildCounterProductsListResponse--;
 }
 
-buildUnnamed338() {
+buildUnnamed361() {
   var o = new core.List<api.ProductstatusesCustomBatchRequestEntry>();
   o.add(buildProductstatusesCustomBatchRequestEntry());
   o.add(buildProductstatusesCustomBatchRequestEntry());
   return o;
 }
 
-checkUnnamed338(core.List<api.ProductstatusesCustomBatchRequestEntry> o) {
+checkUnnamed361(core.List<api.ProductstatusesCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductstatusesCustomBatchRequestEntry(o[0]);
   checkProductstatusesCustomBatchRequestEntry(o[1]);
@@ -2120,7 +2120,7 @@
   var o = new api.ProductstatusesCustomBatchRequest();
   buildCounterProductstatusesCustomBatchRequest++;
   if (buildCounterProductstatusesCustomBatchRequest < 3) {
-    o.entries = buildUnnamed338();
+    o.entries = buildUnnamed361();
   }
   buildCounterProductstatusesCustomBatchRequest--;
   return o;
@@ -2129,7 +2129,7 @@
 checkProductstatusesCustomBatchRequest(api.ProductstatusesCustomBatchRequest o) {
   buildCounterProductstatusesCustomBatchRequest++;
   if (buildCounterProductstatusesCustomBatchRequest < 3) {
-    checkUnnamed338(o.entries);
+    checkUnnamed361(o.entries);
   }
   buildCounterProductstatusesCustomBatchRequest--;
 }
@@ -2159,14 +2159,14 @@
   buildCounterProductstatusesCustomBatchRequestEntry--;
 }
 
-buildUnnamed339() {
+buildUnnamed362() {
   var o = new core.List<api.ProductstatusesCustomBatchResponseEntry>();
   o.add(buildProductstatusesCustomBatchResponseEntry());
   o.add(buildProductstatusesCustomBatchResponseEntry());
   return o;
 }
 
-checkUnnamed339(core.List<api.ProductstatusesCustomBatchResponseEntry> o) {
+checkUnnamed362(core.List<api.ProductstatusesCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductstatusesCustomBatchResponseEntry(o[0]);
   checkProductstatusesCustomBatchResponseEntry(o[1]);
@@ -2177,7 +2177,7 @@
   var o = new api.ProductstatusesCustomBatchResponse();
   buildCounterProductstatusesCustomBatchResponse++;
   if (buildCounterProductstatusesCustomBatchResponse < 3) {
-    o.entries = buildUnnamed339();
+    o.entries = buildUnnamed362();
     o.kind = "foo";
   }
   buildCounterProductstatusesCustomBatchResponse--;
@@ -2187,7 +2187,7 @@
 checkProductstatusesCustomBatchResponse(api.ProductstatusesCustomBatchResponse o) {
   buildCounterProductstatusesCustomBatchResponse++;
   if (buildCounterProductstatusesCustomBatchResponse < 3) {
-    checkUnnamed339(o.entries);
+    checkUnnamed362(o.entries);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterProductstatusesCustomBatchResponse--;
@@ -2218,14 +2218,14 @@
   buildCounterProductstatusesCustomBatchResponseEntry--;
 }
 
-buildUnnamed340() {
+buildUnnamed363() {
   var o = new core.List<api.ProductStatus>();
   o.add(buildProductStatus());
   o.add(buildProductStatus());
   return o;
 }
 
-checkUnnamed340(core.List<api.ProductStatus> o) {
+checkUnnamed363(core.List<api.ProductStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProductStatus(o[0]);
   checkProductStatus(o[1]);
@@ -2238,7 +2238,7 @@
   if (buildCounterProductstatusesListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed340();
+    o.resources = buildUnnamed363();
   }
   buildCounterProductstatusesListResponse--;
   return o;
@@ -2249,7 +2249,7 @@
   if (buildCounterProductstatusesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed340(o.resources);
+    checkUnnamed363(o.resources);
   }
   buildCounterProductstatusesListResponse--;
 }
@@ -2864,8 +2864,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("content/v2/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("accounts/batch"));
         pathOffset += 14;
 
@@ -2909,18 +2911,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/accounts/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/accounts/"));
-        pathOffset += 10;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2960,18 +2952,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/accounts/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/accounts/"));
-        pathOffset += 10;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3016,15 +2998,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/accounts", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/accounts"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3067,15 +3042,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/accounts", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/accounts"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3123,18 +3091,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/accounts/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/accounts/"));
-        pathOffset += 10;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3180,18 +3138,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/accounts/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/accounts/"));
-        pathOffset += 10;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3239,8 +3187,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("content/v2/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("accountstatuses/batch"));
         pathOffset += 21;
 
@@ -3284,18 +3234,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/accountstatuses/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/accountstatuses/"));
-        pathOffset += 17;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_accountId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3338,15 +3278,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/accountstatuses", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/accountstatuses"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3396,8 +3329,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("content/v2/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("datafeeds/batch"));
         pathOffset += 15;
 
@@ -3441,18 +3376,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/datafeeds/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/datafeeds/"));
-        pathOffset += 11;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_datafeedId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3492,18 +3417,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/datafeeds/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/datafeeds/"));
-        pathOffset += 11;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_datafeedId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3548,15 +3463,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/datafeeds", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/datafeeds"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3597,15 +3505,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/datafeeds", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/datafeeds"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3651,18 +3552,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/datafeeds/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/datafeeds/"));
-        pathOffset += 11;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_datafeedId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3708,18 +3599,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/datafeeds/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/datafeeds/"));
-        pathOffset += 11;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_datafeedId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3767,8 +3648,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("content/v2/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("datafeedstatuses/batch"));
         pathOffset += 22;
 
@@ -3812,18 +3695,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/datafeedstatuses/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/datafeedstatuses/"));
-        pathOffset += 18;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_datafeedId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3864,15 +3737,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/datafeedstatuses", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/datafeedstatuses"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -3920,8 +3786,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("content/v2/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("inventory/batch"));
         pathOffset += 15;
 
@@ -3970,25 +3838,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/inventory/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/inventory/"));
-        pathOffset += 11;
-        index = path.indexOf("/products/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_storeCode"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/products/"));
-        pathOffset += 10;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_productId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -4037,8 +3888,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("content/v2/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("products/batch"));
         pathOffset += 14;
 
@@ -4084,18 +3937,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/products/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/products/"));
-        pathOffset += 10;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_productId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -4136,18 +3979,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/products/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/products/"));
-        pathOffset += 10;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_productId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -4193,15 +4026,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/products", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/products"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -4245,15 +4071,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/products", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/products"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -4303,8 +4122,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("content/v2/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("productstatuses/batch"));
         pathOffset += 21;
 
@@ -4348,18 +4169,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/productstatuses/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/productstatuses/"));
-        pathOffset += 17;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_productId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -4402,15 +4213,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/content/v2/"));
-        pathOffset += 12;
-        index = path.indexOf("/productstatuses", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_merchantId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/productstatuses"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
diff --git a/generated/googleapis/test/coordinate/v1_test.dart b/generated/googleapis/test/coordinate/v1_test.dart
index 9403ea8..387d2c6 100644
--- a/generated/googleapis/test/coordinate/v1_test.dart
+++ b/generated/googleapis/test/coordinate/v1_test.dart
@@ -68,14 +68,14 @@
   buildCounterCustomFieldDef--;
 }
 
-buildUnnamed445() {
+buildUnnamed470() {
   var o = new core.List<api.CustomFieldDef>();
   o.add(buildCustomFieldDef());
   o.add(buildCustomFieldDef());
   return o;
 }
 
-checkUnnamed445(core.List<api.CustomFieldDef> o) {
+checkUnnamed470(core.List<api.CustomFieldDef> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomFieldDef(o[0]);
   checkCustomFieldDef(o[1]);
@@ -86,7 +86,7 @@
   var o = new api.CustomFieldDefListResponse();
   buildCounterCustomFieldDefListResponse++;
   if (buildCounterCustomFieldDefListResponse < 3) {
-    o.items = buildUnnamed445();
+    o.items = buildUnnamed470();
     o.kind = "foo";
   }
   buildCounterCustomFieldDefListResponse--;
@@ -96,20 +96,20 @@
 checkCustomFieldDefListResponse(api.CustomFieldDefListResponse o) {
   buildCounterCustomFieldDefListResponse++;
   if (buildCounterCustomFieldDefListResponse < 3) {
-    checkUnnamed445(o.items);
+    checkUnnamed470(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCustomFieldDefListResponse--;
 }
 
-buildUnnamed446() {
+buildUnnamed471() {
   var o = new core.List<api.CustomField>();
   o.add(buildCustomField());
   o.add(buildCustomField());
   return o;
 }
 
-checkUnnamed446(core.List<api.CustomField> o) {
+checkUnnamed471(core.List<api.CustomField> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomField(o[0]);
   checkCustomField(o[1]);
@@ -120,7 +120,7 @@
   var o = new api.CustomFields();
   buildCounterCustomFields++;
   if (buildCounterCustomFields < 3) {
-    o.customField = buildUnnamed446();
+    o.customField = buildUnnamed471();
     o.kind = "foo";
   }
   buildCounterCustomFields--;
@@ -130,20 +130,20 @@
 checkCustomFields(api.CustomFields o) {
   buildCounterCustomFields++;
   if (buildCounterCustomFields < 3) {
-    checkUnnamed446(o.customField);
+    checkUnnamed471(o.customField);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCustomFields--;
 }
 
-buildUnnamed447() {
+buildUnnamed472() {
   var o = new core.List<api.JobChange>();
   o.add(buildJobChange());
   o.add(buildJobChange());
   return o;
 }
 
-checkUnnamed447(core.List<api.JobChange> o) {
+checkUnnamed472(core.List<api.JobChange> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJobChange(o[0]);
   checkJobChange(o[1]);
@@ -155,7 +155,7 @@
   buildCounterJob++;
   if (buildCounterJob < 3) {
     o.id = "foo";
-    o.jobChange = buildUnnamed447();
+    o.jobChange = buildUnnamed472();
     o.kind = "foo";
     o.state = buildJobState();
   }
@@ -167,7 +167,7 @@
   buildCounterJob++;
   if (buildCounterJob < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed447(o.jobChange);
+    checkUnnamed472(o.jobChange);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkJobState(o.state);
   }
@@ -197,14 +197,14 @@
   buildCounterJobChange--;
 }
 
-buildUnnamed448() {
+buildUnnamed473() {
   var o = new core.List<api.Job>();
   o.add(buildJob());
   o.add(buildJob());
   return o;
 }
 
-checkUnnamed448(core.List<api.Job> o) {
+checkUnnamed473(core.List<api.Job> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJob(o[0]);
   checkJob(o[1]);
@@ -215,7 +215,7 @@
   var o = new api.JobListResponse();
   buildCounterJobListResponse++;
   if (buildCounterJobListResponse < 3) {
-    o.items = buildUnnamed448();
+    o.items = buildUnnamed473();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -226,21 +226,21 @@
 checkJobListResponse(api.JobListResponse o) {
   buildCounterJobListResponse++;
   if (buildCounterJobListResponse < 3) {
-    checkUnnamed448(o.items);
+    checkUnnamed473(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterJobListResponse--;
 }
 
-buildUnnamed449() {
+buildUnnamed474() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed449(core.List<core.String> o) {
+checkUnnamed474(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -257,7 +257,7 @@
     o.customerPhoneNumber = "foo";
     o.kind = "foo";
     o.location = buildLocation();
-    o.note = buildUnnamed449();
+    o.note = buildUnnamed474();
     o.progress = "foo";
     o.title = "foo";
   }
@@ -274,21 +274,21 @@
     unittest.expect(o.customerPhoneNumber, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkLocation(o.location);
-    checkUnnamed449(o.note);
+    checkUnnamed474(o.note);
     unittest.expect(o.progress, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterJobState--;
 }
 
-buildUnnamed450() {
+buildUnnamed475() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed450(core.List<core.String> o) {
+checkUnnamed475(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -299,7 +299,7 @@
   var o = new api.Location();
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    o.addressLine = buildUnnamed450();
+    o.addressLine = buildUnnamed475();
     o.kind = "foo";
     o.lat = 42.0;
     o.lng = 42.0;
@@ -311,7 +311,7 @@
 checkLocation(api.Location o) {
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    checkUnnamed450(o.addressLine);
+    checkUnnamed475(o.addressLine);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lat, unittest.equals(42.0));
     unittest.expect(o.lng, unittest.equals(42.0));
@@ -319,14 +319,14 @@
   buildCounterLocation--;
 }
 
-buildUnnamed451() {
+buildUnnamed476() {
   var o = new core.List<api.LocationRecord>();
   o.add(buildLocationRecord());
   o.add(buildLocationRecord());
   return o;
 }
 
-checkUnnamed451(core.List<api.LocationRecord> o) {
+checkUnnamed476(core.List<api.LocationRecord> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocationRecord(o[0]);
   checkLocationRecord(o[1]);
@@ -337,7 +337,7 @@
   var o = new api.LocationListResponse();
   buildCounterLocationListResponse++;
   if (buildCounterLocationListResponse < 3) {
-    o.items = buildUnnamed451();
+    o.items = buildUnnamed476();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.tokenPagination = buildTokenPagination();
@@ -349,7 +349,7 @@
 checkLocationListResponse(api.LocationListResponse o) {
   buildCounterLocationListResponse++;
   if (buildCounterLocationListResponse < 3) {
-    checkUnnamed451(o.items);
+    checkUnnamed476(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkTokenPagination(o.tokenPagination);
@@ -455,14 +455,14 @@
   buildCounterWorker--;
 }
 
-buildUnnamed452() {
+buildUnnamed477() {
   var o = new core.List<api.Worker>();
   o.add(buildWorker());
   o.add(buildWorker());
   return o;
 }
 
-checkUnnamed452(core.List<api.Worker> o) {
+checkUnnamed477(core.List<api.Worker> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWorker(o[0]);
   checkWorker(o[1]);
@@ -473,7 +473,7 @@
   var o = new api.WorkerListResponse();
   buildCounterWorkerListResponse++;
   if (buildCounterWorkerListResponse < 3) {
-    o.items = buildUnnamed452();
+    o.items = buildUnnamed477();
     o.kind = "foo";
   }
   buildCounterWorkerListResponse--;
@@ -483,46 +483,46 @@
 checkWorkerListResponse(api.WorkerListResponse o) {
   buildCounterWorkerListResponse++;
   if (buildCounterWorkerListResponse < 3) {
-    checkUnnamed452(o.items);
+    checkUnnamed477(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterWorkerListResponse--;
 }
 
-buildUnnamed453() {
+buildUnnamed478() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed453(core.List<core.String> o) {
+checkUnnamed478(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed454() {
+buildUnnamed479() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed454(core.List<core.String> o) {
+checkUnnamed479(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed455() {
+buildUnnamed480() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed455(core.List<core.String> o) {
+checkUnnamed480(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -676,15 +676,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/coordinate/v1/teams/"));
-        pathOffset += 21;
-        index = path.indexOf("/custom_fields", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_teamId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/custom_fields"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -730,18 +723,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/coordinate/v1/teams/"));
-        pathOffset += 21;
-        index = path.indexOf("/jobs/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_teamId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/jobs/"));
-        pathOffset += 6;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_jobId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -783,7 +766,7 @@
       var arg_lng = 42.0;
       var arg_title = "foo";
       var arg_assignee = "foo";
-      var arg_customField = buildUnnamed453();
+      var arg_customField = buildUnnamed478();
       var arg_customerName = "foo";
       var arg_customerPhoneNumber = "foo";
       var arg_note = "foo";
@@ -795,15 +778,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/coordinate/v1/teams/"));
-        pathOffset += 21;
-        index = path.indexOf("/jobs", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_teamId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/jobs"));
-        pathOffset += 5;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -856,15 +832,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/coordinate/v1/teams/"));
-        pathOffset += 21;
-        index = path.indexOf("/jobs", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_teamId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/jobs"));
-        pathOffset += 5;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -907,7 +876,7 @@
       var arg_jobId = "foo";
       var arg_address = "foo";
       var arg_assignee = "foo";
-      var arg_customField = buildUnnamed454();
+      var arg_customField = buildUnnamed479();
       var arg_customerName = "foo";
       var arg_customerPhoneNumber = "foo";
       var arg_lat = 42.0;
@@ -923,18 +892,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/coordinate/v1/teams/"));
-        pathOffset += 21;
-        index = path.indexOf("/jobs/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_teamId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/jobs/"));
-        pathOffset += 6;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_jobId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -984,7 +943,7 @@
       var arg_jobId = "foo";
       var arg_address = "foo";
       var arg_assignee = "foo";
-      var arg_customField = buildUnnamed455();
+      var arg_customField = buildUnnamed480();
       var arg_customerName = "foo";
       var arg_customerPhoneNumber = "foo";
       var arg_lat = 42.0;
@@ -1000,18 +959,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/coordinate/v1/teams/"));
-        pathOffset += 21;
-        index = path.indexOf("/jobs/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_teamId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/jobs/"));
-        pathOffset += 6;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_jobId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1070,22 +1019,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/coordinate/v1/teams/"));
-        pathOffset += 21;
-        index = path.indexOf("/workers/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_teamId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/workers/"));
-        pathOffset += 9;
-        index = path.indexOf("/locations", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_workerEmail"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/locations"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1134,22 +1069,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/coordinate/v1/teams/"));
-        pathOffset += 21;
-        index = path.indexOf("/jobs/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_teamId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/jobs/"));
-        pathOffset += 6;
-        index = path.indexOf("/schedule", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_jobId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/schedule"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1199,22 +1120,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/coordinate/v1/teams/"));
-        pathOffset += 21;
-        index = path.indexOf("/jobs/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_teamId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/jobs/"));
-        pathOffset += 6;
-        index = path.indexOf("/schedule", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_jobId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/schedule"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1268,22 +1175,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/coordinate/v1/teams/"));
-        pathOffset += 21;
-        index = path.indexOf("/jobs/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_teamId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/jobs/"));
-        pathOffset += 6;
-        index = path.indexOf("/schedule", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_jobId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/schedule"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1332,15 +1225,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/coordinate/v1/teams/"));
-        pathOffset += 21;
-        index = path.indexOf("/workers", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_teamId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/workers"));
-        pathOffset += 8;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
diff --git a/generated/googleapis/test/customsearch/v1_test.dart b/generated/googleapis/test/customsearch/v1_test.dart
index 3048bd9..46ccc62 100644
--- a/generated/googleapis/test/customsearch/v1_test.dart
+++ b/generated/googleapis/test/customsearch/v1_test.dart
@@ -39,30 +39,30 @@
   buildCounterContextFacets--;
 }
 
-buildUnnamed288() {
+buildUnnamed291() {
   var o = new core.List<api.ContextFacets>();
   o.add(buildContextFacets());
   o.add(buildContextFacets());
   return o;
 }
 
-checkUnnamed288(core.List<api.ContextFacets> o) {
+checkUnnamed291(core.List<api.ContextFacets> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContextFacets(o[0]);
   checkContextFacets(o[1]);
 }
 
-buildUnnamed289() {
+buildUnnamed292() {
   var o = new core.List<core.List<api.ContextFacets>>();
-  o.add(buildUnnamed288());
-  o.add(buildUnnamed288());
+  o.add(buildUnnamed291());
+  o.add(buildUnnamed291());
   return o;
 }
 
-checkUnnamed289(core.List<core.List<api.ContextFacets>> o) {
+checkUnnamed292(core.List<core.List<api.ContextFacets>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed288(o[0]);
-  checkUnnamed288(o[1]);
+  checkUnnamed291(o[0]);
+  checkUnnamed291(o[1]);
 }
 
 core.int buildCounterContext = 0;
@@ -70,7 +70,7 @@
   var o = new api.Context();
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    o.facets = buildUnnamed289();
+    o.facets = buildUnnamed292();
     o.title = "foo";
   }
   buildCounterContext--;
@@ -80,7 +80,7 @@
 checkContext(api.Context o) {
   buildCounterContext++;
   if (buildCounterContext < 3) {
-    checkUnnamed289(o.facets);
+    checkUnnamed292(o.facets);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterContext--;
@@ -111,14 +111,14 @@
   buildCounterPromotionBodyLines--;
 }
 
-buildUnnamed290() {
+buildUnnamed293() {
   var o = new core.List<api.PromotionBodyLines>();
   o.add(buildPromotionBodyLines());
   o.add(buildPromotionBodyLines());
   return o;
 }
 
-checkUnnamed290(core.List<api.PromotionBodyLines> o) {
+checkUnnamed293(core.List<api.PromotionBodyLines> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPromotionBodyLines(o[0]);
   checkPromotionBodyLines(o[1]);
@@ -152,7 +152,7 @@
   var o = new api.Promotion();
   buildCounterPromotion++;
   if (buildCounterPromotion < 3) {
-    o.bodyLines = buildUnnamed290();
+    o.bodyLines = buildUnnamed293();
     o.displayLink = "foo";
     o.htmlTitle = "foo";
     o.image = buildPromotionImage();
@@ -166,7 +166,7 @@
 checkPromotion(api.Promotion o) {
   buildCounterPromotion++;
   if (buildCounterPromotion < 3) {
-    checkUnnamed290(o.bodyLines);
+    checkUnnamed293(o.bodyLines);
     unittest.expect(o.displayLink, unittest.equals('foo'));
     unittest.expect(o.htmlTitle, unittest.equals('foo'));
     checkPromotionImage(o.image);
@@ -321,56 +321,56 @@
   buildCounterResultLabels--;
 }
 
-buildUnnamed291() {
+buildUnnamed294() {
   var o = new core.List<api.ResultLabels>();
   o.add(buildResultLabels());
   o.add(buildResultLabels());
   return o;
 }
 
-checkUnnamed291(core.List<api.ResultLabels> o) {
+checkUnnamed294(core.List<api.ResultLabels> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultLabels(o[0]);
   checkResultLabels(o[1]);
 }
 
-buildUnnamed292() {
+buildUnnamed295() {
   var o = new core.Map<core.String, core.Object>();
   o["x"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
   o["y"] = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
   return o;
 }
 
-checkUnnamed292(core.Map<core.String, core.Object> o) {
+checkUnnamed295(core.Map<core.String, core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o["x"]) 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')); 
   var casted2 = (o["y"]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
 }
 
-buildUnnamed293() {
+buildUnnamed296() {
   var o = new core.List<core.Map<core.String, core.Object>>();
-  o.add(buildUnnamed292());
-  o.add(buildUnnamed292());
+  o.add(buildUnnamed295());
+  o.add(buildUnnamed295());
   return o;
 }
 
-checkUnnamed293(core.List<core.Map<core.String, core.Object>> o) {
+checkUnnamed296(core.List<core.Map<core.String, core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed292(o[0]);
-  checkUnnamed292(o[1]);
+  checkUnnamed295(o[0]);
+  checkUnnamed295(o[1]);
 }
 
-buildUnnamed294() {
+buildUnnamed297() {
   var o = new core.Map<core.String, core.List<core.Map<core.String, core.Object>>>();
-  o["x"] = buildUnnamed293();
-  o["y"] = buildUnnamed293();
+  o["x"] = buildUnnamed296();
+  o["y"] = buildUnnamed296();
   return o;
 }
 
-checkUnnamed294(core.Map<core.String, core.List<core.Map<core.String, core.Object>>> o) {
+checkUnnamed297(core.Map<core.String, core.List<core.Map<core.String, core.Object>>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed293(o["x"]);
-  checkUnnamed293(o["y"]);
+  checkUnnamed296(o["x"]);
+  checkUnnamed296(o["y"]);
 }
 
 core.int buildCounterResult = 0;
@@ -387,10 +387,10 @@
     o.htmlTitle = "foo";
     o.image = buildResultImage();
     o.kind = "foo";
-    o.labels = buildUnnamed291();
+    o.labels = buildUnnamed294();
     o.link = "foo";
     o.mime = "foo";
-    o.pagemap = buildUnnamed294();
+    o.pagemap = buildUnnamed297();
     o.snippet = "foo";
     o.title = "foo";
   }
@@ -410,66 +410,66 @@
     unittest.expect(o.htmlTitle, unittest.equals('foo'));
     checkResultImage(o.image);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed291(o.labels);
+    checkUnnamed294(o.labels);
     unittest.expect(o.link, unittest.equals('foo'));
     unittest.expect(o.mime, unittest.equals('foo'));
-    checkUnnamed294(o.pagemap);
+    checkUnnamed297(o.pagemap);
     unittest.expect(o.snippet, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterResult--;
 }
 
-buildUnnamed295() {
+buildUnnamed298() {
   var o = new core.List<api.Result>();
   o.add(buildResult());
   o.add(buildResult());
   return o;
 }
 
-checkUnnamed295(core.List<api.Result> o) {
+checkUnnamed298(core.List<api.Result> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResult(o[0]);
   checkResult(o[1]);
 }
 
-buildUnnamed296() {
+buildUnnamed299() {
   var o = new core.List<api.Promotion>();
   o.add(buildPromotion());
   o.add(buildPromotion());
   return o;
 }
 
-checkUnnamed296(core.List<api.Promotion> o) {
+checkUnnamed299(core.List<api.Promotion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPromotion(o[0]);
   checkPromotion(o[1]);
 }
 
-buildUnnamed297() {
+buildUnnamed300() {
   var o = new core.List<api.Query>();
   o.add(buildQuery());
   o.add(buildQuery());
   return o;
 }
 
-checkUnnamed297(core.List<api.Query> o) {
+checkUnnamed300(core.List<api.Query> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuery(o[0]);
   checkQuery(o[1]);
 }
 
-buildUnnamed298() {
+buildUnnamed301() {
   var o = new core.Map<core.String, core.List<api.Query>>();
-  o["x"] = buildUnnamed297();
-  o["y"] = buildUnnamed297();
+  o["x"] = buildUnnamed300();
+  o["y"] = buildUnnamed300();
   return o;
 }
 
-checkUnnamed298(core.Map<core.String, core.List<api.Query>> o) {
+checkUnnamed301(core.Map<core.String, core.List<api.Query>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed297(o["x"]);
-  checkUnnamed297(o["y"]);
+  checkUnnamed300(o["x"]);
+  checkUnnamed300(o["y"]);
 }
 
 core.int buildCounterSearchSearchInformation = 0;
@@ -545,10 +545,10 @@
   buildCounterSearch++;
   if (buildCounterSearch < 3) {
     o.context = buildContext();
-    o.items = buildUnnamed295();
+    o.items = buildUnnamed298();
     o.kind = "foo";
-    o.promotions = buildUnnamed296();
-    o.queries = buildUnnamed298();
+    o.promotions = buildUnnamed299();
+    o.queries = buildUnnamed301();
     o.searchInformation = buildSearchSearchInformation();
     o.spelling = buildSearchSpelling();
     o.url = buildSearchUrl();
@@ -561,10 +561,10 @@
   buildCounterSearch++;
   if (buildCounterSearch < 3) {
     checkContext(o.context);
-    checkUnnamed295(o.items);
+    checkUnnamed298(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed296(o.promotions);
-    checkUnnamed298(o.queries);
+    checkUnnamed299(o.promotions);
+    checkUnnamed301(o.queries);
     checkSearchSearchInformation(o.searchInformation);
     checkSearchSpelling(o.spelling);
     checkSearchUrl(o.url);
@@ -733,8 +733,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/customsearch/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("customsearch/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("v1"));
         pathOffset += 2;
 
diff --git a/generated/googleapis/test/dfareporting/v1_3_test.dart b/generated/googleapis/test/dfareporting/v1_3_test.dart
index de3acee..f20951c 100644
--- a/generated/googleapis/test/dfareporting/v1_3_test.dart
+++ b/generated/googleapis/test/dfareporting/v1_3_test.dart
@@ -16,27 +16,27 @@
 
 
 
-buildUnnamed211() {
+buildUnnamed214() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed211(core.List<api.DimensionValue> o) {
+checkUnnamed214(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed212() {
+buildUnnamed215() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed212(core.List<core.String> o) {
+checkUnnamed215(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -47,9 +47,9 @@
   var o = new api.Activities();
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
-    o.filters = buildUnnamed211();
+    o.filters = buildUnnamed214();
     o.kind = "foo";
-    o.metricNames = buildUnnamed212();
+    o.metricNames = buildUnnamed215();
   }
   buildCounterActivities--;
   return o;
@@ -58,9 +58,9 @@
 checkActivities(api.Activities o) {
   buildCounterActivities++;
   if (buildCounterActivities < 3) {
-    checkUnnamed211(o.filters);
+    checkUnnamed214(o.filters);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed212(o.metricNames);
+    checkUnnamed215(o.metricNames);
   }
   buildCounterActivities--;
 }
@@ -94,53 +94,53 @@
   buildCounterCompatibleFields--;
 }
 
-buildUnnamed213() {
+buildUnnamed216() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed213(core.List<api.Dimension> o) {
+checkUnnamed216(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed214() {
+buildUnnamed217() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed214(core.List<api.Dimension> o) {
+checkUnnamed217(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed215() {
+buildUnnamed218() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed215(core.List<api.Metric> o) {
+checkUnnamed218(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed216() {
+buildUnnamed219() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed216(core.List<api.Metric> o) {
+checkUnnamed219(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -151,11 +151,11 @@
   var o = new api.CrossDimensionReachReportCompatibleFields();
   buildCounterCrossDimensionReachReportCompatibleFields++;
   if (buildCounterCrossDimensionReachReportCompatibleFields < 3) {
-    o.breakdown = buildUnnamed213();
-    o.dimensionFilters = buildUnnamed214();
+    o.breakdown = buildUnnamed216();
+    o.dimensionFilters = buildUnnamed217();
     o.kind = "foo";
-    o.metrics = buildUnnamed215();
-    o.overlapMetrics = buildUnnamed216();
+    o.metrics = buildUnnamed218();
+    o.overlapMetrics = buildUnnamed219();
   }
   buildCounterCrossDimensionReachReportCompatibleFields--;
   return o;
@@ -164,23 +164,23 @@
 checkCrossDimensionReachReportCompatibleFields(api.CrossDimensionReachReportCompatibleFields o) {
   buildCounterCrossDimensionReachReportCompatibleFields++;
   if (buildCounterCrossDimensionReachReportCompatibleFields < 3) {
-    checkUnnamed213(o.breakdown);
-    checkUnnamed214(o.dimensionFilters);
+    checkUnnamed216(o.breakdown);
+    checkUnnamed217(o.dimensionFilters);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed215(o.metrics);
-    checkUnnamed216(o.overlapMetrics);
+    checkUnnamed218(o.metrics);
+    checkUnnamed219(o.overlapMetrics);
   }
   buildCounterCrossDimensionReachReportCompatibleFields--;
 }
 
-buildUnnamed217() {
+buildUnnamed220() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed217(core.List<api.DimensionValue> o) {
+checkUnnamed220(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
@@ -191,7 +191,7 @@
   var o = new api.CustomRichMediaEvents();
   buildCounterCustomRichMediaEvents++;
   if (buildCounterCustomRichMediaEvents < 3) {
-    o.filteredEventIds = buildUnnamed217();
+    o.filteredEventIds = buildUnnamed220();
     o.kind = "foo";
   }
   buildCounterCustomRichMediaEvents--;
@@ -201,7 +201,7 @@
 checkCustomRichMediaEvents(api.CustomRichMediaEvents o) {
   buildCounterCustomRichMediaEvents++;
   if (buildCounterCustomRichMediaEvents < 3) {
-    checkUnnamed217(o.filteredEventIds);
+    checkUnnamed220(o.filteredEventIds);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCustomRichMediaEvents--;
@@ -305,14 +305,14 @@
   buildCounterDimensionValue--;
 }
 
-buildUnnamed218() {
+buildUnnamed221() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed218(core.List<api.DimensionValue> o) {
+checkUnnamed221(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
@@ -324,7 +324,7 @@
   buildCounterDimensionValueList++;
   if (buildCounterDimensionValueList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed218();
+    o.items = buildUnnamed221();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -336,21 +336,21 @@
   buildCounterDimensionValueList++;
   if (buildCounterDimensionValueList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed218(o.items);
+    checkUnnamed221(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterDimensionValueList--;
 }
 
-buildUnnamed219() {
+buildUnnamed222() {
   var o = new core.List<api.DimensionFilter>();
   o.add(buildDimensionFilter());
   o.add(buildDimensionFilter());
   return o;
 }
 
-checkUnnamed219(core.List<api.DimensionFilter> o) {
+checkUnnamed222(core.List<api.DimensionFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionFilter(o[0]);
   checkDimensionFilter(o[1]);
@@ -363,7 +363,7 @@
   if (buildCounterDimensionValueRequest < 3) {
     o.dimensionName = "foo";
     o.endDate = core.DateTime.parse("2002-02-27T14:01:02Z");
-    o.filters = buildUnnamed219();
+    o.filters = buildUnnamed222();
     o.kind = "foo";
     o.startDate = core.DateTime.parse("2002-02-27T14:01:02Z");
   }
@@ -376,7 +376,7 @@
   if (buildCounterDimensionValueRequest < 3) {
     unittest.expect(o.dimensionName, unittest.equals('foo'));
     unittest.expect(o.endDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
-    checkUnnamed219(o.filters);
+    checkUnnamed222(o.filters);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.startDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
   }
@@ -441,14 +441,14 @@
   buildCounterFile--;
 }
 
-buildUnnamed220() {
+buildUnnamed223() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed220(core.List<api.File> o) {
+checkUnnamed223(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -460,7 +460,7 @@
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed220();
+    o.items = buildUnnamed223();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -472,98 +472,13 @@
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed220(o.items);
+    checkUnnamed223(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterFileList--;
 }
 
-buildUnnamed221() {
-  var o = new core.List<api.Dimension>();
-  o.add(buildDimension());
-  o.add(buildDimension());
-  return o;
-}
-
-checkUnnamed221(core.List<api.Dimension> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkDimension(o[0]);
-  checkDimension(o[1]);
-}
-
-buildUnnamed222() {
-  var o = new core.List<api.Dimension>();
-  o.add(buildDimension());
-  o.add(buildDimension());
-  return o;
-}
-
-checkUnnamed222(core.List<api.Dimension> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkDimension(o[0]);
-  checkDimension(o[1]);
-}
-
-buildUnnamed223() {
-  var o = new core.List<api.Metric>();
-  o.add(buildMetric());
-  o.add(buildMetric());
-  return o;
-}
-
-checkUnnamed223(core.List<api.Metric> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkMetric(o[0]);
-  checkMetric(o[1]);
-}
-
-core.int buildCounterFloodlightReportCompatibleFields = 0;
-buildFloodlightReportCompatibleFields() {
-  var o = new api.FloodlightReportCompatibleFields();
-  buildCounterFloodlightReportCompatibleFields++;
-  if (buildCounterFloodlightReportCompatibleFields < 3) {
-    o.dimensionFilters = buildUnnamed221();
-    o.dimensions = buildUnnamed222();
-    o.kind = "foo";
-    o.metrics = buildUnnamed223();
-  }
-  buildCounterFloodlightReportCompatibleFields--;
-  return o;
-}
-
-checkFloodlightReportCompatibleFields(api.FloodlightReportCompatibleFields o) {
-  buildCounterFloodlightReportCompatibleFields++;
-  if (buildCounterFloodlightReportCompatibleFields < 3) {
-    checkUnnamed221(o.dimensionFilters);
-    checkUnnamed222(o.dimensions);
-    unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed223(o.metrics);
-  }
-  buildCounterFloodlightReportCompatibleFields--;
-}
-
-core.int buildCounterMetric = 0;
-buildMetric() {
-  var o = new api.Metric();
-  buildCounterMetric++;
-  if (buildCounterMetric < 3) {
-    o.kind = "foo";
-    o.name = "foo";
-  }
-  buildCounterMetric--;
-  return o;
-}
-
-checkMetric(api.Metric o) {
-  buildCounterMetric++;
-  if (buildCounterMetric < 3) {
-    unittest.expect(o.kind, unittest.equals('foo'));
-    unittest.expect(o.name, unittest.equals('foo'));
-  }
-  buildCounterMetric--;
-}
-
 buildUnnamed224() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
@@ -603,6 +518,52 @@
   checkMetric(o[1]);
 }
 
+core.int buildCounterFloodlightReportCompatibleFields = 0;
+buildFloodlightReportCompatibleFields() {
+  var o = new api.FloodlightReportCompatibleFields();
+  buildCounterFloodlightReportCompatibleFields++;
+  if (buildCounterFloodlightReportCompatibleFields < 3) {
+    o.dimensionFilters = buildUnnamed224();
+    o.dimensions = buildUnnamed225();
+    o.kind = "foo";
+    o.metrics = buildUnnamed226();
+  }
+  buildCounterFloodlightReportCompatibleFields--;
+  return o;
+}
+
+checkFloodlightReportCompatibleFields(api.FloodlightReportCompatibleFields o) {
+  buildCounterFloodlightReportCompatibleFields++;
+  if (buildCounterFloodlightReportCompatibleFields < 3) {
+    checkUnnamed224(o.dimensionFilters);
+    checkUnnamed225(o.dimensions);
+    unittest.expect(o.kind, unittest.equals('foo'));
+    checkUnnamed226(o.metrics);
+  }
+  buildCounterFloodlightReportCompatibleFields--;
+}
+
+core.int buildCounterMetric = 0;
+buildMetric() {
+  var o = new api.Metric();
+  buildCounterMetric++;
+  if (buildCounterMetric < 3) {
+    o.kind = "foo";
+    o.name = "foo";
+  }
+  buildCounterMetric--;
+  return o;
+}
+
+checkMetric(api.Metric o) {
+  buildCounterMetric++;
+  if (buildCounterMetric < 3) {
+    unittest.expect(o.kind, unittest.equals('foo'));
+    unittest.expect(o.name, unittest.equals('foo'));
+  }
+  buildCounterMetric--;
+}
+
 buildUnnamed227() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
@@ -616,33 +577,6 @@
   checkDimension(o[1]);
 }
 
-core.int buildCounterPathToConversionReportCompatibleFields = 0;
-buildPathToConversionReportCompatibleFields() {
-  var o = new api.PathToConversionReportCompatibleFields();
-  buildCounterPathToConversionReportCompatibleFields++;
-  if (buildCounterPathToConversionReportCompatibleFields < 3) {
-    o.conversionDimensions = buildUnnamed224();
-    o.customFloodlightVariables = buildUnnamed225();
-    o.kind = "foo";
-    o.metrics = buildUnnamed226();
-    o.perInteractionDimensions = buildUnnamed227();
-  }
-  buildCounterPathToConversionReportCompatibleFields--;
-  return o;
-}
-
-checkPathToConversionReportCompatibleFields(api.PathToConversionReportCompatibleFields o) {
-  buildCounterPathToConversionReportCompatibleFields++;
-  if (buildCounterPathToConversionReportCompatibleFields < 3) {
-    checkUnnamed224(o.conversionDimensions);
-    checkUnnamed225(o.customFloodlightVariables);
-    unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed226(o.metrics);
-    checkUnnamed227(o.perInteractionDimensions);
-  }
-  buildCounterPathToConversionReportCompatibleFields--;
-}
-
 buildUnnamed228() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
@@ -657,52 +591,118 @@
 }
 
 buildUnnamed229() {
+  var o = new core.List<api.Metric>();
+  o.add(buildMetric());
+  o.add(buildMetric());
+  return o;
+}
+
+checkUnnamed229(core.List<api.Metric> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkMetric(o[0]);
+  checkMetric(o[1]);
+}
+
+buildUnnamed230() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed229(core.List<api.Dimension> o) {
+checkUnnamed230(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed230() {
-  var o = new core.List<api.Metric>();
-  o.add(buildMetric());
-  o.add(buildMetric());
+core.int buildCounterPathToConversionReportCompatibleFields = 0;
+buildPathToConversionReportCompatibleFields() {
+  var o = new api.PathToConversionReportCompatibleFields();
+  buildCounterPathToConversionReportCompatibleFields++;
+  if (buildCounterPathToConversionReportCompatibleFields < 3) {
+    o.conversionDimensions = buildUnnamed227();
+    o.customFloodlightVariables = buildUnnamed228();
+    o.kind = "foo";
+    o.metrics = buildUnnamed229();
+    o.perInteractionDimensions = buildUnnamed230();
+  }
+  buildCounterPathToConversionReportCompatibleFields--;
   return o;
 }
 
-checkUnnamed230(core.List<api.Metric> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkMetric(o[0]);
-  checkMetric(o[1]);
+checkPathToConversionReportCompatibleFields(api.PathToConversionReportCompatibleFields o) {
+  buildCounterPathToConversionReportCompatibleFields++;
+  if (buildCounterPathToConversionReportCompatibleFields < 3) {
+    checkUnnamed227(o.conversionDimensions);
+    checkUnnamed228(o.customFloodlightVariables);
+    unittest.expect(o.kind, unittest.equals('foo'));
+    checkUnnamed229(o.metrics);
+    checkUnnamed230(o.perInteractionDimensions);
+  }
+  buildCounterPathToConversionReportCompatibleFields--;
 }
 
 buildUnnamed231() {
+  var o = new core.List<api.Dimension>();
+  o.add(buildDimension());
+  o.add(buildDimension());
+  return o;
+}
+
+checkUnnamed231(core.List<api.Dimension> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkDimension(o[0]);
+  checkDimension(o[1]);
+}
+
+buildUnnamed232() {
+  var o = new core.List<api.Dimension>();
+  o.add(buildDimension());
+  o.add(buildDimension());
+  return o;
+}
+
+checkUnnamed232(core.List<api.Dimension> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkDimension(o[0]);
+  checkDimension(o[1]);
+}
+
+buildUnnamed233() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed231(core.List<api.Metric> o) {
+checkUnnamed233(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed232() {
+buildUnnamed234() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed232(core.List<api.Metric> o) {
+checkUnnamed234(core.List<api.Metric> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkMetric(o[0]);
+  checkMetric(o[1]);
+}
+
+buildUnnamed235() {
+  var o = new core.List<api.Metric>();
+  o.add(buildMetric());
+  o.add(buildMetric());
+  return o;
+}
+
+checkUnnamed235(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -713,12 +713,12 @@
   var o = new api.ReachReportCompatibleFields();
   buildCounterReachReportCompatibleFields++;
   if (buildCounterReachReportCompatibleFields < 3) {
-    o.dimensionFilters = buildUnnamed228();
-    o.dimensions = buildUnnamed229();
+    o.dimensionFilters = buildUnnamed231();
+    o.dimensions = buildUnnamed232();
     o.kind = "foo";
-    o.metrics = buildUnnamed230();
-    o.pivotedActivityMetrics = buildUnnamed231();
-    o.reachByFrequencyMetrics = buildUnnamed232();
+    o.metrics = buildUnnamed233();
+    o.pivotedActivityMetrics = buildUnnamed234();
+    o.reachByFrequencyMetrics = buildUnnamed235();
   }
   buildCounterReachReportCompatibleFields--;
   return o;
@@ -727,12 +727,12 @@
 checkReachReportCompatibleFields(api.ReachReportCompatibleFields o) {
   buildCounterReachReportCompatibleFields++;
   if (buildCounterReachReportCompatibleFields < 3) {
-    checkUnnamed228(o.dimensionFilters);
-    checkUnnamed229(o.dimensions);
+    checkUnnamed231(o.dimensionFilters);
+    checkUnnamed232(o.dimensions);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed230(o.metrics);
-    checkUnnamed231(o.pivotedActivityMetrics);
-    checkUnnamed232(o.reachByFrequencyMetrics);
+    checkUnnamed233(o.metrics);
+    checkUnnamed234(o.pivotedActivityMetrics);
+    checkUnnamed235(o.reachByFrequencyMetrics);
   }
   buildCounterReachReportCompatibleFields--;
 }
@@ -760,70 +760,6 @@
   buildCounterRecipient--;
 }
 
-buildUnnamed233() {
-  var o = new core.List<api.DimensionValue>();
-  o.add(buildDimensionValue());
-  o.add(buildDimensionValue());
-  return o;
-}
-
-checkUnnamed233(core.List<api.DimensionValue> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkDimensionValue(o[0]);
-  checkDimensionValue(o[1]);
-}
-
-buildUnnamed234() {
-  var o = new core.List<api.SortedDimension>();
-  o.add(buildSortedDimension());
-  o.add(buildSortedDimension());
-  return o;
-}
-
-checkUnnamed234(core.List<api.SortedDimension> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkSortedDimension(o[0]);
-  checkSortedDimension(o[1]);
-}
-
-buildUnnamed235() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed235(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterReportActiveGrpCriteria = 0;
-buildReportActiveGrpCriteria() {
-  var o = new api.ReportActiveGrpCriteria();
-  buildCounterReportActiveGrpCriteria++;
-  if (buildCounterReportActiveGrpCriteria < 3) {
-    o.dateRange = buildDateRange();
-    o.dimensionFilters = buildUnnamed233();
-    o.dimensions = buildUnnamed234();
-    o.metricNames = buildUnnamed235();
-  }
-  buildCounterReportActiveGrpCriteria--;
-  return o;
-}
-
-checkReportActiveGrpCriteria(api.ReportActiveGrpCriteria o) {
-  buildCounterReportActiveGrpCriteria++;
-  if (buildCounterReportActiveGrpCriteria < 3) {
-    checkDateRange(o.dateRange);
-    checkUnnamed233(o.dimensionFilters);
-    checkUnnamed234(o.dimensions);
-    checkUnnamed235(o.metricNames);
-  }
-  buildCounterReportActiveGrpCriteria--;
-}
-
 buildUnnamed236() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
@@ -863,61 +799,57 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterReportCriteria = 0;
-buildReportCriteria() {
-  var o = new api.ReportCriteria();
-  buildCounterReportCriteria++;
-  if (buildCounterReportCriteria < 3) {
-    o.activities = buildActivities();
-    o.customRichMediaEvents = buildCustomRichMediaEvents();
+core.int buildCounterReportActiveGrpCriteria = 0;
+buildReportActiveGrpCriteria() {
+  var o = new api.ReportActiveGrpCriteria();
+  buildCounterReportActiveGrpCriteria++;
+  if (buildCounterReportActiveGrpCriteria < 3) {
     o.dateRange = buildDateRange();
     o.dimensionFilters = buildUnnamed236();
     o.dimensions = buildUnnamed237();
     o.metricNames = buildUnnamed238();
   }
-  buildCounterReportCriteria--;
+  buildCounterReportActiveGrpCriteria--;
   return o;
 }
 
-checkReportCriteria(api.ReportCriteria o) {
-  buildCounterReportCriteria++;
-  if (buildCounterReportCriteria < 3) {
-    checkActivities(o.activities);
-    checkCustomRichMediaEvents(o.customRichMediaEvents);
+checkReportActiveGrpCriteria(api.ReportActiveGrpCriteria o) {
+  buildCounterReportActiveGrpCriteria++;
+  if (buildCounterReportActiveGrpCriteria < 3) {
     checkDateRange(o.dateRange);
     checkUnnamed236(o.dimensionFilters);
     checkUnnamed237(o.dimensions);
     checkUnnamed238(o.metricNames);
   }
-  buildCounterReportCriteria--;
+  buildCounterReportActiveGrpCriteria--;
 }
 
 buildUnnamed239() {
-  var o = new core.List<api.SortedDimension>();
-  o.add(buildSortedDimension());
-  o.add(buildSortedDimension());
-  return o;
-}
-
-checkUnnamed239(core.List<api.SortedDimension> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkSortedDimension(o[0]);
-  checkSortedDimension(o[1]);
-}
-
-buildUnnamed240() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed240(core.List<api.DimensionValue> o) {
+checkUnnamed239(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
+buildUnnamed240() {
+  var o = new core.List<api.SortedDimension>();
+  o.add(buildSortedDimension());
+  o.add(buildSortedDimension());
+  return o;
+}
+
+checkUnnamed240(core.List<api.SortedDimension> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkSortedDimension(o[0]);
+  checkSortedDimension(o[1]);
+}
+
 buildUnnamed241() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -931,14 +863,82 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+core.int buildCounterReportCriteria = 0;
+buildReportCriteria() {
+  var o = new api.ReportCriteria();
+  buildCounterReportCriteria++;
+  if (buildCounterReportCriteria < 3) {
+    o.activities = buildActivities();
+    o.customRichMediaEvents = buildCustomRichMediaEvents();
+    o.dateRange = buildDateRange();
+    o.dimensionFilters = buildUnnamed239();
+    o.dimensions = buildUnnamed240();
+    o.metricNames = buildUnnamed241();
+  }
+  buildCounterReportCriteria--;
+  return o;
+}
+
+checkReportCriteria(api.ReportCriteria o) {
+  buildCounterReportCriteria++;
+  if (buildCounterReportCriteria < 3) {
+    checkActivities(o.activities);
+    checkCustomRichMediaEvents(o.customRichMediaEvents);
+    checkDateRange(o.dateRange);
+    checkUnnamed239(o.dimensionFilters);
+    checkUnnamed240(o.dimensions);
+    checkUnnamed241(o.metricNames);
+  }
+  buildCounterReportCriteria--;
+}
+
 buildUnnamed242() {
+  var o = new core.List<api.SortedDimension>();
+  o.add(buildSortedDimension());
+  o.add(buildSortedDimension());
+  return o;
+}
+
+checkUnnamed242(core.List<api.SortedDimension> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkSortedDimension(o[0]);
+  checkSortedDimension(o[1]);
+}
+
+buildUnnamed243() {
+  var o = new core.List<api.DimensionValue>();
+  o.add(buildDimensionValue());
+  o.add(buildDimensionValue());
+  return o;
+}
+
+checkUnnamed243(core.List<api.DimensionValue> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkDimensionValue(o[0]);
+  checkDimensionValue(o[1]);
+}
+
+buildUnnamed244() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed242(core.List<core.String> o) {
+checkUnnamed244(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed245() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed245(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -949,12 +949,12 @@
   var o = new api.ReportCrossDimensionReachCriteria();
   buildCounterReportCrossDimensionReachCriteria++;
   if (buildCounterReportCrossDimensionReachCriteria < 3) {
-    o.breakdown = buildUnnamed239();
+    o.breakdown = buildUnnamed242();
     o.dateRange = buildDateRange();
     o.dimension = "foo";
-    o.dimensionFilters = buildUnnamed240();
-    o.metricNames = buildUnnamed241();
-    o.overlapMetricNames = buildUnnamed242();
+    o.dimensionFilters = buildUnnamed243();
+    o.metricNames = buildUnnamed244();
+    o.overlapMetricNames = buildUnnamed245();
     o.pivoted = true;
   }
   buildCounterReportCrossDimensionReachCriteria--;
@@ -964,25 +964,25 @@
 checkReportCrossDimensionReachCriteria(api.ReportCrossDimensionReachCriteria o) {
   buildCounterReportCrossDimensionReachCriteria++;
   if (buildCounterReportCrossDimensionReachCriteria < 3) {
-    checkUnnamed239(o.breakdown);
+    checkUnnamed242(o.breakdown);
     checkDateRange(o.dateRange);
     unittest.expect(o.dimension, unittest.equals('foo'));
-    checkUnnamed240(o.dimensionFilters);
-    checkUnnamed241(o.metricNames);
-    checkUnnamed242(o.overlapMetricNames);
+    checkUnnamed243(o.dimensionFilters);
+    checkUnnamed244(o.metricNames);
+    checkUnnamed245(o.overlapMetricNames);
     unittest.expect(o.pivoted, unittest.isTrue);
   }
   buildCounterReportCrossDimensionReachCriteria--;
 }
 
-buildUnnamed243() {
+buildUnnamed246() {
   var o = new core.List<api.Recipient>();
   o.add(buildRecipient());
   o.add(buildRecipient());
   return o;
 }
 
-checkUnnamed243(core.List<api.Recipient> o) {
+checkUnnamed246(core.List<api.Recipient> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRecipient(o[0]);
   checkRecipient(o[1]);
@@ -996,7 +996,7 @@
     o.emailOwner = true;
     o.emailOwnerDeliveryType = "foo";
     o.message = "foo";
-    o.recipients = buildUnnamed243();
+    o.recipients = buildUnnamed246();
   }
   buildCounterReportDelivery--;
   return o;
@@ -1008,58 +1008,58 @@
     unittest.expect(o.emailOwner, unittest.isTrue);
     unittest.expect(o.emailOwnerDeliveryType, unittest.equals('foo'));
     unittest.expect(o.message, unittest.equals('foo'));
-    checkUnnamed243(o.recipients);
+    checkUnnamed246(o.recipients);
   }
   buildCounterReportDelivery--;
 }
 
-buildUnnamed244() {
+buildUnnamed247() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed244(core.List<api.DimensionValue> o) {
+checkUnnamed247(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed245() {
+buildUnnamed248() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed245(core.List<api.DimensionValue> o) {
+checkUnnamed248(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed246() {
+buildUnnamed249() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed246(core.List<api.SortedDimension> o) {
+checkUnnamed249(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed247() {
+buildUnnamed250() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed247(core.List<core.String> o) {
+checkUnnamed250(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1093,12 +1093,12 @@
   var o = new api.ReportFloodlightCriteria();
   buildCounterReportFloodlightCriteria++;
   if (buildCounterReportFloodlightCriteria < 3) {
-    o.customRichMediaEvents = buildUnnamed244();
+    o.customRichMediaEvents = buildUnnamed247();
     o.dateRange = buildDateRange();
-    o.dimensionFilters = buildUnnamed245();
-    o.dimensions = buildUnnamed246();
+    o.dimensionFilters = buildUnnamed248();
+    o.dimensions = buildUnnamed249();
     o.floodlightConfigId = buildDimensionValue();
-    o.metricNames = buildUnnamed247();
+    o.metricNames = buildUnnamed250();
     o.reportProperties = buildReportFloodlightCriteriaReportProperties();
   }
   buildCounterReportFloodlightCriteria--;
@@ -1108,56 +1108,17 @@
 checkReportFloodlightCriteria(api.ReportFloodlightCriteria o) {
   buildCounterReportFloodlightCriteria++;
   if (buildCounterReportFloodlightCriteria < 3) {
-    checkUnnamed244(o.customRichMediaEvents);
+    checkUnnamed247(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
-    checkUnnamed245(o.dimensionFilters);
-    checkUnnamed246(o.dimensions);
+    checkUnnamed248(o.dimensionFilters);
+    checkUnnamed249(o.dimensions);
     checkDimensionValue(o.floodlightConfigId);
-    checkUnnamed247(o.metricNames);
+    checkUnnamed250(o.metricNames);
     checkReportFloodlightCriteriaReportProperties(o.reportProperties);
   }
   buildCounterReportFloodlightCriteria--;
 }
 
-buildUnnamed248() {
-  var o = new core.List<api.DimensionValue>();
-  o.add(buildDimensionValue());
-  o.add(buildDimensionValue());
-  return o;
-}
-
-checkUnnamed248(core.List<api.DimensionValue> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkDimensionValue(o[0]);
-  checkDimensionValue(o[1]);
-}
-
-buildUnnamed249() {
-  var o = new core.List<api.SortedDimension>();
-  o.add(buildSortedDimension());
-  o.add(buildSortedDimension());
-  return o;
-}
-
-checkUnnamed249(core.List<api.SortedDimension> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkSortedDimension(o[0]);
-  checkSortedDimension(o[1]);
-}
-
-buildUnnamed250() {
-  var o = new core.List<api.SortedDimension>();
-  o.add(buildSortedDimension());
-  o.add(buildSortedDimension());
-  return o;
-}
-
-checkUnnamed250(core.List<api.SortedDimension> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkSortedDimension(o[0]);
-  checkSortedDimension(o[1]);
-}
-
 buildUnnamed251() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
@@ -1172,16 +1133,16 @@
 }
 
 buildUnnamed252() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
+  var o = new core.List<api.SortedDimension>();
+  o.add(buildSortedDimension());
+  o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed252(core.List<core.String> o) {
+checkUnnamed252(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
+  checkSortedDimension(o[0]);
+  checkSortedDimension(o[1]);
 }
 
 buildUnnamed253() {
@@ -1197,6 +1158,45 @@
   checkSortedDimension(o[1]);
 }
 
+buildUnnamed254() {
+  var o = new core.List<api.DimensionValue>();
+  o.add(buildDimensionValue());
+  o.add(buildDimensionValue());
+  return o;
+}
+
+checkUnnamed254(core.List<api.DimensionValue> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkDimensionValue(o[0]);
+  checkDimensionValue(o[1]);
+}
+
+buildUnnamed255() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed255(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed256() {
+  var o = new core.List<api.SortedDimension>();
+  o.add(buildSortedDimension());
+  o.add(buildSortedDimension());
+  return o;
+}
+
+checkUnnamed256(core.List<api.SortedDimension> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkSortedDimension(o[0]);
+  checkSortedDimension(o[1]);
+}
+
 core.int buildCounterReportPathToConversionCriteriaReportProperties = 0;
 buildReportPathToConversionCriteriaReportProperties() {
   var o = new api.ReportPathToConversionCriteriaReportProperties();
@@ -1237,14 +1237,14 @@
   var o = new api.ReportPathToConversionCriteria();
   buildCounterReportPathToConversionCriteria++;
   if (buildCounterReportPathToConversionCriteria < 3) {
-    o.activityFilters = buildUnnamed248();
-    o.conversionDimensions = buildUnnamed249();
-    o.customFloodlightVariables = buildUnnamed250();
-    o.customRichMediaEvents = buildUnnamed251();
+    o.activityFilters = buildUnnamed251();
+    o.conversionDimensions = buildUnnamed252();
+    o.customFloodlightVariables = buildUnnamed253();
+    o.customRichMediaEvents = buildUnnamed254();
     o.dateRange = buildDateRange();
     o.floodlightConfigId = buildDimensionValue();
-    o.metricNames = buildUnnamed252();
-    o.perInteractionDimensions = buildUnnamed253();
+    o.metricNames = buildUnnamed255();
+    o.perInteractionDimensions = buildUnnamed256();
     o.reportProperties = buildReportPathToConversionCriteriaReportProperties();
   }
   buildCounterReportPathToConversionCriteria--;
@@ -1254,66 +1254,66 @@
 checkReportPathToConversionCriteria(api.ReportPathToConversionCriteria o) {
   buildCounterReportPathToConversionCriteria++;
   if (buildCounterReportPathToConversionCriteria < 3) {
-    checkUnnamed248(o.activityFilters);
-    checkUnnamed249(o.conversionDimensions);
-    checkUnnamed250(o.customFloodlightVariables);
-    checkUnnamed251(o.customRichMediaEvents);
+    checkUnnamed251(o.activityFilters);
+    checkUnnamed252(o.conversionDimensions);
+    checkUnnamed253(o.customFloodlightVariables);
+    checkUnnamed254(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
     checkDimensionValue(o.floodlightConfigId);
-    checkUnnamed252(o.metricNames);
-    checkUnnamed253(o.perInteractionDimensions);
+    checkUnnamed255(o.metricNames);
+    checkUnnamed256(o.perInteractionDimensions);
     checkReportPathToConversionCriteriaReportProperties(o.reportProperties);
   }
   buildCounterReportPathToConversionCriteria--;
 }
 
-buildUnnamed254() {
+buildUnnamed257() {
   var o = new core.List<api.DimensionValue>();
   o.add(buildDimensionValue());
   o.add(buildDimensionValue());
   return o;
 }
 
-checkUnnamed254(core.List<api.DimensionValue> o) {
+checkUnnamed257(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimensionValue(o[0]);
   checkDimensionValue(o[1]);
 }
 
-buildUnnamed255() {
+buildUnnamed258() {
   var o = new core.List<api.SortedDimension>();
   o.add(buildSortedDimension());
   o.add(buildSortedDimension());
   return o;
 }
 
-checkUnnamed255(core.List<api.SortedDimension> o) {
+checkUnnamed258(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSortedDimension(o[0]);
   checkSortedDimension(o[1]);
 }
 
-buildUnnamed256() {
+buildUnnamed259() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed256(core.List<core.String> o) {
+checkUnnamed259(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed257() {
+buildUnnamed260() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed257(core.List<core.String> o) {
+checkUnnamed260(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1327,10 +1327,10 @@
     o.activities = buildActivities();
     o.customRichMediaEvents = buildCustomRichMediaEvents();
     o.dateRange = buildDateRange();
-    o.dimensionFilters = buildUnnamed254();
-    o.dimensions = buildUnnamed255();
-    o.metricNames = buildUnnamed256();
-    o.reachByFrequencyMetricNames = buildUnnamed257();
+    o.dimensionFilters = buildUnnamed257();
+    o.dimensions = buildUnnamed258();
+    o.metricNames = buildUnnamed259();
+    o.reachByFrequencyMetricNames = buildUnnamed260();
   }
   buildCounterReportReachCriteria--;
   return o;
@@ -1342,22 +1342,22 @@
     checkActivities(o.activities);
     checkCustomRichMediaEvents(o.customRichMediaEvents);
     checkDateRange(o.dateRange);
-    checkUnnamed254(o.dimensionFilters);
-    checkUnnamed255(o.dimensions);
-    checkUnnamed256(o.metricNames);
-    checkUnnamed257(o.reachByFrequencyMetricNames);
+    checkUnnamed257(o.dimensionFilters);
+    checkUnnamed258(o.dimensions);
+    checkUnnamed259(o.metricNames);
+    checkUnnamed260(o.reachByFrequencyMetricNames);
   }
   buildCounterReportReachCriteria--;
 }
 
-buildUnnamed258() {
+buildUnnamed261() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed258(core.List<core.String> o) {
+checkUnnamed261(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1372,7 +1372,7 @@
     o.every = 42;
     o.expirationDate = core.DateTime.parse("2002-02-27T14:01:02Z");
     o.repeats = "foo";
-    o.repeatsOnWeekDays = buildUnnamed258();
+    o.repeatsOnWeekDays = buildUnnamed261();
     o.runsOnDayOfMonth = "foo";
     o.startDate = core.DateTime.parse("2002-02-27T14:01:02Z");
   }
@@ -1387,7 +1387,7 @@
     unittest.expect(o.every, unittest.equals(42));
     unittest.expect(o.expirationDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
     unittest.expect(o.repeats, unittest.equals('foo'));
-    checkUnnamed258(o.repeatsOnWeekDays);
+    checkUnnamed261(o.repeatsOnWeekDays);
     unittest.expect(o.runsOnDayOfMonth, unittest.equals('foo'));
     unittest.expect(o.startDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
   }
@@ -1449,53 +1449,53 @@
   buildCounterReport--;
 }
 
-buildUnnamed259() {
+buildUnnamed262() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed259(core.List<api.Dimension> o) {
+checkUnnamed262(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed260() {
+buildUnnamed263() {
   var o = new core.List<api.Dimension>();
   o.add(buildDimension());
   o.add(buildDimension());
   return o;
 }
 
-checkUnnamed260(core.List<api.Dimension> o) {
+checkUnnamed263(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDimension(o[0]);
   checkDimension(o[1]);
 }
 
-buildUnnamed261() {
+buildUnnamed264() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed261(core.List<api.Metric> o) {
+checkUnnamed264(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
 }
 
-buildUnnamed262() {
+buildUnnamed265() {
   var o = new core.List<api.Metric>();
   o.add(buildMetric());
   o.add(buildMetric());
   return o;
 }
 
-checkUnnamed262(core.List<api.Metric> o) {
+checkUnnamed265(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetric(o[0]);
   checkMetric(o[1]);
@@ -1506,11 +1506,11 @@
   var o = new api.ReportCompatibleFields();
   buildCounterReportCompatibleFields++;
   if (buildCounterReportCompatibleFields < 3) {
-    o.dimensionFilters = buildUnnamed259();
-    o.dimensions = buildUnnamed260();
+    o.dimensionFilters = buildUnnamed262();
+    o.dimensions = buildUnnamed263();
     o.kind = "foo";
-    o.metrics = buildUnnamed261();
-    o.pivotedActivityMetrics = buildUnnamed262();
+    o.metrics = buildUnnamed264();
+    o.pivotedActivityMetrics = buildUnnamed265();
   }
   buildCounterReportCompatibleFields--;
   return o;
@@ -1519,23 +1519,23 @@
 checkReportCompatibleFields(api.ReportCompatibleFields o) {
   buildCounterReportCompatibleFields++;
   if (buildCounterReportCompatibleFields < 3) {
-    checkUnnamed259(o.dimensionFilters);
-    checkUnnamed260(o.dimensions);
+    checkUnnamed262(o.dimensionFilters);
+    checkUnnamed263(o.dimensions);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed261(o.metrics);
-    checkUnnamed262(o.pivotedActivityMetrics);
+    checkUnnamed264(o.metrics);
+    checkUnnamed265(o.pivotedActivityMetrics);
   }
   buildCounterReportCompatibleFields--;
 }
 
-buildUnnamed263() {
+buildUnnamed266() {
   var o = new core.List<api.Report>();
   o.add(buildReport());
   o.add(buildReport());
   return o;
 }
 
-checkUnnamed263(core.List<api.Report> o) {
+checkUnnamed266(core.List<api.Report> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReport(o[0]);
   checkReport(o[1]);
@@ -1547,7 +1547,7 @@
   buildCounterReportList++;
   if (buildCounterReportList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed263();
+    o.items = buildUnnamed266();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -1559,7 +1559,7 @@
   buildCounterReportList++;
   if (buildCounterReportList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed263(o.items);
+    checkUnnamed266(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -1622,14 +1622,14 @@
   buildCounterUserProfile--;
 }
 
-buildUnnamed264() {
+buildUnnamed267() {
   var o = new core.List<api.UserProfile>();
   o.add(buildUserProfile());
   o.add(buildUserProfile());
   return o;
 }
 
-checkUnnamed264(core.List<api.UserProfile> o) {
+checkUnnamed267(core.List<api.UserProfile> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserProfile(o[0]);
   checkUserProfile(o[1]);
@@ -1641,7 +1641,7 @@
   buildCounterUserProfileList++;
   if (buildCounterUserProfileList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed264();
+    o.items = buildUnnamed267();
     o.kind = "foo";
   }
   buildCounterUserProfileList--;
@@ -1652,7 +1652,7 @@
   buildCounterUserProfileList++;
   if (buildCounterUserProfileList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed264(o.items);
+    checkUnnamed267(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterUserProfileList--;
@@ -1983,8 +1983,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/dfareporting/v1.3/"));
-        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("dfareporting/v1.3/"));
+        pathOffset += 18;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("userprofiles/"));
         pathOffset += 13;
         index = path.indexOf("/dimensionvalues/query", pathOffset);
@@ -2043,8 +2045,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/dfareporting/v1.3/"));
-        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("dfareporting/v1.3/"));
+        pathOffset += 18;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("reports/"));
         pathOffset += 8;
         index = path.indexOf("/files/", pathOffset);
@@ -2102,8 +2106,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/dfareporting/v1.3/"));
-        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("dfareporting/v1.3/"));
+        pathOffset += 18;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("userprofiles/"));
         pathOffset += 13;
         index = path.indexOf("/files", pathOffset);
@@ -2163,8 +2169,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/dfareporting/v1.3/"));
-        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("dfareporting/v1.3/"));
+        pathOffset += 18;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("userprofiles/"));
         pathOffset += 13;
         index = path.indexOf("/reports/", pathOffset);
@@ -2216,8 +2224,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/dfareporting/v1.3/"));
-        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("dfareporting/v1.3/"));
+        pathOffset += 18;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("userprofiles/"));
         pathOffset += 13;
         index = path.indexOf("/reports/", pathOffset);
@@ -2274,8 +2284,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/dfareporting/v1.3/"));
-        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("dfareporting/v1.3/"));
+        pathOffset += 18;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("userprofiles/"));
         pathOffset += 13;
         index = path.indexOf("/reports", pathOffset);
@@ -2330,8 +2342,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/dfareporting/v1.3/"));
-        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("dfareporting/v1.3/"));
+        pathOffset += 18;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("userprofiles/"));
         pathOffset += 13;
         index = path.indexOf("/reports", pathOffset);
@@ -2391,8 +2405,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/dfareporting/v1.3/"));
-        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("dfareporting/v1.3/"));
+        pathOffset += 18;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("userprofiles/"));
         pathOffset += 13;
         index = path.indexOf("/reports/", pathOffset);
@@ -2447,8 +2463,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/dfareporting/v1.3/"));
-        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("dfareporting/v1.3/"));
+        pathOffset += 18;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("userprofiles/"));
         pathOffset += 13;
         index = path.indexOf("/reports/", pathOffset);
@@ -2511,8 +2529,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/dfareporting/v1.3/"));
-        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("dfareporting/v1.3/"));
+        pathOffset += 18;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("userprofiles/"));
         pathOffset += 13;
         index = path.indexOf("/reports/", pathOffset);
@@ -2573,8 +2593,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/dfareporting/v1.3/"));
-        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("dfareporting/v1.3/"));
+        pathOffset += 18;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("userprofiles/"));
         pathOffset += 13;
         index = path.indexOf("/reports/compatiblefields/query", pathOffset);
@@ -2632,8 +2654,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/dfareporting/v1.3/"));
-        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("dfareporting/v1.3/"));
+        pathOffset += 18;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("userprofiles/"));
         pathOffset += 13;
         index = path.indexOf("/reports/", pathOffset);
@@ -2698,8 +2722,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/dfareporting/v1.3/"));
-        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("dfareporting/v1.3/"));
+        pathOffset += 18;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("userprofiles/"));
         pathOffset += 13;
         index = path.indexOf("/reports/", pathOffset);
@@ -2764,8 +2790,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/dfareporting/v1.3/"));
-        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("dfareporting/v1.3/"));
+        pathOffset += 18;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("userprofiles/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2810,8 +2838,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/dfareporting/v1.3/"));
-        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("dfareporting/v1.3/"));
+        pathOffset += 18;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("userprofiles"));
         pathOffset += 12;
 
diff --git a/generated/googleapis/test/discovery/v1_test.dart b/generated/googleapis/test/discovery/v1_test.dart
index bd41021..e99bee2 100644
--- a/generated/googleapis/test/discovery/v1_test.dart
+++ b/generated/googleapis/test/discovery/v1_test.dart
@@ -37,14 +37,14 @@
   buildCounterDirectoryListItemsIcons--;
 }
 
-buildUnnamed299() {
+buildUnnamed302() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed299(core.List<core.String> o) {
+checkUnnamed302(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -62,7 +62,7 @@
     o.icons = buildDirectoryListItemsIcons();
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed299();
+    o.labels = buildUnnamed302();
     o.name = "foo";
     o.preferred = true;
     o.title = "foo";
@@ -82,7 +82,7 @@
     checkDirectoryListItemsIcons(o.icons);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed299(o.labels);
+    checkUnnamed302(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.preferred, unittest.isTrue);
     unittest.expect(o.title, unittest.equals('foo'));
@@ -91,14 +91,14 @@
   buildCounterDirectoryListItems--;
 }
 
-buildUnnamed300() {
+buildUnnamed303() {
   var o = new core.List<api.DirectoryListItems>();
   o.add(buildDirectoryListItems());
   o.add(buildDirectoryListItems());
   return o;
 }
 
-checkUnnamed300(core.List<api.DirectoryListItems> o) {
+checkUnnamed303(core.List<api.DirectoryListItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDirectoryListItems(o[0]);
   checkDirectoryListItems(o[1]);
@@ -110,7 +110,7 @@
   buildCounterDirectoryList++;
   if (buildCounterDirectoryList < 3) {
     o.discoveryVersion = "foo";
-    o.items = buildUnnamed300();
+    o.items = buildUnnamed303();
     o.kind = "foo";
   }
   buildCounterDirectoryList--;
@@ -121,20 +121,20 @@
   buildCounterDirectoryList++;
   if (buildCounterDirectoryList < 3) {
     unittest.expect(o.discoveryVersion, unittest.equals('foo'));
-    checkUnnamed300(o.items);
+    checkUnnamed303(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDirectoryList--;
 }
 
-buildUnnamed301() {
+buildUnnamed304() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed301(core.List<core.String> o) {
+checkUnnamed304(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -145,7 +145,7 @@
   var o = new api.JsonSchemaAnnotations();
   buildCounterJsonSchemaAnnotations++;
   if (buildCounterJsonSchemaAnnotations < 3) {
-    o.required = buildUnnamed301();
+    o.required = buildUnnamed304();
   }
   buildCounterJsonSchemaAnnotations--;
   return o;
@@ -154,45 +154,45 @@
 checkJsonSchemaAnnotations(api.JsonSchemaAnnotations o) {
   buildCounterJsonSchemaAnnotations++;
   if (buildCounterJsonSchemaAnnotations < 3) {
-    checkUnnamed301(o.required);
+    checkUnnamed304(o.required);
   }
   buildCounterJsonSchemaAnnotations--;
 }
 
-buildUnnamed302() {
+buildUnnamed305() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed302(core.List<core.String> o) {
+checkUnnamed305(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed303() {
+buildUnnamed306() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed303(core.List<core.String> o) {
+checkUnnamed306(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed304() {
+buildUnnamed307() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed304(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed307(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
@@ -219,14 +219,14 @@
   buildCounterJsonSchemaVariantMap--;
 }
 
-buildUnnamed305() {
+buildUnnamed308() {
   var o = new core.List<api.JsonSchemaVariantMap>();
   o.add(buildJsonSchemaVariantMap());
   o.add(buildJsonSchemaVariantMap());
   return o;
 }
 
-checkUnnamed305(core.List<api.JsonSchemaVariantMap> o) {
+checkUnnamed308(core.List<api.JsonSchemaVariantMap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchemaVariantMap(o[0]);
   checkJsonSchemaVariantMap(o[1]);
@@ -238,7 +238,7 @@
   buildCounterJsonSchemaVariant++;
   if (buildCounterJsonSchemaVariant < 3) {
     o.discriminant = "foo";
-    o.map = buildUnnamed305();
+    o.map = buildUnnamed308();
   }
   buildCounterJsonSchemaVariant--;
   return o;
@@ -248,7 +248,7 @@
   buildCounterJsonSchemaVariant++;
   if (buildCounterJsonSchemaVariant < 3) {
     unittest.expect(o.discriminant, unittest.equals('foo'));
-    checkUnnamed305(o.map);
+    checkUnnamed308(o.map);
   }
   buildCounterJsonSchemaVariant--;
 }
@@ -263,8 +263,8 @@
     o.annotations = buildJsonSchemaAnnotations();
     o.default_ = "foo";
     o.description = "foo";
-    o.enum_ = buildUnnamed302();
-    o.enumDescriptions = buildUnnamed303();
+    o.enum_ = buildUnnamed305();
+    o.enumDescriptions = buildUnnamed306();
     o.format = "foo";
     o.id = "foo";
     o.items = buildJsonSchema();
@@ -272,7 +272,7 @@
     o.maximum = "foo";
     o.minimum = "foo";
     o.pattern = "foo";
-    o.properties = buildUnnamed304();
+    o.properties = buildUnnamed307();
     o.readOnly = true;
     o.repeated = true;
     o.required = true;
@@ -291,8 +291,8 @@
     checkJsonSchemaAnnotations(o.annotations);
     unittest.expect(o.default_, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed302(o.enum_);
-    checkUnnamed303(o.enumDescriptions);
+    checkUnnamed305(o.enum_);
+    checkUnnamed306(o.enumDescriptions);
     unittest.expect(o.format, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     checkJsonSchema(o.items);
@@ -300,7 +300,7 @@
     unittest.expect(o.maximum, unittest.equals('foo'));
     unittest.expect(o.minimum, unittest.equals('foo'));
     unittest.expect(o.pattern, unittest.equals('foo'));
-    checkUnnamed304(o.properties);
+    checkUnnamed307(o.properties);
     unittest.expect(o.readOnly, unittest.isTrue);
     unittest.expect(o.repeated, unittest.isTrue);
     unittest.expect(o.required, unittest.isTrue);
@@ -329,14 +329,14 @@
   buildCounterRestDescriptionAuthOauth2ScopesValue--;
 }
 
-buildUnnamed306() {
+buildUnnamed309() {
   var o = new core.Map<core.String, api.RestDescriptionAuthOauth2ScopesValue>();
   o["x"] = buildRestDescriptionAuthOauth2ScopesValue();
   o["y"] = buildRestDescriptionAuthOauth2ScopesValue();
   return o;
 }
 
-checkUnnamed306(core.Map<core.String, api.RestDescriptionAuthOauth2ScopesValue> o) {
+checkUnnamed309(core.Map<core.String, api.RestDescriptionAuthOauth2ScopesValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestDescriptionAuthOauth2ScopesValue(o["x"]);
   checkRestDescriptionAuthOauth2ScopesValue(o["y"]);
@@ -347,7 +347,7 @@
   var o = new api.RestDescriptionAuthOauth2();
   buildCounterRestDescriptionAuthOauth2++;
   if (buildCounterRestDescriptionAuthOauth2 < 3) {
-    o.scopes = buildUnnamed306();
+    o.scopes = buildUnnamed309();
   }
   buildCounterRestDescriptionAuthOauth2--;
   return o;
@@ -356,7 +356,7 @@
 checkRestDescriptionAuthOauth2(api.RestDescriptionAuthOauth2 o) {
   buildCounterRestDescriptionAuthOauth2++;
   if (buildCounterRestDescriptionAuthOauth2 < 3) {
-    checkUnnamed306(o.scopes);
+    checkUnnamed309(o.scopes);
   }
   buildCounterRestDescriptionAuthOauth2--;
 }
@@ -380,14 +380,14 @@
   buildCounterRestDescriptionAuth--;
 }
 
-buildUnnamed307() {
+buildUnnamed310() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed307(core.List<core.String> o) {
+checkUnnamed310(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -414,66 +414,66 @@
   buildCounterRestDescriptionIcons--;
 }
 
-buildUnnamed308() {
+buildUnnamed311() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed308(core.List<core.String> o) {
+checkUnnamed311(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed309() {
+buildUnnamed312() {
   var o = new core.Map<core.String, api.RestMethod>();
   o["x"] = buildRestMethod();
   o["y"] = buildRestMethod();
   return o;
 }
 
-checkUnnamed309(core.Map<core.String, api.RestMethod> o) {
+checkUnnamed312(core.Map<core.String, api.RestMethod> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestMethod(o["x"]);
   checkRestMethod(o["y"]);
 }
 
-buildUnnamed310() {
+buildUnnamed313() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed310(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed313(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
 }
 
-buildUnnamed311() {
+buildUnnamed314() {
   var o = new core.Map<core.String, api.RestResource>();
   o["x"] = buildRestResource();
   o["y"] = buildRestResource();
   return o;
 }
 
-checkUnnamed311(core.Map<core.String, api.RestResource> o) {
+checkUnnamed314(core.Map<core.String, api.RestResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestResource(o["x"]);
   checkRestResource(o["y"]);
 }
 
-buildUnnamed312() {
+buildUnnamed315() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed312(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed315(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
@@ -493,22 +493,22 @@
     o.discoveryVersion = "foo";
     o.documentationLink = "foo";
     o.etag = "foo";
-    o.features = buildUnnamed307();
+    o.features = buildUnnamed310();
     o.icons = buildRestDescriptionIcons();
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed308();
-    o.methods = buildUnnamed309();
+    o.labels = buildUnnamed311();
+    o.methods = buildUnnamed312();
     o.name = "foo";
     o.ownerDomain = "foo";
     o.ownerName = "foo";
     o.packagePath = "foo";
-    o.parameters = buildUnnamed310();
+    o.parameters = buildUnnamed313();
     o.protocol = "foo";
-    o.resources = buildUnnamed311();
+    o.resources = buildUnnamed314();
     o.revision = "foo";
     o.rootUrl = "foo";
-    o.schemas = buildUnnamed312();
+    o.schemas = buildUnnamed315();
     o.servicePath = "foo";
     o.title = "foo";
     o.version = "foo";
@@ -529,22 +529,22 @@
     unittest.expect(o.discoveryVersion, unittest.equals('foo'));
     unittest.expect(o.documentationLink, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed307(o.features);
+    checkUnnamed310(o.features);
     checkRestDescriptionIcons(o.icons);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed308(o.labels);
-    checkUnnamed309(o.methods);
+    checkUnnamed311(o.labels);
+    checkUnnamed312(o.methods);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.ownerDomain, unittest.equals('foo'));
     unittest.expect(o.ownerName, unittest.equals('foo'));
     unittest.expect(o.packagePath, unittest.equals('foo'));
-    checkUnnamed310(o.parameters);
+    checkUnnamed313(o.parameters);
     unittest.expect(o.protocol, unittest.equals('foo'));
-    checkUnnamed311(o.resources);
+    checkUnnamed314(o.resources);
     unittest.expect(o.revision, unittest.equals('foo'));
     unittest.expect(o.rootUrl, unittest.equals('foo'));
-    checkUnnamed312(o.schemas);
+    checkUnnamed315(o.schemas);
     unittest.expect(o.servicePath, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
@@ -552,14 +552,14 @@
   buildCounterRestDescription--;
 }
 
-buildUnnamed313() {
+buildUnnamed316() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed313(core.List<core.String> o) {
+checkUnnamed316(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -633,7 +633,7 @@
   var o = new api.RestMethodMediaUpload();
   buildCounterRestMethodMediaUpload++;
   if (buildCounterRestMethodMediaUpload < 3) {
-    o.accept = buildUnnamed313();
+    o.accept = buildUnnamed316();
     o.maxSize = "foo";
     o.protocols = buildRestMethodMediaUploadProtocols();
   }
@@ -644,34 +644,34 @@
 checkRestMethodMediaUpload(api.RestMethodMediaUpload o) {
   buildCounterRestMethodMediaUpload++;
   if (buildCounterRestMethodMediaUpload < 3) {
-    checkUnnamed313(o.accept);
+    checkUnnamed316(o.accept);
     unittest.expect(o.maxSize, unittest.equals('foo'));
     checkRestMethodMediaUploadProtocols(o.protocols);
   }
   buildCounterRestMethodMediaUpload--;
 }
 
-buildUnnamed314() {
+buildUnnamed317() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed314(core.List<core.String> o) {
+checkUnnamed317(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed315() {
+buildUnnamed318() {
   var o = new core.Map<core.String, api.JsonSchema>();
   o["x"] = buildJsonSchema();
   o["y"] = buildJsonSchema();
   return o;
 }
 
-checkUnnamed315(core.Map<core.String, api.JsonSchema> o) {
+checkUnnamed318(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJsonSchema(o["x"]);
   checkJsonSchema(o["y"]);
@@ -717,14 +717,14 @@
   buildCounterRestMethodResponse--;
 }
 
-buildUnnamed316() {
+buildUnnamed319() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed316(core.List<core.String> o) {
+checkUnnamed319(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -740,12 +740,12 @@
     o.httpMethod = "foo";
     o.id = "foo";
     o.mediaUpload = buildRestMethodMediaUpload();
-    o.parameterOrder = buildUnnamed314();
-    o.parameters = buildUnnamed315();
+    o.parameterOrder = buildUnnamed317();
+    o.parameters = buildUnnamed318();
     o.path = "foo";
     o.request = buildRestMethodRequest();
     o.response = buildRestMethodResponse();
-    o.scopes = buildUnnamed316();
+    o.scopes = buildUnnamed319();
     o.supportsMediaDownload = true;
     o.supportsMediaUpload = true;
     o.supportsSubscription = true;
@@ -762,12 +762,12 @@
     unittest.expect(o.httpMethod, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     checkRestMethodMediaUpload(o.mediaUpload);
-    checkUnnamed314(o.parameterOrder);
-    checkUnnamed315(o.parameters);
+    checkUnnamed317(o.parameterOrder);
+    checkUnnamed318(o.parameters);
     unittest.expect(o.path, unittest.equals('foo'));
     checkRestMethodRequest(o.request);
     checkRestMethodResponse(o.response);
-    checkUnnamed316(o.scopes);
+    checkUnnamed319(o.scopes);
     unittest.expect(o.supportsMediaDownload, unittest.isTrue);
     unittest.expect(o.supportsMediaUpload, unittest.isTrue);
     unittest.expect(o.supportsSubscription, unittest.isTrue);
@@ -775,27 +775,27 @@
   buildCounterRestMethod--;
 }
 
-buildUnnamed317() {
+buildUnnamed320() {
   var o = new core.Map<core.String, api.RestMethod>();
   o["x"] = buildRestMethod();
   o["y"] = buildRestMethod();
   return o;
 }
 
-checkUnnamed317(core.Map<core.String, api.RestMethod> o) {
+checkUnnamed320(core.Map<core.String, api.RestMethod> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestMethod(o["x"]);
   checkRestMethod(o["y"]);
 }
 
-buildUnnamed318() {
+buildUnnamed321() {
   var o = new core.Map<core.String, api.RestResource>();
   o["x"] = buildRestResource();
   o["y"] = buildRestResource();
   return o;
 }
 
-checkUnnamed318(core.Map<core.String, api.RestResource> o) {
+checkUnnamed321(core.Map<core.String, api.RestResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRestResource(o["x"]);
   checkRestResource(o["y"]);
@@ -806,8 +806,8 @@
   var o = new api.RestResource();
   buildCounterRestResource++;
   if (buildCounterRestResource < 3) {
-    o.methods = buildUnnamed317();
-    o.resources = buildUnnamed318();
+    o.methods = buildUnnamed320();
+    o.resources = buildUnnamed321();
   }
   buildCounterRestResource--;
   return o;
@@ -816,8 +816,8 @@
 checkRestResource(api.RestResource o) {
   buildCounterRestResource++;
   if (buildCounterRestResource < 3) {
-    checkUnnamed317(o.methods);
-    checkUnnamed318(o.resources);
+    checkUnnamed320(o.methods);
+    checkUnnamed321(o.resources);
   }
   buildCounterRestResource--;
 }
@@ -1016,8 +1016,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/discovery/v1/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("discovery/v1/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("apis/"));
         pathOffset += 5;
         index = path.indexOf("/", pathOffset);
@@ -1075,8 +1077,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/discovery/v1/"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("discovery/v1/"));
+        pathOffset += 13;
         unittest.expect(path.substring(pathOffset, pathOffset + 4), unittest.equals("apis"));
         pathOffset += 4;
 
diff --git a/generated/googleapis/test/doubleclickbidmanager/v1_test.dart b/generated/googleapis/test/doubleclickbidmanager/v1_test.dart
index a5b9dc9..6372088 100644
--- a/generated/googleapis/test/doubleclickbidmanager/v1_test.dart
+++ b/generated/googleapis/test/doubleclickbidmanager/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed691() {
+buildUnnamed719() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed691(core.List<core.String> o) {
+checkUnnamed719(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -34,7 +34,7 @@
   var o = new api.DownloadLineItemsRequest();
   buildCounterDownloadLineItemsRequest++;
   if (buildCounterDownloadLineItemsRequest < 3) {
-    o.filterIds = buildUnnamed691();
+    o.filterIds = buildUnnamed719();
     o.filterType = "foo";
     o.format = "foo";
   }
@@ -45,7 +45,7 @@
 checkDownloadLineItemsRequest(api.DownloadLineItemsRequest o) {
   buildCounterDownloadLineItemsRequest++;
   if (buildCounterDownloadLineItemsRequest < 3) {
-    checkUnnamed691(o.filterIds);
+    checkUnnamed719(o.filterIds);
     unittest.expect(o.filterType, unittest.equals('foo'));
     unittest.expect(o.format, unittest.equals('foo'));
   }
@@ -92,14 +92,14 @@
   buildCounterFilterPair--;
 }
 
-buildUnnamed692() {
+buildUnnamed720() {
   var o = new core.List<api.Query>();
   o.add(buildQuery());
   o.add(buildQuery());
   return o;
 }
 
-checkUnnamed692(core.List<api.Query> o) {
+checkUnnamed720(core.List<api.Query> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkQuery(o[0]);
   checkQuery(o[1]);
@@ -111,7 +111,7 @@
   buildCounterListQueriesResponse++;
   if (buildCounterListQueriesResponse < 3) {
     o.kind = "foo";
-    o.queries = buildUnnamed692();
+    o.queries = buildUnnamed720();
   }
   buildCounterListQueriesResponse--;
   return o;
@@ -121,19 +121,19 @@
   buildCounterListQueriesResponse++;
   if (buildCounterListQueriesResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed692(o.queries);
+    checkUnnamed720(o.queries);
   }
   buildCounterListQueriesResponse--;
 }
 
-buildUnnamed693() {
+buildUnnamed721() {
   var o = new core.List<api.Report>();
   o.add(buildReport());
   o.add(buildReport());
   return o;
 }
 
-checkUnnamed693(core.List<api.Report> o) {
+checkUnnamed721(core.List<api.Report> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReport(o[0]);
   checkReport(o[1]);
@@ -145,7 +145,7 @@
   buildCounterListReportsResponse++;
   if (buildCounterListReportsResponse < 3) {
     o.kind = "foo";
-    o.reports = buildUnnamed693();
+    o.reports = buildUnnamed721();
   }
   buildCounterListReportsResponse--;
   return o;
@@ -155,45 +155,45 @@
   buildCounterListReportsResponse++;
   if (buildCounterListReportsResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed693(o.reports);
+    checkUnnamed721(o.reports);
   }
   buildCounterListReportsResponse--;
 }
 
-buildUnnamed694() {
+buildUnnamed722() {
   var o = new core.List<api.FilterPair>();
   o.add(buildFilterPair());
   o.add(buildFilterPair());
   return o;
 }
 
-checkUnnamed694(core.List<api.FilterPair> o) {
+checkUnnamed722(core.List<api.FilterPair> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilterPair(o[0]);
   checkFilterPair(o[1]);
 }
 
-buildUnnamed695() {
+buildUnnamed723() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed695(core.List<core.String> o) {
+checkUnnamed723(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed696() {
+buildUnnamed724() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed696(core.List<core.String> o) {
+checkUnnamed724(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -204,10 +204,10 @@
   var o = new api.Parameters();
   buildCounterParameters++;
   if (buildCounterParameters < 3) {
-    o.filters = buildUnnamed694();
-    o.groupBys = buildUnnamed695();
+    o.filters = buildUnnamed722();
+    o.groupBys = buildUnnamed723();
     o.includeInviteData = true;
-    o.metrics = buildUnnamed696();
+    o.metrics = buildUnnamed724();
     o.type = "foo";
   }
   buildCounterParameters--;
@@ -217,10 +217,10 @@
 checkParameters(api.Parameters o) {
   buildCounterParameters++;
   if (buildCounterParameters < 3) {
-    checkUnnamed694(o.filters);
-    checkUnnamed695(o.groupBys);
+    checkUnnamed722(o.filters);
+    checkUnnamed723(o.groupBys);
     unittest.expect(o.includeInviteData, unittest.isTrue);
-    checkUnnamed696(o.metrics);
+    checkUnnamed724(o.metrics);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterParameters--;
@@ -259,14 +259,14 @@
   buildCounterQuery--;
 }
 
-buildUnnamed697() {
+buildUnnamed725() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed697(core.List<core.String> o) {
+checkUnnamed725(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -285,7 +285,7 @@
     o.reportCount = 42;
     o.running = true;
     o.sendNotification = true;
-    o.shareEmailAddress = buildUnnamed697();
+    o.shareEmailAddress = buildUnnamed725();
     o.title = "foo";
   }
   buildCounterQueryMetadata--;
@@ -303,7 +303,7 @@
     unittest.expect(o.reportCount, unittest.equals(42));
     unittest.expect(o.running, unittest.isTrue);
     unittest.expect(o.sendNotification, unittest.isTrue);
-    checkUnnamed697(o.shareEmailAddress);
+    checkUnnamed725(o.shareEmailAddress);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterQueryMetadata--;
@@ -447,14 +447,14 @@
   buildCounterReportStatus--;
 }
 
-buildUnnamed698() {
+buildUnnamed726() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed698(core.List<core.String> o) {
+checkUnnamed726(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -468,7 +468,7 @@
     o.changed = true;
     o.entityId = "foo";
     o.entityName = "foo";
-    o.errors = buildUnnamed698();
+    o.errors = buildUnnamed726();
     o.persisted = true;
     o.rowNumber = 42;
   }
@@ -482,7 +482,7 @@
     unittest.expect(o.changed, unittest.isTrue);
     unittest.expect(o.entityId, unittest.equals('foo'));
     unittest.expect(o.entityName, unittest.equals('foo'));
-    checkUnnamed698(o.errors);
+    checkUnnamed726(o.errors);
     unittest.expect(o.persisted, unittest.isTrue);
     unittest.expect(o.rowNumber, unittest.equals(42));
   }
@@ -556,27 +556,27 @@
   buildCounterUploadLineItemsResponse--;
 }
 
-buildUnnamed699() {
+buildUnnamed727() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed699(core.List<core.String> o) {
+checkUnnamed727(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed700() {
+buildUnnamed728() {
   var o = new core.List<api.RowStatus>();
   o.add(buildRowStatus());
   o.add(buildRowStatus());
   return o;
 }
 
-checkUnnamed700(core.List<api.RowStatus> o) {
+checkUnnamed728(core.List<api.RowStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRowStatus(o[0]);
   checkRowStatus(o[1]);
@@ -587,8 +587,8 @@
   var o = new api.UploadStatus();
   buildCounterUploadStatus++;
   if (buildCounterUploadStatus < 3) {
-    o.errors = buildUnnamed699();
-    o.rowStatus = buildUnnamed700();
+    o.errors = buildUnnamed727();
+    o.rowStatus = buildUnnamed728();
   }
   buildCounterUploadStatus--;
   return o;
@@ -597,8 +597,8 @@
 checkUploadStatus(api.UploadStatus o) {
   buildCounterUploadStatus++;
   if (buildCounterUploadStatus < 3) {
-    checkUnnamed699(o.errors);
-    checkUnnamed700(o.rowStatus);
+    checkUnnamed727(o.errors);
+    checkUnnamed728(o.rowStatus);
   }
   buildCounterUploadStatus--;
 }
@@ -790,8 +790,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/doubleclickbidmanager/v1/"));
-        pathOffset += 26;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("doubleclickbidmanager/v1/"));
+        pathOffset += 25;
         unittest.expect(path.substring(pathOffset, pathOffset + 27), unittest.equals("lineitems/downloadlineitems"));
         pathOffset += 27;
 
@@ -837,8 +839,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/doubleclickbidmanager/v1/"));
-        pathOffset += 26;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("doubleclickbidmanager/v1/"));
+        pathOffset += 25;
         unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("lineitems/uploadlineitems"));
         pathOffset += 25;
 
@@ -888,8 +892,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/doubleclickbidmanager/v1/"));
-        pathOffset += 26;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("doubleclickbidmanager/v1/"));
+        pathOffset += 25;
         unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("query"));
         pathOffset += 5;
 
@@ -932,8 +938,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/doubleclickbidmanager/v1/"));
-        pathOffset += 26;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("doubleclickbidmanager/v1/"));
+        pathOffset += 25;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("query/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -977,8 +985,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/doubleclickbidmanager/v1/"));
-        pathOffset += 26;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("doubleclickbidmanager/v1/"));
+        pathOffset += 25;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("query/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1023,8 +1033,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/doubleclickbidmanager/v1/"));
-        pathOffset += 26;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("doubleclickbidmanager/v1/"));
+        pathOffset += 25;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("queries"));
         pathOffset += 7;
 
@@ -1071,8 +1083,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/doubleclickbidmanager/v1/"));
-        pathOffset += 26;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("doubleclickbidmanager/v1/"));
+        pathOffset += 25;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("query/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1120,8 +1134,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/doubleclickbidmanager/v1/"));
-        pathOffset += 26;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("doubleclickbidmanager/v1/"));
+        pathOffset += 25;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("queries/"));
         pathOffset += 8;
         index = path.indexOf("/reports", pathOffset);
diff --git a/generated/googleapis/test/doubleclicksearch/v2_test.dart b/generated/googleapis/test/doubleclicksearch/v2_test.dart
index c576bab..d5ceea3 100644
--- a/generated/googleapis/test/doubleclicksearch/v2_test.dart
+++ b/generated/googleapis/test/doubleclicksearch/v2_test.dart
@@ -45,27 +45,27 @@
   buildCounterAvailability--;
 }
 
-buildUnnamed731() {
+buildUnnamed759() {
   var o = new core.List<api.CustomDimension>();
   o.add(buildCustomDimension());
   o.add(buildCustomDimension());
   return o;
 }
 
-checkUnnamed731(core.List<api.CustomDimension> o) {
+checkUnnamed759(core.List<api.CustomDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomDimension(o[0]);
   checkCustomDimension(o[1]);
 }
 
-buildUnnamed732() {
+buildUnnamed760() {
   var o = new core.List<api.CustomMetric>();
   o.add(buildCustomMetric());
   o.add(buildCustomMetric());
   return o;
 }
 
-checkUnnamed732(core.List<api.CustomMetric> o) {
+checkUnnamed760(core.List<api.CustomMetric> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCustomMetric(o[0]);
   checkCustomMetric(o[1]);
@@ -87,8 +87,8 @@
     o.conversionTimestamp = "foo";
     o.criterionId = "foo";
     o.currencyCode = "foo";
-    o.customDimension = buildUnnamed731();
-    o.customMetric = buildUnnamed732();
+    o.customDimension = buildUnnamed759();
+    o.customMetric = buildUnnamed760();
     o.dsConversionId = "foo";
     o.engineAccountId = "foo";
     o.floodlightOrderId = "foo";
@@ -118,8 +118,8 @@
     unittest.expect(o.conversionTimestamp, unittest.equals('foo'));
     unittest.expect(o.criterionId, unittest.equals('foo'));
     unittest.expect(o.currencyCode, unittest.equals('foo'));
-    checkUnnamed731(o.customDimension);
-    checkUnnamed732(o.customMetric);
+    checkUnnamed759(o.customDimension);
+    checkUnnamed760(o.customMetric);
     unittest.expect(o.dsConversionId, unittest.equals('foo'));
     unittest.expect(o.engineAccountId, unittest.equals('foo'));
     unittest.expect(o.floodlightOrderId, unittest.equals('foo'));
@@ -134,14 +134,14 @@
   buildCounterConversion--;
 }
 
-buildUnnamed733() {
+buildUnnamed761() {
   var o = new core.List<api.Conversion>();
   o.add(buildConversion());
   o.add(buildConversion());
   return o;
 }
 
-checkUnnamed733(core.List<api.Conversion> o) {
+checkUnnamed761(core.List<api.Conversion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkConversion(o[0]);
   checkConversion(o[1]);
@@ -152,7 +152,7 @@
   var o = new api.ConversionList();
   buildCounterConversionList++;
   if (buildCounterConversionList < 3) {
-    o.conversion = buildUnnamed733();
+    o.conversion = buildUnnamed761();
     o.kind = "foo";
   }
   buildCounterConversionList--;
@@ -162,7 +162,7 @@
 checkConversionList(api.ConversionList o) {
   buildCounterConversionList++;
   if (buildCounterConversionList < 3) {
-    checkUnnamed733(o.conversion);
+    checkUnnamed761(o.conversion);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterConversionList--;
@@ -231,27 +231,27 @@
   buildCounterReportFiles--;
 }
 
-buildUnnamed734() {
+buildUnnamed762() {
   var o = new core.List<api.ReportFiles>();
   o.add(buildReportFiles());
   o.add(buildReportFiles());
   return o;
 }
 
-checkUnnamed734(core.List<api.ReportFiles> o) {
+checkUnnamed762(core.List<api.ReportFiles> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportFiles(o[0]);
   checkReportFiles(o[1]);
 }
 
-buildUnnamed735() {
+buildUnnamed763() {
   var o = new core.List<api.ReportRow>();
   o.add(buildReportRow());
   o.add(buildReportRow());
   return o;
 }
 
-checkUnnamed735(core.List<api.ReportRow> o) {
+checkUnnamed763(core.List<api.ReportRow> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportRow(o[0]);
   checkReportRow(o[1]);
@@ -262,13 +262,13 @@
   var o = new api.Report();
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    o.files = buildUnnamed734();
+    o.files = buildUnnamed762();
     o.id = "foo";
     o.isReportReady = true;
     o.kind = "foo";
     o.request = buildReportRequest();
     o.rowCount = 42;
-    o.rows = buildUnnamed735();
+    o.rows = buildUnnamed763();
     o.statisticsCurrencyCode = "foo";
     o.statisticsTimeZone = "foo";
   }
@@ -279,13 +279,13 @@
 checkReport(api.Report o) {
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    checkUnnamed734(o.files);
+    checkUnnamed762(o.files);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.isReportReady, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkReportRequest(o.request);
     unittest.expect(o.rowCount, unittest.equals(42));
-    checkUnnamed735(o.rows);
+    checkUnnamed763(o.rows);
     unittest.expect(o.statisticsCurrencyCode, unittest.equals('foo'));
     unittest.expect(o.statisticsTimeZone, unittest.equals('foo'));
   }
@@ -325,27 +325,27 @@
   buildCounterReportApiColumnSpec--;
 }
 
-buildUnnamed736() {
+buildUnnamed764() {
   var o = new core.List<api.ReportApiColumnSpec>();
   o.add(buildReportApiColumnSpec());
   o.add(buildReportApiColumnSpec());
   return o;
 }
 
-checkUnnamed736(core.List<api.ReportApiColumnSpec> o) {
+checkUnnamed764(core.List<api.ReportApiColumnSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportApiColumnSpec(o[0]);
   checkReportApiColumnSpec(o[1]);
 }
 
-buildUnnamed737() {
+buildUnnamed765() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed737(core.List<core.Object> o) {
+checkUnnamed765(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) 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')); 
   var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
@@ -358,7 +358,7 @@
   if (buildCounterReportRequestFilters < 3) {
     o.column = buildReportApiColumnSpec();
     o.operator = "foo";
-    o.values = buildUnnamed737();
+    o.values = buildUnnamed765();
   }
   buildCounterReportRequestFilters--;
   return o;
@@ -369,19 +369,19 @@
   if (buildCounterReportRequestFilters < 3) {
     checkReportApiColumnSpec(o.column);
     unittest.expect(o.operator, unittest.equals('foo'));
-    checkUnnamed737(o.values);
+    checkUnnamed765(o.values);
   }
   buildCounterReportRequestFilters--;
 }
 
-buildUnnamed738() {
+buildUnnamed766() {
   var o = new core.List<api.ReportRequestFilters>();
   o.add(buildReportRequestFilters());
   o.add(buildReportRequestFilters());
   return o;
 }
 
-checkUnnamed738(core.List<api.ReportRequestFilters> o) {
+checkUnnamed766(core.List<api.ReportRequestFilters> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportRequestFilters(o[0]);
   checkReportRequestFilters(o[1]);
@@ -408,14 +408,14 @@
   buildCounterReportRequestOrderBy--;
 }
 
-buildUnnamed739() {
+buildUnnamed767() {
   var o = new core.List<api.ReportRequestOrderBy>();
   o.add(buildReportRequestOrderBy());
   o.add(buildReportRequestOrderBy());
   return o;
 }
 
-checkUnnamed739(core.List<api.ReportRequestOrderBy> o) {
+checkUnnamed767(core.List<api.ReportRequestOrderBy> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReportRequestOrderBy(o[0]);
   checkReportRequestOrderBy(o[1]);
@@ -482,13 +482,13 @@
   var o = new api.ReportRequest();
   buildCounterReportRequest++;
   if (buildCounterReportRequest < 3) {
-    o.columns = buildUnnamed736();
+    o.columns = buildUnnamed764();
     o.downloadFormat = "foo";
-    o.filters = buildUnnamed738();
+    o.filters = buildUnnamed766();
     o.includeDeletedEntities = true;
     o.includeRemovedEntities = true;
     o.maxRowsPerFile = 42;
-    o.orderBy = buildUnnamed739();
+    o.orderBy = buildUnnamed767();
     o.reportScope = buildReportRequestReportScope();
     o.reportType = "foo";
     o.rowCount = 42;
@@ -504,13 +504,13 @@
 checkReportRequest(api.ReportRequest o) {
   buildCounterReportRequest++;
   if (buildCounterReportRequest < 3) {
-    checkUnnamed736(o.columns);
+    checkUnnamed764(o.columns);
     unittest.expect(o.downloadFormat, unittest.equals('foo'));
-    checkUnnamed738(o.filters);
+    checkUnnamed766(o.filters);
     unittest.expect(o.includeDeletedEntities, unittest.isTrue);
     unittest.expect(o.includeRemovedEntities, unittest.isTrue);
     unittest.expect(o.maxRowsPerFile, unittest.equals(42));
-    checkUnnamed739(o.orderBy);
+    checkUnnamed767(o.orderBy);
     checkReportRequestReportScope(o.reportScope);
     unittest.expect(o.reportType, unittest.equals('foo'));
     unittest.expect(o.rowCount, unittest.equals(42));
@@ -558,14 +558,14 @@
   buildCounterSavedColumn--;
 }
 
-buildUnnamed740() {
+buildUnnamed768() {
   var o = new core.List<api.SavedColumn>();
   o.add(buildSavedColumn());
   o.add(buildSavedColumn());
   return o;
 }
 
-checkUnnamed740(core.List<api.SavedColumn> o) {
+checkUnnamed768(core.List<api.SavedColumn> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSavedColumn(o[0]);
   checkSavedColumn(o[1]);
@@ -576,7 +576,7 @@
   var o = new api.SavedColumnList();
   buildCounterSavedColumnList++;
   if (buildCounterSavedColumnList < 3) {
-    o.items = buildUnnamed740();
+    o.items = buildUnnamed768();
     o.kind = "foo";
   }
   buildCounterSavedColumnList--;
@@ -586,20 +586,20 @@
 checkSavedColumnList(api.SavedColumnList o) {
   buildCounterSavedColumnList++;
   if (buildCounterSavedColumnList < 3) {
-    checkUnnamed740(o.items);
+    checkUnnamed768(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterSavedColumnList--;
 }
 
-buildUnnamed741() {
+buildUnnamed769() {
   var o = new core.List<api.Availability>();
   o.add(buildAvailability());
   o.add(buildAvailability());
   return o;
 }
 
-checkUnnamed741(core.List<api.Availability> o) {
+checkUnnamed769(core.List<api.Availability> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAvailability(o[0]);
   checkAvailability(o[1]);
@@ -610,7 +610,7 @@
   var o = new api.UpdateAvailabilityRequest();
   buildCounterUpdateAvailabilityRequest++;
   if (buildCounterUpdateAvailabilityRequest < 3) {
-    o.availabilities = buildUnnamed741();
+    o.availabilities = buildUnnamed769();
   }
   buildCounterUpdateAvailabilityRequest--;
   return o;
@@ -619,19 +619,19 @@
 checkUpdateAvailabilityRequest(api.UpdateAvailabilityRequest o) {
   buildCounterUpdateAvailabilityRequest++;
   if (buildCounterUpdateAvailabilityRequest < 3) {
-    checkUnnamed741(o.availabilities);
+    checkUnnamed769(o.availabilities);
   }
   buildCounterUpdateAvailabilityRequest--;
 }
 
-buildUnnamed742() {
+buildUnnamed770() {
   var o = new core.List<api.Availability>();
   o.add(buildAvailability());
   o.add(buildAvailability());
   return o;
 }
 
-checkUnnamed742(core.List<api.Availability> o) {
+checkUnnamed770(core.List<api.Availability> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAvailability(o[0]);
   checkAvailability(o[1]);
@@ -642,7 +642,7 @@
   var o = new api.UpdateAvailabilityResponse();
   buildCounterUpdateAvailabilityResponse++;
   if (buildCounterUpdateAvailabilityResponse < 3) {
-    o.availabilities = buildUnnamed742();
+    o.availabilities = buildUnnamed770();
   }
   buildCounterUpdateAvailabilityResponse--;
   return o;
@@ -651,7 +651,7 @@
 checkUpdateAvailabilityResponse(api.UpdateAvailabilityResponse o) {
   buildCounterUpdateAvailabilityResponse++;
   if (buildCounterUpdateAvailabilityResponse < 3) {
-    checkUnnamed742(o.availabilities);
+    checkUnnamed770(o.availabilities);
   }
   buildCounterUpdateAvailabilityResponse--;
 }
@@ -841,8 +841,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/doubleclicksearch/v2/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("doubleclicksearch/v2/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("agency/"));
         pathOffset += 7;
         index = path.indexOf("/advertiser/", pathOffset);
@@ -917,8 +919,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/doubleclicksearch/v2/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("doubleclicksearch/v2/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("conversion"));
         pathOffset += 10;
 
@@ -971,8 +975,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/doubleclicksearch/v2/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("doubleclicksearch/v2/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("conversion"));
         pathOffset += 10;
 
@@ -1025,8 +1031,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/doubleclicksearch/v2/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("doubleclicksearch/v2/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("conversion"));
         pathOffset += 10;
 
@@ -1072,8 +1080,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/doubleclicksearch/v2/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("doubleclicksearch/v2/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 29), unittest.equals("conversion/updateAvailability"));
         pathOffset += 29;
 
@@ -1123,8 +1133,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/doubleclicksearch/v2/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("doubleclicksearch/v2/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("reports/generate"));
         pathOffset += 16;
 
@@ -1167,8 +1179,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/doubleclicksearch/v2/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("doubleclicksearch/v2/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("reports/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1217,8 +1231,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/doubleclicksearch/v2/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("doubleclicksearch/v2/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("reports/"));
         pathOffset += 8;
         index = path.indexOf("/files/", pathOffset);
@@ -1272,8 +1288,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/doubleclicksearch/v2/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("doubleclicksearch/v2/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("reports"));
         pathOffset += 7;
 
@@ -1321,8 +1339,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/doubleclicksearch/v2/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("doubleclicksearch/v2/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("agency/"));
         pathOffset += 7;
         index = path.indexOf("/advertiser/", pathOffset);
diff --git a/generated/googleapis/test/drive/v2_test.dart b/generated/googleapis/test/drive/v2_test.dart
index fa33e53..dc53a96 100644
--- a/generated/googleapis/test/drive/v2_test.dart
+++ b/generated/googleapis/test/drive/v2_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed394() {
+buildUnnamed419() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed394(core.List<core.String> o) {
+checkUnnamed419(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -34,7 +34,7 @@
   var o = new api.AboutAdditionalRoleInfoRoleSets();
   buildCounterAboutAdditionalRoleInfoRoleSets++;
   if (buildCounterAboutAdditionalRoleInfoRoleSets < 3) {
-    o.additionalRoles = buildUnnamed394();
+    o.additionalRoles = buildUnnamed419();
     o.primaryRole = "foo";
   }
   buildCounterAboutAdditionalRoleInfoRoleSets--;
@@ -44,20 +44,20 @@
 checkAboutAdditionalRoleInfoRoleSets(api.AboutAdditionalRoleInfoRoleSets o) {
   buildCounterAboutAdditionalRoleInfoRoleSets++;
   if (buildCounterAboutAdditionalRoleInfoRoleSets < 3) {
-    checkUnnamed394(o.additionalRoles);
+    checkUnnamed419(o.additionalRoles);
     unittest.expect(o.primaryRole, unittest.equals('foo'));
   }
   buildCounterAboutAdditionalRoleInfoRoleSets--;
 }
 
-buildUnnamed395() {
+buildUnnamed420() {
   var o = new core.List<api.AboutAdditionalRoleInfoRoleSets>();
   o.add(buildAboutAdditionalRoleInfoRoleSets());
   o.add(buildAboutAdditionalRoleInfoRoleSets());
   return o;
 }
 
-checkUnnamed395(core.List<api.AboutAdditionalRoleInfoRoleSets> o) {
+checkUnnamed420(core.List<api.AboutAdditionalRoleInfoRoleSets> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutAdditionalRoleInfoRoleSets(o[0]);
   checkAboutAdditionalRoleInfoRoleSets(o[1]);
@@ -68,7 +68,7 @@
   var o = new api.AboutAdditionalRoleInfo();
   buildCounterAboutAdditionalRoleInfo++;
   if (buildCounterAboutAdditionalRoleInfo < 3) {
-    o.roleSets = buildUnnamed395();
+    o.roleSets = buildUnnamed420();
     o.type = "foo";
   }
   buildCounterAboutAdditionalRoleInfo--;
@@ -78,33 +78,33 @@
 checkAboutAdditionalRoleInfo(api.AboutAdditionalRoleInfo o) {
   buildCounterAboutAdditionalRoleInfo++;
   if (buildCounterAboutAdditionalRoleInfo < 3) {
-    checkUnnamed395(o.roleSets);
+    checkUnnamed420(o.roleSets);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterAboutAdditionalRoleInfo--;
 }
 
-buildUnnamed396() {
+buildUnnamed421() {
   var o = new core.List<api.AboutAdditionalRoleInfo>();
   o.add(buildAboutAdditionalRoleInfo());
   o.add(buildAboutAdditionalRoleInfo());
   return o;
 }
 
-checkUnnamed396(core.List<api.AboutAdditionalRoleInfo> o) {
+checkUnnamed421(core.List<api.AboutAdditionalRoleInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutAdditionalRoleInfo(o[0]);
   checkAboutAdditionalRoleInfo(o[1]);
 }
 
-buildUnnamed397() {
+buildUnnamed422() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed397(core.List<core.String> o) {
+checkUnnamed422(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -116,7 +116,7 @@
   buildCounterAboutExportFormats++;
   if (buildCounterAboutExportFormats < 3) {
     o.source = "foo";
-    o.targets = buildUnnamed397();
+    o.targets = buildUnnamed422();
   }
   buildCounterAboutExportFormats--;
   return o;
@@ -126,19 +126,19 @@
   buildCounterAboutExportFormats++;
   if (buildCounterAboutExportFormats < 3) {
     unittest.expect(o.source, unittest.equals('foo'));
-    checkUnnamed397(o.targets);
+    checkUnnamed422(o.targets);
   }
   buildCounterAboutExportFormats--;
 }
 
-buildUnnamed398() {
+buildUnnamed423() {
   var o = new core.List<api.AboutExportFormats>();
   o.add(buildAboutExportFormats());
   o.add(buildAboutExportFormats());
   return o;
 }
 
-checkUnnamed398(core.List<api.AboutExportFormats> o) {
+checkUnnamed423(core.List<api.AboutExportFormats> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutExportFormats(o[0]);
   checkAboutExportFormats(o[1]);
@@ -165,27 +165,27 @@
   buildCounterAboutFeatures--;
 }
 
-buildUnnamed399() {
+buildUnnamed424() {
   var o = new core.List<api.AboutFeatures>();
   o.add(buildAboutFeatures());
   o.add(buildAboutFeatures());
   return o;
 }
 
-checkUnnamed399(core.List<api.AboutFeatures> o) {
+checkUnnamed424(core.List<api.AboutFeatures> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutFeatures(o[0]);
   checkAboutFeatures(o[1]);
 }
 
-buildUnnamed400() {
+buildUnnamed425() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed400(core.List<core.String> o) {
+checkUnnamed425(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -197,7 +197,7 @@
   buildCounterAboutImportFormats++;
   if (buildCounterAboutImportFormats < 3) {
     o.source = "foo";
-    o.targets = buildUnnamed400();
+    o.targets = buildUnnamed425();
   }
   buildCounterAboutImportFormats--;
   return o;
@@ -207,19 +207,19 @@
   buildCounterAboutImportFormats++;
   if (buildCounterAboutImportFormats < 3) {
     unittest.expect(o.source, unittest.equals('foo'));
-    checkUnnamed400(o.targets);
+    checkUnnamed425(o.targets);
   }
   buildCounterAboutImportFormats--;
 }
 
-buildUnnamed401() {
+buildUnnamed426() {
   var o = new core.List<api.AboutImportFormats>();
   o.add(buildAboutImportFormats());
   o.add(buildAboutImportFormats());
   return o;
 }
 
-checkUnnamed401(core.List<api.AboutImportFormats> o) {
+checkUnnamed426(core.List<api.AboutImportFormats> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutImportFormats(o[0]);
   checkAboutImportFormats(o[1]);
@@ -246,14 +246,14 @@
   buildCounterAboutMaxUploadSizes--;
 }
 
-buildUnnamed402() {
+buildUnnamed427() {
   var o = new core.List<api.AboutMaxUploadSizes>();
   o.add(buildAboutMaxUploadSizes());
   o.add(buildAboutMaxUploadSizes());
   return o;
 }
 
-checkUnnamed402(core.List<api.AboutMaxUploadSizes> o) {
+checkUnnamed427(core.List<api.AboutMaxUploadSizes> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutMaxUploadSizes(o[0]);
   checkAboutMaxUploadSizes(o[1]);
@@ -280,14 +280,14 @@
   buildCounterAboutQuotaBytesByService--;
 }
 
-buildUnnamed403() {
+buildUnnamed428() {
   var o = new core.List<api.AboutQuotaBytesByService>();
   o.add(buildAboutQuotaBytesByService());
   o.add(buildAboutQuotaBytesByService());
   return o;
 }
 
-checkUnnamed403(core.List<api.AboutQuotaBytesByService> o) {
+checkUnnamed428(core.List<api.AboutQuotaBytesByService> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAboutQuotaBytesByService(o[0]);
   checkAboutQuotaBytesByService(o[1]);
@@ -298,20 +298,20 @@
   var o = new api.About();
   buildCounterAbout++;
   if (buildCounterAbout < 3) {
-    o.additionalRoleInfo = buildUnnamed396();
+    o.additionalRoleInfo = buildUnnamed421();
     o.domainSharingPolicy = "foo";
     o.etag = "foo";
-    o.exportFormats = buildUnnamed398();
-    o.features = buildUnnamed399();
-    o.importFormats = buildUnnamed401();
+    o.exportFormats = buildUnnamed423();
+    o.features = buildUnnamed424();
+    o.importFormats = buildUnnamed426();
     o.isCurrentAppInstalled = true;
     o.kind = "foo";
     o.languageCode = "foo";
     o.largestChangeId = "foo";
-    o.maxUploadSizes = buildUnnamed402();
+    o.maxUploadSizes = buildUnnamed427();
     o.name = "foo";
     o.permissionId = "foo";
-    o.quotaBytesByService = buildUnnamed403();
+    o.quotaBytesByService = buildUnnamed428();
     o.quotaBytesTotal = "foo";
     o.quotaBytesUsed = "foo";
     o.quotaBytesUsedAggregate = "foo";
@@ -329,20 +329,20 @@
 checkAbout(api.About o) {
   buildCounterAbout++;
   if (buildCounterAbout < 3) {
-    checkUnnamed396(o.additionalRoleInfo);
+    checkUnnamed421(o.additionalRoleInfo);
     unittest.expect(o.domainSharingPolicy, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed398(o.exportFormats);
-    checkUnnamed399(o.features);
-    checkUnnamed401(o.importFormats);
+    checkUnnamed423(o.exportFormats);
+    checkUnnamed424(o.features);
+    checkUnnamed426(o.importFormats);
     unittest.expect(o.isCurrentAppInstalled, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.languageCode, unittest.equals('foo'));
     unittest.expect(o.largestChangeId, unittest.equals('foo'));
-    checkUnnamed402(o.maxUploadSizes);
+    checkUnnamed427(o.maxUploadSizes);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.permissionId, unittest.equals('foo'));
-    checkUnnamed403(o.quotaBytesByService);
+    checkUnnamed428(o.quotaBytesByService);
     unittest.expect(o.quotaBytesTotal, unittest.equals('foo'));
     unittest.expect(o.quotaBytesUsed, unittest.equals('foo'));
     unittest.expect(o.quotaBytesUsedAggregate, unittest.equals('foo'));
@@ -379,66 +379,66 @@
   buildCounterAppIcons--;
 }
 
-buildUnnamed404() {
+buildUnnamed429() {
   var o = new core.List<api.AppIcons>();
   o.add(buildAppIcons());
   o.add(buildAppIcons());
   return o;
 }
 
-checkUnnamed404(core.List<api.AppIcons> o) {
+checkUnnamed429(core.List<api.AppIcons> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAppIcons(o[0]);
   checkAppIcons(o[1]);
 }
 
-buildUnnamed405() {
+buildUnnamed430() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed405(core.List<core.String> o) {
+checkUnnamed430(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed406() {
+buildUnnamed431() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed406(core.List<core.String> o) {
+checkUnnamed431(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed407() {
+buildUnnamed432() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed407(core.List<core.String> o) {
+checkUnnamed432(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed408() {
+buildUnnamed433() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed408(core.List<core.String> o) {
+checkUnnamed433(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -453,7 +453,7 @@
     o.createInFolderTemplate = "foo";
     o.createUrl = "foo";
     o.hasDriveWideScope = true;
-    o.icons = buildUnnamed404();
+    o.icons = buildUnnamed429();
     o.id = "foo";
     o.installed = true;
     o.kind = "foo";
@@ -461,12 +461,12 @@
     o.name = "foo";
     o.objectType = "foo";
     o.openUrlTemplate = "foo";
-    o.primaryFileExtensions = buildUnnamed405();
-    o.primaryMimeTypes = buildUnnamed406();
+    o.primaryFileExtensions = buildUnnamed430();
+    o.primaryMimeTypes = buildUnnamed431();
     o.productId = "foo";
     o.productUrl = "foo";
-    o.secondaryFileExtensions = buildUnnamed407();
-    o.secondaryMimeTypes = buildUnnamed408();
+    o.secondaryFileExtensions = buildUnnamed432();
+    o.secondaryMimeTypes = buildUnnamed433();
     o.shortDescription = "foo";
     o.supportsCreate = true;
     o.supportsImport = true;
@@ -485,7 +485,7 @@
     unittest.expect(o.createInFolderTemplate, unittest.equals('foo'));
     unittest.expect(o.createUrl, unittest.equals('foo'));
     unittest.expect(o.hasDriveWideScope, unittest.isTrue);
-    checkUnnamed404(o.icons);
+    checkUnnamed429(o.icons);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.installed, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -493,12 +493,12 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
     unittest.expect(o.openUrlTemplate, unittest.equals('foo'));
-    checkUnnamed405(o.primaryFileExtensions);
-    checkUnnamed406(o.primaryMimeTypes);
+    checkUnnamed430(o.primaryFileExtensions);
+    checkUnnamed431(o.primaryMimeTypes);
     unittest.expect(o.productId, unittest.equals('foo'));
     unittest.expect(o.productUrl, unittest.equals('foo'));
-    checkUnnamed407(o.secondaryFileExtensions);
-    checkUnnamed408(o.secondaryMimeTypes);
+    checkUnnamed432(o.secondaryFileExtensions);
+    checkUnnamed433(o.secondaryMimeTypes);
     unittest.expect(o.shortDescription, unittest.equals('foo'));
     unittest.expect(o.supportsCreate, unittest.isTrue);
     unittest.expect(o.supportsImport, unittest.isTrue);
@@ -509,27 +509,27 @@
   buildCounterApp--;
 }
 
-buildUnnamed409() {
+buildUnnamed434() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed409(core.List<core.String> o) {
+checkUnnamed434(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed410() {
+buildUnnamed435() {
   var o = new core.List<api.App>();
   o.add(buildApp());
   o.add(buildApp());
   return o;
 }
 
-checkUnnamed410(core.List<api.App> o) {
+checkUnnamed435(core.List<api.App> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkApp(o[0]);
   checkApp(o[1]);
@@ -540,9 +540,9 @@
   var o = new api.AppList();
   buildCounterAppList++;
   if (buildCounterAppList < 3) {
-    o.defaultAppIds = buildUnnamed409();
+    o.defaultAppIds = buildUnnamed434();
     o.etag = "foo";
-    o.items = buildUnnamed410();
+    o.items = buildUnnamed435();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -553,9 +553,9 @@
 checkAppList(api.AppList o) {
   buildCounterAppList++;
   if (buildCounterAppList < 3) {
-    checkUnnamed409(o.defaultAppIds);
+    checkUnnamed434(o.defaultAppIds);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed410(o.items);
+    checkUnnamed435(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
@@ -593,14 +593,14 @@
   buildCounterChange--;
 }
 
-buildUnnamed411() {
+buildUnnamed436() {
   var o = new core.List<api.Change>();
   o.add(buildChange());
   o.add(buildChange());
   return o;
 }
 
-checkUnnamed411(core.List<api.Change> o) {
+checkUnnamed436(core.List<api.Change> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChange(o[0]);
   checkChange(o[1]);
@@ -612,7 +612,7 @@
   buildCounterChangeList++;
   if (buildCounterChangeList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed411();
+    o.items = buildUnnamed436();
     o.kind = "foo";
     o.largestChangeId = "foo";
     o.nextLink = "foo";
@@ -627,7 +627,7 @@
   buildCounterChangeList++;
   if (buildCounterChangeList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed411(o.items);
+    checkUnnamed436(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.largestChangeId, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
@@ -637,14 +637,14 @@
   buildCounterChangeList--;
 }
 
-buildUnnamed412() {
+buildUnnamed437() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed412(core.Map<core.String, core.String> o) {
+checkUnnamed437(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -659,7 +659,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed412();
+    o.params = buildUnnamed437();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -677,7 +677,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed412(o.params);
+    checkUnnamed437(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -687,14 +687,14 @@
   buildCounterChannel--;
 }
 
-buildUnnamed413() {
+buildUnnamed438() {
   var o = new core.List<api.ChildReference>();
   o.add(buildChildReference());
   o.add(buildChildReference());
   return o;
 }
 
-checkUnnamed413(core.List<api.ChildReference> o) {
+checkUnnamed438(core.List<api.ChildReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChildReference(o[0]);
   checkChildReference(o[1]);
@@ -706,7 +706,7 @@
   buildCounterChildList++;
   if (buildCounterChildList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed413();
+    o.items = buildUnnamed438();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -720,7 +720,7 @@
   buildCounterChildList++;
   if (buildCounterChildList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed413(o.items);
+    checkUnnamed438(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -775,14 +775,14 @@
   buildCounterCommentContext--;
 }
 
-buildUnnamed414() {
+buildUnnamed439() {
   var o = new core.List<api.CommentReply>();
   o.add(buildCommentReply());
   o.add(buildCommentReply());
   return o;
 }
 
-checkUnnamed414(core.List<api.CommentReply> o) {
+checkUnnamed439(core.List<api.CommentReply> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentReply(o[0]);
   checkCommentReply(o[1]);
@@ -805,7 +805,7 @@
     o.htmlContent = "foo";
     o.kind = "foo";
     o.modifiedDate = core.DateTime.parse("2002-02-27T14:01:02");
-    o.replies = buildUnnamed414();
+    o.replies = buildUnnamed439();
     o.selfLink = "foo";
     o.status = "foo";
   }
@@ -828,21 +828,21 @@
     unittest.expect(o.htmlContent, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.modifiedDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed414(o.replies);
+    checkUnnamed439(o.replies);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterComment--;
 }
 
-buildUnnamed415() {
+buildUnnamed440() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed415(core.List<api.Comment> o) {
+checkUnnamed440(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -853,7 +853,7 @@
   var o = new api.CommentList();
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    o.items = buildUnnamed415();
+    o.items = buildUnnamed440();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -866,7 +866,7 @@
 checkCommentList(api.CommentList o) {
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    checkUnnamed415(o.items);
+    checkUnnamed440(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -910,14 +910,14 @@
   buildCounterCommentReply--;
 }
 
-buildUnnamed416() {
+buildUnnamed441() {
   var o = new core.List<api.CommentReply>();
   o.add(buildCommentReply());
   o.add(buildCommentReply());
   return o;
 }
 
-checkUnnamed416(core.List<api.CommentReply> o) {
+checkUnnamed441(core.List<api.CommentReply> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentReply(o[0]);
   checkCommentReply(o[1]);
@@ -928,7 +928,7 @@
   var o = new api.CommentReplyList();
   buildCounterCommentReplyList++;
   if (buildCounterCommentReplyList < 3) {
-    o.items = buildUnnamed416();
+    o.items = buildUnnamed441();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -941,7 +941,7 @@
 checkCommentReplyList(api.CommentReplyList o) {
   buildCounterCommentReplyList++;
   if (buildCounterCommentReplyList < 3) {
-    checkUnnamed416(o.items);
+    checkUnnamed441(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -950,14 +950,14 @@
   buildCounterCommentReplyList--;
 }
 
-buildUnnamed417() {
+buildUnnamed442() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed417(core.Map<core.String, core.String> o) {
+checkUnnamed442(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -1091,79 +1091,79 @@
   buildCounterFileLabels--;
 }
 
-buildUnnamed418() {
+buildUnnamed443() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed418(core.Map<core.String, core.String> o) {
+checkUnnamed443(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed419() {
+buildUnnamed444() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed419(core.List<core.String> o) {
+checkUnnamed444(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed420() {
+buildUnnamed445() {
   var o = new core.List<api.User>();
   o.add(buildUser());
   o.add(buildUser());
   return o;
 }
 
-checkUnnamed420(core.List<api.User> o) {
+checkUnnamed445(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUser(o[0]);
   checkUser(o[1]);
 }
 
-buildUnnamed421() {
+buildUnnamed446() {
   var o = new core.List<api.ParentReference>();
   o.add(buildParentReference());
   o.add(buildParentReference());
   return o;
 }
 
-checkUnnamed421(core.List<api.ParentReference> o) {
+checkUnnamed446(core.List<api.ParentReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParentReference(o[0]);
   checkParentReference(o[1]);
 }
 
-buildUnnamed422() {
+buildUnnamed447() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed422(core.List<api.Permission> o) {
+checkUnnamed447(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
 }
 
-buildUnnamed423() {
+buildUnnamed448() {
   var o = new core.List<api.Property>();
   o.add(buildProperty());
   o.add(buildProperty());
   return o;
 }
 
-checkUnnamed423(core.List<api.Property> o) {
+checkUnnamed448(core.List<api.Property> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProperty(o[0]);
   checkProperty(o[1]);
@@ -1190,6 +1190,29 @@
   buildCounterFileThumbnail--;
 }
 
+core.int buildCounterFileVideoMediaMetadata = 0;
+buildFileVideoMediaMetadata() {
+  var o = new api.FileVideoMediaMetadata();
+  buildCounterFileVideoMediaMetadata++;
+  if (buildCounterFileVideoMediaMetadata < 3) {
+    o.durationMillis = "foo";
+    o.height = 42;
+    o.width = 42;
+  }
+  buildCounterFileVideoMediaMetadata--;
+  return o;
+}
+
+checkFileVideoMediaMetadata(api.FileVideoMediaMetadata o) {
+  buildCounterFileVideoMediaMetadata++;
+  if (buildCounterFileVideoMediaMetadata < 3) {
+    unittest.expect(o.durationMillis, unittest.equals('foo'));
+    unittest.expect(o.height, unittest.equals(42));
+    unittest.expect(o.width, unittest.equals(42));
+  }
+  buildCounterFileVideoMediaMetadata--;
+}
+
 core.int buildCounterFile = 0;
 buildFile() {
   var o = new api.File();
@@ -1206,7 +1229,7 @@
     o.embedLink = "foo";
     o.etag = "foo";
     o.explicitlyTrashed = true;
-    o.exportLinks = buildUnnamed417();
+    o.exportLinks = buildUnnamed442();
     o.fileExtension = "foo";
     o.fileSize = "foo";
     o.headRevisionId = "foo";
@@ -1224,13 +1247,13 @@
     o.mimeType = "foo";
     o.modifiedByMeDate = core.DateTime.parse("2002-02-27T14:01:02");
     o.modifiedDate = core.DateTime.parse("2002-02-27T14:01:02");
-    o.openWithLinks = buildUnnamed418();
+    o.openWithLinks = buildUnnamed443();
     o.originalFilename = "foo";
-    o.ownerNames = buildUnnamed419();
-    o.owners = buildUnnamed420();
-    o.parents = buildUnnamed421();
-    o.permissions = buildUnnamed422();
-    o.properties = buildUnnamed423();
+    o.ownerNames = buildUnnamed444();
+    o.owners = buildUnnamed445();
+    o.parents = buildUnnamed446();
+    o.permissions = buildUnnamed447();
+    o.properties = buildUnnamed448();
     o.quotaBytesUsed = "foo";
     o.selfLink = "foo";
     o.shared = true;
@@ -1241,6 +1264,7 @@
     o.title = "foo";
     o.userPermission = buildPermission();
     o.version = "foo";
+    o.videoMediaMetadata = buildFileVideoMediaMetadata();
     o.webContentLink = "foo";
     o.webViewLink = "foo";
     o.writersCanShare = true;
@@ -1263,7 +1287,7 @@
     unittest.expect(o.embedLink, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.explicitlyTrashed, unittest.isTrue);
-    checkUnnamed417(o.exportLinks);
+    checkUnnamed442(o.exportLinks);
     unittest.expect(o.fileExtension, unittest.equals('foo'));
     unittest.expect(o.fileSize, unittest.equals('foo'));
     unittest.expect(o.headRevisionId, unittest.equals('foo'));
@@ -1281,13 +1305,13 @@
     unittest.expect(o.mimeType, unittest.equals('foo'));
     unittest.expect(o.modifiedByMeDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.modifiedDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed418(o.openWithLinks);
+    checkUnnamed443(o.openWithLinks);
     unittest.expect(o.originalFilename, unittest.equals('foo'));
-    checkUnnamed419(o.ownerNames);
-    checkUnnamed420(o.owners);
-    checkUnnamed421(o.parents);
-    checkUnnamed422(o.permissions);
-    checkUnnamed423(o.properties);
+    checkUnnamed444(o.ownerNames);
+    checkUnnamed445(o.owners);
+    checkUnnamed446(o.parents);
+    checkUnnamed447(o.permissions);
+    checkUnnamed448(o.properties);
     unittest.expect(o.quotaBytesUsed, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.shared, unittest.isTrue);
@@ -1298,6 +1322,7 @@
     unittest.expect(o.title, unittest.equals('foo'));
     checkPermission(o.userPermission);
     unittest.expect(o.version, unittest.equals('foo'));
+    checkFileVideoMediaMetadata(o.videoMediaMetadata);
     unittest.expect(o.webContentLink, unittest.equals('foo'));
     unittest.expect(o.webViewLink, unittest.equals('foo'));
     unittest.expect(o.writersCanShare, unittest.isTrue);
@@ -1305,14 +1330,14 @@
   buildCounterFile--;
 }
 
-buildUnnamed424() {
+buildUnnamed449() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed424(core.List<api.File> o) {
+checkUnnamed449(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -1324,7 +1349,7 @@
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed424();
+    o.items = buildUnnamed449();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -1338,7 +1363,7 @@
   buildCounterFileList++;
   if (buildCounterFileList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed424(o.items);
+    checkUnnamed449(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -1347,14 +1372,14 @@
   buildCounterFileList--;
 }
 
-buildUnnamed425() {
+buildUnnamed450() {
   var o = new core.List<api.ParentReference>();
   o.add(buildParentReference());
   o.add(buildParentReference());
   return o;
 }
 
-checkUnnamed425(core.List<api.ParentReference> o) {
+checkUnnamed450(core.List<api.ParentReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParentReference(o[0]);
   checkParentReference(o[1]);
@@ -1366,7 +1391,7 @@
   buildCounterParentList++;
   if (buildCounterParentList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed425();
+    o.items = buildUnnamed450();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -1378,7 +1403,7 @@
   buildCounterParentList++;
   if (buildCounterParentList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed425(o.items);
+    checkUnnamed450(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
@@ -1412,14 +1437,14 @@
   buildCounterParentReference--;
 }
 
-buildUnnamed426() {
+buildUnnamed451() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed426(core.List<core.String> o) {
+checkUnnamed451(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1430,7 +1455,7 @@
   var o = new api.Permission();
   buildCounterPermission++;
   if (buildCounterPermission < 3) {
-    o.additionalRoles = buildUnnamed426();
+    o.additionalRoles = buildUnnamed451();
     o.authKey = "foo";
     o.domain = "foo";
     o.emailAddress = "foo";
@@ -1452,7 +1477,7 @@
 checkPermission(api.Permission o) {
   buildCounterPermission++;
   if (buildCounterPermission < 3) {
-    checkUnnamed426(o.additionalRoles);
+    checkUnnamed451(o.additionalRoles);
     unittest.expect(o.authKey, unittest.equals('foo'));
     unittest.expect(o.domain, unittest.equals('foo'));
     unittest.expect(o.emailAddress, unittest.equals('foo'));
@@ -1491,14 +1516,14 @@
   buildCounterPermissionId--;
 }
 
-buildUnnamed427() {
+buildUnnamed452() {
   var o = new core.List<api.Permission>();
   o.add(buildPermission());
   o.add(buildPermission());
   return o;
 }
 
-checkUnnamed427(core.List<api.Permission> o) {
+checkUnnamed452(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPermission(o[0]);
   checkPermission(o[1]);
@@ -1510,7 +1535,7 @@
   buildCounterPermissionList++;
   if (buildCounterPermissionList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed427();
+    o.items = buildUnnamed452();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -1522,7 +1547,7 @@
   buildCounterPermissionList++;
   if (buildCounterPermissionList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed427(o.items);
+    checkUnnamed452(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
@@ -1558,14 +1583,14 @@
   buildCounterProperty--;
 }
 
-buildUnnamed428() {
+buildUnnamed453() {
   var o = new core.List<api.Property>();
   o.add(buildProperty());
   o.add(buildProperty());
   return o;
 }
 
-checkUnnamed428(core.List<api.Property> o) {
+checkUnnamed453(core.List<api.Property> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProperty(o[0]);
   checkProperty(o[1]);
@@ -1577,7 +1602,7 @@
   buildCounterPropertyList++;
   if (buildCounterPropertyList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed428();
+    o.items = buildUnnamed453();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -1589,21 +1614,21 @@
   buildCounterPropertyList++;
   if (buildCounterPropertyList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed428(o.items);
+    checkUnnamed453(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
   buildCounterPropertyList--;
 }
 
-buildUnnamed429() {
+buildUnnamed454() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed429(core.Map<core.String, core.String> o) {
+checkUnnamed454(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -1616,7 +1641,7 @@
   if (buildCounterRevision < 3) {
     o.downloadUrl = "foo";
     o.etag = "foo";
-    o.exportLinks = buildUnnamed429();
+    o.exportLinks = buildUnnamed454();
     o.fileSize = "foo";
     o.id = "foo";
     o.kind = "foo";
@@ -1642,7 +1667,7 @@
   if (buildCounterRevision < 3) {
     unittest.expect(o.downloadUrl, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed429(o.exportLinks);
+    checkUnnamed454(o.exportLinks);
     unittest.expect(o.fileSize, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -1662,14 +1687,14 @@
   buildCounterRevision--;
 }
 
-buildUnnamed430() {
+buildUnnamed455() {
   var o = new core.List<api.Revision>();
   o.add(buildRevision());
   o.add(buildRevision());
   return o;
 }
 
-checkUnnamed430(core.List<api.Revision> o) {
+checkUnnamed455(core.List<api.Revision> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRevision(o[0]);
   checkRevision(o[1]);
@@ -1681,7 +1706,7 @@
   buildCounterRevisionList++;
   if (buildCounterRevisionList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed430();
+    o.items = buildUnnamed455();
     o.kind = "foo";
     o.selfLink = "foo";
   }
@@ -1693,7 +1718,7 @@
   buildCounterRevisionList++;
   if (buildCounterRevisionList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed430(o.items);
+    checkUnnamed455(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
@@ -1984,6 +2009,15 @@
   });
 
 
+  unittest.group("obj-schema-FileVideoMediaMetadata", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildFileVideoMediaMetadata();
+      var od = new api.FileVideoMediaMetadata.fromJson(o.toJson());
+      checkFileVideoMediaMetadata(od);
+    });
+  });
+
+
   unittest.group("obj-schema-File", () {
     unittest.test("to-json--from-json", () {
       var o = buildFile();
@@ -2114,8 +2148,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("about"));
         pathOffset += 5;
 
@@ -2165,8 +2201,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("apps/"));
         pathOffset += 5;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2214,8 +2252,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 4), unittest.equals("apps"));
         pathOffset += 4;
 
@@ -2265,8 +2305,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("changes/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2316,8 +2358,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("changes"));
         pathOffset += 7;
 
@@ -2373,8 +2417,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("changes/watch"));
         pathOffset += 13;
 
@@ -2429,8 +2475,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("channels/stop"));
         pathOffset += 13;
 
@@ -2476,8 +2524,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/children/", pathOffset);
@@ -2529,8 +2579,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/children/", pathOffset);
@@ -2587,8 +2639,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/children", pathOffset);
@@ -2641,8 +2695,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/children", pathOffset);
@@ -2700,8 +2756,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
@@ -2754,8 +2812,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
@@ -2813,8 +2873,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments", pathOffset);
@@ -2868,8 +2930,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments", pathOffset);
@@ -2928,8 +2992,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
@@ -2987,8 +3053,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
@@ -3056,8 +3124,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/copy", pathOffset);
@@ -3114,8 +3184,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -3158,8 +3230,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("files/trash"));
         pathOffset += 11;
 
@@ -3202,8 +3276,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -3264,8 +3340,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("files"));
         pathOffset += 5;
 
@@ -3320,8 +3398,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("files"));
         pathOffset += 5;
 
@@ -3385,8 +3465,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -3444,8 +3526,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/touch", pathOffset);
@@ -3495,8 +3579,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/trash", pathOffset);
@@ -3546,8 +3632,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/untrash", pathOffset);
@@ -3615,8 +3703,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -3680,8 +3770,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/watch", pathOffset);
@@ -3738,8 +3830,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/parents/", pathOffset);
@@ -3791,8 +3885,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/parents/", pathOffset);
@@ -3849,8 +3945,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/parents", pathOffset);
@@ -3900,8 +3998,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/parents", pathOffset);
@@ -3956,8 +4056,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/permissions/", pathOffset);
@@ -4009,8 +4111,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/permissions/", pathOffset);
@@ -4063,8 +4167,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("permissionIds/"));
         pathOffset += 14;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -4116,8 +4222,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/permissions", pathOffset);
@@ -4169,8 +4277,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/permissions", pathOffset);
@@ -4226,8 +4336,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/permissions/", pathOffset);
@@ -4287,8 +4399,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/permissions/", pathOffset);
@@ -4348,8 +4462,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/properties/", pathOffset);
@@ -4403,8 +4519,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/properties/", pathOffset);
@@ -4462,8 +4580,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/properties", pathOffset);
@@ -4513,8 +4633,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/properties", pathOffset);
@@ -4570,8 +4692,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/properties/", pathOffset);
@@ -4631,8 +4755,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/properties/", pathOffset);
@@ -4693,8 +4819,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/realtime", pathOffset);
@@ -4746,8 +4874,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/realtime", pathOffset);
@@ -4802,8 +4932,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
@@ -4864,8 +4996,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
@@ -4931,8 +5065,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
@@ -4993,8 +5129,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
@@ -5060,8 +5198,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
@@ -5127,8 +5267,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/comments/", pathOffset);
@@ -5193,8 +5335,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/revisions/", pathOffset);
@@ -5246,8 +5390,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/revisions/", pathOffset);
@@ -5300,8 +5446,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/revisions", pathOffset);
@@ -5356,8 +5504,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/revisions/", pathOffset);
@@ -5415,8 +5565,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/drive/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("drive/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("files/"));
         pathOffset += 6;
         index = path.indexOf("/revisions/", pathOffset);
diff --git a/generated/googleapis/test/freebase/v1_test.dart b/generated/googleapis/test/freebase/v1_test.dart
index 55cf1b2..70cfe32 100644
--- a/generated/googleapis/test/freebase/v1_test.dart
+++ b/generated/googleapis/test/freebase/v1_test.dart
@@ -64,14 +64,14 @@
   buildCounterReconcileCandidate--;
 }
 
-buildUnnamed719() {
+buildUnnamed747() {
   var o = new core.List<api.ReconcileCandidate>();
   o.add(buildReconcileCandidate());
   o.add(buildReconcileCandidate());
   return o;
 }
 
-checkUnnamed719(core.List<api.ReconcileCandidate> o) {
+checkUnnamed747(core.List<api.ReconcileCandidate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReconcileCandidate(o[0]);
   checkReconcileCandidate(o[1]);
@@ -121,14 +121,14 @@
   buildCounterReconcileGetWarning--;
 }
 
-buildUnnamed720() {
+buildUnnamed748() {
   var o = new core.List<api.ReconcileGetWarning>();
   o.add(buildReconcileGetWarning());
   o.add(buildReconcileGetWarning());
   return o;
 }
 
-checkUnnamed720(core.List<api.ReconcileGetWarning> o) {
+checkUnnamed748(core.List<api.ReconcileGetWarning> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReconcileGetWarning(o[0]);
   checkReconcileGetWarning(o[1]);
@@ -139,10 +139,10 @@
   var o = new api.ReconcileGet();
   buildCounterReconcileGet++;
   if (buildCounterReconcileGet < 3) {
-    o.candidate = buildUnnamed719();
+    o.candidate = buildUnnamed747();
     o.costs = buildReconcileGetCosts();
     o.match = buildReconcileCandidate();
-    o.warning = buildUnnamed720();
+    o.warning = buildUnnamed748();
   }
   buildCounterReconcileGet--;
   return o;
@@ -151,139 +151,139 @@
 checkReconcileGet(api.ReconcileGet o) {
   buildCounterReconcileGet++;
   if (buildCounterReconcileGet < 3) {
-    checkUnnamed719(o.candidate);
+    checkUnnamed747(o.candidate);
     checkReconcileGetCosts(o.costs);
     checkReconcileCandidate(o.match);
-    checkUnnamed720(o.warning);
+    checkUnnamed748(o.warning);
   }
   buildCounterReconcileGet--;
 }
 
-buildUnnamed721() {
+buildUnnamed749() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed721(core.List<core.String> o) {
+checkUnnamed749(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed722() {
+buildUnnamed750() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed722(core.List<core.String> o) {
+checkUnnamed750(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed723() {
+buildUnnamed751() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed723(core.List<core.String> o) {
+checkUnnamed751(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed724() {
+buildUnnamed752() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed724(core.List<core.String> o) {
+checkUnnamed752(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed725() {
+buildUnnamed753() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed725(core.List<core.String> o) {
+checkUnnamed753(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed726() {
+buildUnnamed754() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed726(core.List<core.String> o) {
+checkUnnamed754(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed727() {
+buildUnnamed755() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed727(core.List<core.String> o) {
+checkUnnamed755(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed728() {
+buildUnnamed756() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed728(core.List<core.String> o) {
+checkUnnamed756(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed729() {
+buildUnnamed757() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed729(core.List<core.String> o) {
+checkUnnamed757(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed730() {
+buildUnnamed758() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed730(core.List<core.String> o) {
+checkUnnamed758(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -342,18 +342,20 @@
       var mock = new common_test.HttpServerMock();
       api.FreebaseApi res = new api.FreebaseApi(mock);
       var arg_confidence = 42.0;
-      var arg_kind = buildUnnamed721();
-      var arg_lang = buildUnnamed722();
+      var arg_kind = buildUnnamed749();
+      var arg_lang = buildUnnamed750();
       var arg_limit = 42;
       var arg_name = "foo";
-      var arg_prop = buildUnnamed723();
+      var arg_prop = buildUnnamed751();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/freebase/v1/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("freebase/v1/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("reconcile"));
         pathOffset += 9;
 
@@ -401,16 +403,16 @@
       var arg_asOfTime = "foo";
       var arg_callback = "foo";
       var arg_cursor = 42;
-      var arg_domain = buildUnnamed724();
+      var arg_domain = buildUnnamed752();
       var arg_encode = "foo";
       var arg_exact = true;
-      var arg_filter = buildUnnamed725();
+      var arg_filter = buildUnnamed753();
       var arg_format = "foo";
       var arg_help = "foo";
       var arg_indent = true;
-      var arg_lang = buildUnnamed726();
+      var arg_lang = buildUnnamed754();
       var arg_limit = 42;
-      var arg_mid = buildUnnamed727();
+      var arg_mid = buildUnnamed755();
       var arg_mqlOutput = "foo";
       var arg_output = "foo";
       var arg_prefixed = true;
@@ -418,16 +420,18 @@
       var arg_scoring = "foo";
       var arg_spell = "foo";
       var arg_stemmed = true;
-      var arg_type = buildUnnamed728();
-      var arg_with_ = buildUnnamed729();
-      var arg_without = buildUnnamed730();
+      var arg_type = buildUnnamed756();
+      var arg_with_ = buildUnnamed757();
+      var arg_without = buildUnnamed758();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/freebase/v1/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("freebase/v1/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("search"));
         pathOffset += 6;
 
diff --git a/generated/googleapis/test/fusiontables/v1_test.dart b/generated/googleapis/test/fusiontables/v1_test.dart
index 7e5ca49..a4f2599 100644
--- a/generated/googleapis/test/fusiontables/v1_test.dart
+++ b/generated/googleapis/test/fusiontables/v1_test.dart
@@ -97,14 +97,14 @@
   buildCounterColumn--;
 }
 
-buildUnnamed990() {
+buildUnnamed1018() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed990(core.List<api.Column> o) {
+checkUnnamed1018(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -115,7 +115,7 @@
   var o = new api.ColumnList();
   buildCounterColumnList++;
   if (buildCounterColumnList < 3) {
-    o.items = buildUnnamed990();
+    o.items = buildUnnamed1018();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -127,7 +127,7 @@
 checkColumnList(api.ColumnList o) {
   buildCounterColumnList++;
   if (buildCounterColumnList < 3) {
-    checkUnnamed990(o.items);
+    checkUnnamed1018(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -135,14 +135,14 @@
   buildCounterColumnList--;
 }
 
-buildUnnamed991() {
+buildUnnamed1019() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed991(core.List<core.Object> o) {
+checkUnnamed1019(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) 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')); 
   var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
@@ -153,7 +153,7 @@
   var o = new api.Geometry();
   buildCounterGeometry++;
   if (buildCounterGeometry < 3) {
-    o.geometries = buildUnnamed991();
+    o.geometries = buildUnnamed1019();
     o.geometry = {'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'};
     o.type = "foo";
   }
@@ -164,7 +164,7 @@
 checkGeometry(api.Geometry o) {
   buildCounterGeometry++;
   if (buildCounterGeometry < 3) {
-    checkUnnamed991(o.geometries);
+    checkUnnamed1019(o.geometries);
     var casted3 = (o.geometry) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -192,30 +192,30 @@
   buildCounterImport--;
 }
 
-buildUnnamed992() {
+buildUnnamed1020() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed992(core.List<core.double> o) {
+checkUnnamed1020(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed993() {
+buildUnnamed1021() {
   var o = new core.List<core.List<core.double>>();
-  o.add(buildUnnamed992());
-  o.add(buildUnnamed992());
+  o.add(buildUnnamed1020());
+  o.add(buildUnnamed1020());
   return o;
 }
 
-checkUnnamed993(core.List<core.List<core.double>> o) {
+checkUnnamed1021(core.List<core.List<core.double>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed992(o[0]);
-  checkUnnamed992(o[1]);
+  checkUnnamed1020(o[0]);
+  checkUnnamed1020(o[1]);
 }
 
 core.int buildCounterLine = 0;
@@ -223,7 +223,7 @@
   var o = new api.Line();
   buildCounterLine++;
   if (buildCounterLine < 3) {
-    o.coordinates = buildUnnamed993();
+    o.coordinates = buildUnnamed1021();
     o.type = "foo";
   }
   buildCounterLine--;
@@ -233,7 +233,7 @@
 checkLine(api.Line o) {
   buildCounterLine++;
   if (buildCounterLine < 3) {
-    checkUnnamed993(o.coordinates);
+    checkUnnamed1021(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterLine--;
@@ -266,14 +266,14 @@
   buildCounterLineStyle--;
 }
 
-buildUnnamed994() {
+buildUnnamed1022() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed994(core.List<core.double> o) {
+checkUnnamed1022(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -284,7 +284,7 @@
   var o = new api.Point();
   buildCounterPoint++;
   if (buildCounterPoint < 3) {
-    o.coordinates = buildUnnamed994();
+    o.coordinates = buildUnnamed1022();
     o.type = "foo";
   }
   buildCounterPoint--;
@@ -294,7 +294,7 @@
 checkPoint(api.Point o) {
   buildCounterPoint++;
   if (buildCounterPoint < 3) {
-    checkUnnamed994(o.coordinates);
+    checkUnnamed1022(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterPoint--;
@@ -321,43 +321,43 @@
   buildCounterPointStyle--;
 }
 
-buildUnnamed995() {
+buildUnnamed1023() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed995(core.List<core.double> o) {
+checkUnnamed1023(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed996() {
+buildUnnamed1024() {
   var o = new core.List<core.List<core.double>>();
-  o.add(buildUnnamed995());
-  o.add(buildUnnamed995());
+  o.add(buildUnnamed1023());
+  o.add(buildUnnamed1023());
   return o;
 }
 
-checkUnnamed996(core.List<core.List<core.double>> o) {
+checkUnnamed1024(core.List<core.List<core.double>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed995(o[0]);
-  checkUnnamed995(o[1]);
+  checkUnnamed1023(o[0]);
+  checkUnnamed1023(o[1]);
 }
 
-buildUnnamed997() {
+buildUnnamed1025() {
   var o = new core.List<core.List<core.List<core.double>>>();
-  o.add(buildUnnamed996());
-  o.add(buildUnnamed996());
+  o.add(buildUnnamed1024());
+  o.add(buildUnnamed1024());
   return o;
 }
 
-checkUnnamed997(core.List<core.List<core.List<core.double>>> o) {
+checkUnnamed1025(core.List<core.List<core.List<core.double>>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed996(o[0]);
-  checkUnnamed996(o[1]);
+  checkUnnamed1024(o[0]);
+  checkUnnamed1024(o[1]);
 }
 
 core.int buildCounterPolygon = 0;
@@ -365,7 +365,7 @@
   var o = new api.Polygon();
   buildCounterPolygon++;
   if (buildCounterPolygon < 3) {
-    o.coordinates = buildUnnamed997();
+    o.coordinates = buildUnnamed1025();
     o.type = "foo";
   }
   buildCounterPolygon--;
@@ -375,7 +375,7 @@
 checkPolygon(api.Polygon o) {
   buildCounterPolygon++;
   if (buildCounterPolygon < 3) {
-    checkUnnamed997(o.coordinates);
+    checkUnnamed1025(o.coordinates);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterPolygon--;
@@ -414,43 +414,43 @@
   buildCounterPolygonStyle--;
 }
 
-buildUnnamed998() {
+buildUnnamed1026() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed998(core.List<core.String> o) {
+checkUnnamed1026(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed999() {
+buildUnnamed1027() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed999(core.List<core.Object> o) {
+checkUnnamed1027(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted4 = (o[0]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
   var casted5 = (o[1]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
 }
 
-buildUnnamed1000() {
+buildUnnamed1028() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed999());
-  o.add(buildUnnamed999());
+  o.add(buildUnnamed1027());
+  o.add(buildUnnamed1027());
   return o;
 }
 
-checkUnnamed1000(core.List<core.List<core.Object>> o) {
+checkUnnamed1028(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed999(o[0]);
-  checkUnnamed999(o[1]);
+  checkUnnamed1027(o[0]);
+  checkUnnamed1027(o[1]);
 }
 
 core.int buildCounterSqlresponse = 0;
@@ -458,9 +458,9 @@
   var o = new api.Sqlresponse();
   buildCounterSqlresponse++;
   if (buildCounterSqlresponse < 3) {
-    o.columns = buildUnnamed998();
+    o.columns = buildUnnamed1026();
     o.kind = "foo";
-    o.rows = buildUnnamed1000();
+    o.rows = buildUnnamed1028();
   }
   buildCounterSqlresponse--;
   return o;
@@ -469,21 +469,21 @@
 checkSqlresponse(api.Sqlresponse o) {
   buildCounterSqlresponse++;
   if (buildCounterSqlresponse < 3) {
-    checkUnnamed998(o.columns);
+    checkUnnamed1026(o.columns);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1000(o.rows);
+    checkUnnamed1028(o.rows);
   }
   buildCounterSqlresponse--;
 }
 
-buildUnnamed1001() {
+buildUnnamed1029() {
   var o = new core.List<api.Bucket>();
   o.add(buildBucket());
   o.add(buildBucket());
   return o;
 }
 
-checkUnnamed1001(core.List<api.Bucket> o) {
+checkUnnamed1029(core.List<api.Bucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucket(o[0]);
   checkBucket(o[1]);
@@ -510,14 +510,14 @@
   buildCounterStyleFunctionGradientColors--;
 }
 
-buildUnnamed1002() {
+buildUnnamed1030() {
   var o = new core.List<api.StyleFunctionGradientColors>();
   o.add(buildStyleFunctionGradientColors());
   o.add(buildStyleFunctionGradientColors());
   return o;
 }
 
-checkUnnamed1002(core.List<api.StyleFunctionGradientColors> o) {
+checkUnnamed1030(core.List<api.StyleFunctionGradientColors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStyleFunctionGradientColors(o[0]);
   checkStyleFunctionGradientColors(o[1]);
@@ -528,7 +528,7 @@
   var o = new api.StyleFunctionGradient();
   buildCounterStyleFunctionGradient++;
   if (buildCounterStyleFunctionGradient < 3) {
-    o.colors = buildUnnamed1002();
+    o.colors = buildUnnamed1030();
     o.max = 42.0;
     o.min = 42.0;
   }
@@ -539,7 +539,7 @@
 checkStyleFunctionGradient(api.StyleFunctionGradient o) {
   buildCounterStyleFunctionGradient++;
   if (buildCounterStyleFunctionGradient < 3) {
-    checkUnnamed1002(o.colors);
+    checkUnnamed1030(o.colors);
     unittest.expect(o.max, unittest.equals(42.0));
     unittest.expect(o.min, unittest.equals(42.0));
   }
@@ -551,7 +551,7 @@
   var o = new api.StyleFunction();
   buildCounterStyleFunction++;
   if (buildCounterStyleFunction < 3) {
-    o.buckets = buildUnnamed1001();
+    o.buckets = buildUnnamed1029();
     o.columnName = "foo";
     o.gradient = buildStyleFunctionGradient();
     o.kind = "foo";
@@ -563,7 +563,7 @@
 checkStyleFunction(api.StyleFunction o) {
   buildCounterStyleFunction++;
   if (buildCounterStyleFunction < 3) {
-    checkUnnamed1001(o.buckets);
+    checkUnnamed1029(o.buckets);
     unittest.expect(o.columnName, unittest.equals('foo'));
     checkStyleFunctionGradient(o.gradient);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -602,14 +602,14 @@
   buildCounterStyleSetting--;
 }
 
-buildUnnamed1003() {
+buildUnnamed1031() {
   var o = new core.List<api.StyleSetting>();
   o.add(buildStyleSetting());
   o.add(buildStyleSetting());
   return o;
 }
 
-checkUnnamed1003(core.List<api.StyleSetting> o) {
+checkUnnamed1031(core.List<api.StyleSetting> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStyleSetting(o[0]);
   checkStyleSetting(o[1]);
@@ -620,7 +620,7 @@
   var o = new api.StyleSettingList();
   buildCounterStyleSettingList++;
   if (buildCounterStyleSettingList < 3) {
-    o.items = buildUnnamed1003();
+    o.items = buildUnnamed1031();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -632,7 +632,7 @@
 checkStyleSettingList(api.StyleSettingList o) {
   buildCounterStyleSettingList++;
   if (buildCounterStyleSettingList < 3) {
-    checkUnnamed1003(o.items);
+    checkUnnamed1031(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -640,27 +640,27 @@
   buildCounterStyleSettingList--;
 }
 
-buildUnnamed1004() {
+buildUnnamed1032() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1004(core.List<core.String> o) {
+checkUnnamed1032(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1005() {
+buildUnnamed1033() {
   var o = new core.List<api.Column>();
   o.add(buildColumn());
   o.add(buildColumn());
   return o;
 }
 
-checkUnnamed1005(core.List<api.Column> o) {
+checkUnnamed1033(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkColumn(o[0]);
   checkColumn(o[1]);
@@ -673,8 +673,8 @@
   if (buildCounterTable < 3) {
     o.attribution = "foo";
     o.attributionLink = "foo";
-    o.baseTableIds = buildUnnamed1004();
-    o.columns = buildUnnamed1005();
+    o.baseTableIds = buildUnnamed1032();
+    o.columns = buildUnnamed1033();
     o.description = "foo";
     o.isExportable = true;
     o.kind = "foo";
@@ -691,8 +691,8 @@
   if (buildCounterTable < 3) {
     unittest.expect(o.attribution, unittest.equals('foo'));
     unittest.expect(o.attributionLink, unittest.equals('foo'));
-    checkUnnamed1004(o.baseTableIds);
-    checkUnnamed1005(o.columns);
+    checkUnnamed1032(o.baseTableIds);
+    checkUnnamed1033(o.columns);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.isExportable, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -703,14 +703,14 @@
   buildCounterTable--;
 }
 
-buildUnnamed1006() {
+buildUnnamed1034() {
   var o = new core.List<api.Table>();
   o.add(buildTable());
   o.add(buildTable());
   return o;
 }
 
-checkUnnamed1006(core.List<api.Table> o) {
+checkUnnamed1034(core.List<api.Table> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTable(o[0]);
   checkTable(o[1]);
@@ -721,7 +721,7 @@
   var o = new api.TableList();
   buildCounterTableList++;
   if (buildCounterTableList < 3) {
-    o.items = buildUnnamed1006();
+    o.items = buildUnnamed1034();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -732,7 +732,7 @@
 checkTableList(api.TableList o) {
   buildCounterTableList++;
   if (buildCounterTableList < 3) {
-    checkUnnamed1006(o.items);
+    checkUnnamed1034(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -766,14 +766,14 @@
   buildCounterTask--;
 }
 
-buildUnnamed1007() {
+buildUnnamed1035() {
   var o = new core.List<api.Task>();
   o.add(buildTask());
   o.add(buildTask());
   return o;
 }
 
-checkUnnamed1007(core.List<api.Task> o) {
+checkUnnamed1035(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTask(o[0]);
   checkTask(o[1]);
@@ -784,7 +784,7 @@
   var o = new api.TaskList();
   buildCounterTaskList++;
   if (buildCounterTaskList < 3) {
-    o.items = buildUnnamed1007();
+    o.items = buildUnnamed1035();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -796,7 +796,7 @@
 checkTaskList(api.TaskList o) {
   buildCounterTaskList++;
   if (buildCounterTaskList < 3) {
-    checkUnnamed1007(o.items);
+    checkUnnamed1035(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -804,14 +804,14 @@
   buildCounterTaskList--;
 }
 
-buildUnnamed1008() {
+buildUnnamed1036() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1008(core.List<core.String> o) {
+checkUnnamed1036(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -822,7 +822,7 @@
   var o = new api.Template();
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    o.automaticColumnNames = buildUnnamed1008();
+    o.automaticColumnNames = buildUnnamed1036();
     o.body = "foo";
     o.kind = "foo";
     o.name = "foo";
@@ -836,7 +836,7 @@
 checkTemplate(api.Template o) {
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    checkUnnamed1008(o.automaticColumnNames);
+    checkUnnamed1036(o.automaticColumnNames);
     unittest.expect(o.body, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -846,14 +846,14 @@
   buildCounterTemplate--;
 }
 
-buildUnnamed1009() {
+buildUnnamed1037() {
   var o = new core.List<api.Template>();
   o.add(buildTemplate());
   o.add(buildTemplate());
   return o;
 }
 
-checkUnnamed1009(core.List<api.Template> o) {
+checkUnnamed1037(core.List<api.Template> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTemplate(o[0]);
   checkTemplate(o[1]);
@@ -864,7 +864,7 @@
   var o = new api.TemplateList();
   buildCounterTemplateList++;
   if (buildCounterTemplateList < 3) {
-    o.items = buildUnnamed1009();
+    o.items = buildUnnamed1037();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -876,7 +876,7 @@
 checkTemplateList(api.TemplateList o) {
   buildCounterTemplateList++;
   if (buildCounterTemplateList < 3) {
-    checkUnnamed1009(o.items);
+    checkUnnamed1037(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -1114,8 +1114,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/columns/", pathOffset);
@@ -1167,8 +1169,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/columns/", pathOffset);
@@ -1225,8 +1229,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/columns", pathOffset);
@@ -1278,8 +1284,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/columns", pathOffset);
@@ -1336,8 +1344,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/columns/", pathOffset);
@@ -1395,8 +1405,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/columns/", pathOffset);
@@ -1457,8 +1469,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("query"));
         pathOffset += 5;
 
@@ -1508,8 +1522,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("query"));
         pathOffset += 5;
 
@@ -1560,8 +1576,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/styles/", pathOffset);
@@ -1613,8 +1631,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/styles/", pathOffset);
@@ -1671,8 +1691,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/styles", pathOffset);
@@ -1724,8 +1746,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/styles", pathOffset);
@@ -1782,8 +1806,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/styles/", pathOffset);
@@ -1841,8 +1867,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/styles/", pathOffset);
@@ -1900,8 +1928,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/copy", pathOffset);
@@ -1952,8 +1982,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1997,8 +2029,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2051,8 +2085,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/import", pathOffset);
@@ -2111,8 +2147,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("tables/import"));
         pathOffset += 13;
 
@@ -2161,8 +2199,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("tables"));
         pathOffset += 6;
 
@@ -2206,8 +2246,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("tables"));
         pathOffset += 6;
 
@@ -2257,8 +2299,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2310,8 +2354,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2363,8 +2409,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/tasks/", pathOffset);
@@ -2416,8 +2464,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/tasks/", pathOffset);
@@ -2473,8 +2523,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/tasks", pathOffset);
@@ -2532,8 +2584,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/templates/", pathOffset);
@@ -2585,8 +2639,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/templates/", pathOffset);
@@ -2643,8 +2699,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/templates", pathOffset);
@@ -2696,8 +2754,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/templates", pathOffset);
@@ -2754,8 +2814,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/templates/", pathOffset);
@@ -2813,8 +2875,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/fusiontables/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("fusiontables/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/templates/", pathOffset);
diff --git a/generated/googleapis/test/games/v1_test.dart b/generated/googleapis/test/games/v1_test.dart
index 3006c71..ab68f90 100644
--- a/generated/googleapis/test/games/v1_test.dart
+++ b/generated/googleapis/test/games/v1_test.dart
@@ -4102,8 +4102,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("achievements"));
         pathOffset += 12;
 
@@ -4155,8 +4157,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("achievements/"));
         pathOffset += 13;
         index = path.indexOf("/increment", pathOffset);
@@ -4212,8 +4216,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("players/"));
         pathOffset += 8;
         index = path.indexOf("/achievements", pathOffset);
@@ -4267,8 +4273,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("achievements/"));
         pathOffset += 13;
         index = path.indexOf("/reveal", pathOffset);
@@ -4319,8 +4327,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("achievements/"));
         pathOffset += 13;
         index = path.indexOf("/setStepsAtLeast", pathOffset);
@@ -4371,8 +4381,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("achievements/"));
         pathOffset += 13;
         index = path.indexOf("/unlock", pathOffset);
@@ -4425,8 +4437,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 27), unittest.equals("achievements/updateMultiple"));
         pathOffset += 27;
 
@@ -4475,8 +4489,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("applications/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -4523,8 +4539,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("applications/played"));
         pathOffset += 19;
 
@@ -4571,8 +4589,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("events"));
         pathOffset += 6;
 
@@ -4620,8 +4640,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("eventDefinitions"));
         pathOffset += 16;
 
@@ -4671,8 +4693,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("events"));
         pathOffset += 6;
 
@@ -4721,8 +4745,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("leaderboards/"));
         pathOffset += 13;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -4771,8 +4797,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("leaderboards"));
         pathOffset += 12;
 
@@ -4821,8 +4849,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("metagameConfig"));
         pathOffset += 14;
 
@@ -4869,8 +4899,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("players/"));
         pathOffset += 8;
         index = path.indexOf("/categories/", pathOffset);
@@ -4931,8 +4963,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("players/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -4982,8 +5016,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("players/me/players/"));
         pathOffset += 19;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -5039,8 +5075,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("pushtokens/remove"));
         pathOffset += 17;
 
@@ -5084,8 +5122,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("pushtokens"));
         pathOffset += 10;
 
@@ -5132,8 +5172,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("quests/"));
         pathOffset += 7;
         index = path.indexOf("/milestones/", pathOffset);
@@ -5194,8 +5236,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("quests/"));
         pathOffset += 7;
         index = path.indexOf("/accept", pathOffset);
@@ -5249,8 +5293,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("players/"));
         pathOffset += 8;
         index = path.indexOf("/quests", pathOffset);
@@ -5307,8 +5353,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("revisions/check"));
         pathOffset += 15;
 
@@ -5360,8 +5408,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("rooms/create"));
         pathOffset += 12;
 
@@ -5406,8 +5456,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("rooms/"));
         pathOffset += 6;
         index = path.indexOf("/decline", pathOffset);
@@ -5458,8 +5510,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("rooms/"));
         pathOffset += 6;
         index = path.indexOf("/dismiss", pathOffset);
@@ -5508,8 +5562,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("rooms/"));
         pathOffset += 6;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -5561,8 +5617,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("rooms/"));
         pathOffset += 6;
         index = path.indexOf("/join", pathOffset);
@@ -5618,8 +5676,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("rooms/"));
         pathOffset += 6;
         index = path.indexOf("/leave", pathOffset);
@@ -5672,8 +5732,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("rooms"));
         pathOffset += 5;
 
@@ -5724,8 +5786,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("rooms/"));
         pathOffset += 6;
         index = path.indexOf("/reportstatus", pathOffset);
@@ -5786,8 +5850,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("players/"));
         pathOffset += 8;
         index = path.indexOf("/leaderboards/", pathOffset);
@@ -5856,8 +5922,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("leaderboards/"));
         pathOffset += 13;
         index = path.indexOf("/scores/", pathOffset);
@@ -5921,8 +5989,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("leaderboards/"));
         pathOffset += 13;
         index = path.indexOf("/window/", pathOffset);
@@ -5984,8 +6054,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("leaderboards/"));
         pathOffset += 13;
         index = path.indexOf("/scores", pathOffset);
@@ -6042,8 +6114,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("leaderboards/scores"));
         pathOffset += 19;
 
@@ -6092,8 +6166,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("snapshots/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -6143,8 +6219,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("players/"));
         pathOffset += 8;
         index = path.indexOf("/snapshots", pathOffset);
@@ -6201,8 +6279,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("turnbasedmatches/"));
         pathOffset += 17;
         index = path.indexOf("/cancel", pathOffset);
@@ -6254,8 +6334,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("turnbasedmatches/create"));
         pathOffset += 23;
 
@@ -6300,8 +6382,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("turnbasedmatches/"));
         pathOffset += 17;
         index = path.indexOf("/decline", pathOffset);
@@ -6352,8 +6436,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("turnbasedmatches/"));
         pathOffset += 17;
         index = path.indexOf("/dismiss", pathOffset);
@@ -6406,8 +6492,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("turnbasedmatches/"));
         pathOffset += 17;
         index = path.indexOf("/finish", pathOffset);
@@ -6460,8 +6548,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("turnbasedmatches/"));
         pathOffset += 17;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -6510,8 +6600,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("turnbasedmatches/"));
         pathOffset += 17;
         index = path.indexOf("/join", pathOffset);
@@ -6563,8 +6655,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("turnbasedmatches/"));
         pathOffset += 17;
         index = path.indexOf("/leave", pathOffset);
@@ -6618,8 +6712,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("turnbasedmatches/"));
         pathOffset += 17;
         index = path.indexOf("/leaveTurn", pathOffset);
@@ -6676,8 +6772,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("turnbasedmatches"));
         pathOffset += 16;
 
@@ -6727,8 +6825,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("turnbasedmatches/"));
         pathOffset += 17;
         index = path.indexOf("/rematch", pathOffset);
@@ -6784,8 +6884,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("turnbasedmatches/sync"));
         pathOffset += 21;
 
@@ -6838,8 +6940,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/games/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("games/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("turnbasedmatches/"));
         pathOffset += 17;
         index = path.indexOf("/turn", pathOffset);
diff --git a/generated/googleapis/test/gamesmanagement/v1management_test.dart b/generated/googleapis/test/gamesmanagement/v1management_test.dart
index b08a711..c137213 100644
--- a/generated/googleapis/test/gamesmanagement/v1management_test.dart
+++ b/generated/googleapis/test/gamesmanagement/v1management_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed431() {
+buildUnnamed456() {
   var o = new core.List<api.AchievementResetResponse>();
   o.add(buildAchievementResetResponse());
   o.add(buildAchievementResetResponse());
   return o;
 }
 
-checkUnnamed431(core.List<api.AchievementResetResponse> o) {
+checkUnnamed456(core.List<api.AchievementResetResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAchievementResetResponse(o[0]);
   checkAchievementResetResponse(o[1]);
@@ -35,7 +35,7 @@
   buildCounterAchievementResetAllResponse++;
   if (buildCounterAchievementResetAllResponse < 3) {
     o.kind = "foo";
-    o.results = buildUnnamed431();
+    o.results = buildUnnamed456();
   }
   buildCounterAchievementResetAllResponse--;
   return o;
@@ -45,7 +45,7 @@
   buildCounterAchievementResetAllResponse++;
   if (buildCounterAchievementResetAllResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed431(o.results);
+    checkUnnamed456(o.results);
   }
   buildCounterAchievementResetAllResponse--;
 }
@@ -167,14 +167,14 @@
   buildCounterHiddenPlayer--;
 }
 
-buildUnnamed432() {
+buildUnnamed457() {
   var o = new core.List<api.HiddenPlayer>();
   o.add(buildHiddenPlayer());
   o.add(buildHiddenPlayer());
   return o;
 }
 
-checkUnnamed432(core.List<api.HiddenPlayer> o) {
+checkUnnamed457(core.List<api.HiddenPlayer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHiddenPlayer(o[0]);
   checkHiddenPlayer(o[1]);
@@ -185,7 +185,7 @@
   var o = new api.HiddenPlayerList();
   buildCounterHiddenPlayerList++;
   if (buildCounterHiddenPlayerList < 3) {
-    o.items = buildUnnamed432();
+    o.items = buildUnnamed457();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -196,7 +196,7 @@
 checkHiddenPlayerList(api.HiddenPlayerList o) {
   buildCounterHiddenPlayerList++;
   if (buildCounterHiddenPlayerList < 3) {
-    checkUnnamed432(o.items);
+    checkUnnamed457(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -257,14 +257,14 @@
   buildCounterPlayer--;
 }
 
-buildUnnamed433() {
+buildUnnamed458() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed433(core.List<core.String> o) {
+checkUnnamed458(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -276,7 +276,7 @@
   buildCounterPlayerScoreResetResponse++;
   if (buildCounterPlayerScoreResetResponse < 3) {
     o.kind = "foo";
-    o.resetScoreTimeSpans = buildUnnamed433();
+    o.resetScoreTimeSpans = buildUnnamed458();
   }
   buildCounterPlayerScoreResetResponse--;
   return o;
@@ -286,7 +286,7 @@
   buildCounterPlayerScoreResetResponse++;
   if (buildCounterPlayerScoreResetResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed433(o.resetScoreTimeSpans);
+    checkUnnamed458(o.resetScoreTimeSpans);
   }
   buildCounterPlayerScoreResetResponse--;
 }
@@ -394,8 +394,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/games/v1management/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("achievements/"));
         pathOffset += 13;
         index = path.indexOf("/reset", pathOffset);
@@ -444,8 +446,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/games/v1management/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("achievements/reset"));
         pathOffset += 18;
 
@@ -488,8 +492,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/games/v1management/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("achievements/"));
         pathOffset += 13;
         index = path.indexOf("/resetForAllPlayers", pathOffset);
@@ -543,8 +549,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/games/v1management/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("applications/"));
         pathOffset += 13;
         index = path.indexOf("/players/hidden", pathOffset);
@@ -600,8 +608,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/games/v1management/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("events/"));
         pathOffset += 7;
         index = path.indexOf("/reset", pathOffset);
@@ -648,8 +658,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/games/v1management/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("events/reset"));
         pathOffset += 12;
 
@@ -690,8 +702,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/games/v1management/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("events/"));
         pathOffset += 7;
         index = path.indexOf("/resetForAllPlayers", pathOffset);
@@ -744,8 +758,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/games/v1management/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("applications/"));
         pathOffset += 13;
         index = path.indexOf("/players/hidden/", pathOffset);
@@ -797,8 +813,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/games/v1management/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("applications/"));
         pathOffset += 13;
         index = path.indexOf("/players/hidden/", pathOffset);
@@ -853,8 +871,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/games/v1management/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("quests/"));
         pathOffset += 7;
         index = path.indexOf("/reset", pathOffset);
@@ -905,8 +925,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/games/v1management/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("rooms/reset"));
         pathOffset += 11;
 
@@ -951,8 +973,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/games/v1management/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("leaderboards/"));
         pathOffset += 13;
         index = path.indexOf("/scores/reset", pathOffset);
@@ -1002,8 +1026,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/games/v1management/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("leaderboards/"));
         pathOffset += 13;
         index = path.indexOf("/scores/resetForAllPlayers", pathOffset);
@@ -1054,8 +1080,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/games/v1management/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("games/v1management/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("turnbasedmatches/reset"));
         pathOffset += 22;
 
diff --git a/generated/googleapis/test/gmail/v1_test.dart b/generated/googleapis/test/gmail/v1_test.dart
index fccf903..b90e3f0 100644
--- a/generated/googleapis/test/gmail/v1_test.dart
+++ b/generated/googleapis/test/gmail/v1_test.dart
@@ -37,14 +37,14 @@
   buildCounterDraft--;
 }
 
-buildUnnamed187() {
+buildUnnamed190() {
   var o = new core.List<api.Message>();
   o.add(buildMessage());
   o.add(buildMessage());
   return o;
 }
 
-checkUnnamed187(core.List<api.Message> o) {
+checkUnnamed190(core.List<api.Message> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessage(o[0]);
   checkMessage(o[1]);
@@ -56,7 +56,7 @@
   buildCounterHistory++;
   if (buildCounterHistory < 3) {
     o.id = "foo";
-    o.messages = buildUnnamed187();
+    o.messages = buildUnnamed190();
   }
   buildCounterHistory--;
   return o;
@@ -66,7 +66,7 @@
   buildCounterHistory++;
   if (buildCounterHistory < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed187(o.messages);
+    checkUnnamed190(o.messages);
   }
   buildCounterHistory--;
 }
@@ -98,14 +98,14 @@
   buildCounterLabel--;
 }
 
-buildUnnamed188() {
+buildUnnamed191() {
   var o = new core.List<api.Draft>();
   o.add(buildDraft());
   o.add(buildDraft());
   return o;
 }
 
-checkUnnamed188(core.List<api.Draft> o) {
+checkUnnamed191(core.List<api.Draft> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDraft(o[0]);
   checkDraft(o[1]);
@@ -116,7 +116,7 @@
   var o = new api.ListDraftsResponse();
   buildCounterListDraftsResponse++;
   if (buildCounterListDraftsResponse < 3) {
-    o.drafts = buildUnnamed188();
+    o.drafts = buildUnnamed191();
     o.nextPageToken = "foo";
     o.resultSizeEstimate = 42;
   }
@@ -127,21 +127,21 @@
 checkListDraftsResponse(api.ListDraftsResponse o) {
   buildCounterListDraftsResponse++;
   if (buildCounterListDraftsResponse < 3) {
-    checkUnnamed188(o.drafts);
+    checkUnnamed191(o.drafts);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.resultSizeEstimate, unittest.equals(42));
   }
   buildCounterListDraftsResponse--;
 }
 
-buildUnnamed189() {
+buildUnnamed192() {
   var o = new core.List<api.History>();
   o.add(buildHistory());
   o.add(buildHistory());
   return o;
 }
 
-checkUnnamed189(core.List<api.History> o) {
+checkUnnamed192(core.List<api.History> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHistory(o[0]);
   checkHistory(o[1]);
@@ -152,7 +152,7 @@
   var o = new api.ListHistoryResponse();
   buildCounterListHistoryResponse++;
   if (buildCounterListHistoryResponse < 3) {
-    o.history = buildUnnamed189();
+    o.history = buildUnnamed192();
     o.historyId = "foo";
     o.nextPageToken = "foo";
   }
@@ -163,21 +163,21 @@
 checkListHistoryResponse(api.ListHistoryResponse o) {
   buildCounterListHistoryResponse++;
   if (buildCounterListHistoryResponse < 3) {
-    checkUnnamed189(o.history);
+    checkUnnamed192(o.history);
     unittest.expect(o.historyId, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListHistoryResponse--;
 }
 
-buildUnnamed190() {
+buildUnnamed193() {
   var o = new core.List<api.Label>();
   o.add(buildLabel());
   o.add(buildLabel());
   return o;
 }
 
-checkUnnamed190(core.List<api.Label> o) {
+checkUnnamed193(core.List<api.Label> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabel(o[0]);
   checkLabel(o[1]);
@@ -188,7 +188,7 @@
   var o = new api.ListLabelsResponse();
   buildCounterListLabelsResponse++;
   if (buildCounterListLabelsResponse < 3) {
-    o.labels = buildUnnamed190();
+    o.labels = buildUnnamed193();
   }
   buildCounterListLabelsResponse--;
   return o;
@@ -197,19 +197,19 @@
 checkListLabelsResponse(api.ListLabelsResponse o) {
   buildCounterListLabelsResponse++;
   if (buildCounterListLabelsResponse < 3) {
-    checkUnnamed190(o.labels);
+    checkUnnamed193(o.labels);
   }
   buildCounterListLabelsResponse--;
 }
 
-buildUnnamed191() {
+buildUnnamed194() {
   var o = new core.List<api.Message>();
   o.add(buildMessage());
   o.add(buildMessage());
   return o;
 }
 
-checkUnnamed191(core.List<api.Message> o) {
+checkUnnamed194(core.List<api.Message> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessage(o[0]);
   checkMessage(o[1]);
@@ -220,7 +220,7 @@
   var o = new api.ListMessagesResponse();
   buildCounterListMessagesResponse++;
   if (buildCounterListMessagesResponse < 3) {
-    o.messages = buildUnnamed191();
+    o.messages = buildUnnamed194();
     o.nextPageToken = "foo";
     o.resultSizeEstimate = 42;
   }
@@ -231,21 +231,21 @@
 checkListMessagesResponse(api.ListMessagesResponse o) {
   buildCounterListMessagesResponse++;
   if (buildCounterListMessagesResponse < 3) {
-    checkUnnamed191(o.messages);
+    checkUnnamed194(o.messages);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.resultSizeEstimate, unittest.equals(42));
   }
   buildCounterListMessagesResponse--;
 }
 
-buildUnnamed192() {
+buildUnnamed195() {
   var o = new core.List<api.Thread>();
   o.add(buildThread());
   o.add(buildThread());
   return o;
 }
 
-checkUnnamed192(core.List<api.Thread> o) {
+checkUnnamed195(core.List<api.Thread> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThread(o[0]);
   checkThread(o[1]);
@@ -258,7 +258,7 @@
   if (buildCounterListThreadsResponse < 3) {
     o.nextPageToken = "foo";
     o.resultSizeEstimate = 42;
-    o.threads = buildUnnamed192();
+    o.threads = buildUnnamed195();
   }
   buildCounterListThreadsResponse--;
   return o;
@@ -269,19 +269,19 @@
   if (buildCounterListThreadsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.resultSizeEstimate, unittest.equals(42));
-    checkUnnamed192(o.threads);
+    checkUnnamed195(o.threads);
   }
   buildCounterListThreadsResponse--;
 }
 
-buildUnnamed193() {
+buildUnnamed196() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed193(core.List<core.String> o) {
+checkUnnamed196(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -294,7 +294,7 @@
   if (buildCounterMessage < 3) {
     o.historyId = "foo";
     o.id = "foo";
-    o.labelIds = buildUnnamed193();
+    o.labelIds = buildUnnamed196();
     o.payload = buildMessagePart();
     o.raw = "foo";
     o.sizeEstimate = 42;
@@ -310,7 +310,7 @@
   if (buildCounterMessage < 3) {
     unittest.expect(o.historyId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed193(o.labelIds);
+    checkUnnamed196(o.labelIds);
     checkMessagePart(o.payload);
     unittest.expect(o.raw, unittest.equals('foo'));
     unittest.expect(o.sizeEstimate, unittest.equals(42));
@@ -320,27 +320,27 @@
   buildCounterMessage--;
 }
 
-buildUnnamed194() {
+buildUnnamed197() {
   var o = new core.List<api.MessagePartHeader>();
   o.add(buildMessagePartHeader());
   o.add(buildMessagePartHeader());
   return o;
 }
 
-checkUnnamed194(core.List<api.MessagePartHeader> o) {
+checkUnnamed197(core.List<api.MessagePartHeader> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessagePartHeader(o[0]);
   checkMessagePartHeader(o[1]);
 }
 
-buildUnnamed195() {
+buildUnnamed198() {
   var o = new core.List<api.MessagePart>();
   o.add(buildMessagePart());
   o.add(buildMessagePart());
   return o;
 }
 
-checkUnnamed195(core.List<api.MessagePart> o) {
+checkUnnamed198(core.List<api.MessagePart> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMessagePart(o[0]);
   checkMessagePart(o[1]);
@@ -353,10 +353,10 @@
   if (buildCounterMessagePart < 3) {
     o.body = buildMessagePartBody();
     o.filename = "foo";
-    o.headers = buildUnnamed194();
+    o.headers = buildUnnamed197();
     o.mimeType = "foo";
     o.partId = "foo";
-    o.parts = buildUnnamed195();
+    o.parts = buildUnnamed198();
   }
   buildCounterMessagePart--;
   return o;
@@ -367,10 +367,10 @@
   if (buildCounterMessagePart < 3) {
     checkMessagePartBody(o.body);
     unittest.expect(o.filename, unittest.equals('foo'));
-    checkUnnamed194(o.headers);
+    checkUnnamed197(o.headers);
     unittest.expect(o.mimeType, unittest.equals('foo'));
     unittest.expect(o.partId, unittest.equals('foo'));
-    checkUnnamed195(o.parts);
+    checkUnnamed198(o.parts);
   }
   buildCounterMessagePart--;
 }
@@ -419,66 +419,6 @@
   buildCounterMessagePartHeader--;
 }
 
-buildUnnamed196() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed196(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-buildUnnamed197() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed197(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
-core.int buildCounterModifyMessageRequest = 0;
-buildModifyMessageRequest() {
-  var o = new api.ModifyMessageRequest();
-  buildCounterModifyMessageRequest++;
-  if (buildCounterModifyMessageRequest < 3) {
-    o.addLabelIds = buildUnnamed196();
-    o.removeLabelIds = buildUnnamed197();
-  }
-  buildCounterModifyMessageRequest--;
-  return o;
-}
-
-checkModifyMessageRequest(api.ModifyMessageRequest o) {
-  buildCounterModifyMessageRequest++;
-  if (buildCounterModifyMessageRequest < 3) {
-    checkUnnamed196(o.addLabelIds);
-    checkUnnamed197(o.removeLabelIds);
-  }
-  buildCounterModifyMessageRequest--;
-}
-
-buildUnnamed198() {
-  var o = new core.List<core.String>();
-  o.add("foo");
-  o.add("foo");
-  return o;
-}
-
-checkUnnamed198(core.List<core.String> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  unittest.expect(o[0], unittest.equals('foo'));
-  unittest.expect(o[1], unittest.equals('foo'));
-}
-
 buildUnnamed199() {
   var o = new core.List<core.String>();
   o.add("foo");
@@ -492,63 +432,38 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterModifyThreadRequest = 0;
-buildModifyThreadRequest() {
-  var o = new api.ModifyThreadRequest();
-  buildCounterModifyThreadRequest++;
-  if (buildCounterModifyThreadRequest < 3) {
-    o.addLabelIds = buildUnnamed198();
-    o.removeLabelIds = buildUnnamed199();
-  }
-  buildCounterModifyThreadRequest--;
-  return o;
-}
-
-checkModifyThreadRequest(api.ModifyThreadRequest o) {
-  buildCounterModifyThreadRequest++;
-  if (buildCounterModifyThreadRequest < 3) {
-    checkUnnamed198(o.addLabelIds);
-    checkUnnamed199(o.removeLabelIds);
-  }
-  buildCounterModifyThreadRequest--;
-}
-
 buildUnnamed200() {
-  var o = new core.List<api.Message>();
-  o.add(buildMessage());
-  o.add(buildMessage());
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
   return o;
 }
 
-checkUnnamed200(core.List<api.Message> o) {
+checkUnnamed200(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMessage(o[0]);
-  checkMessage(o[1]);
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterThread = 0;
-buildThread() {
-  var o = new api.Thread();
-  buildCounterThread++;
-  if (buildCounterThread < 3) {
-    o.historyId = "foo";
-    o.id = "foo";
-    o.messages = buildUnnamed200();
-    o.snippet = "foo";
+core.int buildCounterModifyMessageRequest = 0;
+buildModifyMessageRequest() {
+  var o = new api.ModifyMessageRequest();
+  buildCounterModifyMessageRequest++;
+  if (buildCounterModifyMessageRequest < 3) {
+    o.addLabelIds = buildUnnamed199();
+    o.removeLabelIds = buildUnnamed200();
   }
-  buildCounterThread--;
+  buildCounterModifyMessageRequest--;
   return o;
 }
 
-checkThread(api.Thread o) {
-  buildCounterThread++;
-  if (buildCounterThread < 3) {
-    unittest.expect(o.historyId, unittest.equals('foo'));
-    unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed200(o.messages);
-    unittest.expect(o.snippet, unittest.equals('foo'));
+checkModifyMessageRequest(api.ModifyMessageRequest o) {
+  buildCounterModifyMessageRequest++;
+  if (buildCounterModifyMessageRequest < 3) {
+    checkUnnamed199(o.addLabelIds);
+    checkUnnamed200(o.removeLabelIds);
   }
-  buildCounterThread--;
+  buildCounterModifyMessageRequest--;
 }
 
 buildUnnamed201() {
@@ -577,14 +492,99 @@
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
+core.int buildCounterModifyThreadRequest = 0;
+buildModifyThreadRequest() {
+  var o = new api.ModifyThreadRequest();
+  buildCounterModifyThreadRequest++;
+  if (buildCounterModifyThreadRequest < 3) {
+    o.addLabelIds = buildUnnamed201();
+    o.removeLabelIds = buildUnnamed202();
+  }
+  buildCounterModifyThreadRequest--;
+  return o;
+}
+
+checkModifyThreadRequest(api.ModifyThreadRequest o) {
+  buildCounterModifyThreadRequest++;
+  if (buildCounterModifyThreadRequest < 3) {
+    checkUnnamed201(o.addLabelIds);
+    checkUnnamed202(o.removeLabelIds);
+  }
+  buildCounterModifyThreadRequest--;
+}
+
 buildUnnamed203() {
+  var o = new core.List<api.Message>();
+  o.add(buildMessage());
+  o.add(buildMessage());
+  return o;
+}
+
+checkUnnamed203(core.List<api.Message> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkMessage(o[0]);
+  checkMessage(o[1]);
+}
+
+core.int buildCounterThread = 0;
+buildThread() {
+  var o = new api.Thread();
+  buildCounterThread++;
+  if (buildCounterThread < 3) {
+    o.historyId = "foo";
+    o.id = "foo";
+    o.messages = buildUnnamed203();
+    o.snippet = "foo";
+  }
+  buildCounterThread--;
+  return o;
+}
+
+checkThread(api.Thread o) {
+  buildCounterThread++;
+  if (buildCounterThread < 3) {
+    unittest.expect(o.historyId, unittest.equals('foo'));
+    unittest.expect(o.id, unittest.equals('foo'));
+    checkUnnamed203(o.messages);
+    unittest.expect(o.snippet, unittest.equals('foo'));
+  }
+  buildCounterThread--;
+}
+
+buildUnnamed204() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed203(core.List<core.String> o) {
+checkUnnamed204(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed205() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed205(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed206() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed206(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -744,15 +744,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/drafts", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/drafts"));
-        pathOffset += 7;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -794,18 +787,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/drafts/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/drafts/"));
-        pathOffset += 8;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -846,18 +829,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/drafts/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/drafts/"));
-        pathOffset += 8;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -901,15 +874,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/drafts", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/drafts"));
-        pathOffset += 7;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -958,15 +924,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/drafts/send", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/drafts/send"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1014,18 +973,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/drafts/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/drafts/"));
-        pathOffset += 8;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1074,15 +1023,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/history", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/history"));
-        pathOffset += 8;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1135,15 +1077,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/labels", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/labels"));
-        pathOffset += 7;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1185,18 +1120,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/labels/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/labels/"));
-        pathOffset += 8;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1236,18 +1161,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/labels/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/labels/"));
-        pathOffset += 8;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1288,15 +1203,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/labels", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/labels"));
-        pathOffset += 7;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1342,18 +1250,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/labels/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/labels/"));
-        pathOffset += 8;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1399,18 +1297,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/labels/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/labels/"));
-        pathOffset += 8;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1456,18 +1344,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/messages/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/messages/"));
-        pathOffset += 10;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1503,24 +1381,14 @@
       var arg_userId = "foo";
       var arg_id = "foo";
       var arg_format = "foo";
-      var arg_metadataHeaders = buildUnnamed201();
+      var arg_metadataHeaders = buildUnnamed204();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/messages/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/messages/"));
-        pathOffset += 10;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1570,15 +1438,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/messages/import", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/messages/import"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1627,15 +1488,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/messages", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/messages"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1673,7 +1527,7 @@
       api.UsersMessagesResourceApi res = new api.GmailApi(mock).users.messages;
       var arg_userId = "foo";
       var arg_includeSpamTrash = true;
-      var arg_labelIds = buildUnnamed202();
+      var arg_labelIds = buildUnnamed205();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_q = "foo";
@@ -1682,15 +1536,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/messages", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/messages"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1741,22 +1588,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/messages/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/messages/"));
-        pathOffset += 10;
-        index = path.indexOf("/modify", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/modify"));
-        pathOffset += 7;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1803,15 +1636,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/messages/send", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/messages/send"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1853,22 +1679,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/messages/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/messages/"));
-        pathOffset += 10;
-        index = path.indexOf("/trash", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/trash"));
-        pathOffset += 6;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1910,22 +1722,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/messages/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/messages/"));
-        pathOffset += 10;
-        index = path.indexOf("/untrash", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/untrash"));
-        pathOffset += 8;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1972,25 +1770,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/messages/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/messages/"));
-        pathOffset += 10;
-        index = path.indexOf("/attachments/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_messageId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/attachments/"));
-        pathOffset += 13;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2036,18 +1817,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/threads/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/threads/"));
-        pathOffset += 9;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2087,18 +1858,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/threads/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/threads/"));
-        pathOffset += 9;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2135,7 +1896,7 @@
       api.UsersThreadsResourceApi res = new api.GmailApi(mock).users.threads;
       var arg_userId = "foo";
       var arg_includeSpamTrash = true;
-      var arg_labelIds = buildUnnamed203();
+      var arg_labelIds = buildUnnamed206();
       var arg_maxResults = 42;
       var arg_pageToken = "foo";
       var arg_q = "foo";
@@ -2144,15 +1905,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/threads", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/threads"));
-        pathOffset += 8;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2203,22 +1957,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/threads/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/threads/"));
-        pathOffset += 9;
-        index = path.indexOf("/modify", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/modify"));
-        pathOffset += 7;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2260,22 +2000,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/threads/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/threads/"));
-        pathOffset += 9;
-        index = path.indexOf("/trash", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/trash"));
-        pathOffset += 6;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2317,22 +2043,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/gmail/v1/users/"));
-        pathOffset += 16;
-        index = path.indexOf("/threads/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/threads/"));
-        pathOffset += 9;
-        index = path.indexOf("/untrash", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/untrash"));
-        pathOffset += 8;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
diff --git a/generated/googleapis/test/groupsmigration/v1_test.dart b/generated/googleapis/test/groupsmigration/v1_test.dart
index e8669c8..bcf6d73 100644
--- a/generated/googleapis/test/groupsmigration/v1_test.dart
+++ b/generated/googleapis/test/groupsmigration/v1_test.dart
@@ -61,15 +61,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/groups/v1/groups/"));
-        pathOffset += 18;
-        index = path.indexOf("/archive", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_groupId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/archive"));
-        pathOffset += 8;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
diff --git a/generated/googleapis/test/groupssettings/v1_test.dart b/generated/googleapis/test/groupssettings/v1_test.dart
index b01f3b4..69bfd14 100644
--- a/generated/googleapis/test/groupssettings/v1_test.dart
+++ b/generated/googleapis/test/groupssettings/v1_test.dart
@@ -111,11 +111,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/groups/v1/groups/"));
-        pathOffset += 18;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_groupUniqueId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -160,11 +157,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/groups/v1/groups/"));
-        pathOffset += 18;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_groupUniqueId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -209,11 +203,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/groups/v1/groups/"));
-        pathOffset += 18;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_groupUniqueId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
diff --git a/generated/googleapis/test/identitytoolkit/v3_test.dart b/generated/googleapis/test/identitytoolkit/v3_test.dart
index 77b3420..bede624 100644
--- a/generated/googleapis/test/identitytoolkit/v3_test.dart
+++ b/generated/googleapis/test/identitytoolkit/v3_test.dart
@@ -22,6 +22,7 @@
   buildCounterCreateAuthUriResponse++;
   if (buildCounterCreateAuthUriResponse < 3) {
     o.authUri = "foo";
+    o.captchaRequired = true;
     o.forExistingProvider = true;
     o.kind = "foo";
     o.providerId = "foo";
@@ -35,6 +36,7 @@
   buildCounterCreateAuthUriResponse++;
   if (buildCounterCreateAuthUriResponse < 3) {
     unittest.expect(o.authUri, unittest.equals('foo'));
+    unittest.expect(o.captchaRequired, unittest.isTrue);
     unittest.expect(o.forExistingProvider, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.providerId, unittest.equals('foo'));
@@ -62,14 +64,14 @@
   buildCounterDeleteAccountResponse--;
 }
 
-buildUnnamed933() {
+buildUnnamed961() {
   var o = new core.List<api.UserInfo>();
   o.add(buildUserInfo());
   o.add(buildUserInfo());
   return o;
 }
 
-checkUnnamed933(core.List<api.UserInfo> o) {
+checkUnnamed961(core.List<api.UserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfo(o[0]);
   checkUserInfo(o[1]);
@@ -82,7 +84,7 @@
   if (buildCounterDownloadAccountResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.users = buildUnnamed933();
+    o.users = buildUnnamed961();
   }
   buildCounterDownloadAccountResponse--;
   return o;
@@ -93,19 +95,19 @@
   if (buildCounterDownloadAccountResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed933(o.users);
+    checkUnnamed961(o.users);
   }
   buildCounterDownloadAccountResponse--;
 }
 
-buildUnnamed934() {
+buildUnnamed962() {
   var o = new core.List<api.UserInfo>();
   o.add(buildUserInfo());
   o.add(buildUserInfo());
   return o;
 }
 
-checkUnnamed934(core.List<api.UserInfo> o) {
+checkUnnamed962(core.List<api.UserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfo(o[0]);
   checkUserInfo(o[1]);
@@ -117,7 +119,7 @@
   buildCounterGetAccountInfoResponse++;
   if (buildCounterGetAccountInfoResponse < 3) {
     o.kind = "foo";
-    o.users = buildUnnamed934();
+    o.users = buildUnnamed962();
   }
   buildCounterGetAccountInfoResponse--;
   return o;
@@ -127,7 +129,7 @@
   buildCounterGetAccountInfoResponse++;
   if (buildCounterGetAccountInfoResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed934(o.users);
+    checkUnnamed962(o.users);
   }
   buildCounterGetAccountInfoResponse--;
 }
@@ -226,27 +228,27 @@
   buildCounterIdentitytoolkitRelyingpartyDownloadAccountRequest--;
 }
 
-buildUnnamed935() {
+buildUnnamed963() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed935(core.List<core.String> o) {
+checkUnnamed963(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed936() {
+buildUnnamed964() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed936(core.List<core.String> o) {
+checkUnnamed964(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -257,9 +259,9 @@
   var o = new api.IdentitytoolkitRelyingpartyGetAccountInfoRequest();
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest++;
   if (buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest < 3) {
-    o.email = buildUnnamed935();
+    o.email = buildUnnamed963();
     o.idToken = "foo";
-    o.localId = buildUnnamed936();
+    o.localId = buildUnnamed964();
   }
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest--;
   return o;
@@ -268,9 +270,9 @@
 checkIdentitytoolkitRelyingpartyGetAccountInfoRequest(api.IdentitytoolkitRelyingpartyGetAccountInfoRequest o) {
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest++;
   if (buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest < 3) {
-    checkUnnamed935(o.email);
+    checkUnnamed963(o.email);
     unittest.expect(o.idToken, unittest.equals('foo'));
-    checkUnnamed936(o.localId);
+    checkUnnamed964(o.localId);
   }
   buildCounterIdentitytoolkitRelyingpartyGetAccountInfoRequest--;
 }
@@ -313,14 +315,14 @@
   buildCounterIdentitytoolkitRelyingpartyResetPasswordRequest--;
 }
 
-buildUnnamed937() {
+buildUnnamed965() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed937(core.List<core.String> o) {
+checkUnnamed965(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -340,7 +342,7 @@
     o.localId = "foo";
     o.oobCode = "foo";
     o.password = "foo";
-    o.provider = buildUnnamed937();
+    o.provider = buildUnnamed965();
     o.upgradeToFederatedLogin = true;
   }
   buildCounterIdentitytoolkitRelyingpartySetAccountInfoRequest--;
@@ -359,20 +361,20 @@
     unittest.expect(o.localId, unittest.equals('foo'));
     unittest.expect(o.oobCode, unittest.equals('foo'));
     unittest.expect(o.password, unittest.equals('foo'));
-    checkUnnamed937(o.provider);
+    checkUnnamed965(o.provider);
     unittest.expect(o.upgradeToFederatedLogin, unittest.isTrue);
   }
   buildCounterIdentitytoolkitRelyingpartySetAccountInfoRequest--;
 }
 
-buildUnnamed938() {
+buildUnnamed966() {
   var o = new core.List<api.UserInfo>();
   o.add(buildUserInfo());
   o.add(buildUserInfo());
   return o;
 }
 
-checkUnnamed938(core.List<api.UserInfo> o) {
+checkUnnamed966(core.List<api.UserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfo(o[0]);
   checkUserInfo(o[1]);
@@ -388,7 +390,7 @@
     o.rounds = 42;
     o.saltSeparator = "foo";
     o.signerKey = "foo";
-    o.users = buildUnnamed938();
+    o.users = buildUnnamed966();
   }
   buildCounterIdentitytoolkitRelyingpartyUploadAccountRequest--;
   return o;
@@ -402,7 +404,7 @@
     unittest.expect(o.rounds, unittest.equals(42));
     unittest.expect(o.saltSeparator, unittest.equals('foo'));
     unittest.expect(o.signerKey, unittest.equals('foo'));
-    checkUnnamed938(o.users);
+    checkUnnamed966(o.users);
   }
   buildCounterIdentitytoolkitRelyingpartyUploadAccountRequest--;
 }
@@ -534,14 +536,14 @@
   buildCounterSetAccountInfoResponseProviderUserInfo--;
 }
 
-buildUnnamed939() {
+buildUnnamed967() {
   var o = new core.List<api.SetAccountInfoResponseProviderUserInfo>();
   o.add(buildSetAccountInfoResponseProviderUserInfo());
   o.add(buildSetAccountInfoResponseProviderUserInfo());
   return o;
 }
 
-checkUnnamed939(core.List<api.SetAccountInfoResponseProviderUserInfo> o) {
+checkUnnamed967(core.List<api.SetAccountInfoResponseProviderUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSetAccountInfoResponseProviderUserInfo(o[0]);
   checkSetAccountInfoResponseProviderUserInfo(o[1]);
@@ -556,7 +558,7 @@
     o.email = "foo";
     o.idToken = "foo";
     o.kind = "foo";
-    o.providerUserInfo = buildUnnamed939();
+    o.providerUserInfo = buildUnnamed967();
   }
   buildCounterSetAccountInfoResponse--;
   return o;
@@ -569,7 +571,7 @@
     unittest.expect(o.email, unittest.equals('foo'));
     unittest.expect(o.idToken, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed939(o.providerUserInfo);
+    checkUnnamed967(o.providerUserInfo);
   }
   buildCounterSetAccountInfoResponse--;
 }
@@ -595,14 +597,14 @@
   buildCounterUploadAccountResponseError--;
 }
 
-buildUnnamed940() {
+buildUnnamed968() {
   var o = new core.List<api.UploadAccountResponseError>();
   o.add(buildUploadAccountResponseError());
   o.add(buildUploadAccountResponseError());
   return o;
 }
 
-checkUnnamed940(core.List<api.UploadAccountResponseError> o) {
+checkUnnamed968(core.List<api.UploadAccountResponseError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUploadAccountResponseError(o[0]);
   checkUploadAccountResponseError(o[1]);
@@ -613,7 +615,7 @@
   var o = new api.UploadAccountResponse();
   buildCounterUploadAccountResponse++;
   if (buildCounterUploadAccountResponse < 3) {
-    o.error = buildUnnamed940();
+    o.error = buildUnnamed968();
     o.kind = "foo";
   }
   buildCounterUploadAccountResponse--;
@@ -623,7 +625,7 @@
 checkUploadAccountResponse(api.UploadAccountResponse o) {
   buildCounterUploadAccountResponse++;
   if (buildCounterUploadAccountResponse < 3) {
-    checkUnnamed940(o.error);
+    checkUnnamed968(o.error);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterUploadAccountResponse--;
@@ -654,14 +656,14 @@
   buildCounterUserInfoProviderUserInfo--;
 }
 
-buildUnnamed941() {
+buildUnnamed969() {
   var o = new core.List<api.UserInfoProviderUserInfo>();
   o.add(buildUserInfoProviderUserInfo());
   o.add(buildUserInfoProviderUserInfo());
   return o;
 }
 
-checkUnnamed941(core.List<api.UserInfoProviderUserInfo> o) {
+checkUnnamed969(core.List<api.UserInfoProviderUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserInfoProviderUserInfo(o[0]);
   checkUserInfoProviderUserInfo(o[1]);
@@ -679,7 +681,7 @@
     o.passwordHash = "foo";
     o.passwordUpdatedAt = 42.0;
     o.photoUrl = "foo";
-    o.providerUserInfo = buildUnnamed941();
+    o.providerUserInfo = buildUnnamed969();
     o.salt = "foo";
     o.version = 42;
   }
@@ -697,21 +699,21 @@
     unittest.expect(o.passwordHash, unittest.equals('foo'));
     unittest.expect(o.passwordUpdatedAt, unittest.equals(42.0));
     unittest.expect(o.photoUrl, unittest.equals('foo'));
-    checkUnnamed941(o.providerUserInfo);
+    checkUnnamed969(o.providerUserInfo);
     unittest.expect(o.salt, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals(42));
   }
   buildCounterUserInfo--;
 }
 
-buildUnnamed942() {
+buildUnnamed970() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed942(core.List<core.String> o) {
+checkUnnamed970(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -748,7 +750,7 @@
     o.photoUrl = "foo";
     o.providerId = "foo";
     o.timeZone = "foo";
-    o.verifiedProvider = buildUnnamed942();
+    o.verifiedProvider = buildUnnamed970();
   }
   buildCounterVerifyAssertionResponse--;
   return o;
@@ -783,7 +785,7 @@
     unittest.expect(o.photoUrl, unittest.equals('foo'));
     unittest.expect(o.providerId, unittest.equals('foo'));
     unittest.expect(o.timeZone, unittest.equals('foo'));
-    checkUnnamed942(o.verifiedProvider);
+    checkUnnamed970(o.verifiedProvider);
   }
   buildCounterVerifyAssertionResponse--;
 }
@@ -1060,8 +1062,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 33), unittest.equals("/identitytoolkit/v3/relyingparty/"));
-        pathOffset += 33;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        pathOffset += 32;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("createAuthUri"));
         pathOffset += 13;
 
@@ -1107,8 +1111,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 33), unittest.equals("/identitytoolkit/v3/relyingparty/"));
-        pathOffset += 33;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        pathOffset += 32;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("deleteAccount"));
         pathOffset += 13;
 
@@ -1154,8 +1160,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 33), unittest.equals("/identitytoolkit/v3/relyingparty/"));
-        pathOffset += 33;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        pathOffset += 32;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("downloadAccount"));
         pathOffset += 15;
 
@@ -1201,8 +1209,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 33), unittest.equals("/identitytoolkit/v3/relyingparty/"));
-        pathOffset += 33;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        pathOffset += 32;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("getAccountInfo"));
         pathOffset += 14;
 
@@ -1248,8 +1258,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 33), unittest.equals("/identitytoolkit/v3/relyingparty/"));
-        pathOffset += 33;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        pathOffset += 32;
         unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("getOobConfirmationCode"));
         pathOffset += 22;
 
@@ -1291,8 +1303,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 33), unittest.equals("/identitytoolkit/v3/relyingparty/"));
-        pathOffset += 33;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        pathOffset += 32;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("publicKeys"));
         pathOffset += 10;
 
@@ -1338,8 +1352,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 33), unittest.equals("/identitytoolkit/v3/relyingparty/"));
-        pathOffset += 33;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        pathOffset += 32;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("resetPassword"));
         pathOffset += 13;
 
@@ -1385,8 +1401,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 33), unittest.equals("/identitytoolkit/v3/relyingparty/"));
-        pathOffset += 33;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        pathOffset += 32;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("setAccountInfo"));
         pathOffset += 14;
 
@@ -1432,8 +1450,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 33), unittest.equals("/identitytoolkit/v3/relyingparty/"));
-        pathOffset += 33;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        pathOffset += 32;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("uploadAccount"));
         pathOffset += 13;
 
@@ -1479,8 +1499,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 33), unittest.equals("/identitytoolkit/v3/relyingparty/"));
-        pathOffset += 33;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        pathOffset += 32;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("verifyAssertion"));
         pathOffset += 15;
 
@@ -1526,8 +1548,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 33), unittest.equals("/identitytoolkit/v3/relyingparty/"));
-        pathOffset += 33;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("identitytoolkit/v3/relyingparty/"));
+        pathOffset += 32;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("verifyPassword"));
         pathOffset += 14;
 
diff --git a/generated/googleapis/test/licensing/v1_test.dart b/generated/googleapis/test/licensing/v1_test.dart
index a16abbd..472432c 100644
--- a/generated/googleapis/test/licensing/v1_test.dart
+++ b/generated/googleapis/test/licensing/v1_test.dart
@@ -64,14 +64,14 @@
   buildCounterLicenseAssignmentInsert--;
 }
 
-buildUnnamed838() {
+buildUnnamed866() {
   var o = new core.List<api.LicenseAssignment>();
   o.add(buildLicenseAssignment());
   o.add(buildLicenseAssignment());
   return o;
 }
 
-checkUnnamed838(core.List<api.LicenseAssignment> o) {
+checkUnnamed866(core.List<api.LicenseAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLicenseAssignment(o[0]);
   checkLicenseAssignment(o[1]);
@@ -83,7 +83,7 @@
   buildCounterLicenseAssignmentList++;
   if (buildCounterLicenseAssignmentList < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed838();
+    o.items = buildUnnamed866();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -95,7 +95,7 @@
   buildCounterLicenseAssignmentList++;
   if (buildCounterLicenseAssignmentList < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed838(o.items);
+    checkUnnamed866(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -144,25 +144,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 27), unittest.equals("/apps/licensing/v1/product/"));
-        pathOffset += 27;
-        index = path.indexOf("/sku/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_productId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/sku/"));
-        pathOffset += 5;
-        index = path.indexOf("/user/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_skuId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/user/"));
-        pathOffset += 6;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -203,25 +186,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 27), unittest.equals("/apps/licensing/v1/product/"));
-        pathOffset += 27;
-        index = path.indexOf("/sku/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_productId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/sku/"));
-        pathOffset += 5;
-        index = path.indexOf("/user/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_skuId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/user/"));
-        pathOffset += 6;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -267,22 +233,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 27), unittest.equals("/apps/licensing/v1/product/"));
-        pathOffset += 27;
-        index = path.indexOf("/sku/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_productId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/sku/"));
-        pathOffset += 5;
-        index = path.indexOf("/user", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_skuId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/user"));
-        pathOffset += 5;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -326,15 +278,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 27), unittest.equals("/apps/licensing/v1/product/"));
-        pathOffset += 27;
-        index = path.indexOf("/users", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_productId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/users"));
-        pathOffset += 6;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -382,22 +327,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 27), unittest.equals("/apps/licensing/v1/product/"));
-        pathOffset += 27;
-        index = path.indexOf("/sku/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_productId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/sku/"));
-        pathOffset += 5;
-        index = path.indexOf("/users", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_skuId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/users"));
-        pathOffset += 6;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -447,25 +378,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 27), unittest.equals("/apps/licensing/v1/product/"));
-        pathOffset += 27;
-        index = path.indexOf("/sku/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_productId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/sku/"));
-        pathOffset += 5;
-        index = path.indexOf("/user/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_skuId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/user/"));
-        pathOffset += 6;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -512,25 +426,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 27), unittest.equals("/apps/licensing/v1/product/"));
-        pathOffset += 27;
-        index = path.indexOf("/sku/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_productId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("/sku/"));
-        pathOffset += 5;
-        index = path.indexOf("/user/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_skuId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/user/"));
-        pathOffset += 6;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_userId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
diff --git a/generated/googleapis/test/mapsengine/v1_test.dart b/generated/googleapis/test/mapsengine/v1_test.dart
index cedf3c1..ac2f2ce 100644
--- a/generated/googleapis/test/mapsengine/v1_test.dart
+++ b/generated/googleapis/test/mapsengine/v1_test.dart
@@ -72,15 +72,18 @@
   if (buildCounterAsset < 3) {
     o.bbox = buildUnnamed91();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
+    o.creatorEmail = "foo";
     o.description = "foo";
     o.etag = "foo";
     o.id = "foo";
     o.lastModifiedTime = core.DateTime.parse("2002-02-27T14:01:02");
+    o.lastModifierEmail = "foo";
     o.name = "foo";
     o.projectId = "foo";
     o.resource = "foo";
     o.tags = buildUnnamed92();
     o.type = "foo";
+    o.writersCanEditPermissions = true;
   }
   buildCounterAsset--;
   return o;
@@ -91,15 +94,18 @@
   if (buildCounterAsset < 3) {
     checkUnnamed91(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.creatorEmail, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.lastModifiedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.lastModifierEmail, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.resource, unittest.equals('foo'));
     checkUnnamed92(o.tags);
     unittest.expect(o.type, unittest.equals('foo'));
+    unittest.expect(o.writersCanEditPermissions, unittest.isTrue);
   }
   buildCounterAsset--;
 }
@@ -950,6 +956,7 @@
   if (buildCounterLayer < 3) {
     o.bbox = buildUnnamed111();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
+    o.creatorEmail = "foo";
     o.datasourceType = "foo";
     o.datasources = buildDatasources();
     o.description = "foo";
@@ -957,6 +964,7 @@
     o.etag = "foo";
     o.id = "foo";
     o.lastModifiedTime = core.DateTime.parse("2002-02-27T14:01:02");
+    o.lastModifierEmail = "foo";
     o.layerType = "foo";
     o.name = "foo";
     o.processingStatus = "foo";
@@ -965,6 +973,7 @@
     o.publishingStatus = "foo";
     o.style = buildVectorStyle();
     o.tags = buildTags();
+    o.writersCanEditPermissions = true;
   }
   buildCounterLayer--;
   return o;
@@ -975,6 +984,7 @@
   if (buildCounterLayer < 3) {
     checkUnnamed111(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.creatorEmail, unittest.equals('foo'));
     unittest.expect(o.datasourceType, unittest.equals('foo'));
     checkDatasources(o.datasources);
     unittest.expect(o.description, unittest.equals('foo'));
@@ -982,6 +992,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.lastModifiedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.lastModifierEmail, unittest.equals('foo'));
     unittest.expect(o.layerType, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.processingStatus, unittest.equals('foo'));
@@ -990,6 +1001,7 @@
     unittest.expect(o.publishingStatus, unittest.equals('foo'));
     checkVectorStyle(o.style);
     checkTags(o.tags);
+    unittest.expect(o.writersCanEditPermissions, unittest.isTrue);
   }
   buildCounterLayer--;
 }
@@ -1123,12 +1135,14 @@
     o.bbox = buildUnnamed114();
     o.contents = buildMapContents();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
+    o.creatorEmail = "foo";
     o.defaultViewport = buildLatLngBox();
     o.description = "foo";
     o.draftAccessList = "foo";
     o.etag = "foo";
     o.id = "foo";
     o.lastModifiedTime = core.DateTime.parse("2002-02-27T14:01:02");
+    o.lastModifierEmail = "foo";
     o.name = "foo";
     o.processingStatus = "foo";
     o.projectId = "foo";
@@ -1136,6 +1150,7 @@
     o.publishingStatus = "foo";
     o.tags = buildTags();
     o.versions = buildUnnamed115();
+    o.writersCanEditPermissions = true;
   }
   buildCounterMap--;
   return o;
@@ -1147,12 +1162,14 @@
     checkUnnamed114(o.bbox);
     checkMapContents(o.contents);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.creatorEmail, unittest.equals('foo'));
     checkLatLngBox(o.defaultViewport);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.draftAccessList, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.lastModifiedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.lastModifierEmail, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.processingStatus, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
@@ -1160,6 +1177,7 @@
     unittest.expect(o.publishingStatus, unittest.equals('foo'));
     checkTags(o.tags);
     checkUnnamed115(o.versions);
+    unittest.expect(o.writersCanEditPermissions, unittest.isTrue);
   }
   buildCounterMap--;
 }
@@ -1418,6 +1436,161 @@
   buildCounterParentsListResponse--;
 }
 
+core.int buildCounterPermission = 0;
+buildPermission() {
+  var o = new api.Permission();
+  buildCounterPermission++;
+  if (buildCounterPermission < 3) {
+    o.discoverable = true;
+    o.id = "foo";
+    o.role = "foo";
+    o.type = "foo";
+  }
+  buildCounterPermission--;
+  return o;
+}
+
+checkPermission(api.Permission o) {
+  buildCounterPermission++;
+  if (buildCounterPermission < 3) {
+    unittest.expect(o.discoverable, unittest.isTrue);
+    unittest.expect(o.id, unittest.equals('foo'));
+    unittest.expect(o.role, unittest.equals('foo'));
+    unittest.expect(o.type, unittest.equals('foo'));
+  }
+  buildCounterPermission--;
+}
+
+buildUnnamed122() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed122(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterPermissionsBatchDeleteRequest = 0;
+buildPermissionsBatchDeleteRequest() {
+  var o = new api.PermissionsBatchDeleteRequest();
+  buildCounterPermissionsBatchDeleteRequest++;
+  if (buildCounterPermissionsBatchDeleteRequest < 3) {
+    o.ids = buildUnnamed122();
+  }
+  buildCounterPermissionsBatchDeleteRequest--;
+  return o;
+}
+
+checkPermissionsBatchDeleteRequest(api.PermissionsBatchDeleteRequest o) {
+  buildCounterPermissionsBatchDeleteRequest++;
+  if (buildCounterPermissionsBatchDeleteRequest < 3) {
+    checkUnnamed122(o.ids);
+  }
+  buildCounterPermissionsBatchDeleteRequest--;
+}
+
+core.int buildCounterPermissionsBatchDeleteResponse = 0;
+buildPermissionsBatchDeleteResponse() {
+  var o = new api.PermissionsBatchDeleteResponse();
+  buildCounterPermissionsBatchDeleteResponse++;
+  if (buildCounterPermissionsBatchDeleteResponse < 3) {
+  }
+  buildCounterPermissionsBatchDeleteResponse--;
+  return o;
+}
+
+checkPermissionsBatchDeleteResponse(api.PermissionsBatchDeleteResponse o) {
+  buildCounterPermissionsBatchDeleteResponse++;
+  if (buildCounterPermissionsBatchDeleteResponse < 3) {
+  }
+  buildCounterPermissionsBatchDeleteResponse--;
+}
+
+buildUnnamed123() {
+  var o = new core.List<api.Permission>();
+  o.add(buildPermission());
+  o.add(buildPermission());
+  return o;
+}
+
+checkUnnamed123(core.List<api.Permission> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkPermission(o[0]);
+  checkPermission(o[1]);
+}
+
+core.int buildCounterPermissionsBatchUpdateRequest = 0;
+buildPermissionsBatchUpdateRequest() {
+  var o = new api.PermissionsBatchUpdateRequest();
+  buildCounterPermissionsBatchUpdateRequest++;
+  if (buildCounterPermissionsBatchUpdateRequest < 3) {
+    o.permissions = buildUnnamed123();
+  }
+  buildCounterPermissionsBatchUpdateRequest--;
+  return o;
+}
+
+checkPermissionsBatchUpdateRequest(api.PermissionsBatchUpdateRequest o) {
+  buildCounterPermissionsBatchUpdateRequest++;
+  if (buildCounterPermissionsBatchUpdateRequest < 3) {
+    checkUnnamed123(o.permissions);
+  }
+  buildCounterPermissionsBatchUpdateRequest--;
+}
+
+core.int buildCounterPermissionsBatchUpdateResponse = 0;
+buildPermissionsBatchUpdateResponse() {
+  var o = new api.PermissionsBatchUpdateResponse();
+  buildCounterPermissionsBatchUpdateResponse++;
+  if (buildCounterPermissionsBatchUpdateResponse < 3) {
+  }
+  buildCounterPermissionsBatchUpdateResponse--;
+  return o;
+}
+
+checkPermissionsBatchUpdateResponse(api.PermissionsBatchUpdateResponse o) {
+  buildCounterPermissionsBatchUpdateResponse++;
+  if (buildCounterPermissionsBatchUpdateResponse < 3) {
+  }
+  buildCounterPermissionsBatchUpdateResponse--;
+}
+
+buildUnnamed124() {
+  var o = new core.List<api.Permission>();
+  o.add(buildPermission());
+  o.add(buildPermission());
+  return o;
+}
+
+checkUnnamed124(core.List<api.Permission> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkPermission(o[0]);
+  checkPermission(o[1]);
+}
+
+core.int buildCounterPermissionsListResponse = 0;
+buildPermissionsListResponse() {
+  var o = new api.PermissionsListResponse();
+  buildCounterPermissionsListResponse++;
+  if (buildCounterPermissionsListResponse < 3) {
+    o.permissions = buildUnnamed124();
+  }
+  buildCounterPermissionsListResponse--;
+  return o;
+}
+
+checkPermissionsListResponse(api.PermissionsListResponse o) {
+  buildCounterPermissionsListResponse++;
+  if (buildCounterPermissionsListResponse < 3) {
+    checkUnnamed124(o.permissions);
+  }
+  buildCounterPermissionsListResponse--;
+}
+
 core.int buildCounterPointStyle = 0;
 buildPointStyle() {
   var o = new api.PointStyle();
@@ -1498,14 +1671,14 @@
   buildCounterProject--;
 }
 
-buildUnnamed122() {
+buildUnnamed125() {
   var o = new core.List<api.Project>();
   o.add(buildProject());
   o.add(buildProject());
   return o;
 }
 
-checkUnnamed122(core.List<api.Project> o) {
+checkUnnamed125(core.List<api.Project> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProject(o[0]);
   checkProject(o[1]);
@@ -1516,7 +1689,7 @@
   var o = new api.ProjectsListResponse();
   buildCounterProjectsListResponse++;
   if (buildCounterProjectsListResponse < 3) {
-    o.projects = buildUnnamed122();
+    o.projects = buildUnnamed125();
   }
   buildCounterProjectsListResponse--;
   return o;
@@ -1525,7 +1698,7 @@
 checkProjectsListResponse(api.ProjectsListResponse o) {
   buildCounterProjectsListResponse++;
   if (buildCounterProjectsListResponse < 3) {
-    checkUnnamed122(o.projects);
+    checkUnnamed125(o.projects);
   }
   buildCounterProjectsListResponse--;
 }
@@ -1553,7 +1726,6 @@
   buildCounterPublishedLayer++;
   if (buildCounterPublishedLayer < 3) {
     o.description = "foo";
-    o.etag = "foo";
     o.id = "foo";
     o.layerType = "foo";
     o.name = "foo";
@@ -1567,7 +1739,6 @@
   buildCounterPublishedLayer++;
   if (buildCounterPublishedLayer < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.layerType, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1576,14 +1747,14 @@
   buildCounterPublishedLayer--;
 }
 
-buildUnnamed123() {
+buildUnnamed126() {
   var o = new core.List<api.PublishedLayer>();
   o.add(buildPublishedLayer());
   o.add(buildPublishedLayer());
   return o;
 }
 
-checkUnnamed123(core.List<api.PublishedLayer> o) {
+checkUnnamed126(core.List<api.PublishedLayer> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPublishedLayer(o[0]);
   checkPublishedLayer(o[1]);
@@ -1594,7 +1765,7 @@
   var o = new api.PublishedLayersListResponse();
   buildCounterPublishedLayersListResponse++;
   if (buildCounterPublishedLayersListResponse < 3) {
-    o.layers = buildUnnamed123();
+    o.layers = buildUnnamed126();
     o.nextPageToken = "foo";
   }
   buildCounterPublishedLayersListResponse--;
@@ -1604,7 +1775,7 @@
 checkPublishedLayersListResponse(api.PublishedLayersListResponse o) {
   buildCounterPublishedLayersListResponse++;
   if (buildCounterPublishedLayersListResponse < 3) {
-    checkUnnamed123(o.layers);
+    checkUnnamed126(o.layers);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterPublishedLayersListResponse--;
@@ -1618,7 +1789,6 @@
     o.contents = buildMapContents();
     o.defaultViewport = buildLatLngBox();
     o.description = "foo";
-    o.etag = "foo";
     o.id = "foo";
     o.name = "foo";
     o.projectId = "foo";
@@ -1633,7 +1803,6 @@
     checkMapContents(o.contents);
     checkLatLngBox(o.defaultViewport);
     unittest.expect(o.description, unittest.equals('foo'));
-    unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
@@ -1641,14 +1810,14 @@
   buildCounterPublishedMap--;
 }
 
-buildUnnamed124() {
+buildUnnamed127() {
   var o = new core.List<api.PublishedMap>();
   o.add(buildPublishedMap());
   o.add(buildPublishedMap());
   return o;
 }
 
-checkUnnamed124(core.List<api.PublishedMap> o) {
+checkUnnamed127(core.List<api.PublishedMap> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPublishedMap(o[0]);
   checkPublishedMap(o[1]);
@@ -1659,7 +1828,7 @@
   var o = new api.PublishedMapsListResponse();
   buildCounterPublishedMapsListResponse++;
   if (buildCounterPublishedMapsListResponse < 3) {
-    o.maps = buildUnnamed124();
+    o.maps = buildUnnamed127();
     o.nextPageToken = "foo";
   }
   buildCounterPublishedMapsListResponse--;
@@ -1669,33 +1838,33 @@
 checkPublishedMapsListResponse(api.PublishedMapsListResponse o) {
   buildCounterPublishedMapsListResponse++;
   if (buildCounterPublishedMapsListResponse < 3) {
-    checkUnnamed124(o.maps);
+    checkUnnamed127(o.maps);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterPublishedMapsListResponse--;
 }
 
-buildUnnamed125() {
+buildUnnamed128() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed125(core.List<core.double> o) {
+checkUnnamed128(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed126() {
+buildUnnamed129() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed126(core.List<api.File> o) {
+checkUnnamed129(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -1708,20 +1877,23 @@
   if (buildCounterRaster < 3) {
     o.acquisitionTime = buildAcquisitionTime();
     o.attribution = "foo";
-    o.bbox = buildUnnamed125();
+    o.bbox = buildUnnamed128();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
+    o.creatorEmail = "foo";
     o.description = "foo";
     o.draftAccessList = "foo";
     o.etag = "foo";
-    o.files = buildUnnamed126();
+    o.files = buildUnnamed129();
     o.id = "foo";
     o.lastModifiedTime = core.DateTime.parse("2002-02-27T14:01:02");
+    o.lastModifierEmail = "foo";
     o.maskType = "foo";
     o.name = "foo";
     o.processingStatus = "foo";
     o.projectId = "foo";
     o.rasterType = "foo";
     o.tags = buildTags();
+    o.writersCanEditPermissions = true;
   }
   buildCounterRaster--;
   return o;
@@ -1732,32 +1904,35 @@
   if (buildCounterRaster < 3) {
     checkAcquisitionTime(o.acquisitionTime);
     unittest.expect(o.attribution, unittest.equals('foo'));
-    checkUnnamed125(o.bbox);
+    checkUnnamed128(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.creatorEmail, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.draftAccessList, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed126(o.files);
+    checkUnnamed129(o.files);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.lastModifiedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.lastModifierEmail, unittest.equals('foo'));
     unittest.expect(o.maskType, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.processingStatus, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.rasterType, unittest.equals('foo'));
     checkTags(o.tags);
+    unittest.expect(o.writersCanEditPermissions, unittest.isTrue);
   }
   buildCounterRaster--;
 }
 
-buildUnnamed127() {
+buildUnnamed130() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed127(core.List<core.double> o) {
+checkUnnamed130(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
@@ -1769,19 +1944,22 @@
   buildCounterRasterCollection++;
   if (buildCounterRasterCollection < 3) {
     o.attribution = "foo";
-    o.bbox = buildUnnamed127();
+    o.bbox = buildUnnamed130();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
+    o.creatorEmail = "foo";
     o.description = "foo";
     o.draftAccessList = "foo";
     o.etag = "foo";
     o.id = "foo";
     o.lastModifiedTime = core.DateTime.parse("2002-02-27T14:01:02");
+    o.lastModifierEmail = "foo";
     o.mosaic = true;
     o.name = "foo";
     o.processingStatus = "foo";
     o.projectId = "foo";
     o.rasterType = "foo";
     o.tags = buildTags();
+    o.writersCanEditPermissions = true;
   }
   buildCounterRasterCollection--;
   return o;
@@ -1791,31 +1969,34 @@
   buildCounterRasterCollection++;
   if (buildCounterRasterCollection < 3) {
     unittest.expect(o.attribution, unittest.equals('foo'));
-    checkUnnamed127(o.bbox);
+    checkUnnamed130(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.creatorEmail, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.draftAccessList, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.lastModifiedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.lastModifierEmail, unittest.equals('foo'));
     unittest.expect(o.mosaic, unittest.isTrue);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.processingStatus, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.rasterType, unittest.equals('foo'));
     checkTags(o.tags);
+    unittest.expect(o.writersCanEditPermissions, unittest.isTrue);
   }
   buildCounterRasterCollection--;
 }
 
-buildUnnamed128() {
+buildUnnamed131() {
   var o = new core.List<api.RasterCollection>();
   o.add(buildRasterCollection());
   o.add(buildRasterCollection());
   return o;
 }
 
-checkUnnamed128(core.List<api.RasterCollection> o) {
+checkUnnamed131(core.List<api.RasterCollection> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRasterCollection(o[0]);
   checkRasterCollection(o[1]);
@@ -1827,7 +2008,7 @@
   buildCounterRasterCollectionsListResponse++;
   if (buildCounterRasterCollectionsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.rasterCollections = buildUnnamed128();
+    o.rasterCollections = buildUnnamed131();
   }
   buildCounterRasterCollectionsListResponse--;
   return o;
@@ -1837,32 +2018,32 @@
   buildCounterRasterCollectionsListResponse++;
   if (buildCounterRasterCollectionsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed128(o.rasterCollections);
+    checkUnnamed131(o.rasterCollections);
   }
   buildCounterRasterCollectionsListResponse--;
 }
 
-buildUnnamed129() {
+buildUnnamed132() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed129(core.List<core.double> o) {
+checkUnnamed132(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed130() {
+buildUnnamed133() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed130(core.List<core.String> o) {
+checkUnnamed133(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1873,7 +2054,7 @@
   var o = new api.RasterCollectionsRaster();
   buildCounterRasterCollectionsRaster++;
   if (buildCounterRasterCollectionsRaster < 3) {
-    o.bbox = buildUnnamed129();
+    o.bbox = buildUnnamed132();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.description = "foo";
     o.id = "foo";
@@ -1881,7 +2062,7 @@
     o.name = "foo";
     o.projectId = "foo";
     o.rasterType = "foo";
-    o.tags = buildUnnamed130();
+    o.tags = buildUnnamed133();
   }
   buildCounterRasterCollectionsRaster--;
   return o;
@@ -1890,7 +2071,7 @@
 checkRasterCollectionsRaster(api.RasterCollectionsRaster o) {
   buildCounterRasterCollectionsRaster++;
   if (buildCounterRasterCollectionsRaster < 3) {
-    checkUnnamed129(o.bbox);
+    checkUnnamed132(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1898,19 +2079,19 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.rasterType, unittest.equals('foo'));
-    checkUnnamed130(o.tags);
+    checkUnnamed133(o.tags);
   }
   buildCounterRasterCollectionsRaster--;
 }
 
-buildUnnamed131() {
+buildUnnamed134() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed131(core.List<core.String> o) {
+checkUnnamed134(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1921,7 +2102,7 @@
   var o = new api.RasterCollectionsRasterBatchDeleteRequest();
   buildCounterRasterCollectionsRasterBatchDeleteRequest++;
   if (buildCounterRasterCollectionsRasterBatchDeleteRequest < 3) {
-    o.ids = buildUnnamed131();
+    o.ids = buildUnnamed134();
   }
   buildCounterRasterCollectionsRasterBatchDeleteRequest--;
   return o;
@@ -1930,7 +2111,7 @@
 checkRasterCollectionsRasterBatchDeleteRequest(api.RasterCollectionsRasterBatchDeleteRequest o) {
   buildCounterRasterCollectionsRasterBatchDeleteRequest++;
   if (buildCounterRasterCollectionsRasterBatchDeleteRequest < 3) {
-    checkUnnamed131(o.ids);
+    checkUnnamed134(o.ids);
   }
   buildCounterRasterCollectionsRasterBatchDeleteRequest--;
 }
@@ -1952,14 +2133,14 @@
   buildCounterRasterCollectionsRastersBatchDeleteResponse--;
 }
 
-buildUnnamed132() {
+buildUnnamed135() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed132(core.List<core.String> o) {
+checkUnnamed135(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1970,7 +2151,7 @@
   var o = new api.RasterCollectionsRastersBatchInsertRequest();
   buildCounterRasterCollectionsRastersBatchInsertRequest++;
   if (buildCounterRasterCollectionsRastersBatchInsertRequest < 3) {
-    o.ids = buildUnnamed132();
+    o.ids = buildUnnamed135();
   }
   buildCounterRasterCollectionsRastersBatchInsertRequest--;
   return o;
@@ -1979,7 +2160,7 @@
 checkRasterCollectionsRastersBatchInsertRequest(api.RasterCollectionsRastersBatchInsertRequest o) {
   buildCounterRasterCollectionsRastersBatchInsertRequest++;
   if (buildCounterRasterCollectionsRastersBatchInsertRequest < 3) {
-    checkUnnamed132(o.ids);
+    checkUnnamed135(o.ids);
   }
   buildCounterRasterCollectionsRastersBatchInsertRequest--;
 }
@@ -2001,14 +2182,14 @@
   buildCounterRasterCollectionsRastersBatchInsertResponse--;
 }
 
-buildUnnamed133() {
+buildUnnamed136() {
   var o = new core.List<api.RasterCollectionsRaster>();
   o.add(buildRasterCollectionsRaster());
   o.add(buildRasterCollectionsRaster());
   return o;
 }
 
-checkUnnamed133(core.List<api.RasterCollectionsRaster> o) {
+checkUnnamed136(core.List<api.RasterCollectionsRaster> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRasterCollectionsRaster(o[0]);
   checkRasterCollectionsRaster(o[1]);
@@ -2020,7 +2201,7 @@
   buildCounterRasterCollectionsRastersListResponse++;
   if (buildCounterRasterCollectionsRastersListResponse < 3) {
     o.nextPageToken = "foo";
-    o.rasters = buildUnnamed133();
+    o.rasters = buildUnnamed136();
   }
   buildCounterRasterCollectionsRastersListResponse--;
   return o;
@@ -2030,19 +2211,19 @@
   buildCounterRasterCollectionsRastersListResponse++;
   if (buildCounterRasterCollectionsRastersListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed133(o.rasters);
+    checkUnnamed136(o.rasters);
   }
   buildCounterRasterCollectionsRastersListResponse--;
 }
 
-buildUnnamed134() {
+buildUnnamed137() {
   var o = new core.List<api.Raster>();
   o.add(buildRaster());
   o.add(buildRaster());
   return o;
 }
 
-checkUnnamed134(core.List<api.Raster> o) {
+checkUnnamed137(core.List<api.Raster> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRaster(o[0]);
   checkRaster(o[1]);
@@ -2054,7 +2235,7 @@
   buildCounterRastersListResponse++;
   if (buildCounterRastersListResponse < 3) {
     o.nextPageToken = "foo";
-    o.rasters = buildUnnamed134();
+    o.rasters = buildUnnamed137();
   }
   buildCounterRastersListResponse--;
   return o;
@@ -2064,7 +2245,7 @@
   buildCounterRastersListResponse++;
   if (buildCounterRastersListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed134(o.rasters);
+    checkUnnamed137(o.rasters);
   }
   buildCounterRastersListResponse--;
 }
@@ -2117,14 +2298,14 @@
   buildCounterScalingFunction--;
 }
 
-buildUnnamed135() {
+buildUnnamed138() {
   var o = new core.List<api.TableColumn>();
   o.add(buildTableColumn());
   o.add(buildTableColumn());
   return o;
 }
 
-checkUnnamed135(core.List<api.TableColumn> o) {
+checkUnnamed138(core.List<api.TableColumn> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTableColumn(o[0]);
   checkTableColumn(o[1]);
@@ -2135,7 +2316,7 @@
   var o = new api.Schema();
   buildCounterSchema++;
   if (buildCounterSchema < 3) {
-    o.columns = buildUnnamed135();
+    o.columns = buildUnnamed138();
     o.primaryGeometry = "foo";
     o.primaryKey = "foo";
   }
@@ -2146,7 +2327,7 @@
 checkSchema(api.Schema o) {
   buildCounterSchema++;
   if (buildCounterSchema < 3) {
-    checkUnnamed135(o.columns);
+    checkUnnamed138(o.columns);
     unittest.expect(o.primaryGeometry, unittest.equals('foo'));
     unittest.expect(o.primaryKey, unittest.equals('foo'));
   }
@@ -2174,27 +2355,27 @@
   buildCounterSizeRange--;
 }
 
-buildUnnamed136() {
+buildUnnamed139() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed136(core.List<core.double> o) {
+checkUnnamed139(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed137() {
+buildUnnamed140() {
   var o = new core.List<api.File>();
   o.add(buildFile());
   o.add(buildFile());
   return o;
 }
 
-checkUnnamed137(core.List<api.File> o) {
+checkUnnamed140(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFile(o[0]);
   checkFile(o[1]);
@@ -2205,14 +2386,16 @@
   var o = new api.Table();
   buildCounterTable++;
   if (buildCounterTable < 3) {
-    o.bbox = buildUnnamed136();
+    o.bbox = buildUnnamed139();
     o.creationTime = core.DateTime.parse("2002-02-27T14:01:02");
+    o.creatorEmail = "foo";
     o.description = "foo";
     o.draftAccessList = "foo";
     o.etag = "foo";
-    o.files = buildUnnamed137();
+    o.files = buildUnnamed140();
     o.id = "foo";
     o.lastModifiedTime = core.DateTime.parse("2002-02-27T14:01:02");
+    o.lastModifierEmail = "foo";
     o.name = "foo";
     o.processingStatus = "foo";
     o.projectId = "foo";
@@ -2220,6 +2403,7 @@
     o.schema = buildSchema();
     o.sourceEncoding = "foo";
     o.tags = buildTags();
+    o.writersCanEditPermissions = true;
   }
   buildCounterTable--;
   return o;
@@ -2228,14 +2412,16 @@
 checkTable(api.Table o) {
   buildCounterTable++;
   if (buildCounterTable < 3) {
-    checkUnnamed136(o.bbox);
+    checkUnnamed139(o.bbox);
     unittest.expect(o.creationTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.creatorEmail, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.draftAccessList, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed137(o.files);
+    checkUnnamed140(o.files);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.lastModifiedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
+    unittest.expect(o.lastModifierEmail, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.processingStatus, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
@@ -2243,6 +2429,7 @@
     checkSchema(o.schema);
     unittest.expect(o.sourceEncoding, unittest.equals('foo'));
     checkTags(o.tags);
+    unittest.expect(o.writersCanEditPermissions, unittest.isTrue);
   }
   buildCounterTable--;
 }
@@ -2268,14 +2455,14 @@
   buildCounterTableColumn--;
 }
 
-buildUnnamed138() {
+buildUnnamed141() {
   var o = new core.List<api.Table>();
   o.add(buildTable());
   o.add(buildTable());
   return o;
 }
 
-checkUnnamed138(core.List<api.Table> o) {
+checkUnnamed141(core.List<api.Table> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTable(o[0]);
   checkTable(o[1]);
@@ -2287,7 +2474,7 @@
   buildCounterTablesListResponse++;
   if (buildCounterTablesListResponse < 3) {
     o.nextPageToken = "foo";
-    o.tables = buildUnnamed138();
+    o.tables = buildUnnamed141();
   }
   buildCounterTablesListResponse--;
   return o;
@@ -2297,7 +2484,7 @@
   buildCounterTablesListResponse++;
   if (buildCounterTablesListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed138(o.tables);
+    checkUnnamed141(o.tables);
   }
   buildCounterTablesListResponse--;
 }
@@ -2336,14 +2523,14 @@
   buildCounterValueRange--;
 }
 
-buildUnnamed139() {
+buildUnnamed142() {
   var o = new core.List<api.DisplayRule>();
   o.add(buildDisplayRule());
   o.add(buildDisplayRule());
   return o;
 }
 
-checkUnnamed139(core.List<api.DisplayRule> o) {
+checkUnnamed142(core.List<api.DisplayRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDisplayRule(o[0]);
   checkDisplayRule(o[1]);
@@ -2354,7 +2541,7 @@
   var o = new api.VectorStyle();
   buildCounterVectorStyle++;
   if (buildCounterVectorStyle < 3) {
-    o.displayRules = buildUnnamed139();
+    o.displayRules = buildUnnamed142();
     o.featureInfo = buildFeatureInfo();
     o.type = "foo";
   }
@@ -2365,7 +2552,7 @@
 checkVectorStyle(api.VectorStyle o) {
   buildCounterVectorStyle++;
   if (buildCounterVectorStyle < 3) {
-    checkUnnamed139(o.displayRules);
+    checkUnnamed142(o.displayRules);
     checkFeatureInfo(o.featureInfo);
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -2791,6 +2978,60 @@
   });
 
 
+  unittest.group("obj-schema-Permission", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildPermission();
+      var od = new api.Permission.fromJson(o.toJson());
+      checkPermission(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-PermissionsBatchDeleteRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildPermissionsBatchDeleteRequest();
+      var od = new api.PermissionsBatchDeleteRequest.fromJson(o.toJson());
+      checkPermissionsBatchDeleteRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-PermissionsBatchDeleteResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildPermissionsBatchDeleteResponse();
+      var od = new api.PermissionsBatchDeleteResponse.fromJson(o.toJson());
+      checkPermissionsBatchDeleteResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-PermissionsBatchUpdateRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildPermissionsBatchUpdateRequest();
+      var od = new api.PermissionsBatchUpdateRequest.fromJson(o.toJson());
+      checkPermissionsBatchUpdateRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-PermissionsBatchUpdateResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildPermissionsBatchUpdateResponse();
+      var od = new api.PermissionsBatchUpdateResponse.fromJson(o.toJson());
+      checkPermissionsBatchUpdateResponse(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-PermissionsListResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildPermissionsListResponse();
+      var od = new api.PermissionsListResponse.fromJson(o.toJson());
+      checkPermissionsListResponse(od);
+    });
+  });
+
+
   unittest.group("obj-schema-PointStyle", () {
     unittest.test("to-json--from-json", () {
       var o = buildPointStyle();
@@ -3081,8 +3322,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("assets/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -3140,8 +3383,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("assets"));
         pathOffset += 6;
 
@@ -3203,8 +3448,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("assets/"));
         pathOffset += 7;
         index = path.indexOf("/parents", pathOffset);
@@ -3249,6 +3496,63 @@
   });
 
 
+  unittest.group("resource-AssetsPermissionsResourceApi", () {
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.AssetsPermissionsResourceApi res = new api.MapsengineApi(mock).assets.permissions;
+      var arg_id = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("assets/"));
+        pathOffset += 7;
+        index = path.indexOf("/permissions", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/permissions"));
+        pathOffset += 12;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildPermissionsListResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_id).then(unittest.expectAsync(((api.PermissionsListResponse response) {
+        checkPermissionsListResponse(response);
+      })));
+    });
+
+  });
+
+
   unittest.group("resource-LayersResourceApi", () {
     unittest.test("method--cancelProcessing", () {
 
@@ -3260,8 +3564,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("layers/"));
         pathOffset += 7;
         index = path.indexOf("/cancelProcessing", pathOffset);
@@ -3315,8 +3621,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("layers"));
         pathOffset += 6;
 
@@ -3360,8 +3668,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("layers/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -3406,8 +3716,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("layers/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -3454,8 +3766,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("layers/"));
         pathOffset += 7;
         index = path.indexOf("/published", pathOffset);
@@ -3517,8 +3831,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("layers"));
         pathOffset += 6;
 
@@ -3576,8 +3892,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("layers/published"));
         pathOffset += 16;
 
@@ -3627,8 +3945,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("layers/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -3672,8 +3992,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("layers/"));
         pathOffset += 7;
         index = path.indexOf("/process", pathOffset);
@@ -3724,8 +4046,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("layers/"));
         pathOffset += 7;
         index = path.indexOf("/publish", pathOffset);
@@ -3776,8 +4100,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("layers/"));
         pathOffset += 7;
         index = path.indexOf("/unpublish", pathOffset);
@@ -3833,8 +4159,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("layers/"));
         pathOffset += 7;
         index = path.indexOf("/parents", pathOffset);
@@ -3879,6 +4207,177 @@
   });
 
 
+  unittest.group("resource-LayersPermissionsResourceApi", () {
+    unittest.test("method--batchDelete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.LayersPermissionsResourceApi res = new api.MapsengineApi(mock).layers.permissions;
+      var arg_request = buildPermissionsBatchDeleteRequest();
+      var arg_id = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.PermissionsBatchDeleteRequest.fromJson(json);
+        checkPermissionsBatchDeleteRequest(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("layers/"));
+        pathOffset += 7;
+        index = path.indexOf("/permissions/batchDelete", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("/permissions/batchDelete"));
+        pathOffset += 24;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildPermissionsBatchDeleteResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.batchDelete(arg_request, arg_id).then(unittest.expectAsync(((api.PermissionsBatchDeleteResponse response) {
+        checkPermissionsBatchDeleteResponse(response);
+      })));
+    });
+
+    unittest.test("method--batchUpdate", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.LayersPermissionsResourceApi res = new api.MapsengineApi(mock).layers.permissions;
+      var arg_request = buildPermissionsBatchUpdateRequest();
+      var arg_id = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.PermissionsBatchUpdateRequest.fromJson(json);
+        checkPermissionsBatchUpdateRequest(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("layers/"));
+        pathOffset += 7;
+        index = path.indexOf("/permissions/batchUpdate", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("/permissions/batchUpdate"));
+        pathOffset += 24;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildPermissionsBatchUpdateResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.batchUpdate(arg_request, arg_id).then(unittest.expectAsync(((api.PermissionsBatchUpdateResponse response) {
+        checkPermissionsBatchUpdateResponse(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.LayersPermissionsResourceApi res = new api.MapsengineApi(mock).layers.permissions;
+      var arg_id = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("layers/"));
+        pathOffset += 7;
+        index = path.indexOf("/permissions", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/permissions"));
+        pathOffset += 12;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildPermissionsListResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_id).then(unittest.expectAsync(((api.PermissionsListResponse response) {
+        checkPermissionsListResponse(response);
+      })));
+    });
+
+  });
+
+
   unittest.group("resource-MapsResourceApi", () {
     unittest.test("method--create", () {
 
@@ -3893,8 +4392,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 4), unittest.equals("maps"));
         pathOffset += 4;
 
@@ -3937,8 +4438,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("maps/"));
         pathOffset += 5;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -3983,8 +4486,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("maps/"));
         pathOffset += 5;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -4031,8 +4536,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("maps/"));
         pathOffset += 5;
         index = path.indexOf("/published", pathOffset);
@@ -4094,8 +4601,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 4), unittest.equals("maps"));
         pathOffset += 4;
 
@@ -4153,8 +4662,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("maps/published"));
         pathOffset += 14;
 
@@ -4204,8 +4715,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("maps/"));
         pathOffset += 5;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -4250,8 +4763,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("maps/"));
         pathOffset += 5;
         index = path.indexOf("/publish", pathOffset);
@@ -4302,8 +4817,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("maps/"));
         pathOffset += 5;
         index = path.indexOf("/unpublish", pathOffset);
@@ -4346,6 +4863,177 @@
   });
 
 
+  unittest.group("resource-MapsPermissionsResourceApi", () {
+    unittest.test("method--batchDelete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.MapsPermissionsResourceApi res = new api.MapsengineApi(mock).maps.permissions;
+      var arg_request = buildPermissionsBatchDeleteRequest();
+      var arg_id = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.PermissionsBatchDeleteRequest.fromJson(json);
+        checkPermissionsBatchDeleteRequest(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("maps/"));
+        pathOffset += 5;
+        index = path.indexOf("/permissions/batchDelete", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("/permissions/batchDelete"));
+        pathOffset += 24;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildPermissionsBatchDeleteResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.batchDelete(arg_request, arg_id).then(unittest.expectAsync(((api.PermissionsBatchDeleteResponse response) {
+        checkPermissionsBatchDeleteResponse(response);
+      })));
+    });
+
+    unittest.test("method--batchUpdate", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.MapsPermissionsResourceApi res = new api.MapsengineApi(mock).maps.permissions;
+      var arg_request = buildPermissionsBatchUpdateRequest();
+      var arg_id = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.PermissionsBatchUpdateRequest.fromJson(json);
+        checkPermissionsBatchUpdateRequest(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("maps/"));
+        pathOffset += 5;
+        index = path.indexOf("/permissions/batchUpdate", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("/permissions/batchUpdate"));
+        pathOffset += 24;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildPermissionsBatchUpdateResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.batchUpdate(arg_request, arg_id).then(unittest.expectAsync(((api.PermissionsBatchUpdateResponse response) {
+        checkPermissionsBatchUpdateResponse(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.MapsPermissionsResourceApi res = new api.MapsengineApi(mock).maps.permissions;
+      var arg_id = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("maps/"));
+        pathOffset += 5;
+        index = path.indexOf("/permissions", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/permissions"));
+        pathOffset += 12;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildPermissionsListResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_id).then(unittest.expectAsync(((api.PermissionsListResponse response) {
+        checkPermissionsListResponse(response);
+      })));
+    });
+
+  });
+
+
   unittest.group("resource-ProjectsResourceApi", () {
     unittest.test("method--list", () {
 
@@ -4356,8 +5044,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("projects"));
         pathOffset += 8;
 
@@ -4410,8 +5100,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/icons", pathOffset);
@@ -4464,8 +5156,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/icons/", pathOffset);
@@ -4520,8 +5214,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/icons", pathOffset);
@@ -4577,8 +5273,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("rasterCollections/"));
         pathOffset += 18;
         index = path.indexOf("/cancelProcessing", pathOffset);
@@ -4631,8 +5329,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("rasterCollections"));
         pathOffset += 17;
 
@@ -4675,8 +5375,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("rasterCollections/"));
         pathOffset += 18;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -4720,8 +5422,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("rasterCollections/"));
         pathOffset += 18;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -4779,8 +5483,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("rasterCollections"));
         pathOffset += 17;
 
@@ -4840,8 +5546,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("rasterCollections/"));
         pathOffset += 18;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -4885,8 +5593,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("rasterCollections/"));
         pathOffset += 18;
         index = path.indexOf("/process", pathOffset);
@@ -4942,8 +5652,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("rasterCollections/"));
         pathOffset += 18;
         index = path.indexOf("/parents", pathOffset);
@@ -4988,6 +5700,177 @@
   });
 
 
+  unittest.group("resource-RasterCollectionsPermissionsResourceApi", () {
+    unittest.test("method--batchDelete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.RasterCollectionsPermissionsResourceApi res = new api.MapsengineApi(mock).rasterCollections.permissions;
+      var arg_request = buildPermissionsBatchDeleteRequest();
+      var arg_id = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.PermissionsBatchDeleteRequest.fromJson(json);
+        checkPermissionsBatchDeleteRequest(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("rasterCollections/"));
+        pathOffset += 18;
+        index = path.indexOf("/permissions/batchDelete", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("/permissions/batchDelete"));
+        pathOffset += 24;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildPermissionsBatchDeleteResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.batchDelete(arg_request, arg_id).then(unittest.expectAsync(((api.PermissionsBatchDeleteResponse response) {
+        checkPermissionsBatchDeleteResponse(response);
+      })));
+    });
+
+    unittest.test("method--batchUpdate", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.RasterCollectionsPermissionsResourceApi res = new api.MapsengineApi(mock).rasterCollections.permissions;
+      var arg_request = buildPermissionsBatchUpdateRequest();
+      var arg_id = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.PermissionsBatchUpdateRequest.fromJson(json);
+        checkPermissionsBatchUpdateRequest(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("rasterCollections/"));
+        pathOffset += 18;
+        index = path.indexOf("/permissions/batchUpdate", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("/permissions/batchUpdate"));
+        pathOffset += 24;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildPermissionsBatchUpdateResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.batchUpdate(arg_request, arg_id).then(unittest.expectAsync(((api.PermissionsBatchUpdateResponse response) {
+        checkPermissionsBatchUpdateResponse(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.RasterCollectionsPermissionsResourceApi res = new api.MapsengineApi(mock).rasterCollections.permissions;
+      var arg_id = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("rasterCollections/"));
+        pathOffset += 18;
+        index = path.indexOf("/permissions", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/permissions"));
+        pathOffset += 12;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildPermissionsListResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_id).then(unittest.expectAsync(((api.PermissionsListResponse response) {
+        checkPermissionsListResponse(response);
+      })));
+    });
+
+  });
+
+
   unittest.group("resource-RasterCollectionsRastersResourceApi", () {
     unittest.test("method--batchDelete", () {
 
@@ -5003,8 +5886,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("rasterCollections/"));
         pathOffset += 18;
         index = path.indexOf("/rasters/batchDelete", pathOffset);
@@ -5058,8 +5943,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("rasterCollections/"));
         pathOffset += 18;
         index = path.indexOf("/rasters/batchInsert", pathOffset);
@@ -5120,8 +6007,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("rasterCollections/"));
         pathOffset += 18;
         index = path.indexOf("/rasters", pathOffset);
@@ -5186,8 +6075,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("rasters/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -5231,8 +6122,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("rasters/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -5290,8 +6183,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("rasters"));
         pathOffset += 7;
 
@@ -5351,8 +6246,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("rasters/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -5396,8 +6293,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("rasters/"));
         pathOffset += 8;
         index = path.indexOf("/process", pathOffset);
@@ -5450,8 +6349,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("rasters/upload"));
         pathOffset += 14;
 
@@ -5501,8 +6402,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("rasters/"));
         pathOffset += 8;
         index = path.indexOf("/files", pathOffset);
@@ -5557,8 +6460,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("rasters/"));
         pathOffset += 8;
         index = path.indexOf("/parents", pathOffset);
@@ -5603,6 +6508,177 @@
   });
 
 
+  unittest.group("resource-RastersPermissionsResourceApi", () {
+    unittest.test("method--batchDelete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.RastersPermissionsResourceApi res = new api.MapsengineApi(mock).rasters.permissions;
+      var arg_request = buildPermissionsBatchDeleteRequest();
+      var arg_id = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.PermissionsBatchDeleteRequest.fromJson(json);
+        checkPermissionsBatchDeleteRequest(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("rasters/"));
+        pathOffset += 8;
+        index = path.indexOf("/permissions/batchDelete", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("/permissions/batchDelete"));
+        pathOffset += 24;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildPermissionsBatchDeleteResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.batchDelete(arg_request, arg_id).then(unittest.expectAsync(((api.PermissionsBatchDeleteResponse response) {
+        checkPermissionsBatchDeleteResponse(response);
+      })));
+    });
+
+    unittest.test("method--batchUpdate", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.RastersPermissionsResourceApi res = new api.MapsengineApi(mock).rasters.permissions;
+      var arg_request = buildPermissionsBatchUpdateRequest();
+      var arg_id = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.PermissionsBatchUpdateRequest.fromJson(json);
+        checkPermissionsBatchUpdateRequest(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("rasters/"));
+        pathOffset += 8;
+        index = path.indexOf("/permissions/batchUpdate", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("/permissions/batchUpdate"));
+        pathOffset += 24;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildPermissionsBatchUpdateResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.batchUpdate(arg_request, arg_id).then(unittest.expectAsync(((api.PermissionsBatchUpdateResponse response) {
+        checkPermissionsBatchUpdateResponse(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.RastersPermissionsResourceApi res = new api.MapsengineApi(mock).rasters.permissions;
+      var arg_id = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("rasters/"));
+        pathOffset += 8;
+        index = path.indexOf("/permissions", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/permissions"));
+        pathOffset += 12;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildPermissionsListResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_id).then(unittest.expectAsync(((api.PermissionsListResponse response) {
+        checkPermissionsListResponse(response);
+      })));
+    });
+
+  });
+
+
   unittest.group("resource-TablesResourceApi", () {
     unittest.test("method--create", () {
 
@@ -5617,8 +6693,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("tables"));
         pathOffset += 6;
 
@@ -5661,8 +6739,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -5707,8 +6787,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -5767,8 +6849,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("tables"));
         pathOffset += 6;
 
@@ -5828,8 +6912,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -5873,8 +6959,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/process", pathOffset);
@@ -5927,8 +7015,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("tables/upload"));
         pathOffset += 13;
 
@@ -5979,8 +7069,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/features/batchDelete", pathOffset);
@@ -6032,8 +7124,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/features/batchInsert", pathOffset);
@@ -6085,8 +7179,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/features/batchPatch", pathOffset);
@@ -6137,8 +7233,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/features/", pathOffset);
@@ -6202,8 +7300,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/features", pathOffset);
@@ -6269,8 +7369,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/files", pathOffset);
@@ -6325,8 +7427,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/mapsengine/v1/"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
         pathOffset += 7;
         index = path.indexOf("/parents", pathOffset);
@@ -6371,5 +7475,176 @@
   });
 
 
+  unittest.group("resource-TablesPermissionsResourceApi", () {
+    unittest.test("method--batchDelete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.TablesPermissionsResourceApi res = new api.MapsengineApi(mock).tables.permissions;
+      var arg_request = buildPermissionsBatchDeleteRequest();
+      var arg_id = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.PermissionsBatchDeleteRequest.fromJson(json);
+        checkPermissionsBatchDeleteRequest(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        pathOffset += 7;
+        index = path.indexOf("/permissions/batchDelete", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("/permissions/batchDelete"));
+        pathOffset += 24;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildPermissionsBatchDeleteResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.batchDelete(arg_request, arg_id).then(unittest.expectAsync(((api.PermissionsBatchDeleteResponse response) {
+        checkPermissionsBatchDeleteResponse(response);
+      })));
+    });
+
+    unittest.test("method--batchUpdate", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.TablesPermissionsResourceApi res = new api.MapsengineApi(mock).tables.permissions;
+      var arg_request = buildPermissionsBatchUpdateRequest();
+      var arg_id = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.PermissionsBatchUpdateRequest.fromJson(json);
+        checkPermissionsBatchUpdateRequest(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        pathOffset += 7;
+        index = path.indexOf("/permissions/batchUpdate", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("/permissions/batchUpdate"));
+        pathOffset += 24;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildPermissionsBatchUpdateResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.batchUpdate(arg_request, arg_id).then(unittest.expectAsync(((api.PermissionsBatchUpdateResponse response) {
+        checkPermissionsBatchUpdateResponse(response);
+      })));
+    });
+
+    unittest.test("method--list", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.TablesPermissionsResourceApi res = new api.MapsengineApi(mock).tables.permissions;
+      var arg_id = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("mapsengine/v1/"));
+        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("tables/"));
+        pathOffset += 7;
+        index = path.indexOf("/permissions", pathOffset);
+        unittest.expect(index >= 0, unittest.isTrue);
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
+        pathOffset = index;
+        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/permissions"));
+        pathOffset += 12;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildPermissionsListResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.list(arg_id).then(unittest.expectAsync(((api.PermissionsListResponse response) {
+        checkPermissionsListResponse(response);
+      })));
+    });
+
+  });
+
+
 }
 
diff --git a/generated/googleapis/test/mirror/v1_test.dart b/generated/googleapis/test/mirror/v1_test.dart
index 7f051f1..b617075 100644
--- a/generated/googleapis/test/mirror/v1_test.dart
+++ b/generated/googleapis/test/mirror/v1_test.dart
@@ -16,40 +16,40 @@
 
 
 
-buildUnnamed743() {
+buildUnnamed771() {
   var o = new core.List<api.AuthToken>();
   o.add(buildAuthToken());
   o.add(buildAuthToken());
   return o;
 }
 
-checkUnnamed743(core.List<api.AuthToken> o) {
+checkUnnamed771(core.List<api.AuthToken> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAuthToken(o[0]);
   checkAuthToken(o[1]);
 }
 
-buildUnnamed744() {
+buildUnnamed772() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed744(core.List<core.String> o) {
+checkUnnamed772(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed745() {
+buildUnnamed773() {
   var o = new core.List<api.UserData>();
   o.add(buildUserData());
   o.add(buildUserData());
   return o;
 }
 
-checkUnnamed745(core.List<api.UserData> o) {
+checkUnnamed773(core.List<api.UserData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserData(o[0]);
   checkUserData(o[1]);
@@ -60,10 +60,10 @@
   var o = new api.Account();
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    o.authTokens = buildUnnamed743();
-    o.features = buildUnnamed744();
+    o.authTokens = buildUnnamed771();
+    o.features = buildUnnamed772();
     o.password = "foo";
-    o.userData = buildUnnamed745();
+    o.userData = buildUnnamed773();
   }
   buildCounterAccount--;
   return o;
@@ -72,10 +72,10 @@
 checkAccount(api.Account o) {
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    checkUnnamed743(o.authTokens);
-    checkUnnamed744(o.features);
+    checkUnnamed771(o.authTokens);
+    checkUnnamed772(o.features);
     unittest.expect(o.password, unittest.equals('foo'));
-    checkUnnamed745(o.userData);
+    checkUnnamed773(o.userData);
   }
   buildCounterAccount--;
 }
@@ -105,14 +105,14 @@
   buildCounterAttachment--;
 }
 
-buildUnnamed746() {
+buildUnnamed774() {
   var o = new core.List<api.Attachment>();
   o.add(buildAttachment());
   o.add(buildAttachment());
   return o;
 }
 
-checkUnnamed746(core.List<api.Attachment> o) {
+checkUnnamed774(core.List<api.Attachment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachment(o[0]);
   checkAttachment(o[1]);
@@ -123,7 +123,7 @@
   var o = new api.AttachmentsListResponse();
   buildCounterAttachmentsListResponse++;
   if (buildCounterAttachmentsListResponse < 3) {
-    o.items = buildUnnamed746();
+    o.items = buildUnnamed774();
     o.kind = "foo";
   }
   buildCounterAttachmentsListResponse--;
@@ -133,7 +133,7 @@
 checkAttachmentsListResponse(api.AttachmentsListResponse o) {
   buildCounterAttachmentsListResponse++;
   if (buildCounterAttachmentsListResponse < 3) {
-    checkUnnamed746(o.items);
+    checkUnnamed774(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAttachmentsListResponse--;
@@ -179,53 +179,53 @@
   buildCounterCommand--;
 }
 
-buildUnnamed747() {
+buildUnnamed775() {
   var o = new core.List<api.Command>();
   o.add(buildCommand());
   o.add(buildCommand());
   return o;
 }
 
-checkUnnamed747(core.List<api.Command> o) {
+checkUnnamed775(core.List<api.Command> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommand(o[0]);
   checkCommand(o[1]);
 }
 
-buildUnnamed748() {
+buildUnnamed776() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed748(core.List<core.String> o) {
+checkUnnamed776(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed749() {
+buildUnnamed777() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed749(core.List<core.String> o) {
+checkUnnamed777(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed750() {
+buildUnnamed778() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed750(core.List<core.String> o) {
+checkUnnamed778(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -236,15 +236,15 @@
   var o = new api.Contact();
   buildCounterContact++;
   if (buildCounterContact < 3) {
-    o.acceptCommands = buildUnnamed747();
-    o.acceptTypes = buildUnnamed748();
+    o.acceptCommands = buildUnnamed775();
+    o.acceptTypes = buildUnnamed776();
     o.displayName = "foo";
     o.id = "foo";
-    o.imageUrls = buildUnnamed749();
+    o.imageUrls = buildUnnamed777();
     o.kind = "foo";
     o.phoneNumber = "foo";
     o.priority = 42;
-    o.sharingFeatures = buildUnnamed750();
+    o.sharingFeatures = buildUnnamed778();
     o.source = "foo";
     o.speakableName = "foo";
     o.type = "foo";
@@ -256,15 +256,15 @@
 checkContact(api.Contact o) {
   buildCounterContact++;
   if (buildCounterContact < 3) {
-    checkUnnamed747(o.acceptCommands);
-    checkUnnamed748(o.acceptTypes);
+    checkUnnamed775(o.acceptCommands);
+    checkUnnamed776(o.acceptTypes);
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed749(o.imageUrls);
+    checkUnnamed777(o.imageUrls);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.phoneNumber, unittest.equals('foo'));
     unittest.expect(o.priority, unittest.equals(42));
-    checkUnnamed750(o.sharingFeatures);
+    checkUnnamed778(o.sharingFeatures);
     unittest.expect(o.source, unittest.equals('foo'));
     unittest.expect(o.speakableName, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -272,14 +272,14 @@
   buildCounterContact--;
 }
 
-buildUnnamed751() {
+buildUnnamed779() {
   var o = new core.List<api.Contact>();
   o.add(buildContact());
   o.add(buildContact());
   return o;
 }
 
-checkUnnamed751(core.List<api.Contact> o) {
+checkUnnamed779(core.List<api.Contact> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContact(o[0]);
   checkContact(o[1]);
@@ -290,7 +290,7 @@
   var o = new api.ContactsListResponse();
   buildCounterContactsListResponse++;
   if (buildCounterContactsListResponse < 3) {
-    o.items = buildUnnamed751();
+    o.items = buildUnnamed779();
     o.kind = "foo";
   }
   buildCounterContactsListResponse--;
@@ -300,7 +300,7 @@
 checkContactsListResponse(api.ContactsListResponse o) {
   buildCounterContactsListResponse++;
   if (buildCounterContactsListResponse < 3) {
-    checkUnnamed751(o.items);
+    checkUnnamed779(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterContactsListResponse--;
@@ -339,14 +339,14 @@
   buildCounterLocation--;
 }
 
-buildUnnamed752() {
+buildUnnamed780() {
   var o = new core.List<api.Location>();
   o.add(buildLocation());
   o.add(buildLocation());
   return o;
 }
 
-checkUnnamed752(core.List<api.Location> o) {
+checkUnnamed780(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocation(o[0]);
   checkLocation(o[1]);
@@ -357,7 +357,7 @@
   var o = new api.LocationsListResponse();
   buildCounterLocationsListResponse++;
   if (buildCounterLocationsListResponse < 3) {
-    o.items = buildUnnamed752();
+    o.items = buildUnnamed780();
     o.kind = "foo";
   }
   buildCounterLocationsListResponse--;
@@ -367,20 +367,20 @@
 checkLocationsListResponse(api.LocationsListResponse o) {
   buildCounterLocationsListResponse++;
   if (buildCounterLocationsListResponse < 3) {
-    checkUnnamed752(o.items);
+    checkUnnamed780(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterLocationsListResponse--;
 }
 
-buildUnnamed753() {
+buildUnnamed781() {
   var o = new core.List<api.MenuValue>();
   o.add(buildMenuValue());
   o.add(buildMenuValue());
   return o;
 }
 
-checkUnnamed753(core.List<api.MenuValue> o) {
+checkUnnamed781(core.List<api.MenuValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMenuValue(o[0]);
   checkMenuValue(o[1]);
@@ -392,10 +392,11 @@
   buildCounterMenuItem++;
   if (buildCounterMenuItem < 3) {
     o.action = "foo";
+    o.contextualCommand = "foo";
     o.id = "foo";
     o.payload = "foo";
     o.removeWhenSelected = true;
-    o.values = buildUnnamed753();
+    o.values = buildUnnamed781();
   }
   buildCounterMenuItem--;
   return o;
@@ -405,10 +406,11 @@
   buildCounterMenuItem++;
   if (buildCounterMenuItem < 3) {
     unittest.expect(o.action, unittest.equals('foo'));
+    unittest.expect(o.contextualCommand, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.payload, unittest.equals('foo'));
     unittest.expect(o.removeWhenSelected, unittest.isTrue);
-    checkUnnamed753(o.values);
+    checkUnnamed781(o.values);
   }
   buildCounterMenuItem--;
 }
@@ -436,14 +438,14 @@
   buildCounterMenuValue--;
 }
 
-buildUnnamed754() {
+buildUnnamed782() {
   var o = new core.List<api.UserAction>();
   o.add(buildUserAction());
   o.add(buildUserAction());
   return o;
 }
 
-checkUnnamed754(core.List<api.UserAction> o) {
+checkUnnamed782(core.List<api.UserAction> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUserAction(o[0]);
   checkUserAction(o[1]);
@@ -457,7 +459,7 @@
     o.collection = "foo";
     o.itemId = "foo";
     o.operation = "foo";
-    o.userActions = buildUnnamed754();
+    o.userActions = buildUnnamed782();
     o.userToken = "foo";
     o.verifyToken = "foo";
   }
@@ -471,7 +473,7 @@
     unittest.expect(o.collection, unittest.equals('foo'));
     unittest.expect(o.itemId, unittest.equals('foo'));
     unittest.expect(o.operation, unittest.equals('foo'));
-    checkUnnamed754(o.userActions);
+    checkUnnamed782(o.userActions);
     unittest.expect(o.userToken, unittest.equals('foo'));
     unittest.expect(o.verifyToken, unittest.equals('foo'));
   }
@@ -522,14 +524,14 @@
   buildCounterSetting--;
 }
 
-buildUnnamed755() {
+buildUnnamed783() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed755(core.List<core.String> o) {
+checkUnnamed783(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -545,7 +547,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.notification = buildNotification();
-    o.operation = buildUnnamed755();
+    o.operation = buildUnnamed783();
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
     o.userToken = "foo";
     o.verifyToken = "foo";
@@ -562,7 +564,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkNotification(o.notification);
-    checkUnnamed755(o.operation);
+    checkUnnamed783(o.operation);
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.userToken, unittest.equals('foo'));
     unittest.expect(o.verifyToken, unittest.equals('foo'));
@@ -570,14 +572,14 @@
   buildCounterSubscription--;
 }
 
-buildUnnamed756() {
+buildUnnamed784() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed756(core.List<api.Subscription> o) {
+checkUnnamed784(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -588,7 +590,7 @@
   var o = new api.SubscriptionsListResponse();
   buildCounterSubscriptionsListResponse++;
   if (buildCounterSubscriptionsListResponse < 3) {
-    o.items = buildUnnamed756();
+    o.items = buildUnnamed784();
     o.kind = "foo";
   }
   buildCounterSubscriptionsListResponse--;
@@ -598,46 +600,46 @@
 checkSubscriptionsListResponse(api.SubscriptionsListResponse o) {
   buildCounterSubscriptionsListResponse++;
   if (buildCounterSubscriptionsListResponse < 3) {
-    checkUnnamed756(o.items);
+    checkUnnamed784(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterSubscriptionsListResponse--;
 }
 
-buildUnnamed757() {
+buildUnnamed785() {
   var o = new core.List<api.Attachment>();
   o.add(buildAttachment());
   o.add(buildAttachment());
   return o;
 }
 
-checkUnnamed757(core.List<api.Attachment> o) {
+checkUnnamed785(core.List<api.Attachment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAttachment(o[0]);
   checkAttachment(o[1]);
 }
 
-buildUnnamed758() {
+buildUnnamed786() {
   var o = new core.List<api.MenuItem>();
   o.add(buildMenuItem());
   o.add(buildMenuItem());
   return o;
 }
 
-checkUnnamed758(core.List<api.MenuItem> o) {
+checkUnnamed786(core.List<api.MenuItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMenuItem(o[0]);
   checkMenuItem(o[1]);
 }
 
-buildUnnamed759() {
+buildUnnamed787() {
   var o = new core.List<api.Contact>();
   o.add(buildContact());
   o.add(buildContact());
   return o;
 }
 
-checkUnnamed759(core.List<api.Contact> o) {
+checkUnnamed787(core.List<api.Contact> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkContact(o[0]);
   checkContact(o[1]);
@@ -648,7 +650,7 @@
   var o = new api.TimelineItem();
   buildCounterTimelineItem++;
   if (buildCounterTimelineItem < 3) {
-    o.attachments = buildUnnamed757();
+    o.attachments = buildUnnamed785();
     o.bundleId = "foo";
     o.canonicalUrl = "foo";
     o.created = core.DateTime.parse("2002-02-27T14:01:02");
@@ -663,10 +665,10 @@
     o.isPinned = true;
     o.kind = "foo";
     o.location = buildLocation();
-    o.menuItems = buildUnnamed758();
+    o.menuItems = buildUnnamed786();
     o.notification = buildNotificationConfig();
     o.pinScore = 42;
-    o.recipients = buildUnnamed759();
+    o.recipients = buildUnnamed787();
     o.selfLink = "foo";
     o.sourceItemId = "foo";
     o.speakableText = "foo";
@@ -682,7 +684,7 @@
 checkTimelineItem(api.TimelineItem o) {
   buildCounterTimelineItem++;
   if (buildCounterTimelineItem < 3) {
-    checkUnnamed757(o.attachments);
+    checkUnnamed785(o.attachments);
     unittest.expect(o.bundleId, unittest.equals('foo'));
     unittest.expect(o.canonicalUrl, unittest.equals('foo'));
     unittest.expect(o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -697,10 +699,10 @@
     unittest.expect(o.isPinned, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkLocation(o.location);
-    checkUnnamed758(o.menuItems);
+    checkUnnamed786(o.menuItems);
     checkNotificationConfig(o.notification);
     unittest.expect(o.pinScore, unittest.equals(42));
-    checkUnnamed759(o.recipients);
+    checkUnnamed787(o.recipients);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.sourceItemId, unittest.equals('foo'));
     unittest.expect(o.speakableText, unittest.equals('foo'));
@@ -712,14 +714,14 @@
   buildCounterTimelineItem--;
 }
 
-buildUnnamed760() {
+buildUnnamed788() {
   var o = new core.List<api.TimelineItem>();
   o.add(buildTimelineItem());
   o.add(buildTimelineItem());
   return o;
 }
 
-checkUnnamed760(core.List<api.TimelineItem> o) {
+checkUnnamed788(core.List<api.TimelineItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimelineItem(o[0]);
   checkTimelineItem(o[1]);
@@ -730,7 +732,7 @@
   var o = new api.TimelineListResponse();
   buildCounterTimelineListResponse++;
   if (buildCounterTimelineListResponse < 3) {
-    o.items = buildUnnamed760();
+    o.items = buildUnnamed788();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -741,7 +743,7 @@
 checkTimelineListResponse(api.TimelineListResponse o) {
   buildCounterTimelineListResponse++;
   if (buildCounterTimelineListResponse < 3) {
-    checkUnnamed760(o.items);
+    checkUnnamed788(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -989,8 +991,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("accounts/"));
         pathOffset += 9;
         index = path.indexOf("/", pathOffset);
@@ -1054,8 +1058,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("contacts/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1099,8 +1105,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("contacts/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1149,8 +1157,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("contacts"));
         pathOffset += 8;
 
@@ -1192,8 +1202,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("contacts"));
         pathOffset += 8;
 
@@ -1240,8 +1252,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("contacts/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1291,8 +1305,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("contacts/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1342,8 +1358,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("locations/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1388,8 +1406,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("locations"));
         pathOffset += 9;
 
@@ -1436,8 +1456,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("settings/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1487,8 +1509,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("subscriptions/"));
         pathOffset += 14;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1535,8 +1559,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("subscriptions"));
         pathOffset += 13;
 
@@ -1578,8 +1604,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("subscriptions"));
         pathOffset += 13;
 
@@ -1626,8 +1654,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("subscriptions/"));
         pathOffset += 14;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1677,8 +1707,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("timeline/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1722,8 +1754,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("timeline/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1774,8 +1808,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("timeline"));
         pathOffset += 8;
 
@@ -1824,8 +1860,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("timeline"));
         pathOffset += 8;
 
@@ -1879,8 +1917,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("timeline/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1932,8 +1972,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("timeline/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1984,8 +2026,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("timeline/"));
         pathOffset += 9;
         index = path.indexOf("/attachments/", pathOffset);
@@ -2039,8 +2083,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("timeline/"));
         pathOffset += 9;
         index = path.indexOf("/attachments/", pathOffset);
@@ -2095,8 +2141,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("timeline/"));
         pathOffset += 9;
         index = path.indexOf("/attachments", pathOffset);
@@ -2146,8 +2194,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/mirror/v1/"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("mirror/v1/"));
+        pathOffset += 10;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("timeline/"));
         pathOffset += 9;
         index = path.indexOf("/attachments", pathOffset);
diff --git a/generated/googleapis/test/orkut/v2_test.dart b/generated/googleapis/test/orkut/v2_test.dart
index c36a3fc..ff06d99 100644
--- a/generated/googleapis/test/orkut/v2_test.dart
+++ b/generated/googleapis/test/orkut/v2_test.dart
@@ -37,14 +37,14 @@
   buildCounterAclItems--;
 }
 
-buildUnnamed140() {
+buildUnnamed143() {
   var o = new core.List<api.AclItems>();
   o.add(buildAclItems());
   o.add(buildAclItems());
   return o;
 }
 
-checkUnnamed140(core.List<api.AclItems> o) {
+checkUnnamed143(core.List<api.AclItems> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAclItems(o[0]);
   checkAclItems(o[1]);
@@ -56,7 +56,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     o.description = "foo";
-    o.items = buildUnnamed140();
+    o.items = buildUnnamed143();
     o.kind = "foo";
     o.totalParticipants = 42;
   }
@@ -68,47 +68,47 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed140(o.items);
+    checkUnnamed143(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.totalParticipants, unittest.equals(42));
   }
   buildCounterAcl--;
 }
 
-buildUnnamed141() {
+buildUnnamed144() {
   var o = new core.List<api.OrkutLinkResource>();
   o.add(buildOrkutLinkResource());
   o.add(buildOrkutLinkResource());
   return o;
 }
 
-checkUnnamed141(core.List<api.OrkutLinkResource> o) {
+checkUnnamed144(core.List<api.OrkutLinkResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrkutLinkResource(o[0]);
   checkOrkutLinkResource(o[1]);
 }
 
-buildUnnamed142() {
+buildUnnamed145() {
   var o = new core.List<api.OrkutActivityobjectsResource>();
   o.add(buildOrkutActivityobjectsResource());
   o.add(buildOrkutActivityobjectsResource());
   return o;
 }
 
-checkUnnamed142(core.List<api.OrkutActivityobjectsResource> o) {
+checkUnnamed145(core.List<api.OrkutActivityobjectsResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrkutActivityobjectsResource(o[0]);
   checkOrkutActivityobjectsResource(o[1]);
 }
 
-buildUnnamed143() {
+buildUnnamed146() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed143(core.List<api.Comment> o) {
+checkUnnamed146(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -119,7 +119,7 @@
   var o = new api.ActivityObjectReplies();
   buildCounterActivityObjectReplies++;
   if (buildCounterActivityObjectReplies < 3) {
-    o.items = buildUnnamed143();
+    o.items = buildUnnamed146();
     o.totalItems = "foo";
     o.url = "foo";
   }
@@ -130,7 +130,7 @@
 checkActivityObjectReplies(api.ActivityObjectReplies o) {
   buildCounterActivityObjectReplies++;
   if (buildCounterActivityObjectReplies < 3) {
-    checkUnnamed143(o.items);
+    checkUnnamed146(o.items);
     unittest.expect(o.totalItems, unittest.equals('foo'));
     unittest.expect(o.url, unittest.equals('foo'));
   }
@@ -143,7 +143,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     o.content = "foo";
-    o.items = buildUnnamed142();
+    o.items = buildUnnamed145();
     o.objectType = "foo";
     o.replies = buildActivityObjectReplies();
   }
@@ -155,7 +155,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     unittest.expect(o.content, unittest.equals('foo'));
-    checkUnnamed142(o.items);
+    checkUnnamed145(o.items);
     unittest.expect(o.objectType, unittest.equals('foo'));
     checkActivityObjectReplies(o.replies);
   }
@@ -171,7 +171,7 @@
     o.actor = buildOrkutAuthorResource();
     o.id = "foo";
     o.kind = "foo";
-    o.links = buildUnnamed141();
+    o.links = buildUnnamed144();
     o.object = buildActivityObject();
     o.published = core.DateTime.parse("2002-02-27T14:01:02");
     o.title = "foo";
@@ -189,7 +189,7 @@
     checkOrkutAuthorResource(o.actor);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed141(o.links);
+    checkUnnamed144(o.links);
     checkActivityObject(o.object);
     unittest.expect(o.published, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.title, unittest.equals('foo'));
@@ -199,14 +199,14 @@
   buildCounterActivity--;
 }
 
-buildUnnamed144() {
+buildUnnamed147() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed144(core.List<api.Activity> o) {
+checkUnnamed147(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -217,7 +217,7 @@
   var o = new api.ActivityList();
   buildCounterActivityList++;
   if (buildCounterActivityList < 3) {
-    o.items = buildUnnamed144();
+    o.items = buildUnnamed147();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -228,7 +228,7 @@
 checkActivityList(api.ActivityList o) {
   buildCounterActivityList++;
   if (buildCounterActivityList < 3) {
-    checkUnnamed144(o.items);
+    checkUnnamed147(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -270,14 +270,14 @@
   buildCounterBadge--;
 }
 
-buildUnnamed145() {
+buildUnnamed148() {
   var o = new core.List<api.Badge>();
   o.add(buildBadge());
   o.add(buildBadge());
   return o;
 }
 
-checkUnnamed145(core.List<api.Badge> o) {
+checkUnnamed148(core.List<api.Badge> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBadge(o[0]);
   checkBadge(o[1]);
@@ -288,7 +288,7 @@
   var o = new api.BadgeList();
   buildCounterBadgeList++;
   if (buildCounterBadgeList < 3) {
-    o.items = buildUnnamed145();
+    o.items = buildUnnamed148();
     o.kind = "foo";
   }
   buildCounterBadgeList--;
@@ -298,7 +298,7 @@
 checkBadgeList(api.BadgeList o) {
   buildCounterBadgeList++;
   if (buildCounterBadgeList < 3) {
-    checkUnnamed145(o.items);
+    checkUnnamed148(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBadgeList--;
@@ -329,14 +329,14 @@
   buildCounterCommentInReplyTo--;
 }
 
-buildUnnamed146() {
+buildUnnamed149() {
   var o = new core.List<api.OrkutLinkResource>();
   o.add(buildOrkutLinkResource());
   o.add(buildOrkutLinkResource());
   return o;
 }
 
-checkUnnamed146(core.List<api.OrkutLinkResource> o) {
+checkUnnamed149(core.List<api.OrkutLinkResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrkutLinkResource(o[0]);
   checkOrkutLinkResource(o[1]);
@@ -352,7 +352,7 @@
     o.id = "foo";
     o.inReplyTo = buildCommentInReplyTo();
     o.kind = "foo";
-    o.links = buildUnnamed146();
+    o.links = buildUnnamed149();
     o.published = core.DateTime.parse("2002-02-27T14:01:02");
   }
   buildCounterComment--;
@@ -367,20 +367,20 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkCommentInReplyTo(o.inReplyTo);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed146(o.links);
+    checkUnnamed149(o.links);
     unittest.expect(o.published, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterComment--;
 }
 
-buildUnnamed147() {
+buildUnnamed150() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed147(core.List<api.Comment> o) {
+checkUnnamed150(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -391,7 +391,7 @@
   var o = new api.CommentList();
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    o.items = buildUnnamed147();
+    o.items = buildUnnamed150();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.previousPageToken = "foo";
@@ -403,7 +403,7 @@
 checkCommentList(api.CommentList o) {
   buildCounterCommentList++;
   if (buildCounterCommentList < 3) {
-    checkUnnamed147(o.items);
+    checkUnnamed150(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.previousPageToken, unittest.equals('foo'));
@@ -411,40 +411,40 @@
   buildCounterCommentList--;
 }
 
-buildUnnamed148() {
+buildUnnamed151() {
   var o = new core.List<api.OrkutAuthorResource>();
   o.add(buildOrkutAuthorResource());
   o.add(buildOrkutAuthorResource());
   return o;
 }
 
-checkUnnamed148(core.List<api.OrkutAuthorResource> o) {
+checkUnnamed151(core.List<api.OrkutAuthorResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrkutAuthorResource(o[0]);
   checkOrkutAuthorResource(o[1]);
 }
 
-buildUnnamed149() {
+buildUnnamed152() {
   var o = new core.List<api.OrkutLinkResource>();
   o.add(buildOrkutLinkResource());
   o.add(buildOrkutLinkResource());
   return o;
 }
 
-checkUnnamed149(core.List<api.OrkutLinkResource> o) {
+checkUnnamed152(core.List<api.OrkutLinkResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrkutLinkResource(o[0]);
   checkOrkutLinkResource(o[1]);
 }
 
-buildUnnamed150() {
+buildUnnamed153() {
   var o = new core.List<api.OrkutAuthorResource>();
   o.add(buildOrkutAuthorResource());
   o.add(buildOrkutAuthorResource());
   return o;
 }
 
-checkUnnamed150(core.List<api.OrkutAuthorResource> o) {
+checkUnnamed153(core.List<api.OrkutAuthorResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrkutAuthorResource(o[0]);
   checkOrkutAuthorResource(o[1]);
@@ -456,16 +456,16 @@
   buildCounterCommunity++;
   if (buildCounterCommunity < 3) {
     o.category = "foo";
-    o.coOwners = buildUnnamed148();
+    o.coOwners = buildUnnamed151();
     o.creationDate = core.DateTime.parse("2002-02-27T14:01:02");
     o.description = "foo";
     o.id = 42;
     o.kind = "foo";
     o.language = "foo";
-    o.links = buildUnnamed149();
+    o.links = buildUnnamed152();
     o.location = "foo";
     o.memberCount = 42;
-    o.moderators = buildUnnamed150();
+    o.moderators = buildUnnamed153();
     o.name = "foo";
     o.owner = buildOrkutAuthorResource();
     o.photoUrl = "foo";
@@ -478,16 +478,16 @@
   buildCounterCommunity++;
   if (buildCounterCommunity < 3) {
     unittest.expect(o.category, unittest.equals('foo'));
-    checkUnnamed148(o.coOwners);
+    checkUnnamed151(o.coOwners);
     unittest.expect(o.creationDate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.language, unittest.equals('foo'));
-    checkUnnamed149(o.links);
+    checkUnnamed152(o.links);
     unittest.expect(o.location, unittest.equals('foo'));
     unittest.expect(o.memberCount, unittest.equals(42));
-    checkUnnamed150(o.moderators);
+    checkUnnamed153(o.moderators);
     unittest.expect(o.name, unittest.equals('foo'));
     checkOrkutAuthorResource(o.owner);
     unittest.expect(o.photoUrl, unittest.equals('foo'));
@@ -495,14 +495,14 @@
   buildCounterCommunity--;
 }
 
-buildUnnamed151() {
+buildUnnamed154() {
   var o = new core.List<api.Community>();
   o.add(buildCommunity());
   o.add(buildCommunity());
   return o;
 }
 
-checkUnnamed151(core.List<api.Community> o) {
+checkUnnamed154(core.List<api.Community> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommunity(o[0]);
   checkCommunity(o[1]);
@@ -513,7 +513,7 @@
   var o = new api.CommunityList();
   buildCounterCommunityList++;
   if (buildCounterCommunityList < 3) {
-    o.items = buildUnnamed151();
+    o.items = buildUnnamed154();
     o.kind = "foo";
   }
   buildCounterCommunityList--;
@@ -523,7 +523,7 @@
 checkCommunityList(api.CommunityList o) {
   buildCounterCommunityList++;
   if (buildCounterCommunityList < 3) {
-    checkUnnamed151(o.items);
+    checkUnnamed154(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCommunityList--;
@@ -552,14 +552,14 @@
   buildCounterCommunityMembers--;
 }
 
-buildUnnamed152() {
+buildUnnamed155() {
   var o = new core.List<api.CommunityMembers>();
   o.add(buildCommunityMembers());
   o.add(buildCommunityMembers());
   return o;
 }
 
-checkUnnamed152(core.List<api.CommunityMembers> o) {
+checkUnnamed155(core.List<api.CommunityMembers> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommunityMembers(o[0]);
   checkCommunityMembers(o[1]);
@@ -571,7 +571,7 @@
   buildCounterCommunityMembersList++;
   if (buildCounterCommunityMembersList < 3) {
     o.firstPageToken = "foo";
-    o.items = buildUnnamed152();
+    o.items = buildUnnamed155();
     o.kind = "foo";
     o.lastPageToken = "foo";
     o.nextPageToken = "foo";
@@ -585,7 +585,7 @@
   buildCounterCommunityMembersList++;
   if (buildCounterCommunityMembersList < 3) {
     unittest.expect(o.firstPageToken, unittest.equals('foo'));
-    checkUnnamed152(o.items);
+    checkUnnamed155(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastPageToken, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -633,14 +633,14 @@
   buildCounterCommunityMembershipStatus--;
 }
 
-buildUnnamed153() {
+buildUnnamed156() {
   var o = new core.List<api.OrkutLinkResource>();
   o.add(buildOrkutLinkResource());
   o.add(buildOrkutLinkResource());
   return o;
 }
 
-checkUnnamed153(core.List<api.OrkutLinkResource> o) {
+checkUnnamed156(core.List<api.OrkutLinkResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrkutLinkResource(o[0]);
   checkOrkutLinkResource(o[1]);
@@ -657,7 +657,7 @@
     o.id = "foo";
     o.isSpam = true;
     o.kind = "foo";
-    o.links = buildUnnamed153();
+    o.links = buildUnnamed156();
     o.subject = "foo";
   }
   buildCounterCommunityMessage--;
@@ -673,20 +673,20 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.isSpam, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed153(o.links);
+    checkUnnamed156(o.links);
     unittest.expect(o.subject, unittest.equals('foo'));
   }
   buildCounterCommunityMessage--;
 }
 
-buildUnnamed154() {
+buildUnnamed157() {
   var o = new core.List<api.CommunityMessage>();
   o.add(buildCommunityMessage());
   o.add(buildCommunityMessage());
   return o;
 }
 
-checkUnnamed154(core.List<api.CommunityMessage> o) {
+checkUnnamed157(core.List<api.CommunityMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommunityMessage(o[0]);
   checkCommunityMessage(o[1]);
@@ -698,7 +698,7 @@
   buildCounterCommunityMessageList++;
   if (buildCounterCommunityMessageList < 3) {
     o.firstPageToken = "foo";
-    o.items = buildUnnamed154();
+    o.items = buildUnnamed157();
     o.kind = "foo";
     o.lastPageToken = "foo";
     o.nextPageToken = "foo";
@@ -712,7 +712,7 @@
   buildCounterCommunityMessageList++;
   if (buildCounterCommunityMessageList < 3) {
     unittest.expect(o.firstPageToken, unittest.equals('foo'));
-    checkUnnamed154(o.items);
+    checkUnnamed157(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastPageToken, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -740,40 +740,40 @@
   buildCounterCommunityPollImage--;
 }
 
-buildUnnamed155() {
+buildUnnamed158() {
   var o = new core.List<api.OrkutLinkResource>();
   o.add(buildOrkutLinkResource());
   o.add(buildOrkutLinkResource());
   return o;
 }
 
-checkUnnamed155(core.List<api.OrkutLinkResource> o) {
+checkUnnamed158(core.List<api.OrkutLinkResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrkutLinkResource(o[0]);
   checkOrkutLinkResource(o[1]);
 }
 
-buildUnnamed156() {
+buildUnnamed159() {
   var o = new core.List<api.OrkutCommunitypolloptionResource>();
   o.add(buildOrkutCommunitypolloptionResource());
   o.add(buildOrkutCommunitypolloptionResource());
   return o;
 }
 
-checkUnnamed156(core.List<api.OrkutCommunitypolloptionResource> o) {
+checkUnnamed159(core.List<api.OrkutCommunitypolloptionResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrkutCommunitypolloptionResource(o[0]);
   checkOrkutCommunitypolloptionResource(o[1]);
 }
 
-buildUnnamed157() {
+buildUnnamed160() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed157(core.List<core.int> o) {
+checkUnnamed160(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
@@ -801,11 +801,11 @@
     o.isVotingAllowedForNonMembers = true;
     o.kind = "foo";
     o.lastUpdate = core.DateTime.parse("2002-02-27T14:01:02");
-    o.links = buildUnnamed155();
-    o.options = buildUnnamed156();
+    o.links = buildUnnamed158();
+    o.options = buildUnnamed159();
     o.question = "foo";
     o.totalNumberOfVotes = 42;
-    o.votedOptions = buildUnnamed157();
+    o.votedOptions = buildUnnamed160();
   }
   buildCounterCommunityPoll--;
   return o;
@@ -831,11 +831,11 @@
     unittest.expect(o.isVotingAllowedForNonMembers, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastUpdate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed155(o.links);
-    checkUnnamed156(o.options);
+    checkUnnamed158(o.links);
+    checkUnnamed159(o.options);
     unittest.expect(o.question, unittest.equals('foo'));
     unittest.expect(o.totalNumberOfVotes, unittest.equals(42));
-    checkUnnamed157(o.votedOptions);
+    checkUnnamed160(o.votedOptions);
   }
   buildCounterCommunityPoll--;
 }
@@ -867,14 +867,14 @@
   buildCounterCommunityPollComment--;
 }
 
-buildUnnamed158() {
+buildUnnamed161() {
   var o = new core.List<api.CommunityPollComment>();
   o.add(buildCommunityPollComment());
   o.add(buildCommunityPollComment());
   return o;
 }
 
-checkUnnamed158(core.List<api.CommunityPollComment> o) {
+checkUnnamed161(core.List<api.CommunityPollComment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommunityPollComment(o[0]);
   checkCommunityPollComment(o[1]);
@@ -886,7 +886,7 @@
   buildCounterCommunityPollCommentList++;
   if (buildCounterCommunityPollCommentList < 3) {
     o.firstPageToken = "foo";
-    o.items = buildUnnamed158();
+    o.items = buildUnnamed161();
     o.kind = "foo";
     o.lastPageToken = "foo";
     o.nextPageToken = "foo";
@@ -900,7 +900,7 @@
   buildCounterCommunityPollCommentList++;
   if (buildCounterCommunityPollCommentList < 3) {
     unittest.expect(o.firstPageToken, unittest.equals('foo'));
-    checkUnnamed158(o.items);
+    checkUnnamed161(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastPageToken, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -909,14 +909,14 @@
   buildCounterCommunityPollCommentList--;
 }
 
-buildUnnamed159() {
+buildUnnamed162() {
   var o = new core.List<api.CommunityPoll>();
   o.add(buildCommunityPoll());
   o.add(buildCommunityPoll());
   return o;
 }
 
-checkUnnamed159(core.List<api.CommunityPoll> o) {
+checkUnnamed162(core.List<api.CommunityPoll> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommunityPoll(o[0]);
   checkCommunityPoll(o[1]);
@@ -928,7 +928,7 @@
   buildCounterCommunityPollList++;
   if (buildCounterCommunityPollList < 3) {
     o.firstPageToken = "foo";
-    o.items = buildUnnamed159();
+    o.items = buildUnnamed162();
     o.kind = "foo";
     o.lastPageToken = "foo";
     o.nextPageToken = "foo";
@@ -942,7 +942,7 @@
   buildCounterCommunityPollList++;
   if (buildCounterCommunityPollList < 3) {
     unittest.expect(o.firstPageToken, unittest.equals('foo'));
-    checkUnnamed159(o.items);
+    checkUnnamed162(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastPageToken, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -951,14 +951,14 @@
   buildCounterCommunityPollList--;
 }
 
-buildUnnamed160() {
+buildUnnamed163() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed160(core.List<core.int> o) {
+checkUnnamed163(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
@@ -971,7 +971,7 @@
   if (buildCounterCommunityPollVote < 3) {
     o.isVotevisible = true;
     o.kind = "foo";
-    o.optionIds = buildUnnamed160();
+    o.optionIds = buildUnnamed163();
   }
   buildCounterCommunityPollVote--;
   return o;
@@ -982,32 +982,32 @@
   if (buildCounterCommunityPollVote < 3) {
     unittest.expect(o.isVotevisible, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed160(o.optionIds);
+    checkUnnamed163(o.optionIds);
   }
   buildCounterCommunityPollVote--;
 }
 
-buildUnnamed161() {
+buildUnnamed164() {
   var o = new core.List<api.OrkutLinkResource>();
   o.add(buildOrkutLinkResource());
   o.add(buildOrkutLinkResource());
   return o;
 }
 
-checkUnnamed161(core.List<api.OrkutLinkResource> o) {
+checkUnnamed164(core.List<api.OrkutLinkResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrkutLinkResource(o[0]);
   checkOrkutLinkResource(o[1]);
 }
 
-buildUnnamed162() {
+buildUnnamed165() {
   var o = new core.List<api.CommunityMessage>();
   o.add(buildCommunityMessage());
   o.add(buildCommunityMessage());
   return o;
 }
 
-checkUnnamed162(core.List<api.CommunityMessage> o) {
+checkUnnamed165(core.List<api.CommunityMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommunityMessage(o[0]);
   checkCommunityMessage(o[1]);
@@ -1025,8 +1025,8 @@
     o.kind = "foo";
     o.lastUpdate = core.DateTime.parse("2002-02-27T14:01:02");
     o.latestMessageSnippet = "foo";
-    o.links = buildUnnamed161();
-    o.messages = buildUnnamed162();
+    o.links = buildUnnamed164();
+    o.messages = buildUnnamed165();
     o.numberOfReplies = 42;
     o.title = "foo";
   }
@@ -1044,22 +1044,22 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastUpdate, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.latestMessageSnippet, unittest.equals('foo'));
-    checkUnnamed161(o.links);
-    checkUnnamed162(o.messages);
+    checkUnnamed164(o.links);
+    checkUnnamed165(o.messages);
     unittest.expect(o.numberOfReplies, unittest.equals(42));
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterCommunityTopic--;
 }
 
-buildUnnamed163() {
+buildUnnamed166() {
   var o = new core.List<api.CommunityTopic>();
   o.add(buildCommunityTopic());
   o.add(buildCommunityTopic());
   return o;
 }
 
-checkUnnamed163(core.List<api.CommunityTopic> o) {
+checkUnnamed166(core.List<api.CommunityTopic> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommunityTopic(o[0]);
   checkCommunityTopic(o[1]);
@@ -1071,7 +1071,7 @@
   buildCounterCommunityTopicList++;
   if (buildCounterCommunityTopicList < 3) {
     o.firstPageToken = "foo";
-    o.items = buildUnnamed163();
+    o.items = buildUnnamed166();
     o.kind = "foo";
     o.lastPageToken = "foo";
     o.nextPageToken = "foo";
@@ -1085,7 +1085,7 @@
   buildCounterCommunityTopicList++;
   if (buildCounterCommunityTopicList < 3) {
     unittest.expect(o.firstPageToken, unittest.equals('foo'));
-    checkUnnamed163(o.items);
+    checkUnnamed166(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastPageToken, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -1094,14 +1094,14 @@
   buildCounterCommunityTopicList--;
 }
 
-buildUnnamed164() {
+buildUnnamed167() {
   var o = new core.List<api.OrkutCounterResource>();
   o.add(buildOrkutCounterResource());
   o.add(buildOrkutCounterResource());
   return o;
 }
 
-checkUnnamed164(core.List<api.OrkutCounterResource> o) {
+checkUnnamed167(core.List<api.OrkutCounterResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrkutCounterResource(o[0]);
   checkOrkutCounterResource(o[1]);
@@ -1112,7 +1112,7 @@
   var o = new api.Counters();
   buildCounterCounters++;
   if (buildCounterCounters < 3) {
-    o.items = buildUnnamed164();
+    o.items = buildUnnamed167();
     o.kind = "foo";
   }
   buildCounterCounters--;
@@ -1122,20 +1122,20 @@
 checkCounters(api.Counters o) {
   buildCounterCounters++;
   if (buildCounterCounters < 3) {
-    checkUnnamed164(o.items);
+    checkUnnamed167(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterCounters--;
 }
 
-buildUnnamed165() {
+buildUnnamed168() {
   var o = new core.List<api.OrkutLinkResource>();
   o.add(buildOrkutLinkResource());
   o.add(buildOrkutLinkResource());
   return o;
 }
 
-checkUnnamed165(core.List<api.OrkutLinkResource> o) {
+checkUnnamed168(core.List<api.OrkutLinkResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrkutLinkResource(o[0]);
   checkOrkutLinkResource(o[1]);
@@ -1150,7 +1150,7 @@
     o.content = "foo";
     o.displayName = "foo";
     o.id = "foo";
-    o.links = buildUnnamed165();
+    o.links = buildUnnamed168();
     o.objectType = "foo";
     o.person = buildOrkutActivitypersonResource();
   }
@@ -1165,7 +1165,7 @@
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed165(o.links);
+    checkUnnamed168(o.links);
     unittest.expect(o.objectType, unittest.equals('foo'));
     checkOrkutActivitypersonResource(o.person);
   }
@@ -1377,14 +1377,14 @@
   buildCounterOrkutLinkResource--;
 }
 
-buildUnnamed166() {
+buildUnnamed169() {
   var o = new core.List<api.OrkutLinkResource>();
   o.add(buildOrkutLinkResource());
   o.add(buildOrkutLinkResource());
   return o;
 }
 
-checkUnnamed166(core.List<api.OrkutLinkResource> o) {
+checkUnnamed169(core.List<api.OrkutLinkResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOrkutLinkResource(o[0]);
   checkOrkutLinkResource(o[1]);
@@ -1396,7 +1396,7 @@
   buildCounterVisibility++;
   if (buildCounterVisibility < 3) {
     o.kind = "foo";
-    o.links = buildUnnamed166();
+    o.links = buildUnnamed169();
     o.visibility = "foo";
   }
   buildCounterVisibility--;
@@ -1407,7 +1407,7 @@
   buildCounterVisibility++;
   if (buildCounterVisibility < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed166(o.links);
+    checkUnnamed169(o.links);
     unittest.expect(o.visibility, unittest.equals('foo'));
   }
   buildCounterVisibility--;
@@ -1769,8 +1769,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("activities/"));
         pathOffset += 11;
         index = path.indexOf("/acl/", pathOffset);
@@ -1825,8 +1827,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("activities/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1874,8 +1878,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("people/"));
         pathOffset += 7;
         index = path.indexOf("/activities/", pathOffset);
@@ -1935,8 +1941,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("activities/"));
         pathOffset += 11;
         index = path.indexOf("/visibility", pathOffset);
@@ -1990,8 +1998,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("activities/"));
         pathOffset += 11;
         index = path.indexOf("/visibility", pathOffset);
@@ -2045,8 +2055,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("activities/"));
         pathOffset += 11;
         index = path.indexOf("/visibility", pathOffset);
@@ -2101,8 +2113,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("people/"));
         pathOffset += 7;
         index = path.indexOf("/badges/", pathOffset);
@@ -2155,8 +2169,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("people/"));
         pathOffset += 7;
         index = path.indexOf("/badges", pathOffset);
@@ -2210,8 +2226,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("comments/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2256,8 +2274,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("comments/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2308,8 +2328,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("activities/"));
         pathOffset += 11;
         index = path.indexOf("/comments", pathOffset);
@@ -2363,8 +2385,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("activities/"));
         pathOffset += 11;
         index = path.indexOf("/comments", pathOffset);
@@ -2423,8 +2447,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("communities/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2474,8 +2500,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("people/"));
         pathOffset += 7;
         index = path.indexOf("/communities", pathOffset);
@@ -2533,8 +2561,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("communities/"));
         pathOffset += 12;
         index = path.indexOf("/followers/", pathOffset);
@@ -2586,8 +2616,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("communities/"));
         pathOffset += 12;
         index = path.indexOf("/followers/", pathOffset);
@@ -2645,8 +2677,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("communities/"));
         pathOffset += 12;
         index = path.indexOf("/members/", pathOffset);
@@ -2699,8 +2733,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("communities/"));
         pathOffset += 12;
         index = path.indexOf("/members/", pathOffset);
@@ -2755,8 +2791,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("communities/"));
         pathOffset += 12;
         index = path.indexOf("/members/", pathOffset);
@@ -2813,8 +2851,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("communities/"));
         pathOffset += 12;
         index = path.indexOf("/members", pathOffset);
@@ -2874,8 +2914,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("communities/"));
         pathOffset += 12;
         index = path.indexOf("/topics/", pathOffset);
@@ -2938,8 +2980,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("communities/"));
         pathOffset += 12;
         index = path.indexOf("/topics/", pathOffset);
@@ -3000,8 +3044,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("communities/"));
         pathOffset += 12;
         index = path.indexOf("/topics/", pathOffset);
@@ -3070,8 +3116,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("communities/"));
         pathOffset += 12;
         index = path.indexOf("/polls/", pathOffset);
@@ -3132,8 +3180,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("communities/"));
         pathOffset += 12;
         index = path.indexOf("/polls/", pathOffset);
@@ -3202,8 +3252,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("communities/"));
         pathOffset += 12;
         index = path.indexOf("/polls/", pathOffset);
@@ -3266,8 +3318,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("communities/"));
         pathOffset += 12;
         index = path.indexOf("/polls/", pathOffset);
@@ -3324,8 +3378,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("communities/"));
         pathOffset += 12;
         index = path.indexOf("/polls", pathOffset);
@@ -3383,8 +3439,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("communities/"));
         pathOffset += 12;
         index = path.indexOf("/related", pathOffset);
@@ -3440,8 +3498,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("communities/"));
         pathOffset += 12;
         index = path.indexOf("/topics/", pathOffset);
@@ -3494,8 +3554,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("communities/"));
         pathOffset += 12;
         index = path.indexOf("/topics/", pathOffset);
@@ -3554,8 +3616,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("communities/"));
         pathOffset += 12;
         index = path.indexOf("/topics", pathOffset);
@@ -3609,8 +3673,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("communities/"));
         pathOffset += 12;
         index = path.indexOf("/topics", pathOffset);
@@ -3667,8 +3733,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("people/"));
         pathOffset += 7;
         index = path.indexOf("/counters", pathOffset);
@@ -3725,8 +3793,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/orkut/v2/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("orkut/v2/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("activities/scraps"));
         pathOffset += 17;
 
diff --git a/generated/googleapis/test/pagespeedonline/v1_test.dart b/generated/googleapis/test/pagespeedonline/v1_test.dart
index e6f3dde..066590e 100644
--- a/generated/googleapis/test/pagespeedonline/v1_test.dart
+++ b/generated/googleapis/test/pagespeedonline/v1_test.dart
@@ -37,14 +37,14 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs--;
 }
 
-buildUnnamed944() {
+buildUnnamed972() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs());
   return o;
 }
 
-checkUnnamed944(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs> o) {
+checkUnnamed972(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocksHeaderArgs(o[1]);
@@ -55,7 +55,7 @@
   var o = new api.ResultFormattedResultsRuleResultsValueUrlBlocksHeader();
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader < 3) {
-    o.args = buildUnnamed944();
+    o.args = buildUnnamed972();
     o.format = "foo";
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader--;
@@ -65,7 +65,7 @@
 checkResultFormattedResultsRuleResultsValueUrlBlocksHeader(api.ResultFormattedResultsRuleResultsValueUrlBlocksHeader o) {
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader < 3) {
-    checkUnnamed944(o.args);
+    checkUnnamed972(o.args);
     unittest.expect(o.format, unittest.equals('foo'));
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksHeader--;
@@ -92,14 +92,14 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs--;
 }
 
-buildUnnamed945() {
+buildUnnamed973() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs());
   return o;
 }
 
-checkUnnamed945(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs> o) {
+checkUnnamed973(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetailsArgs(o[1]);
@@ -110,7 +110,7 @@
   var o = new api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails();
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails < 3) {
-    o.args = buildUnnamed945();
+    o.args = buildUnnamed973();
     o.format = "foo";
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails--;
@@ -120,20 +120,20 @@
 checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails(api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails o) {
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails < 3) {
-    checkUnnamed945(o.args);
+    checkUnnamed973(o.args);
     unittest.expect(o.format, unittest.equals('foo'));
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails--;
 }
 
-buildUnnamed946() {
+buildUnnamed974() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails());
   return o;
 }
 
-checkUnnamed946(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails> o) {
+checkUnnamed974(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsDetails(o[1]);
@@ -160,14 +160,14 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs--;
 }
 
-buildUnnamed947() {
+buildUnnamed975() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs());
   return o;
 }
 
-checkUnnamed947(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs> o) {
+checkUnnamed975(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsResultArgs(o[1]);
@@ -178,7 +178,7 @@
   var o = new api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult();
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult < 3) {
-    o.args = buildUnnamed947();
+    o.args = buildUnnamed975();
     o.format = "foo";
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult--;
@@ -188,7 +188,7 @@
 checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult(api.ResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult o) {
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult < 3) {
-    checkUnnamed947(o.args);
+    checkUnnamed975(o.args);
     unittest.expect(o.format, unittest.equals('foo'));
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult--;
@@ -199,7 +199,7 @@
   var o = new api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls();
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls < 3) {
-    o.details = buildUnnamed946();
+    o.details = buildUnnamed974();
     o.result = buildResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult();
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls--;
@@ -209,20 +209,20 @@
 checkResultFormattedResultsRuleResultsValueUrlBlocksUrls(api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls o) {
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls < 3) {
-    checkUnnamed946(o.details);
+    checkUnnamed974(o.details);
     checkResultFormattedResultsRuleResultsValueUrlBlocksUrlsResult(o.result);
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocksUrls--;
 }
 
-buildUnnamed948() {
+buildUnnamed976() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrls());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocksUrls());
   return o;
 }
 
-checkUnnamed948(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls> o) {
+checkUnnamed976(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocksUrls> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrls(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocksUrls(o[1]);
@@ -234,7 +234,7 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocks < 3) {
     o.header = buildResultFormattedResultsRuleResultsValueUrlBlocksHeader();
-    o.urls = buildUnnamed948();
+    o.urls = buildUnnamed976();
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks--;
   return o;
@@ -244,19 +244,19 @@
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks++;
   if (buildCounterResultFormattedResultsRuleResultsValueUrlBlocks < 3) {
     checkResultFormattedResultsRuleResultsValueUrlBlocksHeader(o.header);
-    checkUnnamed948(o.urls);
+    checkUnnamed976(o.urls);
   }
   buildCounterResultFormattedResultsRuleResultsValueUrlBlocks--;
 }
 
-buildUnnamed949() {
+buildUnnamed977() {
   var o = new core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocks>();
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocks());
   o.add(buildResultFormattedResultsRuleResultsValueUrlBlocks());
   return o;
 }
 
-checkUnnamed949(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocks> o) {
+checkUnnamed977(core.List<api.ResultFormattedResultsRuleResultsValueUrlBlocks> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValueUrlBlocks(o[0]);
   checkResultFormattedResultsRuleResultsValueUrlBlocks(o[1]);
@@ -269,7 +269,7 @@
   if (buildCounterResultFormattedResultsRuleResultsValue < 3) {
     o.localizedRuleName = "foo";
     o.ruleImpact = 42.0;
-    o.urlBlocks = buildUnnamed949();
+    o.urlBlocks = buildUnnamed977();
   }
   buildCounterResultFormattedResultsRuleResultsValue--;
   return o;
@@ -280,19 +280,19 @@
   if (buildCounterResultFormattedResultsRuleResultsValue < 3) {
     unittest.expect(o.localizedRuleName, unittest.equals('foo'));
     unittest.expect(o.ruleImpact, unittest.equals(42.0));
-    checkUnnamed949(o.urlBlocks);
+    checkUnnamed977(o.urlBlocks);
   }
   buildCounterResultFormattedResultsRuleResultsValue--;
 }
 
-buildUnnamed950() {
+buildUnnamed978() {
   var o = new core.Map<core.String, api.ResultFormattedResultsRuleResultsValue>();
   o["x"] = buildResultFormattedResultsRuleResultsValue();
   o["y"] = buildResultFormattedResultsRuleResultsValue();
   return o;
 }
 
-checkUnnamed950(core.Map<core.String, api.ResultFormattedResultsRuleResultsValue> o) {
+checkUnnamed978(core.Map<core.String, api.ResultFormattedResultsRuleResultsValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultFormattedResultsRuleResultsValue(o["x"]);
   checkResultFormattedResultsRuleResultsValue(o["y"]);
@@ -304,7 +304,7 @@
   buildCounterResultFormattedResults++;
   if (buildCounterResultFormattedResults < 3) {
     o.locale = "foo";
-    o.ruleResults = buildUnnamed950();
+    o.ruleResults = buildUnnamed978();
   }
   buildCounterResultFormattedResults--;
   return o;
@@ -314,19 +314,19 @@
   buildCounterResultFormattedResults++;
   if (buildCounterResultFormattedResults < 3) {
     unittest.expect(o.locale, unittest.equals('foo'));
-    checkUnnamed950(o.ruleResults);
+    checkUnnamed978(o.ruleResults);
   }
   buildCounterResultFormattedResults--;
 }
 
-buildUnnamed951() {
+buildUnnamed979() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed951(core.List<core.String> o) {
+checkUnnamed979(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -428,7 +428,7 @@
   if (buildCounterResult < 3) {
     o.formattedResults = buildResultFormattedResults();
     o.id = "foo";
-    o.invalidRules = buildUnnamed951();
+    o.invalidRules = buildUnnamed979();
     o.kind = "foo";
     o.pageStats = buildResultPageStats();
     o.responseCode = 42;
@@ -446,7 +446,7 @@
   if (buildCounterResult < 3) {
     checkResultFormattedResults(o.formattedResults);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed951(o.invalidRules);
+    checkUnnamed979(o.invalidRules);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkResultPageStats(o.pageStats);
     unittest.expect(o.responseCode, unittest.equals(42));
@@ -458,14 +458,14 @@
   buildCounterResult--;
 }
 
-buildUnnamed952() {
+buildUnnamed980() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed952(core.List<core.String> o) {
+checkUnnamed980(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -607,7 +607,7 @@
       var arg_url = "foo";
       var arg_filterThirdPartyResources = true;
       var arg_locale = "foo";
-      var arg_rule = buildUnnamed952();
+      var arg_rule = buildUnnamed980();
       var arg_screenshot = true;
       var arg_strategy = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
@@ -615,8 +615,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/pagespeedonline/v1/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("pagespeedonline/v1/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("runPagespeed"));
         pathOffset += 12;
 
diff --git a/generated/googleapis/test/plus/v1_test.dart b/generated/googleapis/test/plus/v1_test.dart
index eb1782c..d8fdd7d 100644
--- a/generated/googleapis/test/plus/v1_test.dart
+++ b/generated/googleapis/test/plus/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed167() {
+buildUnnamed170() {
   var o = new core.List<api.PlusAclentryResource>();
   o.add(buildPlusAclentryResource());
   o.add(buildPlusAclentryResource());
   return o;
 }
 
-checkUnnamed167(core.List<api.PlusAclentryResource> o) {
+checkUnnamed170(core.List<api.PlusAclentryResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlusAclentryResource(o[0]);
   checkPlusAclentryResource(o[1]);
@@ -35,7 +35,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     o.description = "foo";
-    o.items = buildUnnamed167();
+    o.items = buildUnnamed170();
     o.kind = "foo";
   }
   buildCounterAcl--;
@@ -46,7 +46,7 @@
   buildCounterAcl++;
   if (buildCounterAcl < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed167(o.items);
+    checkUnnamed170(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAcl--;
@@ -282,14 +282,14 @@
   buildCounterActivityObjectAttachmentsThumbnails--;
 }
 
-buildUnnamed168() {
+buildUnnamed171() {
   var o = new core.List<api.ActivityObjectAttachmentsThumbnails>();
   o.add(buildActivityObjectAttachmentsThumbnails());
   o.add(buildActivityObjectAttachmentsThumbnails());
   return o;
 }
 
-checkUnnamed168(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
+checkUnnamed171(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachmentsThumbnails(o[0]);
   checkActivityObjectAttachmentsThumbnails(o[1]);
@@ -307,7 +307,7 @@
     o.id = "foo";
     o.image = buildActivityObjectAttachmentsImage();
     o.objectType = "foo";
-    o.thumbnails = buildUnnamed168();
+    o.thumbnails = buildUnnamed171();
     o.url = "foo";
   }
   buildCounterActivityObjectAttachments--;
@@ -324,20 +324,20 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkActivityObjectAttachmentsImage(o.image);
     unittest.expect(o.objectType, unittest.equals('foo'));
-    checkUnnamed168(o.thumbnails);
+    checkUnnamed171(o.thumbnails);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterActivityObjectAttachments--;
 }
 
-buildUnnamed169() {
+buildUnnamed172() {
   var o = new core.List<api.ActivityObjectAttachments>();
   o.add(buildActivityObjectAttachments());
   o.add(buildActivityObjectAttachments());
   return o;
 }
 
-checkUnnamed169(core.List<api.ActivityObjectAttachments> o) {
+checkUnnamed172(core.List<api.ActivityObjectAttachments> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachments(o[0]);
   checkActivityObjectAttachments(o[1]);
@@ -412,7 +412,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     o.actor = buildActivityObjectActor();
-    o.attachments = buildUnnamed169();
+    o.attachments = buildUnnamed172();
     o.content = "foo";
     o.id = "foo";
     o.objectType = "foo";
@@ -430,7 +430,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     checkActivityObjectActor(o.actor);
-    checkUnnamed169(o.attachments);
+    checkUnnamed172(o.attachments);
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
@@ -519,14 +519,14 @@
   buildCounterActivity--;
 }
 
-buildUnnamed170() {
+buildUnnamed173() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed170(core.List<api.Activity> o) {
+checkUnnamed173(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -539,7 +539,7 @@
   if (buildCounterActivityFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed170();
+    o.items = buildUnnamed173();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -556,7 +556,7 @@
   if (buildCounterActivityFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed170(o.items);
+    checkUnnamed173(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -632,14 +632,14 @@
   buildCounterCommentInReplyTo--;
 }
 
-buildUnnamed171() {
+buildUnnamed174() {
   var o = new core.List<api.CommentInReplyTo>();
   o.add(buildCommentInReplyTo());
   o.add(buildCommentInReplyTo());
   return o;
 }
 
-checkUnnamed171(core.List<api.CommentInReplyTo> o) {
+checkUnnamed174(core.List<api.CommentInReplyTo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentInReplyTo(o[0]);
   checkCommentInReplyTo(o[1]);
@@ -695,7 +695,7 @@
     o.actor = buildCommentActor();
     o.etag = "foo";
     o.id = "foo";
-    o.inReplyTo = buildUnnamed171();
+    o.inReplyTo = buildUnnamed174();
     o.kind = "foo";
     o.object = buildCommentObject();
     o.plusoners = buildCommentPlusoners();
@@ -714,7 +714,7 @@
     checkCommentActor(o.actor);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed171(o.inReplyTo);
+    checkUnnamed174(o.inReplyTo);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkCommentObject(o.object);
     checkCommentPlusoners(o.plusoners);
@@ -726,14 +726,14 @@
   buildCounterComment--;
 }
 
-buildUnnamed172() {
+buildUnnamed175() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed172(core.List<api.Comment> o) {
+checkUnnamed175(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -746,7 +746,7 @@
   if (buildCounterCommentFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed172();
+    o.items = buildUnnamed175();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -762,7 +762,7 @@
   if (buildCounterCommentFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed172(o.items);
+    checkUnnamed175(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -772,58 +772,19 @@
   buildCounterCommentFeed--;
 }
 
-buildUnnamed173() {
+buildUnnamed176() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed173(core.List<core.String> o) {
+checkUnnamed176(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed174() {
-  var o = new core.List<api.ItemScope>();
-  o.add(buildItemScope());
-  o.add(buildItemScope());
-  return o;
-}
-
-checkUnnamed174(core.List<api.ItemScope> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkItemScope(o[0]);
-  checkItemScope(o[1]);
-}
-
-buildUnnamed175() {
-  var o = new core.List<api.ItemScope>();
-  o.add(buildItemScope());
-  o.add(buildItemScope());
-  return o;
-}
-
-checkUnnamed175(core.List<api.ItemScope> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkItemScope(o[0]);
-  checkItemScope(o[1]);
-}
-
-buildUnnamed176() {
-  var o = new core.List<api.ItemScope>();
-  o.add(buildItemScope());
-  o.add(buildItemScope());
-  return o;
-}
-
-checkUnnamed176(core.List<api.ItemScope> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkItemScope(o[0]);
-  checkItemScope(o[1]);
-}
-
 buildUnnamed177() {
   var o = new core.List<api.ItemScope>();
   o.add(buildItemScope());
@@ -850,29 +811,68 @@
   checkItemScope(o[1]);
 }
 
+buildUnnamed179() {
+  var o = new core.List<api.ItemScope>();
+  o.add(buildItemScope());
+  o.add(buildItemScope());
+  return o;
+}
+
+checkUnnamed179(core.List<api.ItemScope> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkItemScope(o[0]);
+  checkItemScope(o[1]);
+}
+
+buildUnnamed180() {
+  var o = new core.List<api.ItemScope>();
+  o.add(buildItemScope());
+  o.add(buildItemScope());
+  return o;
+}
+
+checkUnnamed180(core.List<api.ItemScope> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkItemScope(o[0]);
+  checkItemScope(o[1]);
+}
+
+buildUnnamed181() {
+  var o = new core.List<api.ItemScope>();
+  o.add(buildItemScope());
+  o.add(buildItemScope());
+  return o;
+}
+
+checkUnnamed181(core.List<api.ItemScope> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkItemScope(o[0]);
+  checkItemScope(o[1]);
+}
+
 core.int buildCounterItemScope = 0;
 buildItemScope() {
   var o = new api.ItemScope();
   buildCounterItemScope++;
   if (buildCounterItemScope < 3) {
     o.about = buildItemScope();
-    o.additionalName = buildUnnamed173();
+    o.additionalName = buildUnnamed176();
     o.address = buildItemScope();
     o.addressCountry = "foo";
     o.addressLocality = "foo";
     o.addressRegion = "foo";
-    o.associatedMedia = buildUnnamed174();
+    o.associatedMedia = buildUnnamed177();
     o.attendeeCount = 42;
-    o.attendees = buildUnnamed175();
+    o.attendees = buildUnnamed178();
     o.audio = buildItemScope();
-    o.author = buildUnnamed176();
+    o.author = buildUnnamed179();
     o.bestRating = "foo";
     o.birthDate = "foo";
     o.byArtist = buildItemScope();
     o.caption = "foo";
     o.contentSize = "foo";
     o.contentUrl = "foo";
-    o.contributor = buildUnnamed177();
+    o.contributor = buildUnnamed180();
     o.dateCreated = "foo";
     o.dateModified = "foo";
     o.datePublished = "foo";
@@ -894,7 +894,7 @@
     o.longitude = 42.0;
     o.name = "foo";
     o.partOfTVSeries = buildItemScope();
-    o.performers = buildUnnamed178();
+    o.performers = buildUnnamed181();
     o.playerType = "foo";
     o.postOfficeBoxNumber = "foo";
     o.postalCode = "foo";
@@ -919,23 +919,23 @@
   buildCounterItemScope++;
   if (buildCounterItemScope < 3) {
     checkItemScope(o.about);
-    checkUnnamed173(o.additionalName);
+    checkUnnamed176(o.additionalName);
     checkItemScope(o.address);
     unittest.expect(o.addressCountry, unittest.equals('foo'));
     unittest.expect(o.addressLocality, unittest.equals('foo'));
     unittest.expect(o.addressRegion, unittest.equals('foo'));
-    checkUnnamed174(o.associatedMedia);
+    checkUnnamed177(o.associatedMedia);
     unittest.expect(o.attendeeCount, unittest.equals(42));
-    checkUnnamed175(o.attendees);
+    checkUnnamed178(o.attendees);
     checkItemScope(o.audio);
-    checkUnnamed176(o.author);
+    checkUnnamed179(o.author);
     unittest.expect(o.bestRating, unittest.equals('foo'));
     unittest.expect(o.birthDate, unittest.equals('foo'));
     checkItemScope(o.byArtist);
     unittest.expect(o.caption, unittest.equals('foo'));
     unittest.expect(o.contentSize, unittest.equals('foo'));
     unittest.expect(o.contentUrl, unittest.equals('foo'));
-    checkUnnamed177(o.contributor);
+    checkUnnamed180(o.contributor);
     unittest.expect(o.dateCreated, unittest.equals('foo'));
     unittest.expect(o.dateModified, unittest.equals('foo'));
     unittest.expect(o.datePublished, unittest.equals('foo'));
@@ -957,7 +957,7 @@
     unittest.expect(o.longitude, unittest.equals(42.0));
     unittest.expect(o.name, unittest.equals('foo'));
     checkItemScope(o.partOfTVSeries);
-    checkUnnamed178(o.performers);
+    checkUnnamed181(o.performers);
     unittest.expect(o.playerType, unittest.equals('foo'));
     unittest.expect(o.postOfficeBoxNumber, unittest.equals('foo'));
     unittest.expect(o.postalCode, unittest.equals('foo'));
@@ -1008,14 +1008,14 @@
   buildCounterMoment--;
 }
 
-buildUnnamed179() {
+buildUnnamed182() {
   var o = new core.List<api.Moment>();
   o.add(buildMoment());
   o.add(buildMoment());
   return o;
 }
 
-checkUnnamed179(core.List<api.Moment> o) {
+checkUnnamed182(core.List<api.Moment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMoment(o[0]);
   checkMoment(o[1]);
@@ -1027,7 +1027,7 @@
   buildCounterMomentsFeed++;
   if (buildCounterMomentsFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed179();
+    o.items = buildUnnamed182();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -1043,7 +1043,7 @@
   buildCounterMomentsFeed++;
   if (buildCounterMomentsFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed179(o.items);
+    checkUnnamed182(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -1054,14 +1054,14 @@
   buildCounterMomentsFeed--;
 }
 
-buildUnnamed180() {
+buildUnnamed183() {
   var o = new core.List<api.Person>();
   o.add(buildPerson());
   o.add(buildPerson());
   return o;
 }
 
-checkUnnamed180(core.List<api.Person> o) {
+checkUnnamed183(core.List<api.Person> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPerson(o[0]);
   checkPerson(o[1]);
@@ -1073,7 +1073,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed180();
+    o.items = buildUnnamed183();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1088,7 +1088,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed180(o.items);
+    checkUnnamed183(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1207,14 +1207,14 @@
   buildCounterPersonEmails--;
 }
 
-buildUnnamed181() {
+buildUnnamed184() {
   var o = new core.List<api.PersonEmails>();
   o.add(buildPersonEmails());
   o.add(buildPersonEmails());
   return o;
 }
 
-checkUnnamed181(core.List<api.PersonEmails> o) {
+checkUnnamed184(core.List<api.PersonEmails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonEmails(o[0]);
   checkPersonEmails(o[1]);
@@ -1305,14 +1305,14 @@
   buildCounterPersonOrganizations--;
 }
 
-buildUnnamed182() {
+buildUnnamed185() {
   var o = new core.List<api.PersonOrganizations>();
   o.add(buildPersonOrganizations());
   o.add(buildPersonOrganizations());
   return o;
 }
 
-checkUnnamed182(core.List<api.PersonOrganizations> o) {
+checkUnnamed185(core.List<api.PersonOrganizations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonOrganizations(o[0]);
   checkPersonOrganizations(o[1]);
@@ -1339,14 +1339,14 @@
   buildCounterPersonPlacesLived--;
 }
 
-buildUnnamed183() {
+buildUnnamed186() {
   var o = new core.List<api.PersonPlacesLived>();
   o.add(buildPersonPlacesLived());
   o.add(buildPersonPlacesLived());
   return o;
 }
 
-checkUnnamed183(core.List<api.PersonPlacesLived> o) {
+checkUnnamed186(core.List<api.PersonPlacesLived> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonPlacesLived(o[0]);
   checkPersonPlacesLived(o[1]);
@@ -1375,14 +1375,14 @@
   buildCounterPersonUrls--;
 }
 
-buildUnnamed184() {
+buildUnnamed187() {
   var o = new core.List<api.PersonUrls>();
   o.add(buildPersonUrls());
   o.add(buildPersonUrls());
   return o;
 }
 
-checkUnnamed184(core.List<api.PersonUrls> o) {
+checkUnnamed187(core.List<api.PersonUrls> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonUrls(o[0]);
   checkPersonUrls(o[1]);
@@ -1402,7 +1402,7 @@
     o.currentLocation = "foo";
     o.displayName = "foo";
     o.domain = "foo";
-    o.emails = buildUnnamed181();
+    o.emails = buildUnnamed184();
     o.etag = "foo";
     o.gender = "foo";
     o.id = "foo";
@@ -1414,14 +1414,14 @@
     o.nickname = "foo";
     o.objectType = "foo";
     o.occupation = "foo";
-    o.organizations = buildUnnamed182();
-    o.placesLived = buildUnnamed183();
+    o.organizations = buildUnnamed185();
+    o.placesLived = buildUnnamed186();
     o.plusOneCount = 42;
     o.relationshipStatus = "foo";
     o.skills = "foo";
     o.tagline = "foo";
     o.url = "foo";
-    o.urls = buildUnnamed184();
+    o.urls = buildUnnamed187();
     o.verified = true;
   }
   buildCounterPerson--;
@@ -1440,7 +1440,7 @@
     unittest.expect(o.currentLocation, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.domain, unittest.equals('foo'));
-    checkUnnamed181(o.emails);
+    checkUnnamed184(o.emails);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.gender, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1452,14 +1452,14 @@
     unittest.expect(o.nickname, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
     unittest.expect(o.occupation, unittest.equals('foo'));
-    checkUnnamed182(o.organizations);
-    checkUnnamed183(o.placesLived);
+    checkUnnamed185(o.organizations);
+    checkUnnamed186(o.placesLived);
     unittest.expect(o.plusOneCount, unittest.equals(42));
     unittest.expect(o.relationshipStatus, unittest.equals('foo'));
     unittest.expect(o.skills, unittest.equals('foo'));
     unittest.expect(o.tagline, unittest.equals('foo'));
     unittest.expect(o.url, unittest.equals('foo'));
-    checkUnnamed184(o.urls);
+    checkUnnamed187(o.urls);
     unittest.expect(o.verified, unittest.isTrue);
   }
   buildCounterPerson--;
@@ -1973,8 +1973,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/plus/v1/"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("plus/v1/"));
+        pathOffset += 8;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("activities/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2023,8 +2025,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/plus/v1/"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("plus/v1/"));
+        pathOffset += 8;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("people/"));
         pathOffset += 7;
         index = path.indexOf("/activities/", pathOffset);
@@ -2083,8 +2087,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/plus/v1/"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("plus/v1/"));
+        pathOffset += 8;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("activities"));
         pathOffset += 10;
 
@@ -2136,8 +2142,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/plus/v1/"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("plus/v1/"));
+        pathOffset += 8;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("comments/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2186,8 +2194,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/plus/v1/"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("plus/v1/"));
+        pathOffset += 8;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("activities/"));
         pathOffset += 11;
         index = path.indexOf("/comments", pathOffset);
@@ -2250,8 +2260,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/plus/v1/"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("plus/v1/"));
+        pathOffset += 8;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("people/"));
         pathOffset += 7;
         index = path.indexOf("/moments/", pathOffset);
@@ -2310,8 +2322,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/plus/v1/"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("plus/v1/"));
+        pathOffset += 8;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("people/"));
         pathOffset += 7;
         index = path.indexOf("/moments/", pathOffset);
@@ -2368,8 +2382,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/plus/v1/"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("plus/v1/"));
+        pathOffset += 8;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("moments/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2417,8 +2433,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/plus/v1/"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("plus/v1/"));
+        pathOffset += 8;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("people/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2468,8 +2486,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/plus/v1/"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("plus/v1/"));
+        pathOffset += 8;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("people/"));
         pathOffset += 7;
         index = path.indexOf("/people/", pathOffset);
@@ -2528,8 +2548,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/plus/v1/"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("plus/v1/"));
+        pathOffset += 8;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("activities/"));
         pathOffset += 11;
         index = path.indexOf("/people/", pathOffset);
@@ -2587,8 +2609,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/plus/v1/"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("plus/v1/"));
+        pathOffset += 8;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("people"));
         pathOffset += 6;
 
diff --git a/generated/googleapis/test/plusdomains/v1_test.dart b/generated/googleapis/test/plusdomains/v1_test.dart
index d77399d..690b693 100644
--- a/generated/googleapis/test/plusdomains/v1_test.dart
+++ b/generated/googleapis/test/plusdomains/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed637() {
+buildUnnamed665() {
   var o = new core.List<api.PlusDomainsAclentryResource>();
   o.add(buildPlusDomainsAclentryResource());
   o.add(buildPlusDomainsAclentryResource());
   return o;
 }
 
-checkUnnamed637(core.List<api.PlusDomainsAclentryResource> o) {
+checkUnnamed665(core.List<api.PlusDomainsAclentryResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlusDomainsAclentryResource(o[0]);
   checkPlusDomainsAclentryResource(o[1]);
@@ -36,7 +36,7 @@
   if (buildCounterAcl < 3) {
     o.description = "foo";
     o.domainRestricted = true;
-    o.items = buildUnnamed637();
+    o.items = buildUnnamed665();
     o.kind = "foo";
   }
   buildCounterAcl--;
@@ -48,7 +48,7 @@
   if (buildCounterAcl < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.domainRestricted, unittest.isTrue);
-    checkUnnamed637(o.items);
+    checkUnnamed665(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAcl--;
@@ -255,14 +255,14 @@
   buildCounterActivityObjectAttachmentsPreviewThumbnails--;
 }
 
-buildUnnamed638() {
+buildUnnamed666() {
   var o = new core.List<api.ActivityObjectAttachmentsPreviewThumbnails>();
   o.add(buildActivityObjectAttachmentsPreviewThumbnails());
   o.add(buildActivityObjectAttachmentsPreviewThumbnails());
   return o;
 }
 
-checkUnnamed638(core.List<api.ActivityObjectAttachmentsPreviewThumbnails> o) {
+checkUnnamed666(core.List<api.ActivityObjectAttachmentsPreviewThumbnails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachmentsPreviewThumbnails(o[0]);
   checkActivityObjectAttachmentsPreviewThumbnails(o[1]);
@@ -316,14 +316,14 @@
   buildCounterActivityObjectAttachmentsThumbnails--;
 }
 
-buildUnnamed639() {
+buildUnnamed667() {
   var o = new core.List<api.ActivityObjectAttachmentsThumbnails>();
   o.add(buildActivityObjectAttachmentsThumbnails());
   o.add(buildActivityObjectAttachmentsThumbnails());
   return o;
 }
 
-checkUnnamed639(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
+checkUnnamed667(core.List<api.ActivityObjectAttachmentsThumbnails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachmentsThumbnails(o[0]);
   checkActivityObjectAttachmentsThumbnails(o[1]);
@@ -341,8 +341,8 @@
     o.id = "foo";
     o.image = buildActivityObjectAttachmentsImage();
     o.objectType = "foo";
-    o.previewThumbnails = buildUnnamed638();
-    o.thumbnails = buildUnnamed639();
+    o.previewThumbnails = buildUnnamed666();
+    o.thumbnails = buildUnnamed667();
     o.url = "foo";
   }
   buildCounterActivityObjectAttachments--;
@@ -359,21 +359,21 @@
     unittest.expect(o.id, unittest.equals('foo'));
     checkActivityObjectAttachmentsImage(o.image);
     unittest.expect(o.objectType, unittest.equals('foo'));
-    checkUnnamed638(o.previewThumbnails);
-    checkUnnamed639(o.thumbnails);
+    checkUnnamed666(o.previewThumbnails);
+    checkUnnamed667(o.thumbnails);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterActivityObjectAttachments--;
 }
 
-buildUnnamed640() {
+buildUnnamed668() {
   var o = new core.List<api.ActivityObjectAttachments>();
   o.add(buildActivityObjectAttachments());
   o.add(buildActivityObjectAttachments());
   return o;
 }
 
-checkUnnamed640(core.List<api.ActivityObjectAttachments> o) {
+checkUnnamed668(core.List<api.ActivityObjectAttachments> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivityObjectAttachments(o[0]);
   checkActivityObjectAttachments(o[1]);
@@ -475,7 +475,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     o.actor = buildActivityObjectActor();
-    o.attachments = buildUnnamed640();
+    o.attachments = buildUnnamed668();
     o.content = "foo";
     o.id = "foo";
     o.objectType = "foo";
@@ -494,7 +494,7 @@
   buildCounterActivityObject++;
   if (buildCounterActivityObject < 3) {
     checkActivityObjectActor(o.actor);
-    checkUnnamed640(o.attachments);
+    checkUnnamed668(o.attachments);
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
@@ -584,14 +584,14 @@
   buildCounterActivity--;
 }
 
-buildUnnamed641() {
+buildUnnamed669() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed641(core.List<api.Activity> o) {
+checkUnnamed669(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -604,7 +604,7 @@
   if (buildCounterActivityFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed641();
+    o.items = buildUnnamed669();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -621,7 +621,7 @@
   if (buildCounterActivityFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed641(o.items);
+    checkUnnamed669(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -659,14 +659,14 @@
   buildCounterAudience--;
 }
 
-buildUnnamed642() {
+buildUnnamed670() {
   var o = new core.List<api.Audience>();
   o.add(buildAudience());
   o.add(buildAudience());
   return o;
 }
 
-checkUnnamed642(core.List<api.Audience> o) {
+checkUnnamed670(core.List<api.Audience> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAudience(o[0]);
   checkAudience(o[1]);
@@ -678,7 +678,7 @@
   buildCounterAudiencesFeed++;
   if (buildCounterAudiencesFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed642();
+    o.items = buildUnnamed670();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.totalItems = 42;
@@ -691,7 +691,7 @@
   buildCounterAudiencesFeed++;
   if (buildCounterAudiencesFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed642(o.items);
+    checkUnnamed670(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalItems, unittest.equals(42));
@@ -749,14 +749,14 @@
   buildCounterCircle--;
 }
 
-buildUnnamed643() {
+buildUnnamed671() {
   var o = new core.List<api.Circle>();
   o.add(buildCircle());
   o.add(buildCircle());
   return o;
 }
 
-checkUnnamed643(core.List<api.Circle> o) {
+checkUnnamed671(core.List<api.Circle> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCircle(o[0]);
   checkCircle(o[1]);
@@ -768,7 +768,7 @@
   buildCounterCircleFeed++;
   if (buildCounterCircleFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed643();
+    o.items = buildUnnamed671();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -784,7 +784,7 @@
   buildCounterCircleFeed++;
   if (buildCounterCircleFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed643(o.items);
+    checkUnnamed671(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -860,14 +860,14 @@
   buildCounterCommentInReplyTo--;
 }
 
-buildUnnamed644() {
+buildUnnamed672() {
   var o = new core.List<api.CommentInReplyTo>();
   o.add(buildCommentInReplyTo());
   o.add(buildCommentInReplyTo());
   return o;
 }
 
-checkUnnamed644(core.List<api.CommentInReplyTo> o) {
+checkUnnamed672(core.List<api.CommentInReplyTo> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCommentInReplyTo(o[0]);
   checkCommentInReplyTo(o[1]);
@@ -923,7 +923,7 @@
     o.actor = buildCommentActor();
     o.etag = "foo";
     o.id = "foo";
-    o.inReplyTo = buildUnnamed644();
+    o.inReplyTo = buildUnnamed672();
     o.kind = "foo";
     o.object = buildCommentObject();
     o.plusoners = buildCommentPlusoners();
@@ -942,7 +942,7 @@
     checkCommentActor(o.actor);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed644(o.inReplyTo);
+    checkUnnamed672(o.inReplyTo);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkCommentObject(o.object);
     checkCommentPlusoners(o.plusoners);
@@ -954,14 +954,14 @@
   buildCounterComment--;
 }
 
-buildUnnamed645() {
+buildUnnamed673() {
   var o = new core.List<api.Comment>();
   o.add(buildComment());
   o.add(buildComment());
   return o;
 }
 
-checkUnnamed645(core.List<api.Comment> o) {
+checkUnnamed673(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComment(o[0]);
   checkComment(o[1]);
@@ -974,7 +974,7 @@
   if (buildCounterCommentFeed < 3) {
     o.etag = "foo";
     o.id = "foo";
-    o.items = buildUnnamed645();
+    o.items = buildUnnamed673();
     o.kind = "foo";
     o.nextLink = "foo";
     o.nextPageToken = "foo";
@@ -990,7 +990,7 @@
   if (buildCounterCommentFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed645(o.items);
+    checkUnnamed673(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -1063,14 +1063,14 @@
   buildCounterMediaExif--;
 }
 
-buildUnnamed646() {
+buildUnnamed674() {
   var o = new core.List<api.Videostream>();
   o.add(buildVideostream());
   o.add(buildVideostream());
   return o;
 }
 
-checkUnnamed646(core.List<api.Videostream> o) {
+checkUnnamed674(core.List<api.Videostream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideostream(o[0]);
   checkVideostream(o[1]);
@@ -1092,7 +1092,7 @@
     o.mediaUrl = "foo";
     o.published = core.DateTime.parse("2002-02-27T14:01:02");
     o.sizeBytes = "foo";
-    o.streams = buildUnnamed646();
+    o.streams = buildUnnamed674();
     o.summary = "foo";
     o.updated = core.DateTime.parse("2002-02-27T14:01:02");
     o.url = "foo";
@@ -1118,7 +1118,7 @@
     unittest.expect(o.mediaUrl, unittest.equals('foo'));
     unittest.expect(o.published, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.sizeBytes, unittest.equals('foo'));
-    checkUnnamed646(o.streams);
+    checkUnnamed674(o.streams);
     unittest.expect(o.summary, unittest.equals('foo'));
     unittest.expect(o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.url, unittest.equals('foo'));
@@ -1129,14 +1129,14 @@
   buildCounterMedia--;
 }
 
-buildUnnamed647() {
+buildUnnamed675() {
   var o = new core.List<api.Person>();
   o.add(buildPerson());
   o.add(buildPerson());
   return o;
 }
 
-checkUnnamed647(core.List<api.Person> o) {
+checkUnnamed675(core.List<api.Person> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPerson(o[0]);
   checkPerson(o[1]);
@@ -1148,7 +1148,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed647();
+    o.items = buildUnnamed675();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -1163,7 +1163,7 @@
   buildCounterPeopleFeed++;
   if (buildCounterPeopleFeed < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed647(o.items);
+    checkUnnamed675(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1261,14 +1261,14 @@
   buildCounterPersonEmails--;
 }
 
-buildUnnamed648() {
+buildUnnamed676() {
   var o = new core.List<api.PersonEmails>();
   o.add(buildPersonEmails());
   o.add(buildPersonEmails());
   return o;
 }
 
-checkUnnamed648(core.List<api.PersonEmails> o) {
+checkUnnamed676(core.List<api.PersonEmails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonEmails(o[0]);
   checkPersonEmails(o[1]);
@@ -1359,14 +1359,14 @@
   buildCounterPersonOrganizations--;
 }
 
-buildUnnamed649() {
+buildUnnamed677() {
   var o = new core.List<api.PersonOrganizations>();
   o.add(buildPersonOrganizations());
   o.add(buildPersonOrganizations());
   return o;
 }
 
-checkUnnamed649(core.List<api.PersonOrganizations> o) {
+checkUnnamed677(core.List<api.PersonOrganizations> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonOrganizations(o[0]);
   checkPersonOrganizations(o[1]);
@@ -1393,14 +1393,14 @@
   buildCounterPersonPlacesLived--;
 }
 
-buildUnnamed650() {
+buildUnnamed678() {
   var o = new core.List<api.PersonPlacesLived>();
   o.add(buildPersonPlacesLived());
   o.add(buildPersonPlacesLived());
   return o;
 }
 
-checkUnnamed650(core.List<api.PersonPlacesLived> o) {
+checkUnnamed678(core.List<api.PersonPlacesLived> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonPlacesLived(o[0]);
   checkPersonPlacesLived(o[1]);
@@ -1429,14 +1429,14 @@
   buildCounterPersonUrls--;
 }
 
-buildUnnamed651() {
+buildUnnamed679() {
   var o = new core.List<api.PersonUrls>();
   o.add(buildPersonUrls());
   o.add(buildPersonUrls());
   return o;
 }
 
-checkUnnamed651(core.List<api.PersonUrls> o) {
+checkUnnamed679(core.List<api.PersonUrls> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPersonUrls(o[0]);
   checkPersonUrls(o[1]);
@@ -1455,7 +1455,7 @@
     o.currentLocation = "foo";
     o.displayName = "foo";
     o.domain = "foo";
-    o.emails = buildUnnamed648();
+    o.emails = buildUnnamed676();
     o.etag = "foo";
     o.gender = "foo";
     o.id = "foo";
@@ -1466,14 +1466,14 @@
     o.nickname = "foo";
     o.objectType = "foo";
     o.occupation = "foo";
-    o.organizations = buildUnnamed649();
-    o.placesLived = buildUnnamed650();
+    o.organizations = buildUnnamed677();
+    o.placesLived = buildUnnamed678();
     o.plusOneCount = 42;
     o.relationshipStatus = "foo";
     o.skills = "foo";
     o.tagline = "foo";
     o.url = "foo";
-    o.urls = buildUnnamed651();
+    o.urls = buildUnnamed679();
     o.verified = true;
   }
   buildCounterPerson--;
@@ -1491,7 +1491,7 @@
     unittest.expect(o.currentLocation, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.domain, unittest.equals('foo'));
-    checkUnnamed648(o.emails);
+    checkUnnamed676(o.emails);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.gender, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1502,14 +1502,14 @@
     unittest.expect(o.nickname, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
     unittest.expect(o.occupation, unittest.equals('foo'));
-    checkUnnamed649(o.organizations);
-    checkUnnamed650(o.placesLived);
+    checkUnnamed677(o.organizations);
+    checkUnnamed678(o.placesLived);
     unittest.expect(o.plusOneCount, unittest.equals(42));
     unittest.expect(o.relationshipStatus, unittest.equals('foo'));
     unittest.expect(o.skills, unittest.equals('foo'));
     unittest.expect(o.tagline, unittest.equals('foo'));
     unittest.expect(o.url, unittest.equals('foo'));
-    checkUnnamed651(o.urls);
+    checkUnnamed679(o.urls);
     unittest.expect(o.verified, unittest.isTrue);
   }
   buildCounterPerson--;
@@ -1630,53 +1630,53 @@
   buildCounterVideostream--;
 }
 
-buildUnnamed652() {
+buildUnnamed680() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed652(core.List<core.String> o) {
+checkUnnamed680(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed653() {
+buildUnnamed681() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed653(core.List<core.String> o) {
+checkUnnamed681(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed654() {
+buildUnnamed682() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed654(core.List<core.String> o) {
+checkUnnamed682(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed655() {
+buildUnnamed683() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed655(core.List<core.String> o) {
+checkUnnamed683(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2172,8 +2172,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/plusDomains/v1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("plusDomains/v1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("activities/"));
         pathOffset += 11;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2224,8 +2226,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/plusDomains/v1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("plusDomains/v1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("people/"));
         pathOffset += 7;
         index = path.indexOf("/activities", pathOffset);
@@ -2279,8 +2283,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/plusDomains/v1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("plusDomains/v1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("people/"));
         pathOffset += 7;
         index = path.indexOf("/activities/", pathOffset);
@@ -2341,8 +2347,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/plusDomains/v1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("plusDomains/v1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("people/"));
         pathOffset += 7;
         index = path.indexOf("/audiences", pathOffset);
@@ -2393,15 +2401,17 @@
       var mock = new common_test.HttpServerMock();
       api.CirclesResourceApi res = new api.PlusDomainsApi(mock).circles;
       var arg_circleId = "foo";
-      var arg_email = buildUnnamed652();
-      var arg_userId = buildUnnamed653();
+      var arg_email = buildUnnamed680();
+      var arg_userId = buildUnnamed681();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/plusDomains/v1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("plusDomains/v1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("circles/"));
         pathOffset += 8;
         index = path.indexOf("/people", pathOffset);
@@ -2453,8 +2463,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/plusDomains/v1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("plusDomains/v1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("circles/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2504,8 +2516,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/plusDomains/v1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("plusDomains/v1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("people/"));
         pathOffset += 7;
         index = path.indexOf("/circles", pathOffset);
@@ -2557,8 +2571,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/plusDomains/v1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("plusDomains/v1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("people/"));
         pathOffset += 7;
         index = path.indexOf("/circles", pathOffset);
@@ -2614,8 +2630,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/plusDomains/v1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("plusDomains/v1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("circles/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2661,8 +2679,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/plusDomains/v1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("plusDomains/v1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("circles/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2701,15 +2721,17 @@
       var mock = new common_test.HttpServerMock();
       api.CirclesResourceApi res = new api.PlusDomainsApi(mock).circles;
       var arg_circleId = "foo";
-      var arg_email = buildUnnamed654();
-      var arg_userId = buildUnnamed655();
+      var arg_email = buildUnnamed682();
+      var arg_userId = buildUnnamed683();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/plusDomains/v1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("plusDomains/v1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("circles/"));
         pathOffset += 8;
         index = path.indexOf("/people", pathOffset);
@@ -2763,8 +2785,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/plusDomains/v1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("plusDomains/v1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("circles/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2814,8 +2838,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/plusDomains/v1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("plusDomains/v1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("comments/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2865,8 +2891,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/plusDomains/v1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("plusDomains/v1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("activities/"));
         pathOffset += 11;
         index = path.indexOf("/comments", pathOffset);
@@ -2919,8 +2947,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/plusDomains/v1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("plusDomains/v1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("activities/"));
         pathOffset += 11;
         index = path.indexOf("/comments", pathOffset);
@@ -2984,8 +3014,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/plusDomains/v1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("plusDomains/v1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("people/"));
         pathOffset += 7;
         index = path.indexOf("/media/", pathOffset);
@@ -3042,8 +3074,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/plusDomains/v1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("plusDomains/v1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("people/"));
         pathOffset += 7;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -3093,8 +3127,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/plusDomains/v1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("plusDomains/v1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("people/"));
         pathOffset += 7;
         index = path.indexOf("/people/", pathOffset);
@@ -3153,8 +3189,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/plusDomains/v1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("plusDomains/v1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("activities/"));
         pathOffset += 11;
         index = path.indexOf("/people/", pathOffset);
@@ -3211,8 +3249,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/plusDomains/v1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("plusDomains/v1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("circles/"));
         pathOffset += 8;
         index = path.indexOf("/people", pathOffset);
diff --git a/generated/googleapis/test/prediction/v1_6_test.dart b/generated/googleapis/test/prediction/v1_6_test.dart
index 184f97d..4f0e790 100644
--- a/generated/googleapis/test/prediction/v1_6_test.dart
+++ b/generated/googleapis/test/prediction/v1_6_test.dart
@@ -37,14 +37,14 @@
   buildCounterAnalyzeDataDescriptionFeaturesCategoricalValues--;
 }
 
-buildUnnamed765() {
+buildUnnamed793() {
   var o = new core.List<api.AnalyzeDataDescriptionFeaturesCategoricalValues>();
   o.add(buildAnalyzeDataDescriptionFeaturesCategoricalValues());
   o.add(buildAnalyzeDataDescriptionFeaturesCategoricalValues());
   return o;
 }
 
-checkUnnamed765(core.List<api.AnalyzeDataDescriptionFeaturesCategoricalValues> o) {
+checkUnnamed793(core.List<api.AnalyzeDataDescriptionFeaturesCategoricalValues> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnalyzeDataDescriptionFeaturesCategoricalValues(o[0]);
   checkAnalyzeDataDescriptionFeaturesCategoricalValues(o[1]);
@@ -56,7 +56,7 @@
   buildCounterAnalyzeDataDescriptionFeaturesCategorical++;
   if (buildCounterAnalyzeDataDescriptionFeaturesCategorical < 3) {
     o.count = "foo";
-    o.values = buildUnnamed765();
+    o.values = buildUnnamed793();
   }
   buildCounterAnalyzeDataDescriptionFeaturesCategorical--;
   return o;
@@ -66,7 +66,7 @@
   buildCounterAnalyzeDataDescriptionFeaturesCategorical++;
   if (buildCounterAnalyzeDataDescriptionFeaturesCategorical < 3) {
     unittest.expect(o.count, unittest.equals('foo'));
-    checkUnnamed765(o.values);
+    checkUnnamed793(o.values);
   }
   buildCounterAnalyzeDataDescriptionFeaturesCategorical--;
 }
@@ -138,14 +138,14 @@
   buildCounterAnalyzeDataDescriptionFeatures--;
 }
 
-buildUnnamed766() {
+buildUnnamed794() {
   var o = new core.List<api.AnalyzeDataDescriptionFeatures>();
   o.add(buildAnalyzeDataDescriptionFeatures());
   o.add(buildAnalyzeDataDescriptionFeatures());
   return o;
 }
 
-checkUnnamed766(core.List<api.AnalyzeDataDescriptionFeatures> o) {
+checkUnnamed794(core.List<api.AnalyzeDataDescriptionFeatures> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnalyzeDataDescriptionFeatures(o[0]);
   checkAnalyzeDataDescriptionFeatures(o[1]);
@@ -195,14 +195,14 @@
   buildCounterAnalyzeDataDescriptionOutputFeatureText--;
 }
 
-buildUnnamed767() {
+buildUnnamed795() {
   var o = new core.List<api.AnalyzeDataDescriptionOutputFeatureText>();
   o.add(buildAnalyzeDataDescriptionOutputFeatureText());
   o.add(buildAnalyzeDataDescriptionOutputFeatureText());
   return o;
 }
 
-checkUnnamed767(core.List<api.AnalyzeDataDescriptionOutputFeatureText> o) {
+checkUnnamed795(core.List<api.AnalyzeDataDescriptionOutputFeatureText> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAnalyzeDataDescriptionOutputFeatureText(o[0]);
   checkAnalyzeDataDescriptionOutputFeatureText(o[1]);
@@ -214,7 +214,7 @@
   buildCounterAnalyzeDataDescriptionOutputFeature++;
   if (buildCounterAnalyzeDataDescriptionOutputFeature < 3) {
     o.numeric = buildAnalyzeDataDescriptionOutputFeatureNumeric();
-    o.text = buildUnnamed767();
+    o.text = buildUnnamed795();
   }
   buildCounterAnalyzeDataDescriptionOutputFeature--;
   return o;
@@ -224,7 +224,7 @@
   buildCounterAnalyzeDataDescriptionOutputFeature++;
   if (buildCounterAnalyzeDataDescriptionOutputFeature < 3) {
     checkAnalyzeDataDescriptionOutputFeatureNumeric(o.numeric);
-    checkUnnamed767(o.text);
+    checkUnnamed795(o.text);
   }
   buildCounterAnalyzeDataDescriptionOutputFeature--;
 }
@@ -234,7 +234,7 @@
   var o = new api.AnalyzeDataDescription();
   buildCounterAnalyzeDataDescription++;
   if (buildCounterAnalyzeDataDescription < 3) {
-    o.features = buildUnnamed766();
+    o.features = buildUnnamed794();
     o.outputFeature = buildAnalyzeDataDescriptionOutputFeature();
   }
   buildCounterAnalyzeDataDescription--;
@@ -244,72 +244,72 @@
 checkAnalyzeDataDescription(api.AnalyzeDataDescription o) {
   buildCounterAnalyzeDataDescription++;
   if (buildCounterAnalyzeDataDescription < 3) {
-    checkUnnamed766(o.features);
+    checkUnnamed794(o.features);
     checkAnalyzeDataDescriptionOutputFeature(o.outputFeature);
   }
   buildCounterAnalyzeDataDescription--;
 }
 
-buildUnnamed768() {
+buildUnnamed796() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed768(core.Map<core.String, core.String> o) {
+checkUnnamed796(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed769() {
+buildUnnamed797() {
   var o = new core.List<core.Map<core.String, core.String>>();
-  o.add(buildUnnamed768());
-  o.add(buildUnnamed768());
+  o.add(buildUnnamed796());
+  o.add(buildUnnamed796());
   return o;
 }
 
-checkUnnamed769(core.List<core.Map<core.String, core.String>> o) {
+checkUnnamed797(core.List<core.Map<core.String, core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed768(o[0]);
-  checkUnnamed768(o[1]);
+  checkUnnamed796(o[0]);
+  checkUnnamed796(o[1]);
 }
 
-buildUnnamed770() {
+buildUnnamed798() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed770(core.Map<core.String, core.String> o) {
+checkUnnamed798(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed771() {
+buildUnnamed799() {
   var o = new core.Map<core.String, core.Map<core.String, core.String>>();
-  o["x"] = buildUnnamed770();
-  o["y"] = buildUnnamed770();
+  o["x"] = buildUnnamed798();
+  o["y"] = buildUnnamed798();
   return o;
 }
 
-checkUnnamed771(core.Map<core.String, core.Map<core.String, core.String>> o) {
+checkUnnamed799(core.Map<core.String, core.Map<core.String, core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed770(o["x"]);
-  checkUnnamed770(o["y"]);
+  checkUnnamed798(o["x"]);
+  checkUnnamed798(o["y"]);
 }
 
-buildUnnamed772() {
+buildUnnamed800() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed772(core.Map<core.String, core.String> o) {
+checkUnnamed800(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -320,8 +320,8 @@
   var o = new api.AnalyzeModelDescription();
   buildCounterAnalyzeModelDescription++;
   if (buildCounterAnalyzeModelDescription < 3) {
-    o.confusionMatrix = buildUnnamed771();
-    o.confusionMatrixRowTotals = buildUnnamed772();
+    o.confusionMatrix = buildUnnamed799();
+    o.confusionMatrixRowTotals = buildUnnamed800();
     o.modelinfo = buildInsert2();
   }
   buildCounterAnalyzeModelDescription--;
@@ -331,8 +331,8 @@
 checkAnalyzeModelDescription(api.AnalyzeModelDescription o) {
   buildCounterAnalyzeModelDescription++;
   if (buildCounterAnalyzeModelDescription < 3) {
-    checkUnnamed771(o.confusionMatrix);
-    checkUnnamed772(o.confusionMatrixRowTotals);
+    checkUnnamed799(o.confusionMatrix);
+    checkUnnamed800(o.confusionMatrixRowTotals);
     checkInsert2(o.modelinfo);
   }
   buildCounterAnalyzeModelDescription--;
@@ -344,7 +344,7 @@
   buildCounterAnalyze++;
   if (buildCounterAnalyze < 3) {
     o.dataDescription = buildAnalyzeDataDescription();
-    o.errors = buildUnnamed769();
+    o.errors = buildUnnamed797();
     o.id = "foo";
     o.kind = "foo";
     o.modelDescription = buildAnalyzeModelDescription();
@@ -358,7 +358,7 @@
   buildCounterAnalyze++;
   if (buildCounterAnalyze < 3) {
     checkAnalyzeDataDescription(o.dataDescription);
-    checkUnnamed769(o.errors);
+    checkUnnamed797(o.errors);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkAnalyzeModelDescription(o.modelDescription);
@@ -367,14 +367,14 @@
   buildCounterAnalyze--;
 }
 
-buildUnnamed773() {
+buildUnnamed801() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed773(core.List<core.Object> o) {
+checkUnnamed801(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) 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')); 
   var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
@@ -385,7 +385,7 @@
   var o = new api.InputInput();
   buildCounterInputInput++;
   if (buildCounterInputInput < 3) {
-    o.csvInstance = buildUnnamed773();
+    o.csvInstance = buildUnnamed801();
   }
   buildCounterInputInput--;
   return o;
@@ -394,7 +394,7 @@
 checkInputInput(api.InputInput o) {
   buildCounterInputInput++;
   if (buildCounterInputInput < 3) {
-    checkUnnamed773(o.csvInstance);
+    checkUnnamed801(o.csvInstance);
   }
   buildCounterInputInput--;
 }
@@ -418,14 +418,14 @@
   buildCounterInput--;
 }
 
-buildUnnamed774() {
+buildUnnamed802() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed774(core.List<core.Object> o) {
+checkUnnamed802(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted3 = (o[0]) as core.Map; unittest.expect(casted3, unittest.hasLength(3)); unittest.expect(casted3["list"], unittest.equals([1, 2, 3])); unittest.expect(casted3["bool"], unittest.equals(true)); unittest.expect(casted3["string"], unittest.equals('foo')); 
   var casted4 = (o[1]) as core.Map; unittest.expect(casted4, unittest.hasLength(3)); unittest.expect(casted4["list"], unittest.equals([1, 2, 3])); unittest.expect(casted4["bool"], unittest.equals(true)); unittest.expect(casted4["string"], unittest.equals('foo')); 
@@ -436,7 +436,7 @@
   var o = new api.InsertTrainingInstances();
   buildCounterInsertTrainingInstances++;
   if (buildCounterInsertTrainingInstances < 3) {
-    o.csvInstance = buildUnnamed774();
+    o.csvInstance = buildUnnamed802();
     o.output = "foo";
   }
   buildCounterInsertTrainingInstances--;
@@ -446,49 +446,49 @@
 checkInsertTrainingInstances(api.InsertTrainingInstances o) {
   buildCounterInsertTrainingInstances++;
   if (buildCounterInsertTrainingInstances < 3) {
-    checkUnnamed774(o.csvInstance);
+    checkUnnamed802(o.csvInstance);
     unittest.expect(o.output, unittest.equals('foo'));
   }
   buildCounterInsertTrainingInstances--;
 }
 
-buildUnnamed775() {
+buildUnnamed803() {
   var o = new core.List<api.InsertTrainingInstances>();
   o.add(buildInsertTrainingInstances());
   o.add(buildInsertTrainingInstances());
   return o;
 }
 
-checkUnnamed775(core.List<api.InsertTrainingInstances> o) {
+checkUnnamed803(core.List<api.InsertTrainingInstances> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInsertTrainingInstances(o[0]);
   checkInsertTrainingInstances(o[1]);
 }
 
-buildUnnamed776() {
+buildUnnamed804() {
   var o = new core.Map<core.String, core.double>();
   o["x"] = 42.0;
   o["y"] = 42.0;
   return o;
 }
 
-checkUnnamed776(core.Map<core.String, core.double> o) {
+checkUnnamed804(core.Map<core.String, core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals(42.0));
   unittest.expect(o["y"], unittest.equals(42.0));
 }
 
-buildUnnamed777() {
+buildUnnamed805() {
   var o = new core.List<core.Map<core.String, core.double>>();
-  o.add(buildUnnamed776());
-  o.add(buildUnnamed776());
+  o.add(buildUnnamed804());
+  o.add(buildUnnamed804());
   return o;
 }
 
-checkUnnamed777(core.List<core.Map<core.String, core.double>> o) {
+checkUnnamed805(core.List<core.Map<core.String, core.double>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed776(o[0]);
-  checkUnnamed776(o[1]);
+  checkUnnamed804(o[0]);
+  checkUnnamed804(o[1]);
 }
 
 core.int buildCounterInsert = 0;
@@ -502,8 +502,8 @@
     o.storageDataLocation = "foo";
     o.storagePMMLLocation = "foo";
     o.storagePMMLModelLocation = "foo";
-    o.trainingInstances = buildUnnamed775();
-    o.utility = buildUnnamed777();
+    o.trainingInstances = buildUnnamed803();
+    o.utility = buildUnnamed805();
   }
   buildCounterInsert--;
   return o;
@@ -518,8 +518,8 @@
     unittest.expect(o.storageDataLocation, unittest.equals('foo'));
     unittest.expect(o.storagePMMLLocation, unittest.equals('foo'));
     unittest.expect(o.storagePMMLModelLocation, unittest.equals('foo'));
-    checkUnnamed775(o.trainingInstances);
-    checkUnnamed777(o.utility);
+    checkUnnamed803(o.trainingInstances);
+    checkUnnamed805(o.utility);
   }
   buildCounterInsert--;
 }
@@ -592,14 +592,14 @@
   buildCounterInsert2--;
 }
 
-buildUnnamed778() {
+buildUnnamed806() {
   var o = new core.List<api.Insert2>();
   o.add(buildInsert2());
   o.add(buildInsert2());
   return o;
 }
 
-checkUnnamed778(core.List<api.Insert2> o) {
+checkUnnamed806(core.List<api.Insert2> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInsert2(o[0]);
   checkInsert2(o[1]);
@@ -610,7 +610,7 @@
   var o = new api.List();
   buildCounterList++;
   if (buildCounterList < 3) {
-    o.items = buildUnnamed778();
+    o.items = buildUnnamed806();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -622,7 +622,7 @@
 checkList(api.List o) {
   buildCounterList++;
   if (buildCounterList < 3) {
-    checkUnnamed778(o.items);
+    checkUnnamed806(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -651,14 +651,14 @@
   buildCounterOutputOutputMulti--;
 }
 
-buildUnnamed779() {
+buildUnnamed807() {
   var o = new core.List<api.OutputOutputMulti>();
   o.add(buildOutputOutputMulti());
   o.add(buildOutputOutputMulti());
   return o;
 }
 
-checkUnnamed779(core.List<api.OutputOutputMulti> o) {
+checkUnnamed807(core.List<api.OutputOutputMulti> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOutputOutputMulti(o[0]);
   checkOutputOutputMulti(o[1]);
@@ -672,8 +672,8 @@
     o.id = "foo";
     o.kind = "foo";
     o.outputLabel = "foo";
-    o.outputMulti = buildUnnamed779();
-    o.outputValue = 42.0;
+    o.outputMulti = buildUnnamed807();
+    o.outputValue = "foo";
     o.selfLink = "foo";
   }
   buildCounterOutput--;
@@ -686,21 +686,21 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.outputLabel, unittest.equals('foo'));
-    checkUnnamed779(o.outputMulti);
-    unittest.expect(o.outputValue, unittest.equals(42.0));
+    checkUnnamed807(o.outputMulti);
+    unittest.expect(o.outputValue, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
   buildCounterOutput--;
 }
 
-buildUnnamed780() {
+buildUnnamed808() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed780(core.List<core.Object> o) {
+checkUnnamed808(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted5 = (o[0]) as core.Map; unittest.expect(casted5, unittest.hasLength(3)); unittest.expect(casted5["list"], unittest.equals([1, 2, 3])); unittest.expect(casted5["bool"], unittest.equals(true)); unittest.expect(casted5["string"], unittest.equals('foo')); 
   var casted6 = (o[1]) as core.Map; unittest.expect(casted6, unittest.hasLength(3)); unittest.expect(casted6["list"], unittest.equals([1, 2, 3])); unittest.expect(casted6["bool"], unittest.equals(true)); unittest.expect(casted6["string"], unittest.equals('foo')); 
@@ -711,7 +711,7 @@
   var o = new api.Update();
   buildCounterUpdate++;
   if (buildCounterUpdate < 3) {
-    o.csvInstance = buildUnnamed780();
+    o.csvInstance = buildUnnamed808();
     o.output = "foo";
   }
   buildCounterUpdate--;
@@ -721,7 +721,7 @@
 checkUpdate(api.Update o) {
   buildCounterUpdate++;
   if (buildCounterUpdate < 3) {
-    checkUnnamed780(o.csvInstance);
+    checkUnnamed808(o.csvInstance);
     unittest.expect(o.output, unittest.equals('foo'));
   }
   buildCounterUpdate--;
@@ -934,22 +934,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/prediction/v1.6/projects/"));
-        pathOffset += 26;
-        index = path.indexOf("/hostedmodels/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/hostedmodels/"));
-        pathOffset += 14;
-        index = path.indexOf("/predict", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_hostedModelName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/predict"));
-        pathOffset += 8;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -995,22 +981,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/prediction/v1.6/projects/"));
-        pathOffset += 26;
-        index = path.indexOf("/trainedmodels/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/trainedmodels/"));
-        pathOffset += 15;
-        index = path.indexOf("/analyze", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/analyze"));
-        pathOffset += 8;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1052,18 +1024,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/prediction/v1.6/projects/"));
-        pathOffset += 26;
-        index = path.indexOf("/trainedmodels/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/trainedmodels/"));
-        pathOffset += 15;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1103,18 +1065,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/prediction/v1.6/projects/"));
-        pathOffset += 26;
-        index = path.indexOf("/trainedmodels/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/trainedmodels/"));
-        pathOffset += 15;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1159,15 +1111,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/prediction/v1.6/projects/"));
-        pathOffset += 26;
-        index = path.indexOf("/trainedmodels", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/trainedmodels"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1210,15 +1155,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/prediction/v1.6/projects/"));
-        pathOffset += 26;
-        index = path.indexOf("/trainedmodels/list", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("/trainedmodels/list"));
-        pathOffset += 19;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1266,22 +1204,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/prediction/v1.6/projects/"));
-        pathOffset += 26;
-        index = path.indexOf("/trainedmodels/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/trainedmodels/"));
-        pathOffset += 15;
-        index = path.indexOf("/predict", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/predict"));
-        pathOffset += 8;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1327,18 +1251,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/prediction/v1.6/projects/"));
-        pathOffset += 26;
-        index = path.indexOf("/trainedmodels/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/trainedmodels/"));
-        pathOffset += 15;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_id"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
diff --git a/generated/googleapis/test/qpxexpress/v1_test.dart b/generated/googleapis/test/qpxexpress/v1_test.dart
index 465ca75..daea4bc 100644
--- a/generated/googleapis/test/qpxexpress/v1_test.dart
+++ b/generated/googleapis/test/qpxexpress/v1_test.dart
@@ -1173,8 +1173,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/qpxExpress/v1/trips/"));
-        pathOffset += 21;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("qpxExpress/v1/trips/"));
+        pathOffset += 20;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("search"));
         pathOffset += 6;
 
diff --git a/generated/googleapis/test/reseller/v1_test.dart b/generated/googleapis/test/reseller/v1_test.dart
index 3919a86..8045341 100644
--- a/generated/googleapis/test/reseller/v1_test.dart
+++ b/generated/googleapis/test/reseller/v1_test.dart
@@ -282,14 +282,14 @@
   buildCounterSubscription--;
 }
 
-buildUnnamed932() {
+buildUnnamed960() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed932(core.List<api.Subscription> o) {
+checkUnnamed960(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -302,7 +302,7 @@
   if (buildCounterSubscriptions < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.subscriptions = buildUnnamed932();
+    o.subscriptions = buildUnnamed960();
   }
   buildCounterSubscriptions--;
   return o;
@@ -313,7 +313,7 @@
   if (buildCounterSubscriptions < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed932(o.subscriptions);
+    checkUnnamed960(o.subscriptions);
   }
   buildCounterSubscriptions--;
 }
@@ -430,8 +430,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/apps/reseller/v1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -481,8 +483,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/apps/reseller/v1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("customers"));
         pathOffset += 9;
 
@@ -530,8 +534,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/apps/reseller/v1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -581,8 +587,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/apps/reseller/v1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
         pathOffset += 10;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -637,8 +645,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/apps/reseller/v1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
         pathOffset += 10;
         index = path.indexOf("/subscriptions/", pathOffset);
@@ -700,8 +710,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/apps/reseller/v1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
         pathOffset += 10;
         index = path.indexOf("/subscriptions/", pathOffset);
@@ -763,8 +775,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/apps/reseller/v1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
         pathOffset += 10;
         index = path.indexOf("/subscriptions/", pathOffset);
@@ -823,8 +837,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/apps/reseller/v1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
         pathOffset += 10;
         index = path.indexOf("/subscriptions/", pathOffset);
@@ -877,8 +893,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/apps/reseller/v1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
         pathOffset += 10;
         index = path.indexOf("/subscriptions/", pathOffset);
@@ -936,8 +954,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/apps/reseller/v1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
         pathOffset += 10;
         index = path.indexOf("/subscriptions", pathOffset);
@@ -992,8 +1012,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/apps/reseller/v1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("subscriptions"));
         pathOffset += 13;
 
@@ -1042,8 +1064,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/apps/reseller/v1/"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("apps/reseller/v1/"));
+        pathOffset += 17;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("customers/"));
         pathOffset += 10;
         index = path.indexOf("/subscriptions/", pathOffset);
diff --git a/generated/googleapis/test/siteverification/v1_test.dart b/generated/googleapis/test/siteverification/v1_test.dart
index 4d847be..4373116 100644
--- a/generated/googleapis/test/siteverification/v1_test.dart
+++ b/generated/googleapis/test/siteverification/v1_test.dart
@@ -79,14 +79,14 @@
   buildCounterSiteVerificationWebResourceGettokenResponse--;
 }
 
-buildUnnamed185() {
+buildUnnamed188() {
   var o = new core.List<api.SiteVerificationWebResourceResource>();
   o.add(buildSiteVerificationWebResourceResource());
   o.add(buildSiteVerificationWebResourceResource());
   return o;
 }
 
-checkUnnamed185(core.List<api.SiteVerificationWebResourceResource> o) {
+checkUnnamed188(core.List<api.SiteVerificationWebResourceResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSiteVerificationWebResourceResource(o[0]);
   checkSiteVerificationWebResourceResource(o[1]);
@@ -97,7 +97,7 @@
   var o = new api.SiteVerificationWebResourceListResponse();
   buildCounterSiteVerificationWebResourceListResponse++;
   if (buildCounterSiteVerificationWebResourceListResponse < 3) {
-    o.items = buildUnnamed185();
+    o.items = buildUnnamed188();
   }
   buildCounterSiteVerificationWebResourceListResponse--;
   return o;
@@ -106,19 +106,19 @@
 checkSiteVerificationWebResourceListResponse(api.SiteVerificationWebResourceListResponse o) {
   buildCounterSiteVerificationWebResourceListResponse++;
   if (buildCounterSiteVerificationWebResourceListResponse < 3) {
-    checkUnnamed185(o.items);
+    checkUnnamed188(o.items);
   }
   buildCounterSiteVerificationWebResourceListResponse--;
 }
 
-buildUnnamed186() {
+buildUnnamed189() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed186(core.List<core.String> o) {
+checkUnnamed189(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -151,7 +151,7 @@
   buildCounterSiteVerificationWebResourceResource++;
   if (buildCounterSiteVerificationWebResourceResource < 3) {
     o.id = "foo";
-    o.owners = buildUnnamed186();
+    o.owners = buildUnnamed189();
     o.site = buildSiteVerificationWebResourceResourceSite();
   }
   buildCounterSiteVerificationWebResourceResource--;
@@ -162,7 +162,7 @@
   buildCounterSiteVerificationWebResourceResource++;
   if (buildCounterSiteVerificationWebResourceResource < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed186(o.owners);
+    checkUnnamed189(o.owners);
     checkSiteVerificationWebResourceResourceSite(o.site);
   }
   buildCounterSiteVerificationWebResourceResource--;
@@ -235,8 +235,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/siteVerification/v1/"));
-        pathOffset += 21;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("siteVerification/v1/"));
+        pathOffset += 20;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("webResource/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -280,8 +282,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/siteVerification/v1/"));
-        pathOffset += 21;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("siteVerification/v1/"));
+        pathOffset += 20;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("webResource/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -330,8 +334,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/siteVerification/v1/"));
-        pathOffset += 21;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("siteVerification/v1/"));
+        pathOffset += 20;
         unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("token"));
         pathOffset += 5;
 
@@ -378,8 +384,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/siteVerification/v1/"));
-        pathOffset += 21;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("siteVerification/v1/"));
+        pathOffset += 20;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("webResource"));
         pathOffset += 11;
 
@@ -422,8 +430,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/siteVerification/v1/"));
-        pathOffset += 21;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("siteVerification/v1/"));
+        pathOffset += 20;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("webResource"));
         pathOffset += 11;
 
@@ -470,8 +480,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/siteVerification/v1/"));
-        pathOffset += 21;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("siteVerification/v1/"));
+        pathOffset += 20;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("webResource/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -521,8 +533,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("/siteVerification/v1/"));
-        pathOffset += 21;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("siteVerification/v1/"));
+        pathOffset += 20;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("webResource/"));
         pathOffset += 12;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
diff --git a/generated/googleapis/test/storage/v1_test.dart b/generated/googleapis/test/storage/v1_test.dart
index 257a7fe..078671d 100644
--- a/generated/googleapis/test/storage/v1_test.dart
+++ b/generated/googleapis/test/storage/v1_test.dart
@@ -16,53 +16,53 @@
 
 
 
-buildUnnamed482() {
+buildUnnamed510() {
   var o = new core.List<api.BucketAccessControl>();
   o.add(buildBucketAccessControl());
   o.add(buildBucketAccessControl());
   return o;
 }
 
-checkUnnamed482(core.List<api.BucketAccessControl> o) {
+checkUnnamed510(core.List<api.BucketAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucketAccessControl(o[0]);
   checkBucketAccessControl(o[1]);
 }
 
-buildUnnamed483() {
+buildUnnamed511() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed483(core.List<core.String> o) {
+checkUnnamed511(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed484() {
+buildUnnamed512() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed484(core.List<core.String> o) {
+checkUnnamed512(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed485() {
+buildUnnamed513() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed485(core.List<core.String> o) {
+checkUnnamed513(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -74,9 +74,9 @@
   buildCounterBucketCors++;
   if (buildCounterBucketCors < 3) {
     o.maxAgeSeconds = 42;
-    o.method = buildUnnamed483();
-    o.origin = buildUnnamed484();
-    o.responseHeader = buildUnnamed485();
+    o.method = buildUnnamed511();
+    o.origin = buildUnnamed512();
+    o.responseHeader = buildUnnamed513();
   }
   buildCounterBucketCors--;
   return o;
@@ -86,34 +86,34 @@
   buildCounterBucketCors++;
   if (buildCounterBucketCors < 3) {
     unittest.expect(o.maxAgeSeconds, unittest.equals(42));
-    checkUnnamed483(o.method);
-    checkUnnamed484(o.origin);
-    checkUnnamed485(o.responseHeader);
+    checkUnnamed511(o.method);
+    checkUnnamed512(o.origin);
+    checkUnnamed513(o.responseHeader);
   }
   buildCounterBucketCors--;
 }
 
-buildUnnamed486() {
+buildUnnamed514() {
   var o = new core.List<api.BucketCors>();
   o.add(buildBucketCors());
   o.add(buildBucketCors());
   return o;
 }
 
-checkUnnamed486(core.List<api.BucketCors> o) {
+checkUnnamed514(core.List<api.BucketCors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucketCors(o[0]);
   checkBucketCors(o[1]);
 }
 
-buildUnnamed487() {
+buildUnnamed515() {
   var o = new core.List<api.ObjectAccessControl>();
   o.add(buildObjectAccessControl());
   o.add(buildObjectAccessControl());
   return o;
 }
 
-checkUnnamed487(core.List<api.ObjectAccessControl> o) {
+checkUnnamed515(core.List<api.ObjectAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkObjectAccessControl(o[0]);
   checkObjectAccessControl(o[1]);
@@ -184,14 +184,14 @@
   buildCounterBucketLifecycleRule--;
 }
 
-buildUnnamed488() {
+buildUnnamed516() {
   var o = new core.List<api.BucketLifecycleRule>();
   o.add(buildBucketLifecycleRule());
   o.add(buildBucketLifecycleRule());
   return o;
 }
 
-checkUnnamed488(core.List<api.BucketLifecycleRule> o) {
+checkUnnamed516(core.List<api.BucketLifecycleRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucketLifecycleRule(o[0]);
   checkBucketLifecycleRule(o[1]);
@@ -202,7 +202,7 @@
   var o = new api.BucketLifecycle();
   buildCounterBucketLifecycle++;
   if (buildCounterBucketLifecycle < 3) {
-    o.rule = buildUnnamed488();
+    o.rule = buildUnnamed516();
   }
   buildCounterBucketLifecycle--;
   return o;
@@ -211,7 +211,7 @@
 checkBucketLifecycle(api.BucketLifecycle o) {
   buildCounterBucketLifecycle++;
   if (buildCounterBucketLifecycle < 3) {
-    checkUnnamed488(o.rule);
+    checkUnnamed516(o.rule);
   }
   buildCounterBucketLifecycle--;
 }
@@ -303,9 +303,9 @@
   var o = new api.Bucket();
   buildCounterBucket++;
   if (buildCounterBucket < 3) {
-    o.acl = buildUnnamed482();
-    o.cors = buildUnnamed486();
-    o.defaultObjectAcl = buildUnnamed487();
+    o.acl = buildUnnamed510();
+    o.cors = buildUnnamed514();
+    o.defaultObjectAcl = buildUnnamed515();
     o.etag = "foo";
     o.id = "foo";
     o.kind = "foo";
@@ -329,9 +329,9 @@
 checkBucket(api.Bucket o) {
   buildCounterBucket++;
   if (buildCounterBucket < 3) {
-    checkUnnamed482(o.acl);
-    checkUnnamed486(o.cors);
-    checkUnnamed487(o.defaultObjectAcl);
+    checkUnnamed510(o.acl);
+    checkUnnamed514(o.cors);
+    checkUnnamed515(o.defaultObjectAcl);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -411,14 +411,14 @@
   buildCounterBucketAccessControl--;
 }
 
-buildUnnamed489() {
+buildUnnamed517() {
   var o = new core.List<api.BucketAccessControl>();
   o.add(buildBucketAccessControl());
   o.add(buildBucketAccessControl());
   return o;
 }
 
-checkUnnamed489(core.List<api.BucketAccessControl> o) {
+checkUnnamed517(core.List<api.BucketAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucketAccessControl(o[0]);
   checkBucketAccessControl(o[1]);
@@ -429,7 +429,7 @@
   var o = new api.BucketAccessControls();
   buildCounterBucketAccessControls++;
   if (buildCounterBucketAccessControls < 3) {
-    o.items = buildUnnamed489();
+    o.items = buildUnnamed517();
     o.kind = "foo";
   }
   buildCounterBucketAccessControls--;
@@ -439,20 +439,20 @@
 checkBucketAccessControls(api.BucketAccessControls o) {
   buildCounterBucketAccessControls++;
   if (buildCounterBucketAccessControls < 3) {
-    checkUnnamed489(o.items);
+    checkUnnamed517(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBucketAccessControls--;
 }
 
-buildUnnamed490() {
+buildUnnamed518() {
   var o = new core.List<api.Bucket>();
   o.add(buildBucket());
   o.add(buildBucket());
   return o;
 }
 
-checkUnnamed490(core.List<api.Bucket> o) {
+checkUnnamed518(core.List<api.Bucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBucket(o[0]);
   checkBucket(o[1]);
@@ -463,7 +463,7 @@
   var o = new api.Buckets();
   buildCounterBuckets++;
   if (buildCounterBuckets < 3) {
-    o.items = buildUnnamed490();
+    o.items = buildUnnamed518();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -474,21 +474,21 @@
 checkBuckets(api.Buckets o) {
   buildCounterBuckets++;
   if (buildCounterBuckets < 3) {
-    checkUnnamed490(o.items);
+    checkUnnamed518(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterBuckets--;
 }
 
-buildUnnamed491() {
+buildUnnamed519() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed491(core.Map<core.String, core.String> o) {
+checkUnnamed519(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -503,7 +503,7 @@
     o.expiration = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.params = buildUnnamed491();
+    o.params = buildUnnamed519();
     o.payload = true;
     o.resourceId = "foo";
     o.resourceUri = "foo";
@@ -521,7 +521,7 @@
     unittest.expect(o.expiration, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed491(o.params);
+    checkUnnamed519(o.params);
     unittest.expect(o.payload, unittest.isTrue);
     unittest.expect(o.resourceId, unittest.equals('foo'));
     unittest.expect(o.resourceUri, unittest.equals('foo'));
@@ -573,14 +573,14 @@
   buildCounterComposeRequestSourceObjects--;
 }
 
-buildUnnamed492() {
+buildUnnamed520() {
   var o = new core.List<api.ComposeRequestSourceObjects>();
   o.add(buildComposeRequestSourceObjects());
   o.add(buildComposeRequestSourceObjects());
   return o;
 }
 
-checkUnnamed492(core.List<api.ComposeRequestSourceObjects> o) {
+checkUnnamed520(core.List<api.ComposeRequestSourceObjects> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkComposeRequestSourceObjects(o[0]);
   checkComposeRequestSourceObjects(o[1]);
@@ -593,7 +593,7 @@
   if (buildCounterComposeRequest < 3) {
     o.destination = buildObject();
     o.kind = "foo";
-    o.sourceObjects = buildUnnamed492();
+    o.sourceObjects = buildUnnamed520();
   }
   buildCounterComposeRequest--;
   return o;
@@ -604,32 +604,32 @@
   if (buildCounterComposeRequest < 3) {
     checkObject(o.destination);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed492(o.sourceObjects);
+    checkUnnamed520(o.sourceObjects);
   }
   buildCounterComposeRequest--;
 }
 
-buildUnnamed493() {
+buildUnnamed521() {
   var o = new core.List<api.ObjectAccessControl>();
   o.add(buildObjectAccessControl());
   o.add(buildObjectAccessControl());
   return o;
 }
 
-checkUnnamed493(core.List<api.ObjectAccessControl> o) {
+checkUnnamed521(core.List<api.ObjectAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkObjectAccessControl(o[0]);
   checkObjectAccessControl(o[1]);
 }
 
-buildUnnamed494() {
+buildUnnamed522() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed494(core.Map<core.String, core.String> o) {
+checkUnnamed522(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -661,7 +661,7 @@
   var o = new api.Object();
   buildCounterObject++;
   if (buildCounterObject < 3) {
-    o.acl = buildUnnamed493();
+    o.acl = buildUnnamed521();
     o.bucket = "foo";
     o.cacheControl = "foo";
     o.componentCount = 42;
@@ -676,7 +676,7 @@
     o.kind = "foo";
     o.md5Hash = "foo";
     o.mediaLink = "foo";
-    o.metadata = buildUnnamed494();
+    o.metadata = buildUnnamed522();
     o.metageneration = "foo";
     o.name = "foo";
     o.owner = buildObjectOwner();
@@ -693,7 +693,7 @@
 checkObject(api.Object o) {
   buildCounterObject++;
   if (buildCounterObject < 3) {
-    checkUnnamed493(o.acl);
+    checkUnnamed521(o.acl);
     unittest.expect(o.bucket, unittest.equals('foo'));
     unittest.expect(o.cacheControl, unittest.equals('foo'));
     unittest.expect(o.componentCount, unittest.equals(42));
@@ -708,7 +708,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.md5Hash, unittest.equals('foo'));
     unittest.expect(o.mediaLink, unittest.equals('foo'));
-    checkUnnamed494(o.metadata);
+    checkUnnamed522(o.metadata);
     unittest.expect(o.metageneration, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkObjectOwner(o.owner);
@@ -785,14 +785,14 @@
   buildCounterObjectAccessControl--;
 }
 
-buildUnnamed495() {
+buildUnnamed523() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed495(core.List<core.Object> o) {
+checkUnnamed523(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) 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')); 
   var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
@@ -803,7 +803,7 @@
   var o = new api.ObjectAccessControls();
   buildCounterObjectAccessControls++;
   if (buildCounterObjectAccessControls < 3) {
-    o.items = buildUnnamed495();
+    o.items = buildUnnamed523();
     o.kind = "foo";
   }
   buildCounterObjectAccessControls--;
@@ -813,33 +813,33 @@
 checkObjectAccessControls(api.ObjectAccessControls o) {
   buildCounterObjectAccessControls++;
   if (buildCounterObjectAccessControls < 3) {
-    checkUnnamed495(o.items);
+    checkUnnamed523(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterObjectAccessControls--;
 }
 
-buildUnnamed496() {
+buildUnnamed524() {
   var o = new core.List<api.Object>();
   o.add(buildObject());
   o.add(buildObject());
   return o;
 }
 
-checkUnnamed496(core.List<api.Object> o) {
+checkUnnamed524(core.List<api.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkObject(o[0]);
   checkObject(o[1]);
 }
 
-buildUnnamed497() {
+buildUnnamed525() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed497(core.List<core.String> o) {
+checkUnnamed525(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -850,10 +850,10 @@
   var o = new api.Objects();
   buildCounterObjects++;
   if (buildCounterObjects < 3) {
-    o.items = buildUnnamed496();
+    o.items = buildUnnamed524();
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.prefixes = buildUnnamed497();
+    o.prefixes = buildUnnamed525();
   }
   buildCounterObjects--;
   return o;
@@ -862,10 +862,10 @@
 checkObjects(api.Objects o) {
   buildCounterObjects++;
   if (buildCounterObjects < 3) {
-    checkUnnamed496(o.items);
+    checkUnnamed524(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed497(o.prefixes);
+    checkUnnamed525(o.prefixes);
   }
   buildCounterObjects--;
 }
@@ -1100,8 +1100,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/acl/", pathOffset);
@@ -1153,8 +1155,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/acl/", pathOffset);
@@ -1211,8 +1215,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/acl", pathOffset);
@@ -1262,8 +1268,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/acl", pathOffset);
@@ -1318,8 +1326,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/acl/", pathOffset);
@@ -1377,8 +1387,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/acl/", pathOffset);
@@ -1437,8 +1449,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1487,8 +1501,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1543,8 +1559,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("b"));
         pathOffset += 1;
 
@@ -1593,8 +1611,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("b"));
         pathOffset += 1;
 
@@ -1649,8 +1669,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1708,8 +1730,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -1766,8 +1790,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("channels/stop"));
         pathOffset += 13;
 
@@ -1813,8 +1839,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/defaultObjectAcl/", pathOffset);
@@ -1866,8 +1894,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/defaultObjectAcl/", pathOffset);
@@ -1924,8 +1954,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/defaultObjectAcl", pathOffset);
@@ -1977,8 +2009,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/defaultObjectAcl", pathOffset);
@@ -2035,8 +2069,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/defaultObjectAcl/", pathOffset);
@@ -2094,8 +2130,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/defaultObjectAcl/", pathOffset);
@@ -2155,8 +2193,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/o/", pathOffset);
@@ -2218,8 +2258,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/o/", pathOffset);
@@ -2286,8 +2328,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/o/", pathOffset);
@@ -2347,8 +2391,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/o/", pathOffset);
@@ -2413,8 +2459,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/o/", pathOffset);
@@ -2482,8 +2530,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/o/", pathOffset);
@@ -2558,8 +2608,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/o/", pathOffset);
@@ -2639,8 +2691,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/o/", pathOffset);
@@ -2724,8 +2778,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/o/", pathOffset);
@@ -2790,8 +2846,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/o/", pathOffset);
@@ -2864,8 +2922,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/o", pathOffset);
@@ -2929,8 +2989,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/o", pathOffset);
@@ -2998,8 +3060,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/o/", pathOffset);
@@ -3073,8 +3137,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/o/", pathOffset);
@@ -3144,8 +3210,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/storage/v1/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("storage/v1/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("b/"));
         pathOffset += 2;
         index = path.indexOf("/o/watch", pathOffset);
diff --git a/generated/googleapis/test/tasks/v1_test.dart b/generated/googleapis/test/tasks/v1_test.dart
index e819c22..5315b51 100644
--- a/generated/googleapis/test/tasks/v1_test.dart
+++ b/generated/googleapis/test/tasks/v1_test.dart
@@ -39,14 +39,14 @@
   buildCounterTaskLinks--;
 }
 
-buildUnnamed1010() {
+buildUnnamed1038() {
   var o = new core.List<api.TaskLinks>();
   o.add(buildTaskLinks());
   o.add(buildTaskLinks());
   return o;
 }
 
-checkUnnamed1010(core.List<api.TaskLinks> o) {
+checkUnnamed1038(core.List<api.TaskLinks> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTaskLinks(o[0]);
   checkTaskLinks(o[1]);
@@ -64,7 +64,7 @@
     o.hidden = true;
     o.id = "foo";
     o.kind = "foo";
-    o.links = buildUnnamed1010();
+    o.links = buildUnnamed1038();
     o.notes = "foo";
     o.parent = "foo";
     o.position = "foo";
@@ -87,7 +87,7 @@
     unittest.expect(o.hidden, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1010(o.links);
+    checkUnnamed1038(o.links);
     unittest.expect(o.notes, unittest.equals('foo'));
     unittest.expect(o.parent, unittest.equals('foo'));
     unittest.expect(o.position, unittest.equals('foo'));
@@ -128,14 +128,14 @@
   buildCounterTaskList--;
 }
 
-buildUnnamed1011() {
+buildUnnamed1039() {
   var o = new core.List<api.TaskList>();
   o.add(buildTaskList());
   o.add(buildTaskList());
   return o;
 }
 
-checkUnnamed1011(core.List<api.TaskList> o) {
+checkUnnamed1039(core.List<api.TaskList> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTaskList(o[0]);
   checkTaskList(o[1]);
@@ -147,7 +147,7 @@
   buildCounterTaskLists++;
   if (buildCounterTaskLists < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1011();
+    o.items = buildUnnamed1039();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -159,21 +159,21 @@
   buildCounterTaskLists++;
   if (buildCounterTaskLists < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1011(o.items);
+    checkUnnamed1039(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterTaskLists--;
 }
 
-buildUnnamed1012() {
+buildUnnamed1040() {
   var o = new core.List<api.Task>();
   o.add(buildTask());
   o.add(buildTask());
   return o;
 }
 
-checkUnnamed1012(core.List<api.Task> o) {
+checkUnnamed1040(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTask(o[0]);
   checkTask(o[1]);
@@ -185,7 +185,7 @@
   buildCounterTasks++;
   if (buildCounterTasks < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed1012();
+    o.items = buildUnnamed1040();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -197,7 +197,7 @@
   buildCounterTasks++;
   if (buildCounterTasks < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed1012(o.items);
+    checkUnnamed1040(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -262,8 +262,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/tasks/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("users/@me/lists/"));
         pathOffset += 16;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -307,8 +309,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/tasks/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("users/@me/lists/"));
         pathOffset += 16;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -357,8 +361,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/tasks/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("users/@me/lists"));
         pathOffset += 15;
 
@@ -402,8 +408,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/tasks/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("users/@me/lists"));
         pathOffset += 15;
 
@@ -452,8 +460,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/tasks/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("users/@me/lists/"));
         pathOffset += 16;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -503,8 +513,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/tasks/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("users/@me/lists/"));
         pathOffset += 16;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -554,8 +566,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/tasks/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("lists/"));
         pathOffset += 6;
         index = path.indexOf("/clear", pathOffset);
@@ -604,8 +618,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/tasks/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("lists/"));
         pathOffset += 6;
         index = path.indexOf("/tasks/", pathOffset);
@@ -657,8 +673,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/tasks/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("lists/"));
         pathOffset += 6;
         index = path.indexOf("/tasks/", pathOffset);
@@ -717,8 +735,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/tasks/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("lists/"));
         pathOffset += 6;
         index = path.indexOf("/tasks", pathOffset);
@@ -780,8 +800,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/tasks/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("lists/"));
         pathOffset += 6;
         index = path.indexOf("/tasks", pathOffset);
@@ -844,8 +866,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/tasks/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("lists/"));
         pathOffset += 6;
         index = path.indexOf("/tasks/", pathOffset);
@@ -909,8 +933,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/tasks/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("lists/"));
         pathOffset += 6;
         index = path.indexOf("/tasks/", pathOffset);
@@ -968,8 +994,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/tasks/v1/"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("tasks/v1/"));
+        pathOffset += 9;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("lists/"));
         pathOffset += 6;
         index = path.indexOf("/tasks/", pathOffset);
diff --git a/generated/googleapis/test/translate/v2_test.dart b/generated/googleapis/test/translate/v2_test.dart
index 23f58af..1d84cce 100644
--- a/generated/googleapis/test/translate/v2_test.dart
+++ b/generated/googleapis/test/translate/v2_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed434() {
+buildUnnamed459() {
   var o = new core.List<api.DetectionsResource>();
   o.add(buildDetectionsResource());
   o.add(buildDetectionsResource());
   return o;
 }
 
-checkUnnamed434(core.List<api.DetectionsResource> o) {
+checkUnnamed459(core.List<api.DetectionsResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDetectionsResource(o[0]);
   checkDetectionsResource(o[1]);
@@ -34,7 +34,7 @@
   var o = new api.DetectionsListResponse();
   buildCounterDetectionsListResponse++;
   if (buildCounterDetectionsListResponse < 3) {
-    o.detections = buildUnnamed434();
+    o.detections = buildUnnamed459();
   }
   buildCounterDetectionsListResponse--;
   return o;
@@ -43,7 +43,7 @@
 checkDetectionsListResponse(api.DetectionsListResponse o) {
   buildCounterDetectionsListResponse++;
   if (buildCounterDetectionsListResponse < 3) {
-    checkUnnamed434(o.detections);
+    checkUnnamed459(o.detections);
   }
   buildCounterDetectionsListResponse--;
 }
@@ -84,14 +84,14 @@
   checkDetectionsResourceElement(o[1]);
 }
 
-buildUnnamed435() {
+buildUnnamed460() {
   var o = new core.List<api.LanguagesResource>();
   o.add(buildLanguagesResource());
   o.add(buildLanguagesResource());
   return o;
 }
 
-checkUnnamed435(core.List<api.LanguagesResource> o) {
+checkUnnamed460(core.List<api.LanguagesResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLanguagesResource(o[0]);
   checkLanguagesResource(o[1]);
@@ -102,7 +102,7 @@
   var o = new api.LanguagesListResponse();
   buildCounterLanguagesListResponse++;
   if (buildCounterLanguagesListResponse < 3) {
-    o.languages = buildUnnamed435();
+    o.languages = buildUnnamed460();
   }
   buildCounterLanguagesListResponse--;
   return o;
@@ -111,7 +111,7 @@
 checkLanguagesListResponse(api.LanguagesListResponse o) {
   buildCounterLanguagesListResponse++;
   if (buildCounterLanguagesListResponse < 3) {
-    checkUnnamed435(o.languages);
+    checkUnnamed460(o.languages);
   }
   buildCounterLanguagesListResponse--;
 }
@@ -137,14 +137,14 @@
   buildCounterLanguagesResource--;
 }
 
-buildUnnamed436() {
+buildUnnamed461() {
   var o = new core.List<api.TranslationsResource>();
   o.add(buildTranslationsResource());
   o.add(buildTranslationsResource());
   return o;
 }
 
-checkUnnamed436(core.List<api.TranslationsResource> o) {
+checkUnnamed461(core.List<api.TranslationsResource> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTranslationsResource(o[0]);
   checkTranslationsResource(o[1]);
@@ -155,7 +155,7 @@
   var o = new api.TranslationsListResponse();
   buildCounterTranslationsListResponse++;
   if (buildCounterTranslationsListResponse < 3) {
-    o.translations = buildUnnamed436();
+    o.translations = buildUnnamed461();
   }
   buildCounterTranslationsListResponse--;
   return o;
@@ -164,7 +164,7 @@
 checkTranslationsListResponse(api.TranslationsListResponse o) {
   buildCounterTranslationsListResponse++;
   if (buildCounterTranslationsListResponse < 3) {
-    checkUnnamed436(o.translations);
+    checkUnnamed461(o.translations);
   }
   buildCounterTranslationsListResponse--;
 }
@@ -190,40 +190,40 @@
   buildCounterTranslationsResource--;
 }
 
-buildUnnamed437() {
+buildUnnamed462() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed437(core.List<core.String> o) {
+checkUnnamed462(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed438() {
+buildUnnamed463() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed438(core.List<core.String> o) {
+checkUnnamed463(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed439() {
+buildUnnamed464() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed439(core.List<core.String> o) {
+checkUnnamed464(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -299,14 +299,16 @@
 
       var mock = new common_test.HttpServerMock();
       api.DetectionsResourceApi res = new api.TranslateApi(mock).detections;
-      var arg_q = buildUnnamed437();
+      var arg_q = buildUnnamed462();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/language/translate/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("language/translate/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("v2/detect"));
         pathOffset += 9;
 
@@ -354,8 +356,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/language/translate/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("language/translate/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("v2/languages"));
         pathOffset += 12;
 
@@ -397,9 +401,9 @@
 
       var mock = new common_test.HttpServerMock();
       api.TranslationsResourceApi res = new api.TranslateApi(mock).translations;
-      var arg_q = buildUnnamed438();
+      var arg_q = buildUnnamed463();
       var arg_target = "foo";
-      var arg_cid = buildUnnamed439();
+      var arg_cid = buildUnnamed464();
       var arg_format = "foo";
       var arg_source = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
@@ -407,8 +411,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/language/translate/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("language/translate/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 2), unittest.equals("v2"));
         pathOffset += 2;
 
diff --git a/generated/googleapis/test/urlshortener/v1_test.dart b/generated/googleapis/test/urlshortener/v1_test.dart
index 914418a..d8326f5 100644
--- a/generated/googleapis/test/urlshortener/v1_test.dart
+++ b/generated/googleapis/test/urlshortener/v1_test.dart
@@ -16,53 +16,53 @@
 
 
 
-buildUnnamed440() {
+buildUnnamed465() {
   var o = new core.List<api.StringCount>();
   o.add(buildStringCount());
   o.add(buildStringCount());
   return o;
 }
 
-checkUnnamed440(core.List<api.StringCount> o) {
+checkUnnamed465(core.List<api.StringCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStringCount(o[0]);
   checkStringCount(o[1]);
 }
 
-buildUnnamed441() {
+buildUnnamed466() {
   var o = new core.List<api.StringCount>();
   o.add(buildStringCount());
   o.add(buildStringCount());
   return o;
 }
 
-checkUnnamed441(core.List<api.StringCount> o) {
+checkUnnamed466(core.List<api.StringCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStringCount(o[0]);
   checkStringCount(o[1]);
 }
 
-buildUnnamed442() {
+buildUnnamed467() {
   var o = new core.List<api.StringCount>();
   o.add(buildStringCount());
   o.add(buildStringCount());
   return o;
 }
 
-checkUnnamed442(core.List<api.StringCount> o) {
+checkUnnamed467(core.List<api.StringCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStringCount(o[0]);
   checkStringCount(o[1]);
 }
 
-buildUnnamed443() {
+buildUnnamed468() {
   var o = new core.List<api.StringCount>();
   o.add(buildStringCount());
   o.add(buildStringCount());
   return o;
 }
 
-checkUnnamed443(core.List<api.StringCount> o) {
+checkUnnamed468(core.List<api.StringCount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkStringCount(o[0]);
   checkStringCount(o[1]);
@@ -73,11 +73,11 @@
   var o = new api.AnalyticsSnapshot();
   buildCounterAnalyticsSnapshot++;
   if (buildCounterAnalyticsSnapshot < 3) {
-    o.browsers = buildUnnamed440();
-    o.countries = buildUnnamed441();
+    o.browsers = buildUnnamed465();
+    o.countries = buildUnnamed466();
     o.longUrlClicks = "foo";
-    o.platforms = buildUnnamed442();
-    o.referrers = buildUnnamed443();
+    o.platforms = buildUnnamed467();
+    o.referrers = buildUnnamed468();
     o.shortUrlClicks = "foo";
   }
   buildCounterAnalyticsSnapshot--;
@@ -87,11 +87,11 @@
 checkAnalyticsSnapshot(api.AnalyticsSnapshot o) {
   buildCounterAnalyticsSnapshot++;
   if (buildCounterAnalyticsSnapshot < 3) {
-    checkUnnamed440(o.browsers);
-    checkUnnamed441(o.countries);
+    checkUnnamed465(o.browsers);
+    checkUnnamed466(o.countries);
     unittest.expect(o.longUrlClicks, unittest.equals('foo'));
-    checkUnnamed442(o.platforms);
-    checkUnnamed443(o.referrers);
+    checkUnnamed467(o.platforms);
+    checkUnnamed468(o.referrers);
     unittest.expect(o.shortUrlClicks, unittest.equals('foo'));
   }
   buildCounterAnalyticsSnapshot--;
@@ -174,14 +174,14 @@
   buildCounterUrl--;
 }
 
-buildUnnamed444() {
+buildUnnamed469() {
   var o = new core.List<api.Url>();
   o.add(buildUrl());
   o.add(buildUrl());
   return o;
 }
 
-checkUnnamed444(core.List<api.Url> o) {
+checkUnnamed469(core.List<api.Url> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkUrl(o[0]);
   checkUrl(o[1]);
@@ -192,7 +192,7 @@
   var o = new api.UrlHistory();
   buildCounterUrlHistory++;
   if (buildCounterUrlHistory < 3) {
-    o.items = buildUnnamed444();
+    o.items = buildUnnamed469();
     o.itemsPerPage = 42;
     o.kind = "foo";
     o.nextPageToken = "foo";
@@ -205,7 +205,7 @@
 checkUrlHistory(api.UrlHistory o) {
   buildCounterUrlHistory++;
   if (buildCounterUrlHistory < 3) {
-    checkUnnamed444(o.items);
+    checkUnnamed469(o.items);
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -273,8 +273,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/urlshortener/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("urlshortener/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("url"));
         pathOffset += 3;
 
@@ -322,8 +324,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/urlshortener/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("urlshortener/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 3), unittest.equals("url"));
         pathOffset += 3;
 
@@ -367,8 +371,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/urlshortener/v1/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("urlshortener/v1/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("url/history"));
         pathOffset += 11;
 
diff --git a/generated/googleapis/test/webfonts/v1_test.dart b/generated/googleapis/test/webfonts/v1_test.dart
index 426eeac..dc7c9e3 100644
--- a/generated/googleapis/test/webfonts/v1_test.dart
+++ b/generated/googleapis/test/webfonts/v1_test.dart
@@ -16,40 +16,40 @@
 
 
 
-buildUnnamed761() {
+buildUnnamed789() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed761(core.Map<core.String, core.String> o) {
+checkUnnamed789(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
 }
 
-buildUnnamed762() {
+buildUnnamed790() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed762(core.List<core.String> o) {
+checkUnnamed790(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed763() {
+buildUnnamed791() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed763(core.List<core.String> o) {
+checkUnnamed791(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -62,11 +62,11 @@
   if (buildCounterWebfont < 3) {
     o.category = "foo";
     o.family = "foo";
-    o.files = buildUnnamed761();
+    o.files = buildUnnamed789();
     o.kind = "foo";
     o.lastModified = core.DateTime.parse("2002-02-27T14:01:02Z");
-    o.subsets = buildUnnamed762();
-    o.variants = buildUnnamed763();
+    o.subsets = buildUnnamed790();
+    o.variants = buildUnnamed791();
     o.version = "foo";
   }
   buildCounterWebfont--;
@@ -78,24 +78,24 @@
   if (buildCounterWebfont < 3) {
     unittest.expect(o.category, unittest.equals('foo'));
     unittest.expect(o.family, unittest.equals('foo'));
-    checkUnnamed761(o.files);
+    checkUnnamed789(o.files);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastModified, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
-    checkUnnamed762(o.subsets);
-    checkUnnamed763(o.variants);
+    checkUnnamed790(o.subsets);
+    checkUnnamed791(o.variants);
     unittest.expect(o.version, unittest.equals('foo'));
   }
   buildCounterWebfont--;
 }
 
-buildUnnamed764() {
+buildUnnamed792() {
   var o = new core.List<api.Webfont>();
   o.add(buildWebfont());
   o.add(buildWebfont());
   return o;
 }
 
-checkUnnamed764(core.List<api.Webfont> o) {
+checkUnnamed792(core.List<api.Webfont> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkWebfont(o[0]);
   checkWebfont(o[1]);
@@ -106,7 +106,7 @@
   var o = new api.WebfontList();
   buildCounterWebfontList++;
   if (buildCounterWebfontList < 3) {
-    o.items = buildUnnamed764();
+    o.items = buildUnnamed792();
     o.kind = "foo";
   }
   buildCounterWebfontList--;
@@ -116,7 +116,7 @@
 checkWebfontList(api.WebfontList o) {
   buildCounterWebfontList++;
   if (buildCounterWebfontList < 3) {
-    checkUnnamed764(o.items);
+    checkUnnamed792(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterWebfontList--;
@@ -153,8 +153,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/webfonts/v1/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("webfonts/v1/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("webfonts"));
         pathOffset += 8;
 
diff --git a/generated/googleapis/test/youtube/v3_test.dart b/generated/googleapis/test/youtube/v3_test.dart
index 903c8f4..0fa2da9 100644
--- a/generated/googleapis/test/youtube/v3_test.dart
+++ b/generated/googleapis/test/youtube/v3_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed341() {
+buildUnnamed364() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed341(core.List<core.String> o) {
+checkUnnamed364(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -35,7 +35,7 @@
   buildCounterAccessPolicy++;
   if (buildCounterAccessPolicy < 3) {
     o.allowed = true;
-    o.exception = buildUnnamed341();
+    o.exception = buildUnnamed364();
   }
   buildCounterAccessPolicy--;
   return o;
@@ -45,7 +45,7 @@
   buildCounterAccessPolicy++;
   if (buildCounterAccessPolicy < 3) {
     unittest.expect(o.allowed, unittest.isTrue);
-    checkUnnamed341(o.exception);
+    checkUnnamed364(o.exception);
   }
   buildCounterAccessPolicy--;
 }
@@ -234,27 +234,27 @@
   buildCounterActivityContentDetailsPlaylistItem--;
 }
 
-buildUnnamed342() {
+buildUnnamed365() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed342(core.List<core.String> o) {
+checkUnnamed365(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed343() {
+buildUnnamed366() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed343(core.List<core.String> o) {
+checkUnnamed366(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -272,8 +272,8 @@
     o.customCtaButtonText = "foo";
     o.descriptionText = "foo";
     o.destinationUrl = "foo";
-    o.forecastingUrl = buildUnnamed342();
-    o.impressionUrl = buildUnnamed343();
+    o.forecastingUrl = buildUnnamed365();
+    o.impressionUrl = buildUnnamed366();
     o.videoId = "foo";
   }
   buildCounterActivityContentDetailsPromotedItem--;
@@ -290,8 +290,8 @@
     unittest.expect(o.customCtaButtonText, unittest.equals('foo'));
     unittest.expect(o.descriptionText, unittest.equals('foo'));
     unittest.expect(o.destinationUrl, unittest.equals('foo'));
-    checkUnnamed342(o.forecastingUrl);
-    checkUnnamed343(o.impressionUrl);
+    checkUnnamed365(o.forecastingUrl);
+    checkUnnamed366(o.impressionUrl);
     unittest.expect(o.videoId, unittest.equals('foo'));
   }
   buildCounterActivityContentDetailsPromotedItem--;
@@ -385,14 +385,14 @@
   buildCounterActivityContentDetailsUpload--;
 }
 
-buildUnnamed344() {
+buildUnnamed367() {
   var o = new core.List<api.Activity>();
   o.add(buildActivity());
   o.add(buildActivity());
   return o;
 }
 
-checkUnnamed344(core.List<api.Activity> o) {
+checkUnnamed367(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkActivity(o[0]);
   checkActivity(o[1]);
@@ -405,7 +405,7 @@
   if (buildCounterActivityListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed344();
+    o.items = buildUnnamed367();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -422,7 +422,7 @@
   if (buildCounterActivityListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed344(o.items);
+    checkUnnamed367(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -580,14 +580,14 @@
   buildCounterChannelBannerResource--;
 }
 
-buildUnnamed345() {
+buildUnnamed368() {
   var o = new core.List<api.PropertyValue>();
   o.add(buildPropertyValue());
   o.add(buildPropertyValue());
   return o;
 }
 
-checkUnnamed345(core.List<api.PropertyValue> o) {
+checkUnnamed368(core.List<api.PropertyValue> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyValue(o[0]);
   checkPropertyValue(o[1]);
@@ -599,7 +599,7 @@
   buildCounterChannelBrandingSettings++;
   if (buildCounterChannelBrandingSettings < 3) {
     o.channel = buildChannelSettings();
-    o.hints = buildUnnamed345();
+    o.hints = buildUnnamed368();
     o.image = buildImageSettings();
     o.watch = buildWatchSettings();
   }
@@ -611,7 +611,7 @@
   buildCounterChannelBrandingSettings++;
   if (buildCounterChannelBrandingSettings < 3) {
     checkChannelSettings(o.channel);
-    checkUnnamed345(o.hints);
+    checkUnnamed368(o.hints);
     checkImageSettings(o.image);
     checkWatchSettings(o.watch);
   }
@@ -708,14 +708,14 @@
   buildCounterChannelConversionPing--;
 }
 
-buildUnnamed346() {
+buildUnnamed369() {
   var o = new core.List<api.ChannelConversionPing>();
   o.add(buildChannelConversionPing());
   o.add(buildChannelConversionPing());
   return o;
 }
 
-checkUnnamed346(core.List<api.ChannelConversionPing> o) {
+checkUnnamed369(core.List<api.ChannelConversionPing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannelConversionPing(o[0]);
   checkChannelConversionPing(o[1]);
@@ -726,7 +726,7 @@
   var o = new api.ChannelConversionPings();
   buildCounterChannelConversionPings++;
   if (buildCounterChannelConversionPings < 3) {
-    o.pings = buildUnnamed346();
+    o.pings = buildUnnamed369();
   }
   buildCounterChannelConversionPings--;
   return o;
@@ -735,19 +735,19 @@
 checkChannelConversionPings(api.ChannelConversionPings o) {
   buildCounterChannelConversionPings++;
   if (buildCounterChannelConversionPings < 3) {
-    checkUnnamed346(o.pings);
+    checkUnnamed369(o.pings);
   }
   buildCounterChannelConversionPings--;
 }
 
-buildUnnamed347() {
+buildUnnamed370() {
   var o = new core.List<api.Channel>();
   o.add(buildChannel());
   o.add(buildChannel());
   return o;
 }
 
-checkUnnamed347(core.List<api.Channel> o) {
+checkUnnamed370(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannel(o[0]);
   checkChannel(o[1]);
@@ -760,7 +760,7 @@
   if (buildCounterChannelListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed347();
+    o.items = buildUnnamed370();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -777,7 +777,7 @@
   if (buildCounterChannelListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed347(o.items);
+    checkUnnamed370(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -815,27 +815,27 @@
   buildCounterChannelSection--;
 }
 
-buildUnnamed348() {
+buildUnnamed371() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed348(core.List<core.String> o) {
+checkUnnamed371(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed349() {
+buildUnnamed372() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed349(core.List<core.String> o) {
+checkUnnamed372(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -846,8 +846,8 @@
   var o = new api.ChannelSectionContentDetails();
   buildCounterChannelSectionContentDetails++;
   if (buildCounterChannelSectionContentDetails < 3) {
-    o.channels = buildUnnamed348();
-    o.playlists = buildUnnamed349();
+    o.channels = buildUnnamed371();
+    o.playlists = buildUnnamed372();
   }
   buildCounterChannelSectionContentDetails--;
   return o;
@@ -856,20 +856,20 @@
 checkChannelSectionContentDetails(api.ChannelSectionContentDetails o) {
   buildCounterChannelSectionContentDetails++;
   if (buildCounterChannelSectionContentDetails < 3) {
-    checkUnnamed348(o.channels);
-    checkUnnamed349(o.playlists);
+    checkUnnamed371(o.channels);
+    checkUnnamed372(o.playlists);
   }
   buildCounterChannelSectionContentDetails--;
 }
 
-buildUnnamed350() {
+buildUnnamed373() {
   var o = new core.List<api.ChannelSection>();
   o.add(buildChannelSection());
   o.add(buildChannelSection());
   return o;
 }
 
-checkUnnamed350(core.List<api.ChannelSection> o) {
+checkUnnamed373(core.List<api.ChannelSection> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChannelSection(o[0]);
   checkChannelSection(o[1]);
@@ -882,7 +882,7 @@
   if (buildCounterChannelSectionListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed350();
+    o.items = buildUnnamed373();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -895,7 +895,7 @@
   if (buildCounterChannelSectionListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed350(o.items);
+    checkUnnamed373(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -929,14 +929,14 @@
   buildCounterChannelSectionSnippet--;
 }
 
-buildUnnamed351() {
+buildUnnamed374() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed351(core.List<core.String> o) {
+checkUnnamed374(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -950,7 +950,7 @@
     o.defaultTab = "foo";
     o.description = "foo";
     o.featuredChannelsTitle = "foo";
-    o.featuredChannelsUrls = buildUnnamed351();
+    o.featuredChannelsUrls = buildUnnamed374();
     o.keywords = "foo";
     o.moderateComments = true;
     o.profileColor = "foo";
@@ -970,7 +970,7 @@
     unittest.expect(o.defaultTab, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.featuredChannelsTitle, unittest.equals('foo'));
-    checkUnnamed351(o.featuredChannelsUrls);
+    checkUnnamed374(o.featuredChannelsUrls);
     unittest.expect(o.keywords, unittest.equals('foo'));
     unittest.expect(o.moderateComments, unittest.isTrue);
     unittest.expect(o.profileColor, unittest.equals('foo'));
@@ -1056,14 +1056,14 @@
   buildCounterChannelStatus--;
 }
 
-buildUnnamed352() {
+buildUnnamed375() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed352(core.List<core.String> o) {
+checkUnnamed375(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1074,7 +1074,7 @@
   var o = new api.ChannelTopicDetails();
   buildCounterChannelTopicDetails++;
   if (buildCounterChannelTopicDetails < 3) {
-    o.topicIds = buildUnnamed352();
+    o.topicIds = buildUnnamed375();
   }
   buildCounterChannelTopicDetails--;
   return o;
@@ -1083,7 +1083,7 @@
 checkChannelTopicDetails(api.ChannelTopicDetails o) {
   buildCounterChannelTopicDetails++;
   if (buildCounterChannelTopicDetails < 3) {
-    checkUnnamed352(o.topicIds);
+    checkUnnamed375(o.topicIds);
   }
   buildCounterChannelTopicDetails--;
 }
@@ -1279,14 +1279,14 @@
   buildCounterGuideCategory--;
 }
 
-buildUnnamed353() {
+buildUnnamed376() {
   var o = new core.List<api.GuideCategory>();
   o.add(buildGuideCategory());
   o.add(buildGuideCategory());
   return o;
 }
 
-checkUnnamed353(core.List<api.GuideCategory> o) {
+checkUnnamed376(core.List<api.GuideCategory> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGuideCategory(o[0]);
   checkGuideCategory(o[1]);
@@ -1299,7 +1299,7 @@
   if (buildCounterGuideCategoryListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed353();
+    o.items = buildUnnamed376();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -1316,7 +1316,7 @@
   if (buildCounterGuideCategoryListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed353(o.items);
+    checkUnnamed376(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -1373,14 +1373,14 @@
   buildCounterI18nLanguage--;
 }
 
-buildUnnamed354() {
+buildUnnamed377() {
   var o = new core.List<api.I18nLanguage>();
   o.add(buildI18nLanguage());
   o.add(buildI18nLanguage());
   return o;
 }
 
-checkUnnamed354(core.List<api.I18nLanguage> o) {
+checkUnnamed377(core.List<api.I18nLanguage> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkI18nLanguage(o[0]);
   checkI18nLanguage(o[1]);
@@ -1393,7 +1393,7 @@
   if (buildCounterI18nLanguageListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed354();
+    o.items = buildUnnamed377();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -1406,7 +1406,7 @@
   if (buildCounterI18nLanguageListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed354(o.items);
+    checkUnnamed377(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -1459,14 +1459,14 @@
   buildCounterI18nRegion--;
 }
 
-buildUnnamed355() {
+buildUnnamed378() {
   var o = new core.List<api.I18nRegion>();
   o.add(buildI18nRegion());
   o.add(buildI18nRegion());
   return o;
 }
 
-checkUnnamed355(core.List<api.I18nRegion> o) {
+checkUnnamed378(core.List<api.I18nRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkI18nRegion(o[0]);
   checkI18nRegion(o[1]);
@@ -1479,7 +1479,7 @@
   if (buildCounterI18nRegionListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed355();
+    o.items = buildUnnamed378();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -1492,7 +1492,7 @@
   if (buildCounterI18nRegionListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed355(o.items);
+    checkUnnamed378(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -1652,14 +1652,14 @@
   buildCounterInvideoPosition--;
 }
 
-buildUnnamed356() {
+buildUnnamed379() {
   var o = new core.List<api.PromotedItem>();
   o.add(buildPromotedItem());
   o.add(buildPromotedItem());
   return o;
 }
 
-checkUnnamed356(core.List<api.PromotedItem> o) {
+checkUnnamed379(core.List<api.PromotedItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPromotedItem(o[0]);
   checkPromotedItem(o[1]);
@@ -1671,7 +1671,7 @@
   buildCounterInvideoPromotion++;
   if (buildCounterInvideoPromotion < 3) {
     o.defaultTiming = buildInvideoTiming();
-    o.items = buildUnnamed356();
+    o.items = buildUnnamed379();
     o.position = buildInvideoPosition();
   }
   buildCounterInvideoPromotion--;
@@ -1682,7 +1682,7 @@
   buildCounterInvideoPromotion++;
   if (buildCounterInvideoPromotion < 3) {
     checkInvideoTiming(o.defaultTiming);
-    checkUnnamed356(o.items);
+    checkUnnamed379(o.items);
     checkInvideoPosition(o.position);
   }
   buildCounterInvideoPromotion--;
@@ -1773,14 +1773,14 @@
   buildCounterLiveBroadcastContentDetails--;
 }
 
-buildUnnamed357() {
+buildUnnamed380() {
   var o = new core.List<api.LiveBroadcast>();
   o.add(buildLiveBroadcast());
   o.add(buildLiveBroadcast());
   return o;
 }
 
-checkUnnamed357(core.List<api.LiveBroadcast> o) {
+checkUnnamed380(core.List<api.LiveBroadcast> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveBroadcast(o[0]);
   checkLiveBroadcast(o[1]);
@@ -1793,7 +1793,7 @@
   if (buildCounterLiveBroadcastListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed357();
+    o.items = buildUnnamed380();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -1810,7 +1810,7 @@
   if (buildCounterLiveBroadcastListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed357(o.items);
+    checkUnnamed380(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -1931,14 +1931,14 @@
   buildCounterLiveStreamContentDetails--;
 }
 
-buildUnnamed358() {
+buildUnnamed381() {
   var o = new core.List<api.LiveStream>();
   o.add(buildLiveStream());
   o.add(buildLiveStream());
   return o;
 }
 
-checkUnnamed358(core.List<api.LiveStream> o) {
+checkUnnamed381(core.List<api.LiveStream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLiveStream(o[0]);
   checkLiveStream(o[1]);
@@ -1951,7 +1951,7 @@
   if (buildCounterLiveStreamListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed358();
+    o.items = buildUnnamed381();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -1968,7 +1968,7 @@
   if (buildCounterLiveStreamListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed358(o.items);
+    checkUnnamed381(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2023,14 +2023,14 @@
   buildCounterLiveStreamStatus--;
 }
 
-buildUnnamed359() {
+buildUnnamed382() {
   var o = new core.List<api.LocalizedString>();
   o.add(buildLocalizedString());
   o.add(buildLocalizedString());
   return o;
 }
 
-checkUnnamed359(core.List<api.LocalizedString> o) {
+checkUnnamed382(core.List<api.LocalizedString> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLocalizedString(o[0]);
   checkLocalizedString(o[1]);
@@ -2042,7 +2042,7 @@
   buildCounterLocalizedProperty++;
   if (buildCounterLocalizedProperty < 3) {
     o.default_ = "foo";
-    o.localized = buildUnnamed359();
+    o.localized = buildUnnamed382();
   }
   buildCounterLocalizedProperty--;
   return o;
@@ -2052,7 +2052,7 @@
   buildCounterLocalizedProperty++;
   if (buildCounterLocalizedProperty < 3) {
     unittest.expect(o.default_, unittest.equals('foo'));
-    checkUnnamed359(o.localized);
+    checkUnnamed382(o.localized);
   }
   buildCounterLocalizedProperty--;
 }
@@ -2226,14 +2226,14 @@
   buildCounterPlaylistItemContentDetails--;
 }
 
-buildUnnamed360() {
+buildUnnamed383() {
   var o = new core.List<api.PlaylistItem>();
   o.add(buildPlaylistItem());
   o.add(buildPlaylistItem());
   return o;
 }
 
-checkUnnamed360(core.List<api.PlaylistItem> o) {
+checkUnnamed383(core.List<api.PlaylistItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlaylistItem(o[0]);
   checkPlaylistItem(o[1]);
@@ -2246,7 +2246,7 @@
   if (buildCounterPlaylistItemListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed360();
+    o.items = buildUnnamed383();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -2263,7 +2263,7 @@
   if (buildCounterPlaylistItemListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed360(o.items);
+    checkUnnamed383(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2328,14 +2328,14 @@
   buildCounterPlaylistItemStatus--;
 }
 
-buildUnnamed361() {
+buildUnnamed384() {
   var o = new core.List<api.Playlist>();
   o.add(buildPlaylist());
   o.add(buildPlaylist());
   return o;
 }
 
-checkUnnamed361(core.List<api.Playlist> o) {
+checkUnnamed384(core.List<api.Playlist> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPlaylist(o[0]);
   checkPlaylist(o[1]);
@@ -2348,7 +2348,7 @@
   if (buildCounterPlaylistListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed361();
+    o.items = buildUnnamed384();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -2365,7 +2365,7 @@
   if (buildCounterPlaylistListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed361(o.items);
+    checkUnnamed384(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2395,14 +2395,14 @@
   buildCounterPlaylistPlayer--;
 }
 
-buildUnnamed362() {
+buildUnnamed385() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed362(core.List<core.String> o) {
+checkUnnamed385(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -2417,7 +2417,7 @@
     o.channelTitle = "foo";
     o.description = "foo";
     o.publishedAt = core.DateTime.parse("2002-02-27T14:01:02");
-    o.tags = buildUnnamed362();
+    o.tags = buildUnnamed385();
     o.thumbnails = buildThumbnailDetails();
     o.title = "foo";
   }
@@ -2432,7 +2432,7 @@
     unittest.expect(o.channelTitle, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.publishedAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed362(o.tags);
+    checkUnnamed385(o.tags);
     checkThumbnailDetails(o.thumbnails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -2554,14 +2554,14 @@
   buildCounterResourceId--;
 }
 
-buildUnnamed363() {
+buildUnnamed386() {
   var o = new core.List<api.SearchResult>();
   o.add(buildSearchResult());
   o.add(buildSearchResult());
   return o;
 }
 
-checkUnnamed363(core.List<api.SearchResult> o) {
+checkUnnamed386(core.List<api.SearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSearchResult(o[0]);
   checkSearchResult(o[1]);
@@ -2574,7 +2574,7 @@
   if (buildCounterSearchListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed363();
+    o.items = buildUnnamed386();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -2591,7 +2591,7 @@
   if (buildCounterSearchListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed363(o.items);
+    checkUnnamed386(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2710,14 +2710,14 @@
   buildCounterSubscriptionContentDetails--;
 }
 
-buildUnnamed364() {
+buildUnnamed387() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed364(core.List<api.Subscription> o) {
+checkUnnamed387(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -2730,7 +2730,7 @@
   if (buildCounterSubscriptionListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed364();
+    o.items = buildUnnamed387();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -2747,7 +2747,7 @@
   if (buildCounterSubscriptionListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed364(o.items);
+    checkUnnamed387(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -2864,14 +2864,14 @@
   buildCounterThumbnailDetails--;
 }
 
-buildUnnamed365() {
+buildUnnamed388() {
   var o = new core.List<api.ThumbnailDetails>();
   o.add(buildThumbnailDetails());
   o.add(buildThumbnailDetails());
   return o;
 }
 
-checkUnnamed365(core.List<api.ThumbnailDetails> o) {
+checkUnnamed388(core.List<api.ThumbnailDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkThumbnailDetails(o[0]);
   checkThumbnailDetails(o[1]);
@@ -2884,7 +2884,7 @@
   if (buildCounterThumbnailSetResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed365();
+    o.items = buildUnnamed388();
     o.kind = "foo";
     o.visitorId = "foo";
   }
@@ -2897,7 +2897,7 @@
   if (buildCounterThumbnailSetResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed365(o.items);
+    checkUnnamed388(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
@@ -3022,14 +3022,14 @@
   buildCounterVideoCategory--;
 }
 
-buildUnnamed366() {
+buildUnnamed389() {
   var o = new core.List<api.VideoCategory>();
   o.add(buildVideoCategory());
   o.add(buildVideoCategory());
   return o;
 }
 
-checkUnnamed366(core.List<api.VideoCategory> o) {
+checkUnnamed389(core.List<api.VideoCategory> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoCategory(o[0]);
   checkVideoCategory(o[1]);
@@ -3042,7 +3042,7 @@
   if (buildCounterVideoCategoryListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed366();
+    o.items = buildUnnamed389();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -3059,7 +3059,7 @@
   if (buildCounterVideoCategoryListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed366(o.items);
+    checkUnnamed389(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -3126,27 +3126,27 @@
   buildCounterVideoContentDetails--;
 }
 
-buildUnnamed367() {
+buildUnnamed390() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed367(core.List<core.String> o) {
+checkUnnamed390(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed368() {
+buildUnnamed391() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed368(core.List<core.String> o) {
+checkUnnamed391(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3157,8 +3157,8 @@
   var o = new api.VideoContentDetailsRegionRestriction();
   buildCounterVideoContentDetailsRegionRestriction++;
   if (buildCounterVideoContentDetailsRegionRestriction < 3) {
-    o.allowed = buildUnnamed367();
-    o.blocked = buildUnnamed368();
+    o.allowed = buildUnnamed390();
+    o.blocked = buildUnnamed391();
   }
   buildCounterVideoContentDetailsRegionRestriction--;
   return o;
@@ -3167,8 +3167,8 @@
 checkVideoContentDetailsRegionRestriction(api.VideoContentDetailsRegionRestriction o) {
   buildCounterVideoContentDetailsRegionRestriction++;
   if (buildCounterVideoContentDetailsRegionRestriction < 3) {
-    checkUnnamed367(o.allowed);
-    checkUnnamed368(o.blocked);
+    checkUnnamed390(o.allowed);
+    checkUnnamed391(o.blocked);
   }
   buildCounterVideoContentDetailsRegionRestriction--;
 }
@@ -3194,14 +3194,14 @@
   buildCounterVideoConversionPing--;
 }
 
-buildUnnamed369() {
+buildUnnamed392() {
   var o = new core.List<api.VideoConversionPing>();
   o.add(buildVideoConversionPing());
   o.add(buildVideoConversionPing());
   return o;
 }
 
-checkUnnamed369(core.List<api.VideoConversionPing> o) {
+checkUnnamed392(core.List<api.VideoConversionPing> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoConversionPing(o[0]);
   checkVideoConversionPing(o[1]);
@@ -3212,7 +3212,7 @@
   var o = new api.VideoConversionPings();
   buildCounterVideoConversionPings++;
   if (buildCounterVideoConversionPings < 3) {
-    o.pings = buildUnnamed369();
+    o.pings = buildUnnamed392();
   }
   buildCounterVideoConversionPings--;
   return o;
@@ -3221,32 +3221,32 @@
 checkVideoConversionPings(api.VideoConversionPings o) {
   buildCounterVideoConversionPings++;
   if (buildCounterVideoConversionPings < 3) {
-    checkUnnamed369(o.pings);
+    checkUnnamed392(o.pings);
   }
   buildCounterVideoConversionPings--;
 }
 
-buildUnnamed370() {
+buildUnnamed393() {
   var o = new core.List<api.VideoFileDetailsAudioStream>();
   o.add(buildVideoFileDetailsAudioStream());
   o.add(buildVideoFileDetailsAudioStream());
   return o;
 }
 
-checkUnnamed370(core.List<api.VideoFileDetailsAudioStream> o) {
+checkUnnamed393(core.List<api.VideoFileDetailsAudioStream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoFileDetailsAudioStream(o[0]);
   checkVideoFileDetailsAudioStream(o[1]);
 }
 
-buildUnnamed371() {
+buildUnnamed394() {
   var o = new core.List<api.VideoFileDetailsVideoStream>();
   o.add(buildVideoFileDetailsVideoStream());
   o.add(buildVideoFileDetailsVideoStream());
   return o;
 }
 
-checkUnnamed371(core.List<api.VideoFileDetailsVideoStream> o) {
+checkUnnamed394(core.List<api.VideoFileDetailsVideoStream> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoFileDetailsVideoStream(o[0]);
   checkVideoFileDetailsVideoStream(o[1]);
@@ -3257,7 +3257,7 @@
   var o = new api.VideoFileDetails();
   buildCounterVideoFileDetails++;
   if (buildCounterVideoFileDetails < 3) {
-    o.audioStreams = buildUnnamed370();
+    o.audioStreams = buildUnnamed393();
     o.bitrateBps = "foo";
     o.container = "foo";
     o.creationTime = "foo";
@@ -3266,7 +3266,7 @@
     o.fileSize = "foo";
     o.fileType = "foo";
     o.recordingLocation = buildGeoPoint();
-    o.videoStreams = buildUnnamed371();
+    o.videoStreams = buildUnnamed394();
   }
   buildCounterVideoFileDetails--;
   return o;
@@ -3275,7 +3275,7 @@
 checkVideoFileDetails(api.VideoFileDetails o) {
   buildCounterVideoFileDetails++;
   if (buildCounterVideoFileDetails < 3) {
-    checkUnnamed370(o.audioStreams);
+    checkUnnamed393(o.audioStreams);
     unittest.expect(o.bitrateBps, unittest.equals('foo'));
     unittest.expect(o.container, unittest.equals('foo'));
     unittest.expect(o.creationTime, unittest.equals('foo'));
@@ -3284,7 +3284,7 @@
     unittest.expect(o.fileSize, unittest.equals('foo'));
     unittest.expect(o.fileType, unittest.equals('foo'));
     checkGeoPoint(o.recordingLocation);
-    checkUnnamed371(o.videoStreams);
+    checkUnnamed394(o.videoStreams);
   }
   buildCounterVideoFileDetails--;
 }
@@ -3347,14 +3347,14 @@
   buildCounterVideoFileDetailsVideoStream--;
 }
 
-buildUnnamed372() {
+buildUnnamed395() {
   var o = new core.List<api.VideoRating>();
   o.add(buildVideoRating());
   o.add(buildVideoRating());
   return o;
 }
 
-checkUnnamed372(core.List<api.VideoRating> o) {
+checkUnnamed395(core.List<api.VideoRating> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoRating(o[0]);
   checkVideoRating(o[1]);
@@ -3366,7 +3366,7 @@
   buildCounterVideoGetRatingResponse++;
   if (buildCounterVideoGetRatingResponse < 3) {
     o.etag = "foo";
-    o.items = buildUnnamed372();
+    o.items = buildUnnamed395();
     o.kind = "foo";
   }
   buildCounterVideoGetRatingResponse--;
@@ -3377,20 +3377,20 @@
   buildCounterVideoGetRatingResponse++;
   if (buildCounterVideoGetRatingResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkUnnamed372(o.items);
+    checkUnnamed395(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterVideoGetRatingResponse--;
 }
 
-buildUnnamed373() {
+buildUnnamed396() {
   var o = new core.List<api.Video>();
   o.add(buildVideo());
   o.add(buildVideo());
   return o;
 }
 
-checkUnnamed373(core.List<api.Video> o) {
+checkUnnamed396(core.List<api.Video> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideo(o[0]);
   checkVideo(o[1]);
@@ -3403,7 +3403,7 @@
   if (buildCounterVideoListResponse < 3) {
     o.etag = "foo";
     o.eventId = "foo";
-    o.items = buildUnnamed373();
+    o.items = buildUnnamed396();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.pageInfo = buildPageInfo();
@@ -3420,7 +3420,7 @@
   if (buildCounterVideoListResponse < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
-    checkUnnamed373(o.items);
+    checkUnnamed396(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkPageInfo(o.pageInfo);
@@ -3552,14 +3552,14 @@
   buildCounterVideoProcessingDetailsProcessingProgress--;
 }
 
-buildUnnamed374() {
+buildUnnamed397() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed374(core.List<core.String> o) {
+checkUnnamed397(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3570,7 +3570,7 @@
   var o = new api.VideoProjectDetails();
   buildCounterVideoProjectDetails++;
   if (buildCounterVideoProjectDetails < 3) {
-    o.tags = buildUnnamed374();
+    o.tags = buildUnnamed397();
   }
   buildCounterVideoProjectDetails--;
   return o;
@@ -3579,7 +3579,7 @@
 checkVideoProjectDetails(api.VideoProjectDetails o) {
   buildCounterVideoProjectDetails++;
   if (buildCounterVideoProjectDetails < 3) {
-    checkUnnamed374(o.tags);
+    checkUnnamed397(o.tags);
   }
   buildCounterVideoProjectDetails--;
 }
@@ -3628,14 +3628,14 @@
   buildCounterVideoRecordingDetails--;
 }
 
-buildUnnamed375() {
+buildUnnamed398() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed375(core.List<core.String> o) {
+checkUnnamed398(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3652,7 +3652,7 @@
     o.description = "foo";
     o.liveBroadcastContent = "foo";
     o.publishedAt = core.DateTime.parse("2002-02-27T14:01:02");
-    o.tags = buildUnnamed375();
+    o.tags = buildUnnamed398();
     o.thumbnails = buildThumbnailDetails();
     o.title = "foo";
   }
@@ -3669,7 +3669,7 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.liveBroadcastContent, unittest.equals('foo'));
     unittest.expect(o.publishedAt, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed375(o.tags);
+    checkUnnamed398(o.tags);
     checkThumbnailDetails(o.thumbnails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -3736,66 +3736,66 @@
   buildCounterVideoStatus--;
 }
 
-buildUnnamed376() {
+buildUnnamed399() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed376(core.List<core.String> o) {
+checkUnnamed399(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed377() {
+buildUnnamed400() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed377(core.List<core.String> o) {
+checkUnnamed400(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed378() {
+buildUnnamed401() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed378(core.List<core.String> o) {
+checkUnnamed401(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed379() {
+buildUnnamed402() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed379(core.List<core.String> o) {
+checkUnnamed402(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed380() {
+buildUnnamed403() {
   var o = new core.List<api.VideoSuggestionsTagSuggestion>();
   o.add(buildVideoSuggestionsTagSuggestion());
   o.add(buildVideoSuggestionsTagSuggestion());
   return o;
 }
 
-checkUnnamed380(core.List<api.VideoSuggestionsTagSuggestion> o) {
+checkUnnamed403(core.List<api.VideoSuggestionsTagSuggestion> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVideoSuggestionsTagSuggestion(o[0]);
   checkVideoSuggestionsTagSuggestion(o[1]);
@@ -3806,11 +3806,11 @@
   var o = new api.VideoSuggestions();
   buildCounterVideoSuggestions++;
   if (buildCounterVideoSuggestions < 3) {
-    o.editorSuggestions = buildUnnamed376();
-    o.processingErrors = buildUnnamed377();
-    o.processingHints = buildUnnamed378();
-    o.processingWarnings = buildUnnamed379();
-    o.tagSuggestions = buildUnnamed380();
+    o.editorSuggestions = buildUnnamed399();
+    o.processingErrors = buildUnnamed400();
+    o.processingHints = buildUnnamed401();
+    o.processingWarnings = buildUnnamed402();
+    o.tagSuggestions = buildUnnamed403();
   }
   buildCounterVideoSuggestions--;
   return o;
@@ -3819,23 +3819,23 @@
 checkVideoSuggestions(api.VideoSuggestions o) {
   buildCounterVideoSuggestions++;
   if (buildCounterVideoSuggestions < 3) {
-    checkUnnamed376(o.editorSuggestions);
-    checkUnnamed377(o.processingErrors);
-    checkUnnamed378(o.processingHints);
-    checkUnnamed379(o.processingWarnings);
-    checkUnnamed380(o.tagSuggestions);
+    checkUnnamed399(o.editorSuggestions);
+    checkUnnamed400(o.processingErrors);
+    checkUnnamed401(o.processingHints);
+    checkUnnamed402(o.processingWarnings);
+    checkUnnamed403(o.tagSuggestions);
   }
   buildCounterVideoSuggestions--;
 }
 
-buildUnnamed381() {
+buildUnnamed404() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed381(core.List<core.String> o) {
+checkUnnamed404(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3846,7 +3846,7 @@
   var o = new api.VideoSuggestionsTagSuggestion();
   buildCounterVideoSuggestionsTagSuggestion++;
   if (buildCounterVideoSuggestionsTagSuggestion < 3) {
-    o.categoryRestricts = buildUnnamed381();
+    o.categoryRestricts = buildUnnamed404();
     o.tag = "foo";
   }
   buildCounterVideoSuggestionsTagSuggestion--;
@@ -3856,33 +3856,33 @@
 checkVideoSuggestionsTagSuggestion(api.VideoSuggestionsTagSuggestion o) {
   buildCounterVideoSuggestionsTagSuggestion++;
   if (buildCounterVideoSuggestionsTagSuggestion < 3) {
-    checkUnnamed381(o.categoryRestricts);
+    checkUnnamed404(o.categoryRestricts);
     unittest.expect(o.tag, unittest.equals('foo'));
   }
   buildCounterVideoSuggestionsTagSuggestion--;
 }
 
-buildUnnamed382() {
+buildUnnamed405() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed382(core.List<core.String> o) {
+checkUnnamed405(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed383() {
+buildUnnamed406() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed383(core.List<core.String> o) {
+checkUnnamed406(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -3893,8 +3893,8 @@
   var o = new api.VideoTopicDetails();
   buildCounterVideoTopicDetails++;
   if (buildCounterVideoTopicDetails < 3) {
-    o.relevantTopicIds = buildUnnamed382();
-    o.topicIds = buildUnnamed383();
+    o.relevantTopicIds = buildUnnamed405();
+    o.topicIds = buildUnnamed406();
   }
   buildCounterVideoTopicDetails--;
   return o;
@@ -3903,8 +3903,8 @@
 checkVideoTopicDetails(api.VideoTopicDetails o) {
   buildCounterVideoTopicDetails++;
   if (buildCounterVideoTopicDetails < 3) {
-    checkUnnamed382(o.relevantTopicIds);
-    checkUnnamed383(o.topicIds);
+    checkUnnamed405(o.relevantTopicIds);
+    checkUnnamed406(o.topicIds);
   }
   buildCounterVideoTopicDetails--;
 }
@@ -5056,8 +5056,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("activities"));
         pathOffset += 10;
 
@@ -5109,8 +5111,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("activities"));
         pathOffset += 10;
 
@@ -5172,8 +5176,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("channelBanners/insert"));
         pathOffset += 21;
 
@@ -5221,8 +5227,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("channelSections"));
         pathOffset += 15;
 
@@ -5270,8 +5278,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("channelSections"));
         pathOffset += 15;
 
@@ -5321,8 +5331,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("channelSections"));
         pathOffset += 15;
 
@@ -5374,8 +5386,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("channelSections"));
         pathOffset += 15;
 
@@ -5432,8 +5446,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("channels"));
         pathOffset += 8;
 
@@ -5491,8 +5507,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("channels"));
         pathOffset += 8;
 
@@ -5544,8 +5562,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("guideCategories"));
         pathOffset += 15;
 
@@ -5597,8 +5617,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("i18nLanguages"));
         pathOffset += 13;
 
@@ -5648,8 +5670,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("i18nRegions"));
         pathOffset += 11;
 
@@ -5702,8 +5726,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("liveBroadcasts/bind"));
         pathOffset += 19;
 
@@ -5757,8 +5783,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("liveBroadcasts/control"));
         pathOffset += 22;
 
@@ -5810,8 +5838,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("liveBroadcasts"));
         pathOffset += 14;
 
@@ -5861,8 +5891,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("liveBroadcasts"));
         pathOffset += 14;
 
@@ -5915,8 +5947,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("liveBroadcasts"));
         pathOffset += 14;
 
@@ -5971,8 +6005,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("liveBroadcasts/transition"));
         pathOffset += 25;
 
@@ -6026,8 +6062,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("liveBroadcasts"));
         pathOffset += 14;
 
@@ -6079,8 +6117,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("liveStreams"));
         pathOffset += 11;
 
@@ -6130,8 +6170,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("liveStreams"));
         pathOffset += 11;
 
@@ -6183,8 +6225,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("liveStreams"));
         pathOffset += 11;
 
@@ -6240,8 +6284,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("liveStreams"));
         pathOffset += 11;
 
@@ -6291,8 +6337,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("playlistItems"));
         pathOffset += 13;
 
@@ -6339,8 +6387,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("playlistItems"));
         pathOffset += 13;
 
@@ -6391,8 +6441,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("playlistItems"));
         pathOffset += 13;
 
@@ -6446,8 +6498,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("playlistItems"));
         pathOffset += 13;
 
@@ -6496,8 +6550,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("playlists"));
         pathOffset += 9;
 
@@ -6546,8 +6602,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("playlists"));
         pathOffset += 9;
 
@@ -6600,8 +6658,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("playlists"));
         pathOffset += 9;
 
@@ -6657,8 +6717,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("playlists"));
         pathOffset += 9;
 
@@ -6735,8 +6797,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("search"));
         pathOffset += 6;
 
@@ -6812,8 +6876,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("subscriptions"));
         pathOffset += 13;
 
@@ -6859,8 +6925,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("subscriptions"));
         pathOffset += 13;
 
@@ -6914,8 +6982,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("subscriptions"));
         pathOffset += 13;
 
@@ -6976,8 +7046,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("thumbnails/set"));
         pathOffset += 14;
 
@@ -7029,8 +7101,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("videoCategories"));
         pathOffset += 15;
 
@@ -7082,8 +7156,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("videos"));
         pathOffset += 6;
 
@@ -7127,8 +7203,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("videos/getRating"));
         pathOffset += 16;
 
@@ -7184,8 +7262,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("videos"));
         pathOffset += 6;
 
@@ -7243,8 +7323,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("videos"));
         pathOffset += 6;
 
@@ -7299,8 +7381,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("videos/rate"));
         pathOffset += 11;
 
@@ -7349,8 +7433,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("videos"));
         pathOffset += 6;
 
@@ -7406,8 +7492,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("watermarks/set"));
         pathOffset += 14;
 
@@ -7451,8 +7539,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/youtube/v3/"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("youtube/v3/"));
+        pathOffset += 11;
         unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("watermarks/unset"));
         pathOffset += 16;
 
diff --git a/generated/googleapis/test/youtubeanalytics/v1_test.dart b/generated/googleapis/test/youtubeanalytics/v1_test.dart
index 04a457c..78dbab8 100644
--- a/generated/googleapis/test/youtubeanalytics/v1_test.dart
+++ b/generated/googleapis/test/youtubeanalytics/v1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed204() {
+buildUnnamed207() {
   var o = new core.List<api.BatchReportDefinitionTemplate>();
   o.add(buildBatchReportDefinitionTemplate());
   o.add(buildBatchReportDefinitionTemplate());
   return o;
 }
 
-checkUnnamed204(core.List<api.BatchReportDefinitionTemplate> o) {
+checkUnnamed207(core.List<api.BatchReportDefinitionTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBatchReportDefinitionTemplate(o[0]);
   checkBatchReportDefinitionTemplate(o[1]);
@@ -34,7 +34,7 @@
   var o = new api.BatchReportDefinitionList();
   buildCounterBatchReportDefinitionList++;
   if (buildCounterBatchReportDefinitionList < 3) {
-    o.items = buildUnnamed204();
+    o.items = buildUnnamed207();
     o.kind = "foo";
   }
   buildCounterBatchReportDefinitionList--;
@@ -44,7 +44,7 @@
 checkBatchReportDefinitionList(api.BatchReportDefinitionList o) {
   buildCounterBatchReportDefinitionList++;
   if (buildCounterBatchReportDefinitionList < 3) {
-    checkUnnamed204(o.items);
+    checkUnnamed207(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBatchReportDefinitionList--;
@@ -71,14 +71,14 @@
   buildCounterBatchReportDefinitionTemplateDefaultOutput--;
 }
 
-buildUnnamed205() {
+buildUnnamed208() {
   var o = new core.List<api.BatchReportDefinitionTemplateDefaultOutput>();
   o.add(buildBatchReportDefinitionTemplateDefaultOutput());
   o.add(buildBatchReportDefinitionTemplateDefaultOutput());
   return o;
 }
 
-checkUnnamed205(core.List<api.BatchReportDefinitionTemplateDefaultOutput> o) {
+checkUnnamed208(core.List<api.BatchReportDefinitionTemplateDefaultOutput> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBatchReportDefinitionTemplateDefaultOutput(o[0]);
   checkBatchReportDefinitionTemplateDefaultOutput(o[1]);
@@ -89,7 +89,7 @@
   var o = new api.BatchReportDefinitionTemplate();
   buildCounterBatchReportDefinitionTemplate++;
   if (buildCounterBatchReportDefinitionTemplate < 3) {
-    o.defaultOutput = buildUnnamed205();
+    o.defaultOutput = buildUnnamed208();
     o.id = "foo";
     o.name = "foo";
     o.status = "foo";
@@ -102,7 +102,7 @@
 checkBatchReportDefinitionTemplate(api.BatchReportDefinitionTemplate o) {
   buildCounterBatchReportDefinitionTemplate++;
   if (buildCounterBatchReportDefinitionTemplate < 3) {
-    checkUnnamed205(o.defaultOutput);
+    checkUnnamed208(o.defaultOutput);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -111,14 +111,14 @@
   buildCounterBatchReportDefinitionTemplate--;
 }
 
-buildUnnamed206() {
+buildUnnamed209() {
   var o = new core.List<api.BatchReportTemplate>();
   o.add(buildBatchReportTemplate());
   o.add(buildBatchReportTemplate());
   return o;
 }
 
-checkUnnamed206(core.List<api.BatchReportTemplate> o) {
+checkUnnamed209(core.List<api.BatchReportTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBatchReportTemplate(o[0]);
   checkBatchReportTemplate(o[1]);
@@ -129,7 +129,7 @@
   var o = new api.BatchReportList();
   buildCounterBatchReportList++;
   if (buildCounterBatchReportList < 3) {
-    o.items = buildUnnamed206();
+    o.items = buildUnnamed209();
     o.kind = "foo";
   }
   buildCounterBatchReportList--;
@@ -139,7 +139,7 @@
 checkBatchReportList(api.BatchReportList o) {
   buildCounterBatchReportList++;
   if (buildCounterBatchReportList < 3) {
-    checkUnnamed206(o.items);
+    checkUnnamed209(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBatchReportList--;
@@ -168,14 +168,14 @@
   buildCounterBatchReportTemplateOutputs--;
 }
 
-buildUnnamed207() {
+buildUnnamed210() {
   var o = new core.List<api.BatchReportTemplateOutputs>();
   o.add(buildBatchReportTemplateOutputs());
   o.add(buildBatchReportTemplateOutputs());
   return o;
 }
 
-checkUnnamed207(core.List<api.BatchReportTemplateOutputs> o) {
+checkUnnamed210(core.List<api.BatchReportTemplateOutputs> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBatchReportTemplateOutputs(o[0]);
   checkBatchReportTemplateOutputs(o[1]);
@@ -208,7 +208,7 @@
   buildCounterBatchReportTemplate++;
   if (buildCounterBatchReportTemplate < 3) {
     o.id = "foo";
-    o.outputs = buildUnnamed207();
+    o.outputs = buildUnnamed210();
     o.reportId = "foo";
     o.timeSpan = buildBatchReportTemplateTimeSpan();
     o.timeUpdated = core.DateTime.parse("2002-02-27T14:01:02");
@@ -221,7 +221,7 @@
   buildCounterBatchReportTemplate++;
   if (buildCounterBatchReportTemplate < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed207(o.outputs);
+    checkUnnamed210(o.outputs);
     unittest.expect(o.reportId, unittest.equals('foo'));
     checkBatchReportTemplateTimeSpan(o.timeSpan);
     unittest.expect(o.timeUpdated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -252,43 +252,43 @@
   buildCounterResultTableColumnHeaders--;
 }
 
-buildUnnamed208() {
+buildUnnamed211() {
   var o = new core.List<api.ResultTableColumnHeaders>();
   o.add(buildResultTableColumnHeaders());
   o.add(buildResultTableColumnHeaders());
   return o;
 }
 
-checkUnnamed208(core.List<api.ResultTableColumnHeaders> o) {
+checkUnnamed211(core.List<api.ResultTableColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResultTableColumnHeaders(o[0]);
   checkResultTableColumnHeaders(o[1]);
 }
 
-buildUnnamed209() {
+buildUnnamed212() {
   var o = new core.List<core.Object>();
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   o.add({'list' : [1, 2, 3], 'bool' : true, 'string' : 'foo'});
   return o;
 }
 
-checkUnnamed209(core.List<core.Object> o) {
+checkUnnamed212(core.List<core.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
   var casted1 = (o[0]) 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')); 
   var casted2 = (o[1]) as core.Map; unittest.expect(casted2, unittest.hasLength(3)); unittest.expect(casted2["list"], unittest.equals([1, 2, 3])); unittest.expect(casted2["bool"], unittest.equals(true)); unittest.expect(casted2["string"], unittest.equals('foo')); 
 }
 
-buildUnnamed210() {
+buildUnnamed213() {
   var o = new core.List<core.List<core.Object>>();
-  o.add(buildUnnamed209());
-  o.add(buildUnnamed209());
+  o.add(buildUnnamed212());
+  o.add(buildUnnamed212());
   return o;
 }
 
-checkUnnamed210(core.List<core.List<core.Object>> o) {
+checkUnnamed213(core.List<core.List<core.Object>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed209(o[0]);
-  checkUnnamed209(o[1]);
+  checkUnnamed212(o[0]);
+  checkUnnamed212(o[1]);
 }
 
 core.int buildCounterResultTable = 0;
@@ -296,9 +296,9 @@
   var o = new api.ResultTable();
   buildCounterResultTable++;
   if (buildCounterResultTable < 3) {
-    o.columnHeaders = buildUnnamed208();
+    o.columnHeaders = buildUnnamed211();
     o.kind = "foo";
-    o.rows = buildUnnamed210();
+    o.rows = buildUnnamed213();
   }
   buildCounterResultTable--;
   return o;
@@ -307,9 +307,9 @@
 checkResultTable(api.ResultTable o) {
   buildCounterResultTable++;
   if (buildCounterResultTable < 3) {
-    checkUnnamed208(o.columnHeaders);
+    checkUnnamed211(o.columnHeaders);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed210(o.rows);
+    checkUnnamed213(o.rows);
   }
   buildCounterResultTable--;
 }
@@ -408,8 +408,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/youtube/analytics/v1/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("youtube/analytics/v1/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("batchReportDefinitions"));
         pathOffset += 22;
 
@@ -458,8 +460,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/youtube/analytics/v1/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("youtube/analytics/v1/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("batchReports"));
         pathOffset += 12;
 
@@ -516,8 +520,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/youtube/analytics/v1/"));
-        pathOffset += 22;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 21), unittest.equals("youtube/analytics/v1/"));
+        pathOffset += 21;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("reports"));
         pathOffset += 7;
 
diff --git a/generated/googleapis_beta/CHANGELOG.md b/generated/googleapis_beta/CHANGELOG.md
index e01e4e7..9954163 100644
--- a/generated/googleapis_beta/CHANGELOG.md
+++ b/generated/googleapis_beta/CHANGELOG.md
@@ -1,3 +1,11 @@
+## 0.2.0
+
+* [apis] autoscaler:v1beta2: schema changes
+* [apis] datastore:v1beta2: new API scopes, more descriptions
+* [apis] manager:v1beta2: schema changes
+* [apis-breaking] genomics:v1beta: major changes (method argument changes, schema renames, method removals/additions)
+* [generator] Bugfix in resumable media uploader.
+
 ## 0.1.1
 
 * [generator] Make shorter descriptions in pubspec.yaml: Only list api:version tuples.
diff --git a/generated/googleapis_beta/lib/autoscaler/v1beta2.dart b/generated/googleapis_beta/lib/autoscaler/v1beta2.dart
index 876d526..3440ba5 100644
--- a/generated/googleapis_beta/lib/autoscaler/v1beta2.dart
+++ b/generated/googleapis_beta/lib/autoscaler/v1beta2.dart
@@ -31,7 +31,7 @@
   ZoneOperationsResourceApi get zoneOperations => new ZoneOperationsResourceApi(_requester);
 
   AutoscalerApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/autoscaler/v1beta2/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "autoscaler/v1beta2/");
 }
 
 
@@ -568,6 +568,9 @@
    */
   core.String id;
 
+  /** Type of resource. */
+  core.String kind;
+
   /** Name of the Autoscaler resource. Must be unique per project and zone. */
   core.String name;
 
@@ -597,6 +600,9 @@
     if (_json.containsKey("id")) {
       id = _json["id"];
     }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
     if (_json.containsKey("name")) {
       name = _json["name"];
     }
@@ -622,6 +628,9 @@
     if (id != null) {
       _json["id"] = id;
     }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
     if (name != null) {
       _json["name"] = name;
     }
@@ -641,6 +650,9 @@
   /** Autoscaler resources. */
   core.List<Autoscaler> items;
 
+  /** Type of resource. */
+  core.String kind;
+
   /** [Output only] A token used to continue a truncated list request. */
   core.String nextPageToken;
 
@@ -651,6 +663,9 @@
     if (_json.containsKey("items")) {
       items = _json["items"].map((value) => new Autoscaler.fromJson(value)).toList();
     }
+    if (_json.containsKey("kind")) {
+      kind = _json["kind"];
+    }
     if (_json.containsKey("nextPageToken")) {
       nextPageToken = _json["nextPageToken"];
     }
@@ -661,6 +676,9 @@
     if (items != null) {
       _json["items"] = items.map((value) => (value).toJson()).toList();
     }
+    if (kind != null) {
+      _json["kind"] = kind;
+    }
     if (nextPageToken != null) {
       _json["nextPageToken"] = nextPageToken;
     }
@@ -793,6 +811,9 @@
    */
   core.double utilizationTarget;
 
+  /** Defines type in which utilization_target is expressed. */
+  core.String utilizationTargetType;
+
 
   AutoscalingPolicyCustomMetricUtilization();
 
@@ -803,6 +824,9 @@
     if (_json.containsKey("utilizationTarget")) {
       utilizationTarget = _json["utilizationTarget"];
     }
+    if (_json.containsKey("utilizationTargetType")) {
+      utilizationTargetType = _json["utilizationTargetType"];
+    }
   }
 
   core.Map toJson() {
@@ -813,6 +837,9 @@
     if (utilizationTarget != null) {
       _json["utilizationTarget"] = utilizationTarget;
     }
+    if (utilizationTargetType != null) {
+      _json["utilizationTargetType"] = utilizationTargetType;
+    }
     return _json;
   }
 }
diff --git a/generated/googleapis_beta/lib/cloudmonitoring/v2beta1.dart b/generated/googleapis_beta/lib/cloudmonitoring/v2beta1.dart
index 8f8bd13..5d4bcad 100644
--- a/generated/googleapis_beta/lib/cloudmonitoring/v2beta1.dart
+++ b/generated/googleapis_beta/lib/cloudmonitoring/v2beta1.dart
@@ -26,7 +26,7 @@
   TimeseriesDescriptorsResourceApi get timeseriesDescriptors => new TimeseriesDescriptorsResourceApi(_requester);
 
   CloudmonitoringApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/cloudmonitoring/v2beta1/projects/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "cloudmonitoring/v2beta1/projects/");
 }
 
 
diff --git a/generated/googleapis_beta/lib/datastore/v1beta2.dart b/generated/googleapis_beta/lib/datastore/v1beta2.dart
index 5b1293f..73c2f03 100644
--- a/generated/googleapis_beta/lib/datastore/v1beta2.dart
+++ b/generated/googleapis_beta/lib/datastore/v1beta2.dart
@@ -15,6 +15,9 @@
 
 /** API for accessing Google Cloud Datastore. */
 class DatastoreApi {
+  /** View and manage your data across Google Cloud Platform services */
+  static const CloudPlatformScope = "https://www.googleapis.com/auth/cloud-platform";
+
   /** View and manage your Google Cloud Datastore data */
   static const DatastoreScope = "https://www.googleapis.com/auth/datastore";
 
@@ -27,7 +30,7 @@
   DatasetsResourceApi get datasets => new DatasetsResourceApi(_requester);
 
   DatastoreApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/datastore/v1beta2/datasets/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "datastore/v1beta2/datasets/");
 }
 
 
@@ -552,7 +555,9 @@
 }
 
 
-/** Not documented yet. */
+/**
+ * A filter that merges the multiple other filters using the given operation.
+ */
 class CompositeFilter {
   /** The list of filters to combine. Must contain at least one filter. */
   core.List<Filter> filters;
@@ -590,7 +595,7 @@
 }
 
 
-/** Not documented yet. */
+/** An entity. */
 class Entity {
   /**
    * The entity's key.
@@ -629,7 +634,7 @@
 }
 
 
-/** Not documented yet. */
+/** The result of fetching an entity from the datastore. */
 class EntityResult {
   /** The resulting entity. */
   Entity entity;
@@ -653,7 +658,7 @@
 }
 
 
-/** Not documented yet. */
+/** A holder for any type of filter. Exactly one field should be specified. */
 class Filter {
   /** A composite filter. */
   CompositeFilter compositeFilter;
@@ -686,7 +691,7 @@
 }
 
 
-/** Not documented yet. */
+/** A GQL query. */
 class GqlQuery {
   /** When false, the query string must not contain a literal. */
   core.bool allowLiteral;
@@ -708,7 +713,7 @@
    */
   core.List<GqlQueryArg> numberArgs;
 
-  /** Not documented yet. */
+  /** The query string. */
   core.String queryString;
 
 
@@ -748,7 +753,7 @@
 }
 
 
-/** Not documented yet. */
+/** A binding argument for a GQL query. */
 class GqlQueryArg {
   /** Not documented yet. */
   core.String cursor;
@@ -801,7 +806,7 @@
 }
 
 
-/** Not documented yet. */
+/** A unique identifier for an entity. */
 class Key {
   /**
    * Entities are partitioned into subsets, currently identified by a dataset
@@ -908,7 +913,7 @@
 }
 
 
-/** Not documented yet. */
+/** A representation of a kind. */
 class KindExpression {
   /** The name of the kind. */
   core.String name;
@@ -1016,7 +1021,7 @@
 }
 
 
-/** Not documented yet. */
+/** A set of changes to apply. */
 class Mutation {
   /**
    * Keys of entities to delete. Each key must have a complete key path and must
@@ -1136,7 +1141,12 @@
 }
 
 
-/** Not documented yet. */
+/**
+ * An identifier for a particular subset of entities.
+ *
+ * Entities are partitioned into various subsets, each used by different
+ * datasets and different namespaces within a dataset and so forth.
+ */
 class PartitionId {
   /** The dataset ID. */
   core.String datasetId;
@@ -1169,7 +1179,7 @@
 }
 
 
-/** Not documented yet. */
+/** An entity property. */
 class Property {
   /** A blob key value. */
   core.String blobKeyValue;
@@ -1315,7 +1325,7 @@
 }
 
 
-/** Not documented yet. */
+/** A representation of a property in a projection. */
 class PropertyExpression {
   /**
    * The aggregation function to apply to the property. Optional. Can only be
@@ -1356,7 +1366,7 @@
 }
 
 
-/** Not documented yet. */
+/** A filter on a specific property. */
 class PropertyFilter {
   /**
    * The operator to filter by. One of lessThan, lessThanOrEqual, greaterThan,
@@ -1408,7 +1418,7 @@
 }
 
 
-/** Not documented yet. */
+/** The desired order for a specific property. */
 class PropertyOrder {
   /**
    * The direction to order by. One of ascending or descending. Optional,
@@ -1447,7 +1457,7 @@
 }
 
 
-/** Not documented yet. */
+/** A reference to a property relative to the kind expressions. */
 class PropertyReference {
   /** The name of the property. */
   core.String name;
@@ -1471,7 +1481,7 @@
 }
 
 
-/** Not documented yet. */
+/** A query. */
 class Query {
   /**
    * An ending point for the query results. Optional. Query cursors are returned
@@ -1600,11 +1610,12 @@
 }
 
 
-/** Not documented yet. */
+/** A batch of results produced by a query. */
 class QueryResultBatch {
   /**
    * A cursor that points to the position after the last result in the batch.
-   * May be absent.
+   * May be absent. TODO(arfuller): Once all plans produce cursors update
+   * documentation here.
    */
   core.String endCursor;
 
@@ -1916,7 +1927,10 @@
 }
 
 
-/** Not documented yet. */
+/**
+ * A message that can hold any of the supported value types and associated
+ * metadata.
+ */
 class Value {
   /** A blob key value. */
   core.String blobKeyValue;
diff --git a/generated/googleapis_beta/lib/dns/v1beta1.dart b/generated/googleapis_beta/lib/dns/v1beta1.dart
index 55e6468..f82a0ec 100644
--- a/generated/googleapis_beta/lib/dns/v1beta1.dart
+++ b/generated/googleapis_beta/lib/dns/v1beta1.dart
@@ -36,7 +36,7 @@
   ResourceRecordSetsResourceApi get resourceRecordSets => new ResourceRecordSetsResourceApi(_requester);
 
   DnsApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/dns/v1beta1/projects/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "dns/v1beta1/projects/");
 }
 
 
diff --git a/generated/googleapis_beta/lib/genomics/v1beta.dart b/generated/googleapis_beta/lib/genomics/v1beta.dart
index c74ffda..e681268 100644
--- a/generated/googleapis_beta/lib/genomics/v1beta.dart
+++ b/generated/googleapis_beta/lib/genomics/v1beta.dart
@@ -38,9 +38,10 @@
   ReadsResourceApi get reads => new ReadsResourceApi(_requester);
   ReadsetsResourceApi get readsets => new ReadsetsResourceApi(_requester);
   VariantsResourceApi get variants => new VariantsResourceApi(_requester);
+  VariantsetsResourceApi get variantsets => new VariantsetsResourceApi(_requester);
 
   GenomicsApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/genomics/v1beta/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "genomics/v1beta/");
 }
 
 
@@ -57,15 +58,15 @@
    *
    * Request parameters:
    *
-   * [variantsetId] - The ID of the variantset to query over. It must be public.
-   * Private variantsets will return an unauthorized exception.
+   * [variantSetId] - The ID of the variant set to query over. It must be
+   * public. Private variant sets will return an unauthorized exception.
    *
    * [allele] - Required. The allele to look for ('A', 'C', 'G' or 'T').
    *
-   * [contig] - Required. The contig to query over.
-   *
    * [position] - Required. The 0-based position to query.
    *
+   * [referenceName] - Required. The reference to query over.
+   *
    * Completes with a [Beacon].
    *
    * Completes with a [common.ApiRequestError] if the API endpoint returned an
@@ -74,7 +75,7 @@
    * If the used [http.Client] completes with an error when making a REST call,
    * this method  will complete with the same error.
    */
-  async.Future<Beacon> get(core.String variantsetId, {core.String allele, core.String contig, core.String position}) {
+  async.Future<Beacon> get(core.String variantSetId, {core.String allele, core.String position, core.String referenceName}) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -82,21 +83,21 @@
     var _downloadOptions = common.DownloadOptions.Metadata;
     var _body = null;
 
-    if (variantsetId == null) {
-      throw new core.ArgumentError("Parameter variantsetId is required.");
+    if (variantSetId == null) {
+      throw new core.ArgumentError("Parameter variantSetId is required.");
     }
     if (allele != null) {
       _queryParams["allele"] = [allele];
     }
-    if (contig != null) {
-      _queryParams["contig"] = [contig];
-    }
     if (position != null) {
       _queryParams["position"] = [position];
     }
+    if (referenceName != null) {
+      _queryParams["referenceName"] = [referenceName];
+    }
 
 
-    _url = 'beacons/' + common_internal.Escaper.ecapeVariable('$variantsetId');
+    _url = 'beacons/' + common_internal.Escaper.ecapeVariable('$variantSetId');
 
     var _response = _requester.request(_url,
                                        "GET",
@@ -119,13 +120,13 @@
       _requester = client;
 
   /**
-   * Creates a new callset.
+   * Creates a new call set.
    *
    * [request] - The metadata request object.
    *
    * Request parameters:
    *
-   * Completes with a [Callset].
+   * Completes with a [CallSet].
    *
    * Completes with a [common.ApiRequestError] if the API endpoint returned an
    * error.
@@ -133,7 +134,7 @@
    * If the used [http.Client] completes with an error when making a REST call,
    * this method  will complete with the same error.
    */
-  async.Future<Callset> create(Callset request) {
+  async.Future<CallSet> create(CallSet request) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -155,15 +156,15 @@
                                        uploadOptions: _uploadOptions,
                                        uploadMedia: _uploadMedia,
                                        downloadOptions: _downloadOptions);
-    return _response.then((data) => new Callset.fromJson(data));
+    return _response.then((data) => new CallSet.fromJson(data));
   }
 
   /**
-   * Deletes a callset.
+   * Deletes a call set.
    *
    * Request parameters:
    *
-   * [callsetId] - The ID of the callset to be deleted.
+   * [callSetId] - The ID of the callset to be deleted.
    *
    * Completes with a [common.ApiRequestError] if the API endpoint returned an
    * error.
@@ -171,7 +172,7 @@
    * If the used [http.Client] completes with an error when making a REST call,
    * this method  will complete with the same error.
    */
-  async.Future delete(core.String callsetId) {
+  async.Future delete(core.String callSetId) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -179,13 +180,13 @@
     var _downloadOptions = common.DownloadOptions.Metadata;
     var _body = null;
 
-    if (callsetId == null) {
-      throw new core.ArgumentError("Parameter callsetId is required.");
+    if (callSetId == null) {
+      throw new core.ArgumentError("Parameter callSetId is required.");
     }
 
     _downloadOptions = null;
 
-    _url = 'callsets/' + common_internal.Escaper.ecapeVariable('$callsetId');
+    _url = 'callsets/' + common_internal.Escaper.ecapeVariable('$callSetId');
 
     var _response = _requester.request(_url,
                                        "DELETE",
@@ -198,13 +199,13 @@
   }
 
   /**
-   * Gets a callset by ID.
+   * Gets a call set by ID.
    *
    * Request parameters:
    *
-   * [callsetId] - The ID of the callset.
+   * [callSetId] - The ID of the callset.
    *
-   * Completes with a [Callset].
+   * Completes with a [CallSet].
    *
    * Completes with a [common.ApiRequestError] if the API endpoint returned an
    * error.
@@ -212,7 +213,7 @@
    * If the used [http.Client] completes with an error when making a REST call,
    * this method  will complete with the same error.
    */
-  async.Future<Callset> get(core.String callsetId) {
+  async.Future<CallSet> get(core.String callSetId) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -220,12 +221,12 @@
     var _downloadOptions = common.DownloadOptions.Metadata;
     var _body = null;
 
-    if (callsetId == null) {
-      throw new core.ArgumentError("Parameter callsetId is required.");
+    if (callSetId == null) {
+      throw new core.ArgumentError("Parameter callSetId is required.");
     }
 
 
-    _url = 'callsets/' + common_internal.Escaper.ecapeVariable('$callsetId');
+    _url = 'callsets/' + common_internal.Escaper.ecapeVariable('$callSetId');
 
     var _response = _requester.request(_url,
                                        "GET",
@@ -234,19 +235,19 @@
                                        uploadOptions: _uploadOptions,
                                        uploadMedia: _uploadMedia,
                                        downloadOptions: _downloadOptions);
-    return _response.then((data) => new Callset.fromJson(data));
+    return _response.then((data) => new CallSet.fromJson(data));
   }
 
   /**
-   * Updates a callset. This method supports patch semantics.
+   * Updates a call set. This method supports patch semantics.
    *
    * [request] - The metadata request object.
    *
    * Request parameters:
    *
-   * [callsetId] - The ID of the callset to be updated.
+   * [callSetId] - The ID of the callset to be updated.
    *
-   * Completes with a [Callset].
+   * Completes with a [CallSet].
    *
    * Completes with a [common.ApiRequestError] if the API endpoint returned an
    * error.
@@ -254,7 +255,7 @@
    * If the used [http.Client] completes with an error when making a REST call,
    * this method  will complete with the same error.
    */
-  async.Future<Callset> patch(Callset request, core.String callsetId) {
+  async.Future<CallSet> patch(CallSet request, core.String callSetId) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -265,12 +266,12 @@
     if (request != null) {
       _body = convert.JSON.encode((request).toJson());
     }
-    if (callsetId == null) {
-      throw new core.ArgumentError("Parameter callsetId is required.");
+    if (callSetId == null) {
+      throw new core.ArgumentError("Parameter callSetId is required.");
     }
 
 
-    _url = 'callsets/' + common_internal.Escaper.ecapeVariable('$callsetId');
+    _url = 'callsets/' + common_internal.Escaper.ecapeVariable('$callSetId');
 
     var _response = _requester.request(_url,
                                        "PATCH",
@@ -279,17 +280,17 @@
                                        uploadOptions: _uploadOptions,
                                        uploadMedia: _uploadMedia,
                                        downloadOptions: _downloadOptions);
-    return _response.then((data) => new Callset.fromJson(data));
+    return _response.then((data) => new CallSet.fromJson(data));
   }
 
   /**
-   * Gets a list of callsets matching the criteria.
+   * Gets a list of call sets matching the criteria.
    *
    * [request] - The metadata request object.
    *
    * Request parameters:
    *
-   * Completes with a [SearchCallsetsResponse].
+   * Completes with a [SearchCallSetsResponse].
    *
    * Completes with a [common.ApiRequestError] if the API endpoint returned an
    * error.
@@ -297,7 +298,7 @@
    * If the used [http.Client] completes with an error when making a REST call,
    * this method  will complete with the same error.
    */
-  async.Future<SearchCallsetsResponse> search(SearchCallsetsRequest request) {
+  async.Future<SearchCallSetsResponse> search(SearchCallSetsRequest request) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -319,19 +320,19 @@
                                        uploadOptions: _uploadOptions,
                                        uploadMedia: _uploadMedia,
                                        downloadOptions: _downloadOptions);
-    return _response.then((data) => new SearchCallsetsResponse.fromJson(data));
+    return _response.then((data) => new SearchCallSetsResponse.fromJson(data));
   }
 
   /**
-   * Updates a callset.
+   * Updates a call set.
    *
    * [request] - The metadata request object.
    *
    * Request parameters:
    *
-   * [callsetId] - The ID of the callset to be updated.
+   * [callSetId] - The ID of the callset to be updated.
    *
-   * Completes with a [Callset].
+   * Completes with a [CallSet].
    *
    * Completes with a [common.ApiRequestError] if the API endpoint returned an
    * error.
@@ -339,7 +340,7 @@
    * If the used [http.Client] completes with an error when making a REST call,
    * this method  will complete with the same error.
    */
-  async.Future<Callset> update(Callset request, core.String callsetId) {
+  async.Future<CallSet> update(CallSet request, core.String callSetId) {
     var _url = null;
     var _queryParams = new core.Map();
     var _uploadMedia = null;
@@ -350,12 +351,12 @@
     if (request != null) {
       _body = convert.JSON.encode((request).toJson());
     }
-    if (callsetId == null) {
-      throw new core.ArgumentError("Parameter callsetId is required.");
+    if (callSetId == null) {
+      throw new core.ArgumentError("Parameter callSetId is required.");
     }
 
 
-    _url = 'callsets/' + common_internal.Escaper.ecapeVariable('$callsetId');
+    _url = 'callsets/' + common_internal.Escaper.ecapeVariable('$callSetId');
 
     var _response = _requester.request(_url,
                                        "PUT",
@@ -364,7 +365,7 @@
                                        uploadOptions: _uploadOptions,
                                        uploadMedia: _uploadMedia,
                                        downloadOptions: _downloadOptions);
-    return _response.then((data) => new Callset.fromJson(data));
+    return _response.then((data) => new CallSet.fromJson(data));
   }
 
 }
@@ -505,7 +506,7 @@
    *
    * [pageToken] - The continuation token, which is used to page through large
    * result sets. To get the next page of results, set this parameter to the
-   * value of "nextPageToken" from the previous response.
+   * value of nextPageToken from the previous response.
    *
    * [projectId] - Only return datasets which belong to this Google Developers
    * Console project. Only accepts project numbers.
@@ -1270,23 +1271,23 @@
    *
    * [pageToken] - The continuation token, which is used to page through large
    * result sets. To get the next page of results, set this parameter to the
-   * value of "nextPageToken" from the previous response.
+   * value of nextPageToken from the previous response.
    *
    * [range_sequenceEnd] - The end position of the range on the reference,
    * 1-based exclusive. If specified, sequenceName must also be specified.
    *
-   * [range_sequenceName] - The reference sequence name, for example "chr1",
-   * "1", or "chrX".
+   * [range_sequenceName] - The reference sequence name, for example chr1, 1, or
+   * chrX.
    *
    * [range_sequenceStart] - The start position of the range on the reference,
    * 1-based inclusive. If specified, sequenceName must also be specified.
    *
    * [targetBucketWidth] - The desired width of each reported coverage bucket in
    * base pairs. This will be rounded down to the nearest precomputed bucket
-   * width; the value of which is returned as bucket_width in the response.
+   * width; the value of which is returned as bucketWidth in the response.
    * Defaults to infinity (each bucket spans an entire reference sequence) or
    * the length of the target range, if specified. The smallest precomputed
-   * bucket_width is currently 2048 base pairs; this is subject to change.
+   * bucketWidth is currently 2048 base pairs; this is subject to change.
    *
    * Completes with a [ListCoverageBucketsResponse].
    *
@@ -1509,47 +1510,6 @@
   }
 
   /**
-   * Gets a summary of all the variant data in a variantset.
-   *
-   * Request parameters:
-   *
-   * [variantsetId] - Required. The ID of the variant set to get variant summary
-   * information for.
-   *
-   * Completes with a [GetVariantsSummaryResponse].
-   *
-   * Completes with a [common.ApiRequestError] if the API endpoint returned an
-   * error.
-   *
-   * If the used [http.Client] completes with an error when making a REST call,
-   * this method  will complete with the same error.
-   */
-  async.Future<GetVariantsSummaryResponse> getSummary({core.String variantsetId}) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = common.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (variantsetId != null) {
-      _queryParams["variantsetId"] = [variantsetId];
-    }
-
-
-    _url = 'variants/summary';
-
-    var _response = _requester.request(_url,
-                                       "GET",
-                                       body: _body,
-                                       queryParams: _queryParams,
-                                       uploadOptions: _uploadOptions,
-                                       uploadMedia: _uploadMedia,
-                                       downloadOptions: _downloadOptions);
-    return _response.then((data) => new GetVariantsSummaryResponse.fromJson(data));
-  }
-
-  /**
    * Creates variant data by asynchronously importing the provided information.
    *
    * [request] - The metadata request object.
@@ -1590,51 +1550,6 @@
   }
 
   /**
-   * Updates a variant. This method supports patch semantics.
-   *
-   * [request] - The metadata request object.
-   *
-   * Request parameters:
-   *
-   * [variantId] - The ID of the variant to be updated..
-   *
-   * Completes with a [Variant].
-   *
-   * Completes with a [common.ApiRequestError] if the API endpoint returned an
-   * error.
-   *
-   * If the used [http.Client] completes with an error when making a REST call,
-   * this method  will complete with the same error.
-   */
-  async.Future<Variant> patch(Variant request, core.String variantId) {
-    var _url = null;
-    var _queryParams = new core.Map();
-    var _uploadMedia = null;
-    var _uploadOptions = null;
-    var _downloadOptions = common.DownloadOptions.Metadata;
-    var _body = null;
-
-    if (request != null) {
-      _body = convert.JSON.encode((request).toJson());
-    }
-    if (variantId == null) {
-      throw new core.ArgumentError("Parameter variantId is required.");
-    }
-
-
-    _url = 'variants/' + common_internal.Escaper.ecapeVariable('$variantId');
-
-    var _response = _requester.request(_url,
-                                       "PATCH",
-                                       body: _body,
-                                       queryParams: _queryParams,
-                                       uploadOptions: _uploadOptions,
-                                       uploadMedia: _uploadMedia,
-                                       downloadOptions: _downloadOptions);
-    return _response.then((data) => new Variant.fromJson(data));
-  }
-
-  /**
    * Gets a list of variants matching the criteria.
    *
    * [request] - The metadata request object.
@@ -1675,13 +1590,14 @@
   }
 
   /**
-   * Updates a variant.
+   * Updates a variant's names and info fields. All other modifications are
+   * silently ignored. Returns the modified variant without its calls.
    *
    * [request] - The metadata request object.
    *
    * Request parameters:
    *
-   * [variantId] - The ID of the variant to be updated..
+   * [variantId] - The ID of the variant to be updated.
    *
    * Completes with a [Variant].
    *
@@ -1722,9 +1638,139 @@
 }
 
 
+/** Not documented yet. */
+class VariantsetsResourceApi {
+  final common_internal.ApiRequester _requester;
+
+  VariantsetsResourceApi(common_internal.ApiRequester client) : 
+      _requester = client;
+
+  /**
+   * Deletes the contents of a variant set. The variant set object is not
+   * deleted.
+   *
+   * Request parameters:
+   *
+   * [variantSetId] - The ID of the variant set to be deleted.
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future delete(core.String variantSetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (variantSetId == null) {
+      throw new core.ArgumentError("Parameter variantSetId is required.");
+    }
+
+    _downloadOptions = null;
+
+    _url = 'variantsets/' + common_internal.Escaper.ecapeVariable('$variantSetId');
+
+    var _response = _requester.request(_url,
+                                       "DELETE",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => null);
+  }
+
+  /**
+   * Gets a variant set by ID.
+   *
+   * Request parameters:
+   *
+   * [variantSetId] - Required. The ID of the variant set.
+   *
+   * Completes with a [VariantSet].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<VariantSet> get(core.String variantSetId) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (variantSetId == null) {
+      throw new core.ArgumentError("Parameter variantSetId is required.");
+    }
+
+
+    _url = 'variantsets/' + common_internal.Escaper.ecapeVariable('$variantSetId');
+
+    var _response = _requester.request(_url,
+                                       "GET",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new VariantSet.fromJson(data));
+  }
+
+  /**
+   * Returns a list of all variant sets matching search criteria.
+   *
+   * [request] - The metadata request object.
+   *
+   * Request parameters:
+   *
+   * Completes with a [SearchVariantSetsResponse].
+   *
+   * Completes with a [common.ApiRequestError] if the API endpoint returned an
+   * error.
+   *
+   * If the used [http.Client] completes with an error when making a REST call,
+   * this method  will complete with the same error.
+   */
+  async.Future<SearchVariantSetsResponse> search(SearchVariantSetsRequest request) {
+    var _url = null;
+    var _queryParams = new core.Map();
+    var _uploadMedia = null;
+    var _uploadOptions = null;
+    var _downloadOptions = common.DownloadOptions.Metadata;
+    var _body = null;
+
+    if (request != null) {
+      _body = convert.JSON.encode((request).toJson());
+    }
+
+
+    _url = 'variantsets/search';
+
+    var _response = _requester.request(_url,
+                                       "POST",
+                                       body: _body,
+                                       queryParams: _queryParams,
+                                       uploadOptions: _uploadOptions,
+                                       uploadMedia: _uploadMedia,
+                                       downloadOptions: _downloadOptions);
+    return _response.then((data) => new SearchVariantSetsResponse.fromJson(data));
+  }
+
+}
+
+
 
 /**
- * A beacon represents whether any variant call in a variantset has a specific
+ * A beacon represents whether any variant call in a variant set has a specific
  * allele at a particular position.
  */
 class Beacon {
@@ -1754,25 +1800,24 @@
  * A Call represents the determination of genotype with respect to a particular
  * variant. It may include associated information such as quality and phasing.
  * For example, a Call might assign a probability of 0.32 to the occurrence of a
- * SNP named rs1234 in a callset with the name NA12345.
+ * SNP named rs1234 in a call set with the name NA12345.
  */
 class Call {
-  /** The ID of the callset this variant call belongs to. */
-  core.String callsetId;
+  /** The ID of the call set this variant call belongs to. */
+  core.String callSetId;
 
-  /** The name of the callset this variant call belongs to. */
-  core.String callsetName;
+  /** The name of the call set this variant call belongs to. */
+  core.String callSetName;
 
   /**
    * The genotype of this variant call. Each value represents either the value
    * of the referenceBases field or a 1-based index into alternateBases. If a
-   * variant had a referenceBases field of "T" and an alternateBases value of
+   * variant had a referenceBases value of T and an alternateBases value of
    * ["A", "C"], and the genotype was [2, 1], that would mean the call
-   * represented the heterozygous value "CA" for this variant. If the genotype
-   * was instead [0, 1], the represented value would be "TA". Ordering of the
-   * genotype values is important if the phaseset field is present. If a
-   * genotype is not called (that is, a "." is present in the GT string) -1 is
-   * returned.
+   * represented the heterozygous value CA for this variant. If the genotype was
+   * instead [0, 1], the represented value would be TA. Ordering of the genotype
+   * values is important if the phaseset is present. If a genotype is not called
+   * (that is, a . is present in the GT string) -1 is returned.
    */
   core.List<core.int> genotype;
 
@@ -1788,10 +1833,10 @@
 
   /**
    * If this field is present, this variant call's genotype ordering implies the
-   * phase of the bases and is consistent with any other variant calls on the
-   * same contig which have the same phaseset value. When importing data from
-   * VCF, if the genotype data was phased but no phase set was specified this
-   * field will be set to "*".
+   * phase of the bases and is consistent with any other variant calls in the
+   * same reference sequence which have the same phaseset value. When importing
+   * data from VCF, if the genotype data was phased but no phase set was
+   * specified this field will be set to *.
    */
   core.String phaseset;
 
@@ -1799,11 +1844,11 @@
   Call();
 
   Call.fromJson(core.Map _json) {
-    if (_json.containsKey("callsetId")) {
-      callsetId = _json["callsetId"];
+    if (_json.containsKey("callSetId")) {
+      callSetId = _json["callSetId"];
     }
-    if (_json.containsKey("callsetName")) {
-      callsetName = _json["callsetName"];
+    if (_json.containsKey("callSetName")) {
+      callSetName = _json["callSetName"];
     }
     if (_json.containsKey("genotype")) {
       genotype = _json["genotype"];
@@ -1821,11 +1866,11 @@
 
   core.Map toJson() {
     var _json = new core.Map();
-    if (callsetId != null) {
-      _json["callsetId"] = callsetId;
+    if (callSetId != null) {
+      _json["callSetId"] = callSetId;
     }
-    if (callsetName != null) {
-      _json["callsetName"] = callsetName;
+    if (callSetName != null) {
+      _json["callSetName"] = callSetName;
     }
     if (genotype != null) {
       _json["genotype"] = genotype;
@@ -1844,12 +1889,12 @@
 }
 
 
-/** A Callset is a collection of Variant Calls. It belongs to a Variantset. */
-class Callset {
-  /** The date this callset was created in milliseconds from the epoch. */
+/** A CallSet is a collection of variant calls. It belongs to a variant set. */
+class CallSet {
+  /** The date this call set was created in milliseconds from the epoch. */
   core.String created;
 
-  /** The Google generated ID of the callset, immutable. */
+  /** The Google generated ID of the call set, immutable. */
   core.String id;
 
   /** A map of additional callset information. */
@@ -1858,13 +1903,16 @@
   /** The callset name. */
   core.String name;
 
-  /** The ID of the variantset this callset belongs to. */
-  core.String variantsetId;
+  /** The sample ID this call set corresponds to. */
+  core.String sampleId;
+
+  /** The IDs of the variant sets this call set belongs to. */
+  core.List<core.String> variantSetIds;
 
 
-  Callset();
+  CallSet();
 
-  Callset.fromJson(core.Map _json) {
+  CallSet.fromJson(core.Map _json) {
     if (_json.containsKey("created")) {
       created = _json["created"];
     }
@@ -1877,8 +1925,11 @@
     if (_json.containsKey("name")) {
       name = _json["name"];
     }
-    if (_json.containsKey("variantsetId")) {
-      variantsetId = _json["variantsetId"];
+    if (_json.containsKey("sampleId")) {
+      sampleId = _json["sampleId"];
+    }
+    if (_json.containsKey("variantSetIds")) {
+      variantSetIds = _json["variantSetIds"];
     }
   }
 
@@ -1896,47 +1947,11 @@
     if (name != null) {
       _json["name"] = name;
     }
-    if (variantsetId != null) {
-      _json["variantsetId"] = variantsetId;
+    if (sampleId != null) {
+      _json["sampleId"] = sampleId;
     }
-    return _json;
-  }
-}
-
-
-/**
- * ContigBound records an upper bound for the starting coordinate of variants in
- * a particular contig.
- */
-class ContigBound {
-  /** The contig the bound is associate with. */
-  core.String contig;
-
-  /**
-   * An upper bound (inclusive) on the starting coordinate of any variant in the
-   * contig.
-   */
-  core.String upperBound;
-
-
-  ContigBound();
-
-  ContigBound.fromJson(core.Map _json) {
-    if (_json.containsKey("contig")) {
-      contig = _json["contig"];
-    }
-    if (_json.containsKey("upperBound")) {
-      upperBound = _json["upperBound"];
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (contig != null) {
-      _json["contig"] = contig;
-    }
-    if (upperBound != null) {
-      _json["upperBound"] = upperBound;
+    if (variantSetIds != null) {
+      _json["variantSetIds"] = variantSetIds;
     }
     return _json;
   }
@@ -2042,28 +2057,28 @@
 class ExperimentalCreateJobRequest {
   /**
    * Specifies whether or not to run the alignment pipeline. At least one of
-   * align or call_variants must be provided.
+   * align or callVariants must be provided.
    */
   core.bool align;
 
   /**
    * Specifies whether or not to run the variant calling pipeline. If specified,
    * alignment will be performed first and the aligned BAMs will passed as input
-   * to the variant caller. At least one of align or call_variants must be
+   * to the variant caller. At least one of align or callVariants must be
    * provided.
    */
   core.bool callVariants;
 
   /**
-   * Specifies where to copy the results of certain pipelines. This shoud be in
-   * the form of "gs://bucket/path".
+   * Specifies where to copy the results of certain pipelines. This should be in
+   * the form of gs://bucket/path.
    */
   core.String gcsOutputPath;
 
   /**
    * A list of Google Cloud Storage URIs of paired end .fastq files to operate
    * upon. If specified, this represents the second file of each paired .fastq
-   * file. The first file of each pair should be specified in "sourceUris".
+   * file. The first file of each pair should be specified in sourceUris.
    */
   core.List<core.String> pairedSourceUris;
 
@@ -2076,7 +2091,7 @@
    * A list of Google Cloud Storage URIs of data files to operate upon. These
    * can be .bam, interleaved .fastq, or paired .fastq. If specifying paired
    * .fastq files, the first of each pair of files should be listed here, and
-   * the second of each pair should be listed in "pairedSourceUris".
+   * the second of each pair should be listed in pairedSourceUris.
    */
   core.List<core.String> sourceUris;
 
@@ -2173,7 +2188,8 @@
 
   /**
    * The reference names to export. If this is not specified, all reference
-   * sequences are exported. Use '*' to export unmapped reads.
+   * sequences, including unmapped reads, are exported. Use * to export only
+   * unmapped reads.
    */
   core.List<core.String> referenceNames;
 
@@ -2254,10 +2270,10 @@
   core.String bigqueryTable;
 
   /**
-   * If provided, only variant call information from the specified callsets will
-   * be exported. By default all variant calls are exported.
+   * If provided, only variant call information from the specified call sets
+   * will be exported. By default all variant calls are exported.
    */
-  core.List<core.String> callsetIds;
+  core.List<core.String> callSetIds;
 
   /**
    * The format for the exported data.
@@ -2273,10 +2289,10 @@
   core.String projectId;
 
   /**
-   * Required. The ID of the variantset that contains variant data which should
-   * be exported. The caller must have READ access to this variantset.
+   * Required. The ID of the variant set that contains variant data which should
+   * be exported. The caller must have READ access to this variant set.
    */
-  core.String variantsetId;
+  core.String variantSetId;
 
 
   ExportVariantsRequest();
@@ -2288,8 +2304,8 @@
     if (_json.containsKey("bigqueryTable")) {
       bigqueryTable = _json["bigqueryTable"];
     }
-    if (_json.containsKey("callsetIds")) {
-      callsetIds = _json["callsetIds"];
+    if (_json.containsKey("callSetIds")) {
+      callSetIds = _json["callSetIds"];
     }
     if (_json.containsKey("format")) {
       format = _json["format"];
@@ -2297,8 +2313,8 @@
     if (_json.containsKey("projectId")) {
       projectId = _json["projectId"];
     }
-    if (_json.containsKey("variantsetId")) {
-      variantsetId = _json["variantsetId"];
+    if (_json.containsKey("variantSetId")) {
+      variantSetId = _json["variantSetId"];
     }
   }
 
@@ -2310,8 +2326,8 @@
     if (bigqueryTable != null) {
       _json["bigqueryTable"] = bigqueryTable;
     }
-    if (callsetIds != null) {
-      _json["callsetIds"] = callsetIds;
+    if (callSetIds != null) {
+      _json["callSetIds"] = callSetIds;
     }
     if (format != null) {
       _json["format"] = format;
@@ -2319,8 +2335,8 @@
     if (projectId != null) {
       _json["projectId"] = projectId;
     }
-    if (variantsetId != null) {
-      _json["variantsetId"] = variantsetId;
+    if (variantSetId != null) {
+      _json["variantSetId"] = variantSetId;
     }
     return _json;
   }
@@ -2361,7 +2377,7 @@
    */
   core.String sequenceEnd;
 
-  /** The reference sequence name, for example "chr1", "1", or "chrX". */
+  /** The reference sequence name, for example chr1, 1, or chrX. */
   core.String sequenceName;
 
   /**
@@ -2401,42 +2417,6 @@
 }
 
 
-/** The variants summary response. */
-class GetVariantsSummaryResponse {
-  /**
-   * A list of all contigs used by the variants in a dataset with associated
-   * coordinate upper bounds for each one.
-   */
-  core.List<ContigBound> contigBounds;
-
-  /** The metadata associated with this dataset. */
-  core.List<Metadata> metadata;
-
-
-  GetVariantsSummaryResponse();
-
-  GetVariantsSummaryResponse.fromJson(core.Map _json) {
-    if (_json.containsKey("contigBounds")) {
-      contigBounds = _json["contigBounds"].map((value) => new ContigBound.fromJson(value)).toList();
-    }
-    if (_json.containsKey("metadata")) {
-      metadata = _json["metadata"].map((value) => new Metadata.fromJson(value)).toList();
-    }
-  }
-
-  core.Map toJson() {
-    var _json = new core.Map();
-    if (contigBounds != null) {
-      _json["contigBounds"] = contigBounds.map((value) => (value).toJson()).toList();
-    }
-    if (metadata != null) {
-      _json["metadata"] = metadata.map((value) => (value).toJson()).toList();
-    }
-    return _json;
-  }
-}
-
-
 /** Not documented yet. */
 class Header {
   /** (SO) Sorting order of alignments. */
@@ -2627,8 +2607,8 @@
    */
   core.List<core.String> sourceUris;
 
-  /** Required. The variantset to which variant data should be imported. */
-  core.String variantsetId;
+  /** Required. The variant set to which variant data should be imported. */
+  core.String variantSetId;
 
 
   ImportVariantsRequest();
@@ -2640,8 +2620,8 @@
     if (_json.containsKey("sourceUris")) {
       sourceUris = _json["sourceUris"];
     }
-    if (_json.containsKey("variantsetId")) {
-      variantsetId = _json["variantsetId"];
+    if (_json.containsKey("variantSetId")) {
+      variantSetId = _json["variantSetId"];
     }
   }
 
@@ -2653,8 +2633,8 @@
     if (sourceUris != null) {
       _json["sourceUris"] = sourceUris;
     }
-    if (variantsetId != null) {
-      _json["variantsetId"] = variantsetId;
+    if (variantSetId != null) {
+      _json["variantSetId"] = variantSetId;
     }
     return _json;
   }
@@ -2862,15 +2842,15 @@
    * The length of each coverage bucket in base pairs. Note that buckets at the
    * end of a reference sequence may be shorter. This value is omitted if the
    * bucket width is infinity (the default behaviour, with no range or
-   * target_bucket_width).
+   * targetBucketWidth).
    */
   core.String bucketWidth;
 
   /**
    * The coverage buckets. The list of buckets is sparse; a bucket with 0
    * overlapping reads is not returned. A bucket never crosses more than one
-   * reference sequence. Each bucket has width bucket_width, unless its end is
-   * is the end of the reference sequence.
+   * reference sequence. Each bucket has width bucketWidth, unless its end is
+   * the end of the reference sequence.
    */
   core.List<CoverageBucket> coverageBuckets;
 
@@ -3476,6 +3456,45 @@
 }
 
 
+/**
+ * ReferenceBound records an upper bound for the starting coordinate of variants
+ * in a particular reference.
+ */
+class ReferenceBound {
+  /** The reference the bound is associate with. */
+  core.String referenceName;
+
+  /**
+   * An upper bound (inclusive) on the starting coordinate of any variant in the
+   * reference sequence.
+   */
+  core.String upperBound;
+
+
+  ReferenceBound();
+
+  ReferenceBound.fromJson(core.Map _json) {
+    if (_json.containsKey("referenceName")) {
+      referenceName = _json["referenceName"];
+    }
+    if (_json.containsKey("upperBound")) {
+      upperBound = _json["upperBound"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (referenceName != null) {
+      _json["referenceName"] = referenceName;
+    }
+    if (upperBound != null) {
+      _json["upperBound"] = upperBound;
+    }
+    return _json;
+  }
+}
+
+
 /** Not documented yet. */
 class ReferenceSequence {
   /** (AS) Genome assembly identifier. */
@@ -3548,70 +3567,71 @@
 }
 
 
-/** The callset search request. */
-class SearchCallsetsRequest {
-  /** The maximum number of callsets to return. */
-  core.String maxResults;
-
+/** The call set search request. */
+class SearchCallSetsRequest {
   /**
-   * Only return callsets for which a substring of the name matches this string.
+   * Only return call sets for which a substring of the name matches this
+   * string.
    */
   core.String name;
 
+  /** The maximum number of call sets to return. */
+  core.int pageSize;
+
   /**
    * The continuation token, which is used to page through large result sets. To
    * get the next page of results, set this parameter to the value of
-   * "nextPageToken" from the previous response.
+   * nextPageToken from the previous response.
    */
   core.String pageToken;
 
   /**
-   * Restrict the query to callsets within the given variantsets. At least one
+   * Restrict the query to call sets within the given variant sets. At least one
    * ID must be provided.
    */
-  core.List<core.String> variantsetIds;
+  core.List<core.String> variantSetIds;
 
 
-  SearchCallsetsRequest();
+  SearchCallSetsRequest();
 
-  SearchCallsetsRequest.fromJson(core.Map _json) {
-    if (_json.containsKey("maxResults")) {
-      maxResults = _json["maxResults"];
-    }
+  SearchCallSetsRequest.fromJson(core.Map _json) {
     if (_json.containsKey("name")) {
       name = _json["name"];
     }
+    if (_json.containsKey("pageSize")) {
+      pageSize = _json["pageSize"];
+    }
     if (_json.containsKey("pageToken")) {
       pageToken = _json["pageToken"];
     }
-    if (_json.containsKey("variantsetIds")) {
-      variantsetIds = _json["variantsetIds"];
+    if (_json.containsKey("variantSetIds")) {
+      variantSetIds = _json["variantSetIds"];
     }
   }
 
   core.Map toJson() {
     var _json = new core.Map();
-    if (maxResults != null) {
-      _json["maxResults"] = maxResults;
-    }
     if (name != null) {
       _json["name"] = name;
     }
+    if (pageSize != null) {
+      _json["pageSize"] = pageSize;
+    }
     if (pageToken != null) {
       _json["pageToken"] = pageToken;
     }
-    if (variantsetIds != null) {
-      _json["variantsetIds"] = variantsetIds;
+    if (variantSetIds != null) {
+      _json["variantSetIds"] = variantSetIds;
     }
     return _json;
   }
 }
 
 
-/** The callset search response. */
-class SearchCallsetsResponse {
-  /** The list of matching callsets. */
-  core.List<Callset> callsets;
+/** The call set search response. */
+class SearchCallSetsResponse {
+  /** The list of matching call sets. */
+  core.List<CallSet> callSets;
 
   /**
    * The continuation token, which is used to page through large result sets.
@@ -3621,11 +3641,11 @@
   core.String nextPageToken;
 
 
-  SearchCallsetsResponse();
+  SearchCallSetsResponse();
 
-  SearchCallsetsResponse.fromJson(core.Map _json) {
-    if (_json.containsKey("callsets")) {
-      callsets = _json["callsets"].map((value) => new Callset.fromJson(value)).toList();
+  SearchCallSetsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("callSets")) {
+      callSets = _json["callSets"].map((value) => new CallSet.fromJson(value)).toList();
     }
     if (_json.containsKey("nextPageToken")) {
       nextPageToken = _json["nextPageToken"];
@@ -3634,8 +3654,8 @@
 
   core.Map toJson() {
     var _json = new core.Map();
-    if (callsets != null) {
-      _json["callsets"] = callsets.map((value) => (value).toJson()).toList();
+    if (callSets != null) {
+      _json["callSets"] = callSets.map((value) => (value).toJson()).toList();
     }
     if (nextPageToken != null) {
       _json["nextPageToken"] = nextPageToken;
@@ -3668,14 +3688,11 @@
   /**
    * The continuation token which is used to page through large result sets. To
    * get the next page of results, set this parameter to the value of the
-   * "nextPageToken" from the previous response.
+   * nextPageToken from the previous response.
    */
   core.String pageToken;
 
-  /**
-   * Required. Only return jobs which belong to this Google Developers Console
-   * project. Only accepts project numbers.
-   */
+  /** Required. Only return jobs which belong to this Google Developers */
   core.String projectId;
 
   /** Only return jobs which have a matching status. */
@@ -3778,7 +3795,7 @@
   /**
    * The continuation token, which is used to page through large result sets. To
    * get the next page of results, set this parameter to the value of
-   * "nextPageToken" from the previous response.
+   * nextPageToken from the previous response.
    */
   core.String pageToken;
 
@@ -3791,21 +3808,21 @@
 
   /**
    * The end position (1-based, inclusive) of the target range. If specified,
-   * "sequenceName" must also be specified. Defaults to the end of the target
+   * sequenceName must also be specified. Defaults to the end of the target
    * reference sequence, if any.
    */
   core.String sequenceEnd;
 
   /**
-   * Restricts the results to a particular reference sequence such as '1',
-   * 'chr1', or 'X'. The set of valid references sequences depends on the
-   * readsets specified. If set to "*", only unmapped Reads are returned.
+   * Restricts the results to a particular reference sequence such as 1, chr1,
+   * or X. The set of valid references sequences depends on the readsets
+   * specified. If set to *, only unmapped Reads are returned.
    */
   core.String sequenceName;
 
   /**
    * The start position (1-based, inclusive) of the target range. If specified,
-   * "sequenceName" must also be specified. Defaults to the start of the target
+   * sequenceName must also be specified. Defaults to the start of the target
    * reference sequence, if any.
    */
   core.String sequenceStart;
@@ -3922,7 +3939,7 @@
   /**
    * The continuation token, which is used to page through large result sets. To
    * get the next page of results, set this parameter to the value of
-   * "nextPageToken" from the previous response.
+   * nextPageToken from the previous response.
    */
   core.String pageToken;
 
@@ -4000,114 +4017,201 @@
 }
 
 
-/** The variant search request. */
-class SearchVariantsRequest {
+/** The search variant sets request. */
+class SearchVariantSetsRequest {
   /**
-   * Only return variant calls which belong to callsets with these ids. Leaving
-   * this blank returns all variant calls. At most one of callsetNames or
-   * callsetIds should be provided.
+   * Exactly one dataset ID must be provided here. Only variant sets which
+   * belong to this dataset will be returned.
    */
-  core.List<core.String> callsetIds;
+  core.List<core.String> datasetIds;
 
-  /**
-   * Only return variant calls which belong to callsets which have exactly these
-   * names. Leaving this blank returns all variant calls. At most one of
-   * callsetNames or callsetIds should be provided.
-   */
-  core.List<core.String> callsetNames;
-
-  /** Required. Only return variants on this contig. */
-  core.String contig;
-
-  /**
-   * Required. The end of the window (0-based, exclusive) for which overlapping
-   * variants should be returned.
-   */
-  core.String endPosition;
-
-  /** The maximum number of variants to return. */
-  core.String maxResults;
+  /** The maximum number of variant sets to return in a request. */
+  core.int pageSize;
 
   /**
    * The continuation token, which is used to page through large result sets. To
    * get the next page of results, set this parameter to the value of
-   * "nextPageToken" from the previous response.
+   * nextPageToken from the previous response.
    */
   core.String pageToken;
 
-  /**
-   * Required. The beginning of the window (0-based, inclusive) for which
-   * overlapping variants should be returned.
-   */
-  core.String startPosition;
 
-  /** Only return variants which have exactly this name. */
-  core.String variantName;
+  SearchVariantSetsRequest();
 
-  /** Required. The ID of the variantset to search. */
-  core.String variantsetId;
-
-
-  SearchVariantsRequest();
-
-  SearchVariantsRequest.fromJson(core.Map _json) {
-    if (_json.containsKey("callsetIds")) {
-      callsetIds = _json["callsetIds"];
+  SearchVariantSetsRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("datasetIds")) {
+      datasetIds = _json["datasetIds"];
     }
-    if (_json.containsKey("callsetNames")) {
-      callsetNames = _json["callsetNames"];
-    }
-    if (_json.containsKey("contig")) {
-      contig = _json["contig"];
-    }
-    if (_json.containsKey("endPosition")) {
-      endPosition = _json["endPosition"];
-    }
-    if (_json.containsKey("maxResults")) {
-      maxResults = _json["maxResults"];
+    if (_json.containsKey("pageSize")) {
+      pageSize = _json["pageSize"];
     }
     if (_json.containsKey("pageToken")) {
       pageToken = _json["pageToken"];
     }
-    if (_json.containsKey("startPosition")) {
-      startPosition = _json["startPosition"];
-    }
-    if (_json.containsKey("variantName")) {
-      variantName = _json["variantName"];
-    }
-    if (_json.containsKey("variantsetId")) {
-      variantsetId = _json["variantsetId"];
-    }
   }
 
   core.Map toJson() {
     var _json = new core.Map();
-    if (callsetIds != null) {
-      _json["callsetIds"] = callsetIds;
+    if (datasetIds != null) {
+      _json["datasetIds"] = datasetIds;
     }
-    if (callsetNames != null) {
-      _json["callsetNames"] = callsetNames;
-    }
-    if (contig != null) {
-      _json["contig"] = contig;
-    }
-    if (endPosition != null) {
-      _json["endPosition"] = endPosition;
-    }
-    if (maxResults != null) {
-      _json["maxResults"] = maxResults;
+    if (pageSize != null) {
+      _json["pageSize"] = pageSize;
     }
     if (pageToken != null) {
       _json["pageToken"] = pageToken;
     }
-    if (startPosition != null) {
-      _json["startPosition"] = startPosition;
+    return _json;
+  }
+}
+
+
+/** The search variant sets response. */
+class SearchVariantSetsResponse {
+  /**
+   * The continuation token, which is used to page through large result sets.
+   * Provide this value in a subsequent request to return the next page of
+   * results. This field will be empty if there aren't any additional results.
+   */
+  core.String nextPageToken;
+
+  /** The variant sets belonging to the requested dataset. */
+  core.List<VariantSet> variantSets;
+
+
+  SearchVariantSetsResponse();
+
+  SearchVariantSetsResponse.fromJson(core.Map _json) {
+    if (_json.containsKey("nextPageToken")) {
+      nextPageToken = _json["nextPageToken"];
+    }
+    if (_json.containsKey("variantSets")) {
+      variantSets = _json["variantSets"].map((value) => new VariantSet.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (nextPageToken != null) {
+      _json["nextPageToken"] = nextPageToken;
+    }
+    if (variantSets != null) {
+      _json["variantSets"] = variantSets.map((value) => (value).toJson()).toList();
+    }
+    return _json;
+  }
+}
+
+
+/** The variant search request. */
+class SearchVariantsRequest {
+  /**
+   * Only return variant calls which belong to call sets with these ids. Leaving
+   * this blank returns all variant calls.
+   */
+  core.List<core.String> callSetIds;
+
+  /**
+   * Required. The end of the window (0-based, exclusive) for which overlapping
+   * variants should be returned.
+   */
+  core.String end;
+
+  /**
+   * The maximum number of calls to return. However, at least one variant will
+   * always be returned, even if it has more calls than this limit.
+   */
+  core.int maxCalls;
+
+  /** The maximum number of variants to return. */
+  core.int pageSize;
+
+  /**
+   * The continuation token, which is used to page through large result sets. To
+   * get the next page of results, set this parameter to the value of
+   * nextPageToken from the previous response.
+   */
+  core.String pageToken;
+
+  /** Required. Only return variants in this reference sequence. */
+  core.String referenceName;
+
+  /**
+   * Required. The beginning of the window (0-based, inclusive) for which
+   * overlapping variants should be returned.
+   */
+  core.String start;
+
+  /** Only return variants which have exactly this name. */
+  core.String variantName;
+
+  /**
+   * Exactly one variant set ID must be provided. Only variants from this
+   * variant set will be returned.
+   */
+  core.List<core.String> variantSetIds;
+
+
+  SearchVariantsRequest();
+
+  SearchVariantsRequest.fromJson(core.Map _json) {
+    if (_json.containsKey("callSetIds")) {
+      callSetIds = _json["callSetIds"];
+    }
+    if (_json.containsKey("end")) {
+      end = _json["end"];
+    }
+    if (_json.containsKey("maxCalls")) {
+      maxCalls = _json["maxCalls"];
+    }
+    if (_json.containsKey("pageSize")) {
+      pageSize = _json["pageSize"];
+    }
+    if (_json.containsKey("pageToken")) {
+      pageToken = _json["pageToken"];
+    }
+    if (_json.containsKey("referenceName")) {
+      referenceName = _json["referenceName"];
+    }
+    if (_json.containsKey("start")) {
+      start = _json["start"];
+    }
+    if (_json.containsKey("variantName")) {
+      variantName = _json["variantName"];
+    }
+    if (_json.containsKey("variantSetIds")) {
+      variantSetIds = _json["variantSetIds"];
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (callSetIds != null) {
+      _json["callSetIds"] = callSetIds;
+    }
+    if (end != null) {
+      _json["end"] = end;
+    }
+    if (maxCalls != null) {
+      _json["maxCalls"] = maxCalls;
+    }
+    if (pageSize != null) {
+      _json["pageSize"] = pageSize;
+    }
+    if (pageToken != null) {
+      _json["pageToken"] = pageToken;
+    }
+    if (referenceName != null) {
+      _json["referenceName"] = referenceName;
+    }
+    if (start != null) {
+      _json["start"] = start;
     }
     if (variantName != null) {
       _json["variantName"] = variantName;
     }
-    if (variantsetId != null) {
-      _json["variantsetId"] = variantsetId;
+    if (variantSetIds != null) {
+      _json["variantSetIds"] = variantSetIds;
     }
     return _json;
   }
@@ -4154,7 +4258,7 @@
 /**
  * A Variant represents a change in DNA sequence relative to some reference. For
  * example, a Variant could represent a SNP or an insertion. Variants belong to
- * a Variantset.
+ * a variant set.
  */
 class Variant {
   /** The bases that appear instead of the reference bases. */
@@ -4166,17 +4270,14 @@
    */
   core.List<Call> calls;
 
-  /** The contig on which this variant occurs. (such as 'chr20' or 'X') */
-  core.String contig;
-
   /** The date this variant was created, in milliseconds from the epoch. */
   core.String created;
 
   /**
    * The end position (0-based) of this variant. This corresponds to the first
    * base after the last base in the reference allele. So, the length of the
-   * reference allele is (end - position). This is useful for variants that
-   * don't explicitly give alternate bases, for example large deletions.
+   * reference allele is (end - start). This is useful for variants that don't
+   * explicitly give alternate bases, for example large deletions.
    */
   core.String end;
 
@@ -4190,18 +4291,21 @@
   core.List<core.String> names;
 
   /**
-   * The position at which this variant occurs (0-based). This corresponds to
-   * the first base of the string of reference bases.
-   */
-  core.String position;
-
-  /**
    * The reference bases for this variant. They start at the given position.
    */
   core.String referenceBases;
 
-  /** The ID of the variantset this variant belongs to. */
-  core.String variantsetId;
+  /** The reference on which this variant occurs. (such as chr20 or X) */
+  core.String referenceName;
+
+  /**
+   * The position at which this variant occurs (0-based). This corresponds to
+   * the first base of the string of reference bases.
+   */
+  core.String start;
+
+  /** The ID of the variant set this variant belongs to. */
+  core.String variantSetId;
 
 
   Variant();
@@ -4213,9 +4317,6 @@
     if (_json.containsKey("calls")) {
       calls = _json["calls"].map((value) => new Call.fromJson(value)).toList();
     }
-    if (_json.containsKey("contig")) {
-      contig = _json["contig"];
-    }
     if (_json.containsKey("created")) {
       created = _json["created"];
     }
@@ -4231,14 +4332,17 @@
     if (_json.containsKey("names")) {
       names = _json["names"];
     }
-    if (_json.containsKey("position")) {
-      position = _json["position"];
-    }
     if (_json.containsKey("referenceBases")) {
       referenceBases = _json["referenceBases"];
     }
-    if (_json.containsKey("variantsetId")) {
-      variantsetId = _json["variantsetId"];
+    if (_json.containsKey("referenceName")) {
+      referenceName = _json["referenceName"];
+    }
+    if (_json.containsKey("start")) {
+      start = _json["start"];
+    }
+    if (_json.containsKey("variantSetId")) {
+      variantSetId = _json["variantSetId"];
     }
   }
 
@@ -4250,9 +4354,6 @@
     if (calls != null) {
       _json["calls"] = calls.map((value) => (value).toJson()).toList();
     }
-    if (contig != null) {
-      _json["contig"] = contig;
-    }
     if (created != null) {
       _json["created"] = created;
     }
@@ -4268,14 +4369,74 @@
     if (names != null) {
       _json["names"] = names;
     }
-    if (position != null) {
-      _json["position"] = position;
-    }
     if (referenceBases != null) {
       _json["referenceBases"] = referenceBases;
     }
-    if (variantsetId != null) {
-      _json["variantsetId"] = variantsetId;
+    if (referenceName != null) {
+      _json["referenceName"] = referenceName;
+    }
+    if (start != null) {
+      _json["start"] = start;
+    }
+    if (variantSetId != null) {
+      _json["variantSetId"] = variantSetId;
+    }
+    return _json;
+  }
+}
+
+
+/**
+ * A VariantSet represents a collection of Variants and their summary
+ * statistics.
+ */
+class VariantSet {
+  /** The dataset to which this variant set belongs. Immutable. */
+  core.String datasetId;
+
+  /** The Google-generated ID of the variant set. Immutable. */
+  core.String id;
+
+  /** The metadata associated with this variant set. */
+  core.List<Metadata> metadata;
+
+  /**
+   * A list of all references used by the variants in a variant set with
+   * associated coordinate upper bounds for each one.
+   */
+  core.List<ReferenceBound> referenceBounds;
+
+
+  VariantSet();
+
+  VariantSet.fromJson(core.Map _json) {
+    if (_json.containsKey("datasetId")) {
+      datasetId = _json["datasetId"];
+    }
+    if (_json.containsKey("id")) {
+      id = _json["id"];
+    }
+    if (_json.containsKey("metadata")) {
+      metadata = _json["metadata"].map((value) => new Metadata.fromJson(value)).toList();
+    }
+    if (_json.containsKey("referenceBounds")) {
+      referenceBounds = _json["referenceBounds"].map((value) => new ReferenceBound.fromJson(value)).toList();
+    }
+  }
+
+  core.Map toJson() {
+    var _json = new core.Map();
+    if (datasetId != null) {
+      _json["datasetId"] = datasetId;
+    }
+    if (id != null) {
+      _json["id"] = id;
+    }
+    if (metadata != null) {
+      _json["metadata"] = metadata.map((value) => (value).toJson()).toList();
+    }
+    if (referenceBounds != null) {
+      _json["referenceBounds"] = referenceBounds.map((value) => (value).toJson()).toList();
     }
     return _json;
   }
diff --git a/generated/googleapis_beta/lib/manager/v1beta2.dart b/generated/googleapis_beta/lib/manager/v1beta2.dart
index b818f64..6316e9c 100644
--- a/generated/googleapis_beta/lib/manager/v1beta2.dart
+++ b/generated/googleapis_beta/lib/manager/v1beta2.dart
@@ -49,7 +49,7 @@
   TemplatesResourceApi get templates => new TemplatesResourceApi(_requester);
 
   ManagerApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/manager/v1beta2/projects/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "manager/v1beta2/projects/");
 }
 
 
@@ -1736,6 +1736,12 @@
   /** The size of the created disk in gigabytes. */
   core.String diskSizeGb;
 
+  /**
+   * Name of the disk type resource describing which disk type to use to create
+   * the disk. For example 'pd-ssd' or 'pd-standard'. Default is 'pd-standard'
+   */
+  core.String diskType;
+
   /** The fully-qualified URL of a source image to use to create this disk. */
   core.String sourceImage;
 
@@ -1746,6 +1752,9 @@
     if (_json.containsKey("diskSizeGb")) {
       diskSizeGb = _json["diskSizeGb"];
     }
+    if (_json.containsKey("diskType")) {
+      diskType = _json["diskType"];
+    }
     if (_json.containsKey("sourceImage")) {
       sourceImage = _json["sourceImage"];
     }
@@ -1756,6 +1765,9 @@
     if (diskSizeGb != null) {
       _json["diskSizeGb"] = diskSizeGb;
     }
+    if (diskType != null) {
+      _json["diskType"] = diskType;
+    }
     if (sourceImage != null) {
       _json["sourceImage"] = sourceImage;
     }
diff --git a/generated/googleapis_beta/lib/pubsub/v1beta1.dart b/generated/googleapis_beta/lib/pubsub/v1beta1.dart
index c5ce845..c7b372f 100644
--- a/generated/googleapis_beta/lib/pubsub/v1beta1.dart
+++ b/generated/googleapis_beta/lib/pubsub/v1beta1.dart
@@ -30,7 +30,7 @@
   TopicsResourceApi get topics => new TopicsResourceApi(_requester);
 
   PubsubApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/pubsub/v1beta1/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "pubsub/v1beta1/");
 }
 
 
@@ -781,7 +781,7 @@
 
 /** Not documented yet. */
 class ModifyAckDeadlineRequest {
-  /** The new Ack deadline. Must be >= 1. */
+  /** The new Ack deadline. Must be >= 0. */
   core.int ackDeadlineSeconds;
 
   /** The Ack ID. */
diff --git a/generated/googleapis_beta/lib/replicapool/v1beta1.dart b/generated/googleapis_beta/lib/replicapool/v1beta1.dart
index f00cd93..f0f1414 100644
--- a/generated/googleapis_beta/lib/replicapool/v1beta1.dart
+++ b/generated/googleapis_beta/lib/replicapool/v1beta1.dart
@@ -46,7 +46,7 @@
   ReplicasResourceApi get replicas => new ReplicasResourceApi(_requester);
 
   ReplicapoolApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/replicapool/v1beta1/projects/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "replicapool/v1beta1/projects/");
 }
 
 
diff --git a/generated/googleapis_beta/lib/resourceviews/v1beta1.dart b/generated/googleapis_beta/lib/resourceviews/v1beta1.dart
index 14fec28..839b72b 100644
--- a/generated/googleapis_beta/lib/resourceviews/v1beta1.dart
+++ b/generated/googleapis_beta/lib/resourceviews/v1beta1.dart
@@ -46,7 +46,7 @@
   ZoneViewsResourceApi get zoneViews => new ZoneViewsResourceApi(_requester);
 
   ResourceviewsApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/resourceviews/v1beta1/projects/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "resourceviews/v1beta1/projects/");
 }
 
 
diff --git a/generated/googleapis_beta/lib/sqladmin/v1beta3.dart b/generated/googleapis_beta/lib/sqladmin/v1beta3.dart
index ac64772..a8d005f 100644
--- a/generated/googleapis_beta/lib/sqladmin/v1beta3.dart
+++ b/generated/googleapis_beta/lib/sqladmin/v1beta3.dart
@@ -32,7 +32,7 @@
   TiersResourceApi get tiers => new TiersResourceApi(_requester);
 
   SqladminApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/sql/v1beta3/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "sql/v1beta3/");
 }
 
 
diff --git a/generated/googleapis_beta/lib/src/common_internal.dart b/generated/googleapis_beta/lib/src/common_internal.dart
index 0939147..a489b3a 100644
--- a/generated/googleapis_beta/lib/src/common_internal.dart
+++ b/generated/googleapis_beta/lib/src/common_internal.dart
@@ -9,7 +9,7 @@
 import "package:http/http.dart" as http;
 
 const String USER_AGENT_STRING =
-    'google-api-dart-client googleapis_beta/0.1.1';
+    'google-api-dart-client googleapis_beta/0.2.0';
 
 const CONTENT_TYPE_JSON_UTF8 = 'application/json; charset=utf-8';
 
@@ -152,7 +152,7 @@
     if (requestUrl.startsWith('/')) {
       path ="$_rootUrl${requestUrl.substring(1)}";
     } else {
-      path ="$_rootUrl${_basePath.substring(1)}$requestUrl";
+      path ="$_rootUrl${_basePath}$requestUrl";
     }
 
     bool containsQueryParameter = path.contains('?');
@@ -430,12 +430,19 @@
 
         // Upload all but the last chunk.
         // The final send will be done in the [onDone] handler.
-        if (chunkStack.length > 1) {
+        bool hasPartialChunk = chunkStack.hasPartialChunk;
+        if (chunkStack.length > 1 ||
+            (chunkStack.length == 1 && hasPartialChunk)) {
           // Pause the input stream.
           subscription.pause();
 
           // Upload all chunks except the last one.
-          var fullChunks = chunkStack.removeSublist(0, chunkStack.length - 1);
+          var fullChunks;
+          if (hasPartialChunk) {
+            fullChunks = chunkStack.removeSublist(0, chunkStack.length);
+          } else {
+            fullChunks = chunkStack.removeSublist(0, chunkStack.length - 1);
+          }
           Future.forEach(fullChunks,
                          (c) => _uploadChunkDrained(uploadUri, c)).then((_) {
             // All chunks uploaded, we can continue consuming data.
@@ -457,11 +464,13 @@
           chunkStack.finalize();
 
           var lastChunk;
-          if (chunkStack.totalByteLength > 0) {
-            assert(chunkStack.length == 1);
+          if (chunkStack.length == 1) {
             lastChunk = chunkStack.removeSublist(0, chunkStack.length).first;
           } else {
-            lastChunk = new ResumableChunk([], 0, 0);
+            completer.completeError(new StateError(
+                'Resumable uploads need to result in at least one non-empty '
+                'chunk at the end.'));
+            return;
           }
           var end = lastChunk.endOfChunk;
 
@@ -654,16 +663,34 @@
   // Currently accumulated data.
   List<List<int>> _byteArrays = [];
   int _length = 0;
-  int _totalLength = 0;
   int _offset = 0;
 
   bool _finalized = false;
 
   ChunkStack(this._chunkSize);
 
+  /**
+   * Whether data for a not-yet-finished [ResumableChunk] is present. A call to
+   * `finalize` will create a [ResumableChunk] of this data.
+   */
+  bool get hasPartialChunk => _length > 0;
+
+  /**
+   * The number of chunks in this [ChunkStack].
+   */
   int get length => _chunkStack.length;
 
-  int get totalByteLength => _offset;
+  /**
+   * The total number of bytes which have been converted to [ResumableChunk]s.
+   * Can only be called once this [ChunkStack] has been finalized.
+   */
+  int get totalByteLength {
+    if (!_finalized) {
+      throw new StateError('ChunkStack has not been finalized yet.');
+    }
+
+    return _offset;
+  }
 
   /**
    * Returns the chunks [from] ... [to] and deletes it from the stack.
diff --git a/generated/googleapis_beta/lib/taskqueue/v1beta2.dart b/generated/googleapis_beta/lib/taskqueue/v1beta2.dart
index a36f39b..7c5f3e5 100644
--- a/generated/googleapis_beta/lib/taskqueue/v1beta2.dart
+++ b/generated/googleapis_beta/lib/taskqueue/v1beta2.dart
@@ -28,7 +28,7 @@
   TasksResourceApi get tasks => new TasksResourceApi(_requester);
 
   TaskqueueApi(http.Client client) : 
-      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "/taskqueue/v1beta2/projects/");
+      _requester = new common_internal.ApiRequester(client, "https://www.googleapis.com/", "taskqueue/v1beta2/projects/");
 }
 
 
diff --git a/generated/googleapis_beta/pubspec.yaml b/generated/googleapis_beta/pubspec.yaml
index 65bd4f0..731a0f5 100644
--- a/generated/googleapis_beta/pubspec.yaml
+++ b/generated/googleapis_beta/pubspec.yaml
@@ -1,5 +1,5 @@
 name: googleapis_beta
-version: 0.1.1
+version: 0.2.0
 author: Dart Team <misc@dartlang.org>
 description: "Auto-generated client libraries for accessing the following APIs:autoscaler:v1beta2, cloudmonitoring:v2beta1, datastore:v1beta2, dns:v1beta1, genomics:v1beta, manager:v1beta2, pubsub:v1beta1, replicapool:v1beta1, resourceviews:v1beta1, sqladmin:v1beta3, taskqueue:v1beta2"
 homepage: http://www.dartlang.org
diff --git a/generated/googleapis_beta/test/autoscaler/v1beta2_test.dart b/generated/googleapis_beta/test/autoscaler/v1beta2_test.dart
index 50a5864..95e82ae 100644
--- a/generated/googleapis_beta/test/autoscaler/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/autoscaler/v1beta2_test.dart
@@ -25,6 +25,7 @@
     o.creationTimestamp = "foo";
     o.description = "foo";
     o.id = "foo";
+    o.kind = "foo";
     o.name = "foo";
     o.selfLink = "foo";
     o.target = "foo";
@@ -40,6 +41,7 @@
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
+    unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.target, unittest.equals('foo'));
@@ -47,14 +49,14 @@
   buildCounterAutoscaler--;
 }
 
-buildUnnamed1116() {
+buildUnnamed1144() {
   var o = new core.List<api.Autoscaler>();
   o.add(buildAutoscaler());
   o.add(buildAutoscaler());
   return o;
 }
 
-checkUnnamed1116(core.List<api.Autoscaler> o) {
+checkUnnamed1144(core.List<api.Autoscaler> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscaler(o[0]);
   checkAutoscaler(o[1]);
@@ -65,7 +67,8 @@
   var o = new api.AutoscalerListResponse();
   buildCounterAutoscalerListResponse++;
   if (buildCounterAutoscalerListResponse < 3) {
-    o.items = buildUnnamed1116();
+    o.items = buildUnnamed1144();
+    o.kind = "foo";
     o.nextPageToken = "foo";
   }
   buildCounterAutoscalerListResponse--;
@@ -75,20 +78,21 @@
 checkAutoscalerListResponse(api.AutoscalerListResponse o) {
   buildCounterAutoscalerListResponse++;
   if (buildCounterAutoscalerListResponse < 3) {
-    checkUnnamed1116(o.items);
+    checkUnnamed1144(o.items);
+    unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterAutoscalerListResponse--;
 }
 
-buildUnnamed1117() {
+buildUnnamed1145() {
   var o = new core.List<api.AutoscalingPolicyCustomMetricUtilization>();
   o.add(buildAutoscalingPolicyCustomMetricUtilization());
   o.add(buildAutoscalingPolicyCustomMetricUtilization());
   return o;
 }
 
-checkUnnamed1117(core.List<api.AutoscalingPolicyCustomMetricUtilization> o) {
+checkUnnamed1145(core.List<api.AutoscalingPolicyCustomMetricUtilization> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAutoscalingPolicyCustomMetricUtilization(o[0]);
   checkAutoscalingPolicyCustomMetricUtilization(o[1]);
@@ -101,7 +105,7 @@
   if (buildCounterAutoscalingPolicy < 3) {
     o.coolDownPeriodSec = 42;
     o.cpuUtilization = buildAutoscalingPolicyCpuUtilization();
-    o.customMetricUtilizations = buildUnnamed1117();
+    o.customMetricUtilizations = buildUnnamed1145();
     o.loadBalancingUtilization = buildAutoscalingPolicyLoadBalancingUtilization();
     o.maxNumReplicas = 42;
     o.minNumReplicas = 42;
@@ -115,7 +119,7 @@
   if (buildCounterAutoscalingPolicy < 3) {
     unittest.expect(o.coolDownPeriodSec, unittest.equals(42));
     checkAutoscalingPolicyCpuUtilization(o.cpuUtilization);
-    checkUnnamed1117(o.customMetricUtilizations);
+    checkUnnamed1145(o.customMetricUtilizations);
     checkAutoscalingPolicyLoadBalancingUtilization(o.loadBalancingUtilization);
     unittest.expect(o.maxNumReplicas, unittest.equals(42));
     unittest.expect(o.minNumReplicas, unittest.equals(42));
@@ -149,6 +153,7 @@
   if (buildCounterAutoscalingPolicyCustomMetricUtilization < 3) {
     o.metric = "foo";
     o.utilizationTarget = 42.0;
+    o.utilizationTargetType = "foo";
   }
   buildCounterAutoscalingPolicyCustomMetricUtilization--;
   return o;
@@ -159,6 +164,7 @@
   if (buildCounterAutoscalingPolicyCustomMetricUtilization < 3) {
     unittest.expect(o.metric, unittest.equals('foo'));
     unittest.expect(o.utilizationTarget, unittest.equals(42.0));
+    unittest.expect(o.utilizationTargetType, unittest.equals('foo'));
   }
   buildCounterAutoscalingPolicyCustomMetricUtilization--;
 }
@@ -205,14 +211,14 @@
   buildCounterOperationErrorErrors--;
 }
 
-buildUnnamed1118() {
+buildUnnamed1146() {
   var o = new core.List<api.OperationErrorErrors>();
   o.add(buildOperationErrorErrors());
   o.add(buildOperationErrorErrors());
   return o;
 }
 
-checkUnnamed1118(core.List<api.OperationErrorErrors> o) {
+checkUnnamed1146(core.List<api.OperationErrorErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationErrorErrors(o[0]);
   checkOperationErrorErrors(o[1]);
@@ -223,7 +229,7 @@
   var o = new api.OperationError();
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    o.errors = buildUnnamed1118();
+    o.errors = buildUnnamed1146();
   }
   buildCounterOperationError--;
   return o;
@@ -232,7 +238,7 @@
 checkOperationError(api.OperationError o) {
   buildCounterOperationError++;
   if (buildCounterOperationError < 3) {
-    checkUnnamed1118(o.errors);
+    checkUnnamed1146(o.errors);
   }
   buildCounterOperationError--;
 }
@@ -258,14 +264,14 @@
   buildCounterOperationWarningsData--;
 }
 
-buildUnnamed1119() {
+buildUnnamed1147() {
   var o = new core.List<api.OperationWarningsData>();
   o.add(buildOperationWarningsData());
   o.add(buildOperationWarningsData());
   return o;
 }
 
-checkUnnamed1119(core.List<api.OperationWarningsData> o) {
+checkUnnamed1147(core.List<api.OperationWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarningsData(o[0]);
   checkOperationWarningsData(o[1]);
@@ -277,7 +283,7 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     o.code = "foo";
-    o.data = buildUnnamed1119();
+    o.data = buildUnnamed1147();
     o.message = "foo";
   }
   buildCounterOperationWarnings--;
@@ -288,20 +294,20 @@
   buildCounterOperationWarnings++;
   if (buildCounterOperationWarnings < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkUnnamed1119(o.data);
+    checkUnnamed1147(o.data);
     unittest.expect(o.message, unittest.equals('foo'));
   }
   buildCounterOperationWarnings--;
 }
 
-buildUnnamed1120() {
+buildUnnamed1148() {
   var o = new core.List<api.OperationWarnings>();
   o.add(buildOperationWarnings());
   o.add(buildOperationWarnings());
   return o;
 }
 
-checkUnnamed1120(core.List<api.OperationWarnings> o) {
+checkUnnamed1148(core.List<api.OperationWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationWarnings(o[0]);
   checkOperationWarnings(o[1]);
@@ -332,7 +338,7 @@
     o.targetId = "foo";
     o.targetLink = "foo";
     o.user = "foo";
-    o.warnings = buildUnnamed1120();
+    o.warnings = buildUnnamed1148();
     o.zone = "foo";
   }
   buildCounterOperation--;
@@ -362,20 +368,20 @@
     unittest.expect(o.targetId, unittest.equals('foo'));
     unittest.expect(o.targetLink, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkUnnamed1120(o.warnings);
+    checkUnnamed1148(o.warnings);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterOperation--;
 }
 
-buildUnnamed1121() {
+buildUnnamed1149() {
   var o = new core.List<api.Operation>();
   o.add(buildOperation());
   o.add(buildOperation());
   return o;
 }
 
-checkUnnamed1121(core.List<api.Operation> o) {
+checkUnnamed1149(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperation(o[0]);
   checkOperation(o[1]);
@@ -387,7 +393,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     o.id = "foo";
-    o.items = buildUnnamed1121();
+    o.items = buildUnnamed1149();
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.selfLink = "foo";
@@ -400,7 +406,7 @@
   buildCounterOperationList++;
   if (buildCounterOperationList < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1121(o.items);
+    checkUnnamed1149(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -531,8 +537,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/autoscaler/v1beta2/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("autoscaler/v1beta2/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/zones/", pathOffset);
@@ -594,8 +602,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/autoscaler/v1beta2/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("autoscaler/v1beta2/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/zones/", pathOffset);
@@ -660,8 +670,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/autoscaler/v1beta2/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("autoscaler/v1beta2/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/zones/", pathOffset);
@@ -722,8 +734,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/autoscaler/v1beta2/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("autoscaler/v1beta2/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/zones/", pathOffset);
@@ -789,8 +803,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/autoscaler/v1beta2/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("autoscaler/v1beta2/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/zones/", pathOffset);
@@ -856,8 +872,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/autoscaler/v1beta2/"));
-        pathOffset += 20;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 19), unittest.equals("autoscaler/v1beta2/"));
+        pathOffset += 19;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/zones/", pathOffset);
@@ -923,25 +941,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/autoscaler/v1beta2/"));
-        pathOffset += 20;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/operations/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/operations/"));
-        pathOffset += 12;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_operation"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -982,25 +983,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/autoscaler/v1beta2/"));
-        pathOffset += 20;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/operations/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/operations/"));
-        pathOffset += 12;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_operation"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1045,22 +1029,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 20), unittest.equals("/autoscaler/v1beta2/"));
-        pathOffset += 20;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/operations", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/operations"));
-        pathOffset += 11;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
diff --git a/generated/googleapis_beta/test/cloudmonitoring/v2beta1_test.dart b/generated/googleapis_beta/test/cloudmonitoring/v2beta1_test.dart
index 2defc15..96d99ee 100644
--- a/generated/googleapis_beta/test/cloudmonitoring/v2beta1_test.dart
+++ b/generated/googleapis_beta/test/cloudmonitoring/v2beta1_test.dart
@@ -35,14 +35,14 @@
   buildCounterListMetricDescriptorsRequest--;
 }
 
-buildUnnamed1174() {
+buildUnnamed1205() {
   var o = new core.List<api.MetricDescriptor>();
   o.add(buildMetricDescriptor());
   o.add(buildMetricDescriptor());
   return o;
 }
 
-checkUnnamed1174(core.List<api.MetricDescriptor> o) {
+checkUnnamed1205(core.List<api.MetricDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricDescriptor(o[0]);
   checkMetricDescriptor(o[1]);
@@ -54,7 +54,7 @@
   buildCounterListMetricDescriptorsResponse++;
   if (buildCounterListMetricDescriptorsResponse < 3) {
     o.kind = "foo";
-    o.metrics = buildUnnamed1174();
+    o.metrics = buildUnnamed1205();
     o.nextPageToken = "foo";
   }
   buildCounterListMetricDescriptorsResponse--;
@@ -65,7 +65,7 @@
   buildCounterListMetricDescriptorsResponse++;
   if (buildCounterListMetricDescriptorsResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1174(o.metrics);
+    checkUnnamed1205(o.metrics);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListMetricDescriptorsResponse--;
@@ -90,14 +90,14 @@
   buildCounterListTimeseriesDescriptorsRequest--;
 }
 
-buildUnnamed1175() {
+buildUnnamed1206() {
   var o = new core.List<api.TimeseriesDescriptor>();
   o.add(buildTimeseriesDescriptor());
   o.add(buildTimeseriesDescriptor());
   return o;
 }
 
-checkUnnamed1175(core.List<api.TimeseriesDescriptor> o) {
+checkUnnamed1206(core.List<api.TimeseriesDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimeseriesDescriptor(o[0]);
   checkTimeseriesDescriptor(o[1]);
@@ -111,7 +111,7 @@
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.oldest = core.DateTime.parse("2002-02-27T14:01:02");
-    o.timeseries = buildUnnamed1175();
+    o.timeseries = buildUnnamed1206();
     o.youngest = core.DateTime.parse("2002-02-27T14:01:02");
   }
   buildCounterListTimeseriesDescriptorsResponse--;
@@ -124,7 +124,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.oldest, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed1175(o.timeseries);
+    checkUnnamed1206(o.timeseries);
     unittest.expect(o.youngest, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterListTimeseriesDescriptorsResponse--;
@@ -149,14 +149,14 @@
   buildCounterListTimeseriesRequest--;
 }
 
-buildUnnamed1176() {
+buildUnnamed1207() {
   var o = new core.List<api.Timeseries>();
   o.add(buildTimeseries());
   o.add(buildTimeseries());
   return o;
 }
 
-checkUnnamed1176(core.List<api.Timeseries> o) {
+checkUnnamed1207(core.List<api.Timeseries> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTimeseries(o[0]);
   checkTimeseries(o[1]);
@@ -170,7 +170,7 @@
     o.kind = "foo";
     o.nextPageToken = "foo";
     o.oldest = core.DateTime.parse("2002-02-27T14:01:02");
-    o.timeseries = buildUnnamed1176();
+    o.timeseries = buildUnnamed1207();
     o.youngest = core.DateTime.parse("2002-02-27T14:01:02");
   }
   buildCounterListTimeseriesResponse--;
@@ -183,20 +183,20 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.oldest, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed1176(o.timeseries);
+    checkUnnamed1207(o.timeseries);
     unittest.expect(o.youngest, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
   buildCounterListTimeseriesResponse--;
 }
 
-buildUnnamed1177() {
+buildUnnamed1208() {
   var o = new core.List<api.MetricDescriptorLabelDescriptor>();
   o.add(buildMetricDescriptorLabelDescriptor());
   o.add(buildMetricDescriptorLabelDescriptor());
   return o;
 }
 
-checkUnnamed1177(core.List<api.MetricDescriptorLabelDescriptor> o) {
+checkUnnamed1208(core.List<api.MetricDescriptorLabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetricDescriptorLabelDescriptor(o[0]);
   checkMetricDescriptorLabelDescriptor(o[1]);
@@ -208,7 +208,7 @@
   buildCounterMetricDescriptor++;
   if (buildCounterMetricDescriptor < 3) {
     o.description = "foo";
-    o.labels = buildUnnamed1177();
+    o.labels = buildUnnamed1208();
     o.name = "foo";
     o.project = "foo";
     o.typeDescriptor = buildMetricDescriptorTypeDescriptor();
@@ -221,7 +221,7 @@
   buildCounterMetricDescriptor++;
   if (buildCounterMetricDescriptor < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1177(o.labels);
+    checkUnnamed1208(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.project, unittest.equals('foo'));
     checkMetricDescriptorTypeDescriptor(o.typeDescriptor);
@@ -302,14 +302,14 @@
   buildCounterPoint--;
 }
 
-buildUnnamed1178() {
+buildUnnamed1209() {
   var o = new core.List<api.PointDistributionBucket>();
   o.add(buildPointDistributionBucket());
   o.add(buildPointDistributionBucket());
   return o;
 }
 
-checkUnnamed1178(core.List<api.PointDistributionBucket> o) {
+checkUnnamed1209(core.List<api.PointDistributionBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPointDistributionBucket(o[0]);
   checkPointDistributionBucket(o[1]);
@@ -320,7 +320,7 @@
   var o = new api.PointDistribution();
   buildCounterPointDistribution++;
   if (buildCounterPointDistribution < 3) {
-    o.buckets = buildUnnamed1178();
+    o.buckets = buildUnnamed1209();
     o.overflowBucket = buildPointDistributionOverflowBucket();
     o.underflowBucket = buildPointDistributionUnderflowBucket();
   }
@@ -331,7 +331,7 @@
 checkPointDistribution(api.PointDistribution o) {
   buildCounterPointDistribution++;
   if (buildCounterPointDistribution < 3) {
-    checkUnnamed1178(o.buckets);
+    checkUnnamed1209(o.buckets);
     checkPointDistributionOverflowBucket(o.overflowBucket);
     checkPointDistributionUnderflowBucket(o.underflowBucket);
   }
@@ -403,14 +403,14 @@
   buildCounterPointDistributionUnderflowBucket--;
 }
 
-buildUnnamed1179() {
+buildUnnamed1210() {
   var o = new core.List<api.Point>();
   o.add(buildPoint());
   o.add(buildPoint());
   return o;
 }
 
-checkUnnamed1179(core.List<api.Point> o) {
+checkUnnamed1210(core.List<api.Point> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPoint(o[0]);
   checkPoint(o[1]);
@@ -421,7 +421,7 @@
   var o = new api.Timeseries();
   buildCounterTimeseries++;
   if (buildCounterTimeseries < 3) {
-    o.points = buildUnnamed1179();
+    o.points = buildUnnamed1210();
     o.timeseriesDesc = buildTimeseriesDescriptor();
   }
   buildCounterTimeseries--;
@@ -431,20 +431,20 @@
 checkTimeseries(api.Timeseries o) {
   buildCounterTimeseries++;
   if (buildCounterTimeseries < 3) {
-    checkUnnamed1179(o.points);
+    checkUnnamed1210(o.points);
     checkTimeseriesDescriptor(o.timeseriesDesc);
   }
   buildCounterTimeseries--;
 }
 
-buildUnnamed1180() {
+buildUnnamed1211() {
   var o = new core.Map<core.String, core.String>();
   o["x"] = "foo";
   o["y"] = "foo";
   return o;
 }
 
-checkUnnamed1180(core.Map<core.String, core.String> o) {
+checkUnnamed1211(core.Map<core.String, core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o["x"], unittest.equals('foo'));
   unittest.expect(o["y"], unittest.equals('foo'));
@@ -455,7 +455,7 @@
   var o = new api.TimeseriesDescriptor();
   buildCounterTimeseriesDescriptor++;
   if (buildCounterTimeseriesDescriptor < 3) {
-    o.labels = buildUnnamed1180();
+    o.labels = buildUnnamed1211();
     o.metric = "foo";
     o.project = "foo";
   }
@@ -466,34 +466,34 @@
 checkTimeseriesDescriptor(api.TimeseriesDescriptor o) {
   buildCounterTimeseriesDescriptor++;
   if (buildCounterTimeseriesDescriptor < 3) {
-    checkUnnamed1180(o.labels);
+    checkUnnamed1211(o.labels);
     unittest.expect(o.metric, unittest.equals('foo'));
     unittest.expect(o.project, unittest.equals('foo'));
   }
   buildCounterTimeseriesDescriptor--;
 }
 
-buildUnnamed1181() {
+buildUnnamed1212() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1181(core.List<core.String> o) {
+checkUnnamed1212(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1182() {
+buildUnnamed1213() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1182(core.List<core.String> o) {
+checkUnnamed1213(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -663,15 +663,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/cloudmonitoring/v2beta1/projects/"));
-        pathOffset += 34;
-        index = path.indexOf("/metricDescriptors", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("/metricDescriptors"));
-        pathOffset += 18;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -718,7 +711,7 @@
       var arg_metric = "foo";
       var arg_youngest = "foo";
       var arg_count = 42;
-      var arg_labels = buildUnnamed1181();
+      var arg_labels = buildUnnamed1212();
       var arg_oldest = "foo";
       var arg_pageToken = "foo";
       var arg_timespan = "foo";
@@ -730,18 +723,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/cloudmonitoring/v2beta1/projects/"));
-        pathOffset += 34;
-        index = path.indexOf("/timeseries/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/timeseries/"));
-        pathOffset += 12;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_metric"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -791,7 +774,7 @@
       var arg_metric = "foo";
       var arg_youngest = "foo";
       var arg_count = 42;
-      var arg_labels = buildUnnamed1182();
+      var arg_labels = buildUnnamed1213();
       var arg_oldest = "foo";
       var arg_pageToken = "foo";
       var arg_timespan = "foo";
@@ -803,18 +786,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 34), unittest.equals("/cloudmonitoring/v2beta1/projects/"));
-        pathOffset += 34;
-        index = path.indexOf("/timeseriesDescriptors/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 23), unittest.equals("/timeseriesDescriptors/"));
-        pathOffset += 23;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_metric"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
diff --git a/generated/googleapis_beta/test/common/common_internal_test.dart b/generated/googleapis_beta/test/common/common_internal_test.dart
index a8fc299..acf53f2 100644
--- a/generated/googleapis_beta/test/common/common_internal_test.dart
+++ b/generated/googleapis_beta/test/common/common_internal_test.dart
@@ -7,6 +7,7 @@
 import 'package:googleapis_beta/src/common_internal.dart';
 import 'package:http/http.dart' as http;
 import 'package:unittest/unittest.dart';
+
 class HttpServerMock extends http.BaseClient {
   Function _callback;
   bool _expectJson;
@@ -307,7 +308,7 @@
       setUp(() {
         httpMock = new HttpServerMock();
         rootUrl = 'http://example.com/';
-        basePath = '/base/';
+        basePath = 'base/';
         requester = new ApiRequester(httpMock, rootUrl, basePath);
       });
 
@@ -731,6 +732,17 @@
                      1024*1024], false);
           });
 
+          test('length-big-block-parts-non-divisible', () {
+            runTest(1, 1024 * 1024 + 1,
+                    [1,
+                     256*1024-1,
+                     256*1024,
+                     256*1024+1,
+                     1024*1024-1,
+                     1024*1024,
+                     1024*1024+1], false);
+          });
+
           test('stream-small-block', () {
             runTest(1, 10, [10], true);
           });
diff --git a/generated/googleapis_beta/test/datastore/v1beta2_test.dart b/generated/googleapis_beta/test/datastore/v1beta2_test.dart
index a9f450f..85aa41a 100644
--- a/generated/googleapis_beta/test/datastore/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/datastore/v1beta2_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed1183() {
+buildUnnamed1214() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1183(core.List<api.Key> o) {
+checkUnnamed1214(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
@@ -34,7 +34,7 @@
   var o = new api.AllocateIdsRequest();
   buildCounterAllocateIdsRequest++;
   if (buildCounterAllocateIdsRequest < 3) {
-    o.keys = buildUnnamed1183();
+    o.keys = buildUnnamed1214();
   }
   buildCounterAllocateIdsRequest--;
   return o;
@@ -43,19 +43,19 @@
 checkAllocateIdsRequest(api.AllocateIdsRequest o) {
   buildCounterAllocateIdsRequest++;
   if (buildCounterAllocateIdsRequest < 3) {
-    checkUnnamed1183(o.keys);
+    checkUnnamed1214(o.keys);
   }
   buildCounterAllocateIdsRequest--;
 }
 
-buildUnnamed1184() {
+buildUnnamed1215() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1184(core.List<api.Key> o) {
+checkUnnamed1215(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
@@ -67,7 +67,7 @@
   buildCounterAllocateIdsResponse++;
   if (buildCounterAllocateIdsResponse < 3) {
     o.header = buildResponseHeader();
-    o.keys = buildUnnamed1184();
+    o.keys = buildUnnamed1215();
   }
   buildCounterAllocateIdsResponse--;
   return o;
@@ -77,7 +77,7 @@
   buildCounterAllocateIdsResponse++;
   if (buildCounterAllocateIdsResponse < 3) {
     checkResponseHeader(o.header);
-    checkUnnamed1184(o.keys);
+    checkUnnamed1215(o.keys);
   }
   buildCounterAllocateIdsResponse--;
 }
@@ -168,14 +168,14 @@
   buildCounterCommitResponse--;
 }
 
-buildUnnamed1185() {
+buildUnnamed1216() {
   var o = new core.List<api.Filter>();
   o.add(buildFilter());
   o.add(buildFilter());
   return o;
 }
 
-checkUnnamed1185(core.List<api.Filter> o) {
+checkUnnamed1216(core.List<api.Filter> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFilter(o[0]);
   checkFilter(o[1]);
@@ -186,7 +186,7 @@
   var o = new api.CompositeFilter();
   buildCounterCompositeFilter++;
   if (buildCounterCompositeFilter < 3) {
-    o.filters = buildUnnamed1185();
+    o.filters = buildUnnamed1216();
     o.operator = "foo";
   }
   buildCounterCompositeFilter--;
@@ -196,20 +196,20 @@
 checkCompositeFilter(api.CompositeFilter o) {
   buildCounterCompositeFilter++;
   if (buildCounterCompositeFilter < 3) {
-    checkUnnamed1185(o.filters);
+    checkUnnamed1216(o.filters);
     unittest.expect(o.operator, unittest.equals('foo'));
   }
   buildCounterCompositeFilter--;
 }
 
-buildUnnamed1186() {
+buildUnnamed1217() {
   var o = new core.Map<core.String, api.Property>();
   o["x"] = buildProperty();
   o["y"] = buildProperty();
   return o;
 }
 
-checkUnnamed1186(core.Map<core.String, api.Property> o) {
+checkUnnamed1217(core.Map<core.String, api.Property> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProperty(o["x"]);
   checkProperty(o["y"]);
@@ -221,7 +221,7 @@
   buildCounterEntity++;
   if (buildCounterEntity < 3) {
     o.key = buildKey();
-    o.properties = buildUnnamed1186();
+    o.properties = buildUnnamed1217();
   }
   buildCounterEntity--;
   return o;
@@ -231,7 +231,7 @@
   buildCounterEntity++;
   if (buildCounterEntity < 3) {
     checkKey(o.key);
-    checkUnnamed1186(o.properties);
+    checkUnnamed1217(o.properties);
   }
   buildCounterEntity--;
 }
@@ -276,27 +276,27 @@
   buildCounterFilter--;
 }
 
-buildUnnamed1187() {
+buildUnnamed1218() {
   var o = new core.List<api.GqlQueryArg>();
   o.add(buildGqlQueryArg());
   o.add(buildGqlQueryArg());
   return o;
 }
 
-checkUnnamed1187(core.List<api.GqlQueryArg> o) {
+checkUnnamed1218(core.List<api.GqlQueryArg> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGqlQueryArg(o[0]);
   checkGqlQueryArg(o[1]);
 }
 
-buildUnnamed1188() {
+buildUnnamed1219() {
   var o = new core.List<api.GqlQueryArg>();
   o.add(buildGqlQueryArg());
   o.add(buildGqlQueryArg());
   return o;
 }
 
-checkUnnamed1188(core.List<api.GqlQueryArg> o) {
+checkUnnamed1219(core.List<api.GqlQueryArg> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGqlQueryArg(o[0]);
   checkGqlQueryArg(o[1]);
@@ -308,8 +308,8 @@
   buildCounterGqlQuery++;
   if (buildCounterGqlQuery < 3) {
     o.allowLiteral = true;
-    o.nameArgs = buildUnnamed1187();
-    o.numberArgs = buildUnnamed1188();
+    o.nameArgs = buildUnnamed1218();
+    o.numberArgs = buildUnnamed1219();
     o.queryString = "foo";
   }
   buildCounterGqlQuery--;
@@ -320,8 +320,8 @@
   buildCounterGqlQuery++;
   if (buildCounterGqlQuery < 3) {
     unittest.expect(o.allowLiteral, unittest.isTrue);
-    checkUnnamed1187(o.nameArgs);
-    checkUnnamed1188(o.numberArgs);
+    checkUnnamed1218(o.nameArgs);
+    checkUnnamed1219(o.numberArgs);
     unittest.expect(o.queryString, unittest.equals('foo'));
   }
   buildCounterGqlQuery--;
@@ -350,14 +350,14 @@
   buildCounterGqlQueryArg--;
 }
 
-buildUnnamed1189() {
+buildUnnamed1220() {
   var o = new core.List<api.KeyPathElement>();
   o.add(buildKeyPathElement());
   o.add(buildKeyPathElement());
   return o;
 }
 
-checkUnnamed1189(core.List<api.KeyPathElement> o) {
+checkUnnamed1220(core.List<api.KeyPathElement> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKeyPathElement(o[0]);
   checkKeyPathElement(o[1]);
@@ -369,7 +369,7 @@
   buildCounterKey++;
   if (buildCounterKey < 3) {
     o.partitionId = buildPartitionId();
-    o.path = buildUnnamed1189();
+    o.path = buildUnnamed1220();
   }
   buildCounterKey--;
   return o;
@@ -379,7 +379,7 @@
   buildCounterKey++;
   if (buildCounterKey < 3) {
     checkPartitionId(o.partitionId);
-    checkUnnamed1189(o.path);
+    checkUnnamed1220(o.path);
   }
   buildCounterKey--;
 }
@@ -426,14 +426,14 @@
   buildCounterKindExpression--;
 }
 
-buildUnnamed1190() {
+buildUnnamed1221() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1190(core.List<api.Key> o) {
+checkUnnamed1221(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
@@ -444,7 +444,7 @@
   var o = new api.LookupRequest();
   buildCounterLookupRequest++;
   if (buildCounterLookupRequest < 3) {
-    o.keys = buildUnnamed1190();
+    o.keys = buildUnnamed1221();
     o.readOptions = buildReadOptions();
   }
   buildCounterLookupRequest--;
@@ -454,46 +454,46 @@
 checkLookupRequest(api.LookupRequest o) {
   buildCounterLookupRequest++;
   if (buildCounterLookupRequest < 3) {
-    checkUnnamed1190(o.keys);
+    checkUnnamed1221(o.keys);
     checkReadOptions(o.readOptions);
   }
   buildCounterLookupRequest--;
 }
 
-buildUnnamed1191() {
+buildUnnamed1222() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1191(core.List<api.Key> o) {
+checkUnnamed1222(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
 }
 
-buildUnnamed1192() {
+buildUnnamed1223() {
   var o = new core.List<api.EntityResult>();
   o.add(buildEntityResult());
   o.add(buildEntityResult());
   return o;
 }
 
-checkUnnamed1192(core.List<api.EntityResult> o) {
+checkUnnamed1223(core.List<api.EntityResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityResult(o[0]);
   checkEntityResult(o[1]);
 }
 
-buildUnnamed1193() {
+buildUnnamed1224() {
   var o = new core.List<api.EntityResult>();
   o.add(buildEntityResult());
   o.add(buildEntityResult());
   return o;
 }
 
-checkUnnamed1193(core.List<api.EntityResult> o) {
+checkUnnamed1224(core.List<api.EntityResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityResult(o[0]);
   checkEntityResult(o[1]);
@@ -504,10 +504,10 @@
   var o = new api.LookupResponse();
   buildCounterLookupResponse++;
   if (buildCounterLookupResponse < 3) {
-    o.deferred = buildUnnamed1191();
-    o.found = buildUnnamed1192();
+    o.deferred = buildUnnamed1222();
+    o.found = buildUnnamed1223();
     o.header = buildResponseHeader();
-    o.missing = buildUnnamed1193();
+    o.missing = buildUnnamed1224();
   }
   buildCounterLookupResponse--;
   return o;
@@ -516,74 +516,74 @@
 checkLookupResponse(api.LookupResponse o) {
   buildCounterLookupResponse++;
   if (buildCounterLookupResponse < 3) {
-    checkUnnamed1191(o.deferred);
-    checkUnnamed1192(o.found);
+    checkUnnamed1222(o.deferred);
+    checkUnnamed1223(o.found);
     checkResponseHeader(o.header);
-    checkUnnamed1193(o.missing);
+    checkUnnamed1224(o.missing);
   }
   buildCounterLookupResponse--;
 }
 
-buildUnnamed1194() {
+buildUnnamed1225() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1194(core.List<api.Key> o) {
+checkUnnamed1225(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
 }
 
-buildUnnamed1195() {
+buildUnnamed1226() {
   var o = new core.List<api.Entity>();
   o.add(buildEntity());
   o.add(buildEntity());
   return o;
 }
 
-checkUnnamed1195(core.List<api.Entity> o) {
+checkUnnamed1226(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntity(o[0]);
   checkEntity(o[1]);
 }
 
-buildUnnamed1196() {
+buildUnnamed1227() {
   var o = new core.List<api.Entity>();
   o.add(buildEntity());
   o.add(buildEntity());
   return o;
 }
 
-checkUnnamed1196(core.List<api.Entity> o) {
+checkUnnamed1227(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntity(o[0]);
   checkEntity(o[1]);
 }
 
-buildUnnamed1197() {
+buildUnnamed1228() {
   var o = new core.List<api.Entity>();
   o.add(buildEntity());
   o.add(buildEntity());
   return o;
 }
 
-checkUnnamed1197(core.List<api.Entity> o) {
+checkUnnamed1228(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntity(o[0]);
   checkEntity(o[1]);
 }
 
-buildUnnamed1198() {
+buildUnnamed1229() {
   var o = new core.List<api.Entity>();
   o.add(buildEntity());
   o.add(buildEntity());
   return o;
 }
 
-checkUnnamed1198(core.List<api.Entity> o) {
+checkUnnamed1229(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntity(o[0]);
   checkEntity(o[1]);
@@ -594,12 +594,12 @@
   var o = new api.Mutation();
   buildCounterMutation++;
   if (buildCounterMutation < 3) {
-    o.delete = buildUnnamed1194();
+    o.delete = buildUnnamed1225();
     o.force = true;
-    o.insert = buildUnnamed1195();
-    o.insertAutoId = buildUnnamed1196();
-    o.update = buildUnnamed1197();
-    o.upsert = buildUnnamed1198();
+    o.insert = buildUnnamed1226();
+    o.insertAutoId = buildUnnamed1227();
+    o.update = buildUnnamed1228();
+    o.upsert = buildUnnamed1229();
   }
   buildCounterMutation--;
   return o;
@@ -608,24 +608,24 @@
 checkMutation(api.Mutation o) {
   buildCounterMutation++;
   if (buildCounterMutation < 3) {
-    checkUnnamed1194(o.delete);
+    checkUnnamed1225(o.delete);
     unittest.expect(o.force, unittest.isTrue);
-    checkUnnamed1195(o.insert);
-    checkUnnamed1196(o.insertAutoId);
-    checkUnnamed1197(o.update);
-    checkUnnamed1198(o.upsert);
+    checkUnnamed1226(o.insert);
+    checkUnnamed1227(o.insertAutoId);
+    checkUnnamed1228(o.update);
+    checkUnnamed1229(o.upsert);
   }
   buildCounterMutation--;
 }
 
-buildUnnamed1199() {
+buildUnnamed1230() {
   var o = new core.List<api.Key>();
   o.add(buildKey());
   o.add(buildKey());
   return o;
 }
 
-checkUnnamed1199(core.List<api.Key> o) {
+checkUnnamed1230(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKey(o[0]);
   checkKey(o[1]);
@@ -637,7 +637,7 @@
   buildCounterMutationResult++;
   if (buildCounterMutationResult < 3) {
     o.indexUpdates = 42;
-    o.insertAutoIdKeys = buildUnnamed1199();
+    o.insertAutoIdKeys = buildUnnamed1230();
   }
   buildCounterMutationResult--;
   return o;
@@ -647,7 +647,7 @@
   buildCounterMutationResult++;
   if (buildCounterMutationResult < 3) {
     unittest.expect(o.indexUpdates, unittest.equals(42));
-    checkUnnamed1199(o.insertAutoIdKeys);
+    checkUnnamed1230(o.insertAutoIdKeys);
   }
   buildCounterMutationResult--;
 }
@@ -673,14 +673,14 @@
   buildCounterPartitionId--;
 }
 
-buildUnnamed1200() {
+buildUnnamed1231() {
   var o = new core.List<api.Value>();
   o.add(buildValue());
   o.add(buildValue());
   return o;
 }
 
-checkUnnamed1200(core.List<api.Value> o) {
+checkUnnamed1231(core.List<api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkValue(o[0]);
   checkValue(o[1]);
@@ -700,7 +700,7 @@
     o.indexed = true;
     o.integerValue = "foo";
     o.keyValue = buildKey();
-    o.listValue = buildUnnamed1200();
+    o.listValue = buildUnnamed1231();
     o.meaning = 42;
     o.stringValue = "foo";
   }
@@ -720,7 +720,7 @@
     unittest.expect(o.indexed, unittest.isTrue);
     unittest.expect(o.integerValue, unittest.equals('foo'));
     checkKey(o.keyValue);
-    checkUnnamed1200(o.listValue);
+    checkUnnamed1231(o.listValue);
     unittest.expect(o.meaning, unittest.equals(42));
     unittest.expect(o.stringValue, unittest.equals('foo'));
   }
@@ -811,53 +811,53 @@
   buildCounterPropertyReference--;
 }
 
-buildUnnamed1201() {
+buildUnnamed1232() {
   var o = new core.List<api.PropertyReference>();
   o.add(buildPropertyReference());
   o.add(buildPropertyReference());
   return o;
 }
 
-checkUnnamed1201(core.List<api.PropertyReference> o) {
+checkUnnamed1232(core.List<api.PropertyReference> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyReference(o[0]);
   checkPropertyReference(o[1]);
 }
 
-buildUnnamed1202() {
+buildUnnamed1233() {
   var o = new core.List<api.KindExpression>();
   o.add(buildKindExpression());
   o.add(buildKindExpression());
   return o;
 }
 
-checkUnnamed1202(core.List<api.KindExpression> o) {
+checkUnnamed1233(core.List<api.KindExpression> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkKindExpression(o[0]);
   checkKindExpression(o[1]);
 }
 
-buildUnnamed1203() {
+buildUnnamed1234() {
   var o = new core.List<api.PropertyOrder>();
   o.add(buildPropertyOrder());
   o.add(buildPropertyOrder());
   return o;
 }
 
-checkUnnamed1203(core.List<api.PropertyOrder> o) {
+checkUnnamed1234(core.List<api.PropertyOrder> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyOrder(o[0]);
   checkPropertyOrder(o[1]);
 }
 
-buildUnnamed1204() {
+buildUnnamed1235() {
   var o = new core.List<api.PropertyExpression>();
   o.add(buildPropertyExpression());
   o.add(buildPropertyExpression());
   return o;
 }
 
-checkUnnamed1204(core.List<api.PropertyExpression> o) {
+checkUnnamed1235(core.List<api.PropertyExpression> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPropertyExpression(o[0]);
   checkPropertyExpression(o[1]);
@@ -870,12 +870,12 @@
   if (buildCounterQuery < 3) {
     o.endCursor = "foo";
     o.filter = buildFilter();
-    o.groupBy = buildUnnamed1201();
-    o.kinds = buildUnnamed1202();
+    o.groupBy = buildUnnamed1232();
+    o.kinds = buildUnnamed1233();
     o.limit = 42;
     o.offset = 42;
-    o.order = buildUnnamed1203();
-    o.projection = buildUnnamed1204();
+    o.order = buildUnnamed1234();
+    o.projection = buildUnnamed1235();
     o.startCursor = "foo";
   }
   buildCounterQuery--;
@@ -887,25 +887,25 @@
   if (buildCounterQuery < 3) {
     unittest.expect(o.endCursor, unittest.equals('foo'));
     checkFilter(o.filter);
-    checkUnnamed1201(o.groupBy);
-    checkUnnamed1202(o.kinds);
+    checkUnnamed1232(o.groupBy);
+    checkUnnamed1233(o.kinds);
     unittest.expect(o.limit, unittest.equals(42));
     unittest.expect(o.offset, unittest.equals(42));
-    checkUnnamed1203(o.order);
-    checkUnnamed1204(o.projection);
+    checkUnnamed1234(o.order);
+    checkUnnamed1235(o.projection);
     unittest.expect(o.startCursor, unittest.equals('foo'));
   }
   buildCounterQuery--;
 }
 
-buildUnnamed1205() {
+buildUnnamed1236() {
   var o = new core.List<api.EntityResult>();
   o.add(buildEntityResult());
   o.add(buildEntityResult());
   return o;
 }
 
-checkUnnamed1205(core.List<api.EntityResult> o) {
+checkUnnamed1236(core.List<api.EntityResult> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEntityResult(o[0]);
   checkEntityResult(o[1]);
@@ -918,7 +918,7 @@
   if (buildCounterQueryResultBatch < 3) {
     o.endCursor = "foo";
     o.entityResultType = "foo";
-    o.entityResults = buildUnnamed1205();
+    o.entityResults = buildUnnamed1236();
     o.moreResults = "foo";
     o.skippedResults = 42;
   }
@@ -931,7 +931,7 @@
   if (buildCounterQueryResultBatch < 3) {
     unittest.expect(o.endCursor, unittest.equals('foo'));
     unittest.expect(o.entityResultType, unittest.equals('foo'));
-    checkUnnamed1205(o.entityResults);
+    checkUnnamed1236(o.entityResults);
     unittest.expect(o.moreResults, unittest.equals('foo'));
     unittest.expect(o.skippedResults, unittest.equals(42));
   }
@@ -1062,14 +1062,14 @@
   buildCounterRunQueryResponse--;
 }
 
-buildUnnamed1206() {
+buildUnnamed1237() {
   var o = new core.List<api.Value>();
   o.add(buildValue());
   o.add(buildValue());
   return o;
 }
 
-checkUnnamed1206(core.List<api.Value> o) {
+checkUnnamed1237(core.List<api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkValue(o[0]);
   checkValue(o[1]);
@@ -1089,7 +1089,7 @@
     o.indexed = true;
     o.integerValue = "foo";
     o.keyValue = buildKey();
-    o.listValue = buildUnnamed1206();
+    o.listValue = buildUnnamed1237();
     o.meaning = 42;
     o.stringValue = "foo";
   }
@@ -1109,7 +1109,7 @@
     unittest.expect(o.indexed, unittest.isTrue);
     unittest.expect(o.integerValue, unittest.equals('foo'));
     checkKey(o.keyValue);
-    checkUnnamed1206(o.listValue);
+    checkUnnamed1237(o.listValue);
     unittest.expect(o.meaning, unittest.equals(42));
     unittest.expect(o.stringValue, unittest.equals('foo'));
   }
@@ -1439,15 +1439,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("/datastore/v1beta2/datasets/"));
-        pathOffset += 28;
-        index = path.indexOf("/allocateIds", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_datasetId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/allocateIds"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1492,15 +1485,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("/datastore/v1beta2/datasets/"));
-        pathOffset += 28;
-        index = path.indexOf("/beginTransaction", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_datasetId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/beginTransaction"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1545,15 +1531,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("/datastore/v1beta2/datasets/"));
-        pathOffset += 28;
-        index = path.indexOf("/commit", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_datasetId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/commit"));
-        pathOffset += 7;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1598,15 +1577,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("/datastore/v1beta2/datasets/"));
-        pathOffset += 28;
-        index = path.indexOf("/lookup", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_datasetId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/lookup"));
-        pathOffset += 7;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1651,15 +1623,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("/datastore/v1beta2/datasets/"));
-        pathOffset += 28;
-        index = path.indexOf("/rollback", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_datasetId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/rollback"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1704,15 +1669,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("/datastore/v1beta2/datasets/"));
-        pathOffset += 28;
-        index = path.indexOf("/runQuery", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_datasetId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/runQuery"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
diff --git a/generated/googleapis_beta/test/dns/v1beta1_test.dart b/generated/googleapis_beta/test/dns/v1beta1_test.dart
index b875a57..66f16aa 100644
--- a/generated/googleapis_beta/test/dns/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/dns/v1beta1_test.dart
@@ -16,27 +16,27 @@
 
 
 
-buildUnnamed1052() {
+buildUnnamed1080() {
   var o = new core.List<api.ResourceRecordSet>();
   o.add(buildResourceRecordSet());
   o.add(buildResourceRecordSet());
   return o;
 }
 
-checkUnnamed1052(core.List<api.ResourceRecordSet> o) {
+checkUnnamed1080(core.List<api.ResourceRecordSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceRecordSet(o[0]);
   checkResourceRecordSet(o[1]);
 }
 
-buildUnnamed1053() {
+buildUnnamed1081() {
   var o = new core.List<api.ResourceRecordSet>();
   o.add(buildResourceRecordSet());
   o.add(buildResourceRecordSet());
   return o;
 }
 
-checkUnnamed1053(core.List<api.ResourceRecordSet> o) {
+checkUnnamed1081(core.List<api.ResourceRecordSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceRecordSet(o[0]);
   checkResourceRecordSet(o[1]);
@@ -47,8 +47,8 @@
   var o = new api.Change();
   buildCounterChange++;
   if (buildCounterChange < 3) {
-    o.additions = buildUnnamed1052();
-    o.deletions = buildUnnamed1053();
+    o.additions = buildUnnamed1080();
+    o.deletions = buildUnnamed1081();
     o.id = "foo";
     o.kind = "foo";
     o.startTime = "foo";
@@ -61,8 +61,8 @@
 checkChange(api.Change o) {
   buildCounterChange++;
   if (buildCounterChange < 3) {
-    checkUnnamed1052(o.additions);
-    checkUnnamed1053(o.deletions);
+    checkUnnamed1080(o.additions);
+    checkUnnamed1081(o.deletions);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.startTime, unittest.equals('foo'));
@@ -71,14 +71,14 @@
   buildCounterChange--;
 }
 
-buildUnnamed1054() {
+buildUnnamed1082() {
   var o = new core.List<api.Change>();
   o.add(buildChange());
   o.add(buildChange());
   return o;
 }
 
-checkUnnamed1054(core.List<api.Change> o) {
+checkUnnamed1082(core.List<api.Change> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkChange(o[0]);
   checkChange(o[1]);
@@ -89,7 +89,7 @@
   var o = new api.ChangesListResponse();
   buildCounterChangesListResponse++;
   if (buildCounterChangesListResponse < 3) {
-    o.changes = buildUnnamed1054();
+    o.changes = buildUnnamed1082();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -100,21 +100,21 @@
 checkChangesListResponse(api.ChangesListResponse o) {
   buildCounterChangesListResponse++;
   if (buildCounterChangesListResponse < 3) {
-    checkUnnamed1054(o.changes);
+    checkUnnamed1082(o.changes);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterChangesListResponse--;
 }
 
-buildUnnamed1055() {
+buildUnnamed1083() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1055(core.List<core.String> o) {
+checkUnnamed1083(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -131,7 +131,7 @@
     o.id = "foo";
     o.kind = "foo";
     o.name = "foo";
-    o.nameServers = buildUnnamed1055();
+    o.nameServers = buildUnnamed1083();
   }
   buildCounterManagedZone--;
   return o;
@@ -146,19 +146,19 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1055(o.nameServers);
+    checkUnnamed1083(o.nameServers);
   }
   buildCounterManagedZone--;
 }
 
-buildUnnamed1056() {
+buildUnnamed1084() {
   var o = new core.List<api.ManagedZone>();
   o.add(buildManagedZone());
   o.add(buildManagedZone());
   return o;
 }
 
-checkUnnamed1056(core.List<api.ManagedZone> o) {
+checkUnnamed1084(core.List<api.ManagedZone> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkManagedZone(o[0]);
   checkManagedZone(o[1]);
@@ -170,7 +170,7 @@
   buildCounterManagedZonesListResponse++;
   if (buildCounterManagedZonesListResponse < 3) {
     o.kind = "foo";
-    o.managedZones = buildUnnamed1056();
+    o.managedZones = buildUnnamed1084();
     o.nextPageToken = "foo";
   }
   buildCounterManagedZonesListResponse--;
@@ -181,7 +181,7 @@
   buildCounterManagedZonesListResponse++;
   if (buildCounterManagedZonesListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1056(o.managedZones);
+    checkUnnamed1084(o.managedZones);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterManagedZonesListResponse--;
@@ -243,14 +243,14 @@
   buildCounterQuota--;
 }
 
-buildUnnamed1057() {
+buildUnnamed1085() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1057(core.List<core.String> o) {
+checkUnnamed1085(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -263,7 +263,7 @@
   if (buildCounterResourceRecordSet < 3) {
     o.kind = "foo";
     o.name = "foo";
-    o.rrdatas = buildUnnamed1057();
+    o.rrdatas = buildUnnamed1085();
     o.ttl = 42;
     o.type = "foo";
   }
@@ -276,21 +276,21 @@
   if (buildCounterResourceRecordSet < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1057(o.rrdatas);
+    checkUnnamed1085(o.rrdatas);
     unittest.expect(o.ttl, unittest.equals(42));
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterResourceRecordSet--;
 }
 
-buildUnnamed1058() {
+buildUnnamed1086() {
   var o = new core.List<api.ResourceRecordSet>();
   o.add(buildResourceRecordSet());
   o.add(buildResourceRecordSet());
   return o;
 }
 
-checkUnnamed1058(core.List<api.ResourceRecordSet> o) {
+checkUnnamed1086(core.List<api.ResourceRecordSet> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceRecordSet(o[0]);
   checkResourceRecordSet(o[1]);
@@ -303,7 +303,7 @@
   if (buildCounterResourceRecordSetsListResponse < 3) {
     o.kind = "foo";
     o.nextPageToken = "foo";
-    o.rrsets = buildUnnamed1058();
+    o.rrsets = buildUnnamed1086();
   }
   buildCounterResourceRecordSetsListResponse--;
   return o;
@@ -314,7 +314,7 @@
   if (buildCounterResourceRecordSetsListResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1058(o.rrsets);
+    checkUnnamed1086(o.rrsets);
   }
   buildCounterResourceRecordSetsListResponse--;
 }
@@ -409,22 +409,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/dns/v1beta1/projects/"));
-        pathOffset += 22;
-        index = path.indexOf("/managedZones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/managedZones/"));
-        pathOffset += 14;
-        index = path.indexOf("/changes", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_managedZone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/changes"));
-        pathOffset += 8;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -467,25 +453,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/dns/v1beta1/projects/"));
-        pathOffset += 22;
-        index = path.indexOf("/managedZones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/managedZones/"));
-        pathOffset += 14;
-        index = path.indexOf("/changes/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_managedZone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/changes/"));
-        pathOffset += 9;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_changeId"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -531,22 +500,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/dns/v1beta1/projects/"));
-        pathOffset += 22;
-        index = path.indexOf("/managedZones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/managedZones/"));
-        pathOffset += 14;
-        index = path.indexOf("/changes", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_managedZone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/changes"));
-        pathOffset += 8;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -599,15 +554,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/dns/v1beta1/projects/"));
-        pathOffset += 22;
-        index = path.indexOf("/managedZones", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/managedZones"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -649,18 +597,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/dns/v1beta1/projects/"));
-        pathOffset += 22;
-        index = path.indexOf("/managedZones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/managedZones/"));
-        pathOffset += 14;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_managedZone"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -700,18 +638,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/dns/v1beta1/projects/"));
-        pathOffset += 22;
-        index = path.indexOf("/managedZones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/managedZones/"));
-        pathOffset += 14;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_managedZone"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -754,15 +682,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/dns/v1beta1/projects/"));
-        pathOffset += 22;
-        index = path.indexOf("/managedZones", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/managedZones"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -809,11 +730,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/dns/v1beta1/projects/"));
-        pathOffset += 22;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -863,22 +781,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 22), unittest.equals("/dns/v1beta1/projects/"));
-        pathOffset += 22;
-        index = path.indexOf("/managedZones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/managedZones/"));
-        pathOffset += 14;
-        index = path.indexOf("/rrsets", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_managedZone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/rrsets"));
-        pathOffset += 7;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
diff --git a/generated/googleapis_beta/test/genomics/v1beta_test.dart b/generated/googleapis_beta/test/genomics/v1beta_test.dart
index 344622a..c4d1830 100644
--- a/generated/googleapis_beta/test/genomics/v1beta_test.dart
+++ b/generated/googleapis_beta/test/genomics/v1beta_test.dart
@@ -35,56 +35,56 @@
   buildCounterBeacon--;
 }
 
-buildUnnamed1122() {
+buildUnnamed1150() {
   var o = new core.List<core.int>();
   o.add(42);
   o.add(42);
   return o;
 }
 
-checkUnnamed1122(core.List<core.int> o) {
+checkUnnamed1150(core.List<core.int> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42));
   unittest.expect(o[1], unittest.equals(42));
 }
 
-buildUnnamed1123() {
+buildUnnamed1151() {
   var o = new core.List<core.double>();
   o.add(42.0);
   o.add(42.0);
   return o;
 }
 
-checkUnnamed1123(core.List<core.double> o) {
+checkUnnamed1151(core.List<core.double> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals(42.0));
   unittest.expect(o[1], unittest.equals(42.0));
 }
 
-buildUnnamed1124() {
+buildUnnamed1152() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1124(core.List<core.String> o) {
+checkUnnamed1152(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1125() {
+buildUnnamed1153() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1124();
-  o["y"] = buildUnnamed1124();
+  o["x"] = buildUnnamed1152();
+  o["y"] = buildUnnamed1152();
   return o;
 }
 
-checkUnnamed1125(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1153(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1124(o["x"]);
-  checkUnnamed1124(o["y"]);
+  checkUnnamed1152(o["x"]);
+  checkUnnamed1152(o["y"]);
 }
 
 core.int buildCounterCall = 0;
@@ -92,11 +92,11 @@
   var o = new api.Call();
   buildCounterCall++;
   if (buildCounterCall < 3) {
-    o.callsetId = "foo";
-    o.callsetName = "foo";
-    o.genotype = buildUnnamed1122();
-    o.genotypeLikelihood = buildUnnamed1123();
-    o.info = buildUnnamed1125();
+    o.callSetId = "foo";
+    o.callSetName = "foo";
+    o.genotype = buildUnnamed1150();
+    o.genotypeLikelihood = buildUnnamed1151();
+    o.info = buildUnnamed1153();
     o.phaseset = "foo";
   }
   buildCounterCall--;
@@ -106,88 +106,82 @@
 checkCall(api.Call o) {
   buildCounterCall++;
   if (buildCounterCall < 3) {
-    unittest.expect(o.callsetId, unittest.equals('foo'));
-    unittest.expect(o.callsetName, unittest.equals('foo'));
-    checkUnnamed1122(o.genotype);
-    checkUnnamed1123(o.genotypeLikelihood);
-    checkUnnamed1125(o.info);
+    unittest.expect(o.callSetId, unittest.equals('foo'));
+    unittest.expect(o.callSetName, unittest.equals('foo'));
+    checkUnnamed1150(o.genotype);
+    checkUnnamed1151(o.genotypeLikelihood);
+    checkUnnamed1153(o.info);
     unittest.expect(o.phaseset, unittest.equals('foo'));
   }
   buildCounterCall--;
 }
 
-buildUnnamed1126() {
+buildUnnamed1154() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1126(core.List<core.String> o) {
+checkUnnamed1154(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1127() {
+buildUnnamed1155() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1126();
-  o["y"] = buildUnnamed1126();
+  o["x"] = buildUnnamed1154();
+  o["y"] = buildUnnamed1154();
   return o;
 }
 
-checkUnnamed1127(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1155(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1126(o["x"]);
-  checkUnnamed1126(o["y"]);
+  checkUnnamed1154(o["x"]);
+  checkUnnamed1154(o["y"]);
 }
 
-core.int buildCounterCallset = 0;
-buildCallset() {
-  var o = new api.Callset();
-  buildCounterCallset++;
-  if (buildCounterCallset < 3) {
+buildUnnamed1156() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1156(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+core.int buildCounterCallSet = 0;
+buildCallSet() {
+  var o = new api.CallSet();
+  buildCounterCallSet++;
+  if (buildCounterCallSet < 3) {
     o.created = "foo";
     o.id = "foo";
-    o.info = buildUnnamed1127();
+    o.info = buildUnnamed1155();
     o.name = "foo";
-    o.variantsetId = "foo";
+    o.sampleId = "foo";
+    o.variantSetIds = buildUnnamed1156();
   }
-  buildCounterCallset--;
+  buildCounterCallSet--;
   return o;
 }
 
-checkCallset(api.Callset o) {
-  buildCounterCallset++;
-  if (buildCounterCallset < 3) {
+checkCallSet(api.CallSet o) {
+  buildCounterCallSet++;
+  if (buildCounterCallSet < 3) {
     unittest.expect(o.created, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1127(o.info);
+    checkUnnamed1155(o.info);
     unittest.expect(o.name, unittest.equals('foo'));
-    unittest.expect(o.variantsetId, unittest.equals('foo'));
+    unittest.expect(o.sampleId, unittest.equals('foo'));
+    checkUnnamed1156(o.variantSetIds);
   }
-  buildCounterCallset--;
-}
-
-core.int buildCounterContigBound = 0;
-buildContigBound() {
-  var o = new api.ContigBound();
-  buildCounterContigBound++;
-  if (buildCounterContigBound < 3) {
-    o.contig = "foo";
-    o.upperBound = "foo";
-  }
-  buildCounterContigBound--;
-  return o;
-}
-
-checkContigBound(api.ContigBound o) {
-  buildCounterContigBound++;
-  if (buildCounterContigBound < 3) {
-    unittest.expect(o.contig, unittest.equals('foo'));
-    unittest.expect(o.upperBound, unittest.equals('foo'));
-  }
-  buildCounterContigBound--;
+  buildCounterCallSet--;
 }
 
 core.int buildCounterCoverageBucket = 0;
@@ -236,27 +230,27 @@
   buildCounterDataset--;
 }
 
-buildUnnamed1128() {
+buildUnnamed1157() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1128(core.List<core.String> o) {
+checkUnnamed1157(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1129() {
+buildUnnamed1158() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1129(core.List<core.String> o) {
+checkUnnamed1158(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -270,9 +264,9 @@
     o.align = true;
     o.callVariants = true;
     o.gcsOutputPath = "foo";
-    o.pairedSourceUris = buildUnnamed1128();
+    o.pairedSourceUris = buildUnnamed1157();
     o.projectId = "foo";
-    o.sourceUris = buildUnnamed1129();
+    o.sourceUris = buildUnnamed1158();
   }
   buildCounterExperimentalCreateJobRequest--;
   return o;
@@ -284,9 +278,9 @@
     unittest.expect(o.align, unittest.isTrue);
     unittest.expect(o.callVariants, unittest.isTrue);
     unittest.expect(o.gcsOutputPath, unittest.equals('foo'));
-    checkUnnamed1128(o.pairedSourceUris);
+    checkUnnamed1157(o.pairedSourceUris);
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkUnnamed1129(o.sourceUris);
+    checkUnnamed1158(o.sourceUris);
   }
   buildCounterExperimentalCreateJobRequest--;
 }
@@ -310,27 +304,27 @@
   buildCounterExperimentalCreateJobResponse--;
 }
 
-buildUnnamed1130() {
+buildUnnamed1159() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1130(core.List<core.String> o) {
+checkUnnamed1159(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1131() {
+buildUnnamed1160() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1131(core.List<core.String> o) {
+checkUnnamed1160(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -343,8 +337,8 @@
   if (buildCounterExportReadsetsRequest < 3) {
     o.exportUri = "foo";
     o.projectId = "foo";
-    o.readsetIds = buildUnnamed1130();
-    o.referenceNames = buildUnnamed1131();
+    o.readsetIds = buildUnnamed1159();
+    o.referenceNames = buildUnnamed1160();
   }
   buildCounterExportReadsetsRequest--;
   return o;
@@ -355,8 +349,8 @@
   if (buildCounterExportReadsetsRequest < 3) {
     unittest.expect(o.exportUri, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkUnnamed1130(o.readsetIds);
-    checkUnnamed1131(o.referenceNames);
+    checkUnnamed1159(o.readsetIds);
+    checkUnnamed1160(o.referenceNames);
   }
   buildCounterExportReadsetsRequest--;
 }
@@ -380,14 +374,14 @@
   buildCounterExportReadsetsResponse--;
 }
 
-buildUnnamed1132() {
+buildUnnamed1161() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1132(core.List<core.String> o) {
+checkUnnamed1161(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -400,10 +394,10 @@
   if (buildCounterExportVariantsRequest < 3) {
     o.bigqueryDataset = "foo";
     o.bigqueryTable = "foo";
-    o.callsetIds = buildUnnamed1132();
+    o.callSetIds = buildUnnamed1161();
     o.format = "foo";
     o.projectId = "foo";
-    o.variantsetId = "foo";
+    o.variantSetId = "foo";
   }
   buildCounterExportVariantsRequest--;
   return o;
@@ -414,10 +408,10 @@
   if (buildCounterExportVariantsRequest < 3) {
     unittest.expect(o.bigqueryDataset, unittest.equals('foo'));
     unittest.expect(o.bigqueryTable, unittest.equals('foo'));
-    checkUnnamed1132(o.callsetIds);
+    checkUnnamed1161(o.callSetIds);
     unittest.expect(o.format, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
-    unittest.expect(o.variantsetId, unittest.equals('foo'));
+    unittest.expect(o.variantSetId, unittest.equals('foo'));
   }
   buildCounterExportVariantsRequest--;
 }
@@ -464,53 +458,6 @@
   buildCounterGenomicRange--;
 }
 
-buildUnnamed1133() {
-  var o = new core.List<api.ContigBound>();
-  o.add(buildContigBound());
-  o.add(buildContigBound());
-  return o;
-}
-
-checkUnnamed1133(core.List<api.ContigBound> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkContigBound(o[0]);
-  checkContigBound(o[1]);
-}
-
-buildUnnamed1134() {
-  var o = new core.List<api.Metadata>();
-  o.add(buildMetadata());
-  o.add(buildMetadata());
-  return o;
-}
-
-checkUnnamed1134(core.List<api.Metadata> o) {
-  unittest.expect(o, unittest.hasLength(2));
-  checkMetadata(o[0]);
-  checkMetadata(o[1]);
-}
-
-core.int buildCounterGetVariantsSummaryResponse = 0;
-buildGetVariantsSummaryResponse() {
-  var o = new api.GetVariantsSummaryResponse();
-  buildCounterGetVariantsSummaryResponse++;
-  if (buildCounterGetVariantsSummaryResponse < 3) {
-    o.contigBounds = buildUnnamed1133();
-    o.metadata = buildUnnamed1134();
-  }
-  buildCounterGetVariantsSummaryResponse--;
-  return o;
-}
-
-checkGetVariantsSummaryResponse(api.GetVariantsSummaryResponse o) {
-  buildCounterGetVariantsSummaryResponse++;
-  if (buildCounterGetVariantsSummaryResponse < 3) {
-    checkUnnamed1133(o.contigBounds);
-    checkUnnamed1134(o.metadata);
-  }
-  buildCounterGetVariantsSummaryResponse--;
-}
-
 core.int buildCounterHeader = 0;
 buildHeader() {
   var o = new api.Header();
@@ -532,66 +479,66 @@
   buildCounterHeader--;
 }
 
-buildUnnamed1135() {
+buildUnnamed1162() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1135(core.List<core.String> o) {
+checkUnnamed1162(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1136() {
+buildUnnamed1163() {
   var o = new core.List<api.Header>();
   o.add(buildHeader());
   o.add(buildHeader());
   return o;
 }
 
-checkUnnamed1136(core.List<api.Header> o) {
+checkUnnamed1163(core.List<api.Header> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHeader(o[0]);
   checkHeader(o[1]);
 }
 
-buildUnnamed1137() {
+buildUnnamed1164() {
   var o = new core.List<api.Program>();
   o.add(buildProgram());
   o.add(buildProgram());
   return o;
 }
 
-checkUnnamed1137(core.List<api.Program> o) {
+checkUnnamed1164(core.List<api.Program> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkProgram(o[0]);
   checkProgram(o[1]);
 }
 
-buildUnnamed1138() {
+buildUnnamed1165() {
   var o = new core.List<api.ReadGroup>();
   o.add(buildReadGroup());
   o.add(buildReadGroup());
   return o;
 }
 
-checkUnnamed1138(core.List<api.ReadGroup> o) {
+checkUnnamed1165(core.List<api.ReadGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReadGroup(o[0]);
   checkReadGroup(o[1]);
 }
 
-buildUnnamed1139() {
+buildUnnamed1166() {
   var o = new core.List<api.ReferenceSequence>();
   o.add(buildReferenceSequence());
   o.add(buildReferenceSequence());
   return o;
 }
 
-checkUnnamed1139(core.List<api.ReferenceSequence> o) {
+checkUnnamed1166(core.List<api.ReferenceSequence> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReferenceSequence(o[0]);
   checkReferenceSequence(o[1]);
@@ -602,13 +549,13 @@
   var o = new api.HeaderSection();
   buildCounterHeaderSection++;
   if (buildCounterHeaderSection < 3) {
-    o.comments = buildUnnamed1135();
+    o.comments = buildUnnamed1162();
     o.fileUri = "foo";
     o.filename = "foo";
-    o.headers = buildUnnamed1136();
-    o.programs = buildUnnamed1137();
-    o.readGroups = buildUnnamed1138();
-    o.refSequences = buildUnnamed1139();
+    o.headers = buildUnnamed1163();
+    o.programs = buildUnnamed1164();
+    o.readGroups = buildUnnamed1165();
+    o.refSequences = buildUnnamed1166();
   }
   buildCounterHeaderSection--;
   return o;
@@ -617,25 +564,25 @@
 checkHeaderSection(api.HeaderSection o) {
   buildCounterHeaderSection++;
   if (buildCounterHeaderSection < 3) {
-    checkUnnamed1135(o.comments);
+    checkUnnamed1162(o.comments);
     unittest.expect(o.fileUri, unittest.equals('foo'));
     unittest.expect(o.filename, unittest.equals('foo'));
-    checkUnnamed1136(o.headers);
-    checkUnnamed1137(o.programs);
-    checkUnnamed1138(o.readGroups);
-    checkUnnamed1139(o.refSequences);
+    checkUnnamed1163(o.headers);
+    checkUnnamed1164(o.programs);
+    checkUnnamed1165(o.readGroups);
+    checkUnnamed1166(o.refSequences);
   }
   buildCounterHeaderSection--;
 }
 
-buildUnnamed1140() {
+buildUnnamed1167() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1140(core.List<core.String> o) {
+checkUnnamed1167(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -647,7 +594,7 @@
   buildCounterImportReadsetsRequest++;
   if (buildCounterImportReadsetsRequest < 3) {
     o.datasetId = "foo";
-    o.sourceUris = buildUnnamed1140();
+    o.sourceUris = buildUnnamed1167();
   }
   buildCounterImportReadsetsRequest--;
   return o;
@@ -657,7 +604,7 @@
   buildCounterImportReadsetsRequest++;
   if (buildCounterImportReadsetsRequest < 3) {
     unittest.expect(o.datasetId, unittest.equals('foo'));
-    checkUnnamed1140(o.sourceUris);
+    checkUnnamed1167(o.sourceUris);
   }
   buildCounterImportReadsetsRequest--;
 }
@@ -681,14 +628,14 @@
   buildCounterImportReadsetsResponse--;
 }
 
-buildUnnamed1141() {
+buildUnnamed1168() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1141(core.List<core.String> o) {
+checkUnnamed1168(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -700,8 +647,8 @@
   buildCounterImportVariantsRequest++;
   if (buildCounterImportVariantsRequest < 3) {
     o.format = "foo";
-    o.sourceUris = buildUnnamed1141();
-    o.variantsetId = "foo";
+    o.sourceUris = buildUnnamed1168();
+    o.variantSetId = "foo";
   }
   buildCounterImportVariantsRequest--;
   return o;
@@ -711,8 +658,8 @@
   buildCounterImportVariantsRequest++;
   if (buildCounterImportVariantsRequest < 3) {
     unittest.expect(o.format, unittest.equals('foo'));
-    checkUnnamed1141(o.sourceUris);
-    unittest.expect(o.variantsetId, unittest.equals('foo'));
+    checkUnnamed1168(o.sourceUris);
+    unittest.expect(o.variantSetId, unittest.equals('foo'));
   }
   buildCounterImportVariantsRequest--;
 }
@@ -736,40 +683,40 @@
   buildCounterImportVariantsResponse--;
 }
 
-buildUnnamed1142() {
+buildUnnamed1169() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1142(core.List<core.String> o) {
+checkUnnamed1169(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1143() {
+buildUnnamed1170() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1143(core.List<core.String> o) {
+checkUnnamed1170(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1144() {
+buildUnnamed1171() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1144(core.List<core.String> o) {
+checkUnnamed1171(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -782,13 +729,13 @@
   if (buildCounterJob < 3) {
     o.created = "foo";
     o.description = "foo";
-    o.errors = buildUnnamed1142();
+    o.errors = buildUnnamed1169();
     o.id = "foo";
-    o.importedIds = buildUnnamed1143();
+    o.importedIds = buildUnnamed1170();
     o.projectId = "foo";
     o.request = buildJobRequest();
     o.status = "foo";
-    o.warnings = buildUnnamed1144();
+    o.warnings = buildUnnamed1171();
   }
   buildCounterJob--;
   return o;
@@ -799,38 +746,38 @@
   if (buildCounterJob < 3) {
     unittest.expect(o.created, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1142(o.errors);
+    checkUnnamed1169(o.errors);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1143(o.importedIds);
+    checkUnnamed1170(o.importedIds);
     unittest.expect(o.projectId, unittest.equals('foo'));
     checkJobRequest(o.request);
     unittest.expect(o.status, unittest.equals('foo'));
-    checkUnnamed1144(o.warnings);
+    checkUnnamed1171(o.warnings);
   }
   buildCounterJob--;
 }
 
-buildUnnamed1145() {
+buildUnnamed1172() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1145(core.List<core.String> o) {
+checkUnnamed1172(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1146() {
+buildUnnamed1173() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1146(core.List<core.String> o) {
+checkUnnamed1173(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -841,8 +788,8 @@
   var o = new api.JobRequest();
   buildCounterJobRequest++;
   if (buildCounterJobRequest < 3) {
-    o.destination = buildUnnamed1145();
-    o.source = buildUnnamed1146();
+    o.destination = buildUnnamed1172();
+    o.source = buildUnnamed1173();
     o.type = "foo";
   }
   buildCounterJobRequest--;
@@ -852,21 +799,21 @@
 checkJobRequest(api.JobRequest o) {
   buildCounterJobRequest++;
   if (buildCounterJobRequest < 3) {
-    checkUnnamed1145(o.destination);
-    checkUnnamed1146(o.source);
+    checkUnnamed1172(o.destination);
+    checkUnnamed1173(o.source);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterJobRequest--;
 }
 
-buildUnnamed1147() {
+buildUnnamed1174() {
   var o = new core.List<api.CoverageBucket>();
   o.add(buildCoverageBucket());
   o.add(buildCoverageBucket());
   return o;
 }
 
-checkUnnamed1147(core.List<api.CoverageBucket> o) {
+checkUnnamed1174(core.List<api.CoverageBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCoverageBucket(o[0]);
   checkCoverageBucket(o[1]);
@@ -878,7 +825,7 @@
   buildCounterListCoverageBucketsResponse++;
   if (buildCounterListCoverageBucketsResponse < 3) {
     o.bucketWidth = "foo";
-    o.coverageBuckets = buildUnnamed1147();
+    o.coverageBuckets = buildUnnamed1174();
     o.nextPageToken = "foo";
   }
   buildCounterListCoverageBucketsResponse--;
@@ -889,20 +836,20 @@
   buildCounterListCoverageBucketsResponse++;
   if (buildCounterListCoverageBucketsResponse < 3) {
     unittest.expect(o.bucketWidth, unittest.equals('foo'));
-    checkUnnamed1147(o.coverageBuckets);
+    checkUnnamed1174(o.coverageBuckets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListCoverageBucketsResponse--;
 }
 
-buildUnnamed1148() {
+buildUnnamed1175() {
   var o = new core.List<api.Dataset>();
   o.add(buildDataset());
   o.add(buildDataset());
   return o;
 }
 
-checkUnnamed1148(core.List<api.Dataset> o) {
+checkUnnamed1175(core.List<api.Dataset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDataset(o[0]);
   checkDataset(o[1]);
@@ -913,7 +860,7 @@
   var o = new api.ListDatasetsResponse();
   buildCounterListDatasetsResponse++;
   if (buildCounterListDatasetsResponse < 3) {
-    o.datasets = buildUnnamed1148();
+    o.datasets = buildUnnamed1175();
     o.nextPageToken = "foo";
   }
   buildCounterListDatasetsResponse--;
@@ -923,36 +870,36 @@
 checkListDatasetsResponse(api.ListDatasetsResponse o) {
   buildCounterListDatasetsResponse++;
   if (buildCounterListDatasetsResponse < 3) {
-    checkUnnamed1148(o.datasets);
+    checkUnnamed1175(o.datasets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListDatasetsResponse--;
 }
 
-buildUnnamed1149() {
+buildUnnamed1176() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1149(core.List<core.String> o) {
+checkUnnamed1176(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1150() {
+buildUnnamed1177() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1149();
-  o["y"] = buildUnnamed1149();
+  o["x"] = buildUnnamed1176();
+  o["y"] = buildUnnamed1176();
   return o;
 }
 
-checkUnnamed1150(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1177(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1149(o["x"]);
-  checkUnnamed1149(o["y"]);
+  checkUnnamed1176(o["x"]);
+  checkUnnamed1176(o["y"]);
 }
 
 core.int buildCounterMetadata = 0;
@@ -962,7 +909,7 @@
   if (buildCounterMetadata < 3) {
     o.description = "foo";
     o.id = "foo";
-    o.info = buildUnnamed1150();
+    o.info = buildUnnamed1177();
     o.key = "foo";
     o.number = "foo";
     o.type = "foo";
@@ -977,7 +924,7 @@
   if (buildCounterMetadata < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1150(o.info);
+    checkUnnamed1177(o.info);
     unittest.expect(o.key, unittest.equals('foo'));
     unittest.expect(o.number, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -1013,30 +960,30 @@
   buildCounterProgram--;
 }
 
-buildUnnamed1151() {
+buildUnnamed1178() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1151(core.List<core.String> o) {
+checkUnnamed1178(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1152() {
+buildUnnamed1179() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1151();
-  o["y"] = buildUnnamed1151();
+  o["x"] = buildUnnamed1178();
+  o["y"] = buildUnnamed1178();
   return o;
 }
 
-checkUnnamed1152(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1179(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1151(o["x"]);
-  checkUnnamed1151(o["y"]);
+  checkUnnamed1178(o["x"]);
+  checkUnnamed1178(o["y"]);
 }
 
 core.int buildCounterRead = 0;
@@ -1057,7 +1004,7 @@
     o.position = 42;
     o.readsetId = "foo";
     o.referenceSequenceName = "foo";
-    o.tags = buildUnnamed1152();
+    o.tags = buildUnnamed1179();
     o.templateLength = 42;
   }
   buildCounterRead--;
@@ -1080,7 +1027,7 @@
     unittest.expect(o.position, unittest.equals(42));
     unittest.expect(o.readsetId, unittest.equals('foo'));
     unittest.expect(o.referenceSequenceName, unittest.equals('foo'));
-    checkUnnamed1152(o.tags);
+    checkUnnamed1179(o.tags);
     unittest.expect(o.templateLength, unittest.equals(42));
   }
   buildCounterRead--;
@@ -1127,14 +1074,14 @@
   buildCounterReadGroup--;
 }
 
-buildUnnamed1153() {
+buildUnnamed1180() {
   var o = new core.List<api.HeaderSection>();
   o.add(buildHeaderSection());
   o.add(buildHeaderSection());
   return o;
 }
 
-checkUnnamed1153(core.List<api.HeaderSection> o) {
+checkUnnamed1180(core.List<api.HeaderSection> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHeaderSection(o[0]);
   checkHeaderSection(o[1]);
@@ -1146,7 +1093,7 @@
   buildCounterReadset++;
   if (buildCounterReadset < 3) {
     o.datasetId = "foo";
-    o.fileData = buildUnnamed1153();
+    o.fileData = buildUnnamed1180();
     o.id = "foo";
     o.name = "foo";
   }
@@ -1158,13 +1105,34 @@
   buildCounterReadset++;
   if (buildCounterReadset < 3) {
     unittest.expect(o.datasetId, unittest.equals('foo'));
-    checkUnnamed1153(o.fileData);
+    checkUnnamed1180(o.fileData);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterReadset--;
 }
 
+core.int buildCounterReferenceBound = 0;
+buildReferenceBound() {
+  var o = new api.ReferenceBound();
+  buildCounterReferenceBound++;
+  if (buildCounterReferenceBound < 3) {
+    o.referenceName = "foo";
+    o.upperBound = "foo";
+  }
+  buildCounterReferenceBound--;
+  return o;
+}
+
+checkReferenceBound(api.ReferenceBound o) {
+  buildCounterReferenceBound++;
+  if (buildCounterReferenceBound < 3) {
+    unittest.expect(o.referenceName, unittest.equals('foo'));
+    unittest.expect(o.upperBound, unittest.equals('foo'));
+  }
+  buildCounterReferenceBound--;
+}
+
 core.int buildCounterReferenceSequence = 0;
 buildReferenceSequence() {
   var o = new api.ReferenceSequence();
@@ -1194,86 +1162,86 @@
   buildCounterReferenceSequence--;
 }
 
-buildUnnamed1154() {
+buildUnnamed1181() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1154(core.List<core.String> o) {
+checkUnnamed1181(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-core.int buildCounterSearchCallsetsRequest = 0;
-buildSearchCallsetsRequest() {
-  var o = new api.SearchCallsetsRequest();
-  buildCounterSearchCallsetsRequest++;
-  if (buildCounterSearchCallsetsRequest < 3) {
-    o.maxResults = "foo";
+core.int buildCounterSearchCallSetsRequest = 0;
+buildSearchCallSetsRequest() {
+  var o = new api.SearchCallSetsRequest();
+  buildCounterSearchCallSetsRequest++;
+  if (buildCounterSearchCallSetsRequest < 3) {
     o.name = "foo";
+    o.pageSize = 42;
     o.pageToken = "foo";
-    o.variantsetIds = buildUnnamed1154();
+    o.variantSetIds = buildUnnamed1181();
   }
-  buildCounterSearchCallsetsRequest--;
+  buildCounterSearchCallSetsRequest--;
   return o;
 }
 
-checkSearchCallsetsRequest(api.SearchCallsetsRequest o) {
-  buildCounterSearchCallsetsRequest++;
-  if (buildCounterSearchCallsetsRequest < 3) {
-    unittest.expect(o.maxResults, unittest.equals('foo'));
+checkSearchCallSetsRequest(api.SearchCallSetsRequest o) {
+  buildCounterSearchCallSetsRequest++;
+  if (buildCounterSearchCallSetsRequest < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
+    unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed1154(o.variantsetIds);
+    checkUnnamed1181(o.variantSetIds);
   }
-  buildCounterSearchCallsetsRequest--;
+  buildCounterSearchCallSetsRequest--;
 }
 
-buildUnnamed1155() {
-  var o = new core.List<api.Callset>();
-  o.add(buildCallset());
-  o.add(buildCallset());
+buildUnnamed1182() {
+  var o = new core.List<api.CallSet>();
+  o.add(buildCallSet());
+  o.add(buildCallSet());
   return o;
 }
 
-checkUnnamed1155(core.List<api.Callset> o) {
+checkUnnamed1182(core.List<api.CallSet> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCallset(o[0]);
-  checkCallset(o[1]);
+  checkCallSet(o[0]);
+  checkCallSet(o[1]);
 }
 
-core.int buildCounterSearchCallsetsResponse = 0;
-buildSearchCallsetsResponse() {
-  var o = new api.SearchCallsetsResponse();
-  buildCounterSearchCallsetsResponse++;
-  if (buildCounterSearchCallsetsResponse < 3) {
-    o.callsets = buildUnnamed1155();
+core.int buildCounterSearchCallSetsResponse = 0;
+buildSearchCallSetsResponse() {
+  var o = new api.SearchCallSetsResponse();
+  buildCounterSearchCallSetsResponse++;
+  if (buildCounterSearchCallSetsResponse < 3) {
+    o.callSets = buildUnnamed1182();
     o.nextPageToken = "foo";
   }
-  buildCounterSearchCallsetsResponse--;
+  buildCounterSearchCallSetsResponse--;
   return o;
 }
 
-checkSearchCallsetsResponse(api.SearchCallsetsResponse o) {
-  buildCounterSearchCallsetsResponse++;
-  if (buildCounterSearchCallsetsResponse < 3) {
-    checkUnnamed1155(o.callsets);
+checkSearchCallSetsResponse(api.SearchCallSetsResponse o) {
+  buildCounterSearchCallSetsResponse++;
+  if (buildCounterSearchCallSetsResponse < 3) {
+    checkUnnamed1182(o.callSets);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
-  buildCounterSearchCallsetsResponse--;
+  buildCounterSearchCallSetsResponse--;
 }
 
-buildUnnamed1156() {
+buildUnnamed1183() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1156(core.List<core.String> o) {
+checkUnnamed1183(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1289,7 +1257,7 @@
     o.maxResults = "foo";
     o.pageToken = "foo";
     o.projectId = "foo";
-    o.status = buildUnnamed1156();
+    o.status = buildUnnamed1183();
   }
   buildCounterSearchJobsRequest--;
   return o;
@@ -1303,19 +1271,19 @@
     unittest.expect(o.maxResults, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkUnnamed1156(o.status);
+    checkUnnamed1183(o.status);
   }
   buildCounterSearchJobsRequest--;
 }
 
-buildUnnamed1157() {
+buildUnnamed1184() {
   var o = new core.List<api.Job>();
   o.add(buildJob());
   o.add(buildJob());
   return o;
 }
 
-checkUnnamed1157(core.List<api.Job> o) {
+checkUnnamed1184(core.List<api.Job> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkJob(o[0]);
   checkJob(o[1]);
@@ -1326,7 +1294,7 @@
   var o = new api.SearchJobsResponse();
   buildCounterSearchJobsResponse++;
   if (buildCounterSearchJobsResponse < 3) {
-    o.jobs = buildUnnamed1157();
+    o.jobs = buildUnnamed1184();
     o.nextPageToken = "foo";
   }
   buildCounterSearchJobsResponse--;
@@ -1336,20 +1304,20 @@
 checkSearchJobsResponse(api.SearchJobsResponse o) {
   buildCounterSearchJobsResponse++;
   if (buildCounterSearchJobsResponse < 3) {
-    checkUnnamed1157(o.jobs);
+    checkUnnamed1184(o.jobs);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterSearchJobsResponse--;
 }
 
-buildUnnamed1158() {
+buildUnnamed1185() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1158(core.List<core.String> o) {
+checkUnnamed1185(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1362,7 +1330,7 @@
   if (buildCounterSearchReadsRequest < 3) {
     o.maxResults = "foo";
     o.pageToken = "foo";
-    o.readsetIds = buildUnnamed1158();
+    o.readsetIds = buildUnnamed1185();
     o.sequenceEnd = "foo";
     o.sequenceName = "foo";
     o.sequenceStart = "foo";
@@ -1376,7 +1344,7 @@
   if (buildCounterSearchReadsRequest < 3) {
     unittest.expect(o.maxResults, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUnnamed1158(o.readsetIds);
+    checkUnnamed1185(o.readsetIds);
     unittest.expect(o.sequenceEnd, unittest.equals('foo'));
     unittest.expect(o.sequenceName, unittest.equals('foo'));
     unittest.expect(o.sequenceStart, unittest.equals('foo'));
@@ -1384,14 +1352,14 @@
   buildCounterSearchReadsRequest--;
 }
 
-buildUnnamed1159() {
+buildUnnamed1186() {
   var o = new core.List<api.Read>();
   o.add(buildRead());
   o.add(buildRead());
   return o;
 }
 
-checkUnnamed1159(core.List<api.Read> o) {
+checkUnnamed1186(core.List<api.Read> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkRead(o[0]);
   checkRead(o[1]);
@@ -1403,7 +1371,7 @@
   buildCounterSearchReadsResponse++;
   if (buildCounterSearchReadsResponse < 3) {
     o.nextPageToken = "foo";
-    o.reads = buildUnnamed1159();
+    o.reads = buildUnnamed1186();
   }
   buildCounterSearchReadsResponse--;
   return o;
@@ -1413,19 +1381,19 @@
   buildCounterSearchReadsResponse++;
   if (buildCounterSearchReadsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1159(o.reads);
+    checkUnnamed1186(o.reads);
   }
   buildCounterSearchReadsResponse--;
 }
 
-buildUnnamed1160() {
+buildUnnamed1187() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1160(core.List<core.String> o) {
+checkUnnamed1187(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1436,7 +1404,7 @@
   var o = new api.SearchReadsetsRequest();
   buildCounterSearchReadsetsRequest++;
   if (buildCounterSearchReadsetsRequest < 3) {
-    o.datasetIds = buildUnnamed1160();
+    o.datasetIds = buildUnnamed1187();
     o.maxResults = "foo";
     o.name = "foo";
     o.pageToken = "foo";
@@ -1448,7 +1416,7 @@
 checkSearchReadsetsRequest(api.SearchReadsetsRequest o) {
   buildCounterSearchReadsetsRequest++;
   if (buildCounterSearchReadsetsRequest < 3) {
-    checkUnnamed1160(o.datasetIds);
+    checkUnnamed1187(o.datasetIds);
     unittest.expect(o.maxResults, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
@@ -1456,14 +1424,14 @@
   buildCounterSearchReadsetsRequest--;
 }
 
-buildUnnamed1161() {
+buildUnnamed1188() {
   var o = new core.List<api.Readset>();
   o.add(buildReadset());
   o.add(buildReadset());
   return o;
 }
 
-checkUnnamed1161(core.List<api.Readset> o) {
+checkUnnamed1188(core.List<api.Readset> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReadset(o[0]);
   checkReadset(o[1]);
@@ -1475,7 +1443,7 @@
   buildCounterSearchReadsetsResponse++;
   if (buildCounterSearchReadsetsResponse < 3) {
     o.nextPageToken = "foo";
-    o.readsets = buildUnnamed1161();
+    o.readsets = buildUnnamed1188();
   }
   buildCounterSearchReadsetsResponse--;
   return o;
@@ -1485,32 +1453,102 @@
   buildCounterSearchReadsetsResponse++;
   if (buildCounterSearchReadsetsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1161(o.readsets);
+    checkUnnamed1188(o.readsets);
   }
   buildCounterSearchReadsetsResponse--;
 }
 
-buildUnnamed1162() {
+buildUnnamed1189() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1162(core.List<core.String> o) {
+checkUnnamed1189(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1163() {
+core.int buildCounterSearchVariantSetsRequest = 0;
+buildSearchVariantSetsRequest() {
+  var o = new api.SearchVariantSetsRequest();
+  buildCounterSearchVariantSetsRequest++;
+  if (buildCounterSearchVariantSetsRequest < 3) {
+    o.datasetIds = buildUnnamed1189();
+    o.pageSize = 42;
+    o.pageToken = "foo";
+  }
+  buildCounterSearchVariantSetsRequest--;
+  return o;
+}
+
+checkSearchVariantSetsRequest(api.SearchVariantSetsRequest o) {
+  buildCounterSearchVariantSetsRequest++;
+  if (buildCounterSearchVariantSetsRequest < 3) {
+    checkUnnamed1189(o.datasetIds);
+    unittest.expect(o.pageSize, unittest.equals(42));
+    unittest.expect(o.pageToken, unittest.equals('foo'));
+  }
+  buildCounterSearchVariantSetsRequest--;
+}
+
+buildUnnamed1190() {
+  var o = new core.List<api.VariantSet>();
+  o.add(buildVariantSet());
+  o.add(buildVariantSet());
+  return o;
+}
+
+checkUnnamed1190(core.List<api.VariantSet> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkVariantSet(o[0]);
+  checkVariantSet(o[1]);
+}
+
+core.int buildCounterSearchVariantSetsResponse = 0;
+buildSearchVariantSetsResponse() {
+  var o = new api.SearchVariantSetsResponse();
+  buildCounterSearchVariantSetsResponse++;
+  if (buildCounterSearchVariantSetsResponse < 3) {
+    o.nextPageToken = "foo";
+    o.variantSets = buildUnnamed1190();
+  }
+  buildCounterSearchVariantSetsResponse--;
+  return o;
+}
+
+checkSearchVariantSetsResponse(api.SearchVariantSetsResponse o) {
+  buildCounterSearchVariantSetsResponse++;
+  if (buildCounterSearchVariantSetsResponse < 3) {
+    unittest.expect(o.nextPageToken, unittest.equals('foo'));
+    checkUnnamed1190(o.variantSets);
+  }
+  buildCounterSearchVariantSetsResponse--;
+}
+
+buildUnnamed1191() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1163(core.List<core.String> o) {
+checkUnnamed1191(core.List<core.String> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  unittest.expect(o[0], unittest.equals('foo'));
+  unittest.expect(o[1], unittest.equals('foo'));
+}
+
+buildUnnamed1192() {
+  var o = new core.List<core.String>();
+  o.add("foo");
+  o.add("foo");
+  return o;
+}
+
+checkUnnamed1192(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1521,15 +1559,15 @@
   var o = new api.SearchVariantsRequest();
   buildCounterSearchVariantsRequest++;
   if (buildCounterSearchVariantsRequest < 3) {
-    o.callsetIds = buildUnnamed1162();
-    o.callsetNames = buildUnnamed1163();
-    o.contig = "foo";
-    o.endPosition = "foo";
-    o.maxResults = "foo";
+    o.callSetIds = buildUnnamed1191();
+    o.end = "foo";
+    o.maxCalls = 42;
+    o.pageSize = 42;
     o.pageToken = "foo";
-    o.startPosition = "foo";
+    o.referenceName = "foo";
+    o.start = "foo";
     o.variantName = "foo";
-    o.variantsetId = "foo";
+    o.variantSetIds = buildUnnamed1192();
   }
   buildCounterSearchVariantsRequest--;
   return o;
@@ -1538,27 +1576,27 @@
 checkSearchVariantsRequest(api.SearchVariantsRequest o) {
   buildCounterSearchVariantsRequest++;
   if (buildCounterSearchVariantsRequest < 3) {
-    checkUnnamed1162(o.callsetIds);
-    checkUnnamed1163(o.callsetNames);
-    unittest.expect(o.contig, unittest.equals('foo'));
-    unittest.expect(o.endPosition, unittest.equals('foo'));
-    unittest.expect(o.maxResults, unittest.equals('foo'));
+    checkUnnamed1191(o.callSetIds);
+    unittest.expect(o.end, unittest.equals('foo'));
+    unittest.expect(o.maxCalls, unittest.equals(42));
+    unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    unittest.expect(o.startPosition, unittest.equals('foo'));
+    unittest.expect(o.referenceName, unittest.equals('foo'));
+    unittest.expect(o.start, unittest.equals('foo'));
     unittest.expect(o.variantName, unittest.equals('foo'));
-    unittest.expect(o.variantsetId, unittest.equals('foo'));
+    checkUnnamed1192(o.variantSetIds);
   }
   buildCounterSearchVariantsRequest--;
 }
 
-buildUnnamed1164() {
+buildUnnamed1193() {
   var o = new core.List<api.Variant>();
   o.add(buildVariant());
   o.add(buildVariant());
   return o;
 }
 
-checkUnnamed1164(core.List<api.Variant> o) {
+checkUnnamed1193(core.List<api.Variant> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkVariant(o[0]);
   checkVariant(o[1]);
@@ -1570,7 +1608,7 @@
   buildCounterSearchVariantsResponse++;
   if (buildCounterSearchVariantsResponse < 3) {
     o.nextPageToken = "foo";
-    o.variants = buildUnnamed1164();
+    o.variants = buildUnnamed1193();
   }
   buildCounterSearchVariantsResponse--;
   return o;
@@ -1580,71 +1618,71 @@
   buildCounterSearchVariantsResponse++;
   if (buildCounterSearchVariantsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1164(o.variants);
+    checkUnnamed1193(o.variants);
   }
   buildCounterSearchVariantsResponse--;
 }
 
-buildUnnamed1165() {
+buildUnnamed1194() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1165(core.List<core.String> o) {
+checkUnnamed1194(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1166() {
+buildUnnamed1195() {
   var o = new core.List<api.Call>();
   o.add(buildCall());
   o.add(buildCall());
   return o;
 }
 
-checkUnnamed1166(core.List<api.Call> o) {
+checkUnnamed1195(core.List<api.Call> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkCall(o[0]);
   checkCall(o[1]);
 }
 
-buildUnnamed1167() {
+buildUnnamed1196() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1167(core.List<core.String> o) {
+checkUnnamed1196(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1168() {
+buildUnnamed1197() {
   var o = new core.Map<core.String, core.List<core.String>>();
-  o["x"] = buildUnnamed1167();
-  o["y"] = buildUnnamed1167();
+  o["x"] = buildUnnamed1196();
+  o["y"] = buildUnnamed1196();
   return o;
 }
 
-checkUnnamed1168(core.Map<core.String, core.List<core.String>> o) {
+checkUnnamed1197(core.Map<core.String, core.List<core.String>> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnnamed1167(o["x"]);
-  checkUnnamed1167(o["y"]);
+  checkUnnamed1196(o["x"]);
+  checkUnnamed1196(o["y"]);
 }
 
-buildUnnamed1169() {
+buildUnnamed1198() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1169(core.List<core.String> o) {
+checkUnnamed1198(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1655,17 +1693,17 @@
   var o = new api.Variant();
   buildCounterVariant++;
   if (buildCounterVariant < 3) {
-    o.alternateBases = buildUnnamed1165();
-    o.calls = buildUnnamed1166();
-    o.contig = "foo";
+    o.alternateBases = buildUnnamed1194();
+    o.calls = buildUnnamed1195();
     o.created = "foo";
     o.end = "foo";
     o.id = "foo";
-    o.info = buildUnnamed1168();
-    o.names = buildUnnamed1169();
-    o.position = "foo";
+    o.info = buildUnnamed1197();
+    o.names = buildUnnamed1198();
     o.referenceBases = "foo";
-    o.variantsetId = "foo";
+    o.referenceName = "foo";
+    o.start = "foo";
+    o.variantSetId = "foo";
   }
   buildCounterVariant--;
   return o;
@@ -1674,21 +1712,72 @@
 checkVariant(api.Variant o) {
   buildCounterVariant++;
   if (buildCounterVariant < 3) {
-    checkUnnamed1165(o.alternateBases);
-    checkUnnamed1166(o.calls);
-    unittest.expect(o.contig, unittest.equals('foo'));
+    checkUnnamed1194(o.alternateBases);
+    checkUnnamed1195(o.calls);
     unittest.expect(o.created, unittest.equals('foo'));
     unittest.expect(o.end, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkUnnamed1168(o.info);
-    checkUnnamed1169(o.names);
-    unittest.expect(o.position, unittest.equals('foo'));
+    checkUnnamed1197(o.info);
+    checkUnnamed1198(o.names);
     unittest.expect(o.referenceBases, unittest.equals('foo'));
-    unittest.expect(o.variantsetId, unittest.equals('foo'));
+    unittest.expect(o.referenceName, unittest.equals('foo'));
+    unittest.expect(o.start, unittest.equals('foo'));
+    unittest.expect(o.variantSetId, unittest.equals('foo'));
   }
   buildCounterVariant--;
 }
 
+buildUnnamed1199() {
+  var o = new core.List<api.Metadata>();
+  o.add(buildMetadata());
+  o.add(buildMetadata());
+  return o;
+}
+
+checkUnnamed1199(core.List<api.Metadata> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkMetadata(o[0]);
+  checkMetadata(o[1]);
+}
+
+buildUnnamed1200() {
+  var o = new core.List<api.ReferenceBound>();
+  o.add(buildReferenceBound());
+  o.add(buildReferenceBound());
+  return o;
+}
+
+checkUnnamed1200(core.List<api.ReferenceBound> o) {
+  unittest.expect(o, unittest.hasLength(2));
+  checkReferenceBound(o[0]);
+  checkReferenceBound(o[1]);
+}
+
+core.int buildCounterVariantSet = 0;
+buildVariantSet() {
+  var o = new api.VariantSet();
+  buildCounterVariantSet++;
+  if (buildCounterVariantSet < 3) {
+    o.datasetId = "foo";
+    o.id = "foo";
+    o.metadata = buildUnnamed1199();
+    o.referenceBounds = buildUnnamed1200();
+  }
+  buildCounterVariantSet--;
+  return o;
+}
+
+checkVariantSet(api.VariantSet o) {
+  buildCounterVariantSet++;
+  if (buildCounterVariantSet < 3) {
+    unittest.expect(o.datasetId, unittest.equals('foo'));
+    unittest.expect(o.id, unittest.equals('foo'));
+    checkUnnamed1199(o.metadata);
+    checkUnnamed1200(o.referenceBounds);
+  }
+  buildCounterVariantSet--;
+}
+
 
 main() {
   unittest.group("obj-schema-Beacon", () {
@@ -1709,20 +1798,11 @@
   });
 
 
-  unittest.group("obj-schema-Callset", () {
+  unittest.group("obj-schema-CallSet", () {
     unittest.test("to-json--from-json", () {
-      var o = buildCallset();
-      var od = new api.Callset.fromJson(o.toJson());
-      checkCallset(od);
-    });
-  });
-
-
-  unittest.group("obj-schema-ContigBound", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildContigBound();
-      var od = new api.ContigBound.fromJson(o.toJson());
-      checkContigBound(od);
+      var o = buildCallSet();
+      var od = new api.CallSet.fromJson(o.toJson());
+      checkCallSet(od);
     });
   });
 
@@ -1808,15 +1888,6 @@
   });
 
 
-  unittest.group("obj-schema-GetVariantsSummaryResponse", () {
-    unittest.test("to-json--from-json", () {
-      var o = buildGetVariantsSummaryResponse();
-      var od = new api.GetVariantsSummaryResponse.fromJson(o.toJson());
-      checkGetVariantsSummaryResponse(od);
-    });
-  });
-
-
   unittest.group("obj-schema-Header", () {
     unittest.test("to-json--from-json", () {
       var o = buildHeader();
@@ -1952,6 +2023,15 @@
   });
 
 
+  unittest.group("obj-schema-ReferenceBound", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildReferenceBound();
+      var od = new api.ReferenceBound.fromJson(o.toJson());
+      checkReferenceBound(od);
+    });
+  });
+
+
   unittest.group("obj-schema-ReferenceSequence", () {
     unittest.test("to-json--from-json", () {
       var o = buildReferenceSequence();
@@ -1961,20 +2041,20 @@
   });
 
 
-  unittest.group("obj-schema-SearchCallsetsRequest", () {
+  unittest.group("obj-schema-SearchCallSetsRequest", () {
     unittest.test("to-json--from-json", () {
-      var o = buildSearchCallsetsRequest();
-      var od = new api.SearchCallsetsRequest.fromJson(o.toJson());
-      checkSearchCallsetsRequest(od);
+      var o = buildSearchCallSetsRequest();
+      var od = new api.SearchCallSetsRequest.fromJson(o.toJson());
+      checkSearchCallSetsRequest(od);
     });
   });
 
 
-  unittest.group("obj-schema-SearchCallsetsResponse", () {
+  unittest.group("obj-schema-SearchCallSetsResponse", () {
     unittest.test("to-json--from-json", () {
-      var o = buildSearchCallsetsResponse();
-      var od = new api.SearchCallsetsResponse.fromJson(o.toJson());
-      checkSearchCallsetsResponse(od);
+      var o = buildSearchCallSetsResponse();
+      var od = new api.SearchCallSetsResponse.fromJson(o.toJson());
+      checkSearchCallSetsResponse(od);
     });
   });
 
@@ -2033,6 +2113,24 @@
   });
 
 
+  unittest.group("obj-schema-SearchVariantSetsRequest", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSearchVariantSetsRequest();
+      var od = new api.SearchVariantSetsRequest.fromJson(o.toJson());
+      checkSearchVariantSetsRequest(od);
+    });
+  });
+
+
+  unittest.group("obj-schema-SearchVariantSetsResponse", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildSearchVariantSetsResponse();
+      var od = new api.SearchVariantSetsResponse.fromJson(o.toJson());
+      checkSearchVariantSetsResponse(od);
+    });
+  });
+
+
   unittest.group("obj-schema-SearchVariantsRequest", () {
     unittest.test("to-json--from-json", () {
       var o = buildSearchVariantsRequest();
@@ -2060,27 +2158,38 @@
   });
 
 
+  unittest.group("obj-schema-VariantSet", () {
+    unittest.test("to-json--from-json", () {
+      var o = buildVariantSet();
+      var od = new api.VariantSet.fromJson(o.toJson());
+      checkVariantSet(od);
+    });
+  });
+
+
   unittest.group("resource-BeaconsResourceApi", () {
     unittest.test("method--get", () {
 
       var mock = new common_test.HttpServerMock();
       api.BeaconsResourceApi res = new api.GenomicsApi(mock).beacons;
-      var arg_variantsetId = "foo";
+      var arg_variantSetId = "foo";
       var arg_allele = "foo";
-      var arg_contig = "foo";
       var arg_position = "foo";
+      var arg_referenceName = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("beacons/"));
         pathOffset += 8;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_variantsetId"));
+        unittest.expect(subPart, unittest.equals("$arg_variantSetId"));
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2099,8 +2208,8 @@
           }
         }
         unittest.expect(queryMap["allele"].first, unittest.equals(arg_allele));
-        unittest.expect(queryMap["contig"].first, unittest.equals(arg_contig));
         unittest.expect(queryMap["position"].first, unittest.equals(arg_position));
+        unittest.expect(queryMap["referenceName"].first, unittest.equals(arg_referenceName));
 
 
         var h = {
@@ -2109,7 +2218,7 @@
         var resp = convert.JSON.encode(buildBeacon());
         return new async.Future.value(common_test.stringResponse(200, h, resp));
       }), true);
-      res.get(arg_variantsetId, allele: arg_allele, contig: arg_contig, position: arg_position).then(unittest.expectAsync(((api.Beacon response) {
+      res.get(arg_variantSetId, allele: arg_allele, position: arg_position, referenceName: arg_referenceName).then(unittest.expectAsync(((api.Beacon response) {
         checkBeacon(response);
       })));
     });
@@ -2122,17 +2231,19 @@
 
       var mock = new common_test.HttpServerMock();
       api.CallsetsResourceApi res = new api.GenomicsApi(mock).callsets;
-      var arg_request = buildCallset();
+      var arg_request = buildCallSet();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
-        var obj = new api.Callset.fromJson(json);
-        checkCallset(obj);
+        var obj = new api.CallSet.fromJson(json);
+        checkCallSet(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("callsets"));
         pathOffset += 8;
 
@@ -2157,11 +2268,11 @@
         var h = {
           "content-type" : "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildCallset());
+        var resp = convert.JSON.encode(buildCallSet());
         return new async.Future.value(common_test.stringResponse(200, h, resp));
       }), true);
-      res.create(arg_request).then(unittest.expectAsync(((api.Callset response) {
-        checkCallset(response);
+      res.create(arg_request).then(unittest.expectAsync(((api.CallSet response) {
+        checkCallSet(response);
       })));
     });
 
@@ -2169,19 +2280,21 @@
 
       var mock = new common_test.HttpServerMock();
       api.CallsetsResourceApi res = new api.GenomicsApi(mock).callsets;
-      var arg_callsetId = "foo";
+      var arg_callSetId = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("callsets/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_callsetId"));
+        unittest.expect(subPart, unittest.equals("$arg_callSetId"));
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2207,26 +2320,28 @@
         var resp = "";
         return new async.Future.value(common_test.stringResponse(200, h, resp));
       }), true);
-      res.delete(arg_callsetId).then(unittest.expectAsync((_) {}));
+      res.delete(arg_callSetId).then(unittest.expectAsync((_) {}));
     });
 
     unittest.test("method--get", () {
 
       var mock = new common_test.HttpServerMock();
       api.CallsetsResourceApi res = new api.GenomicsApi(mock).callsets;
-      var arg_callsetId = "foo";
+      var arg_callSetId = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("callsets/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_callsetId"));
+        unittest.expect(subPart, unittest.equals("$arg_callSetId"));
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2249,11 +2364,11 @@
         var h = {
           "content-type" : "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildCallset());
+        var resp = convert.JSON.encode(buildCallSet());
         return new async.Future.value(common_test.stringResponse(200, h, resp));
       }), true);
-      res.get(arg_callsetId).then(unittest.expectAsync(((api.Callset response) {
-        checkCallset(response);
+      res.get(arg_callSetId).then(unittest.expectAsync(((api.CallSet response) {
+        checkCallSet(response);
       })));
     });
 
@@ -2261,23 +2376,25 @@
 
       var mock = new common_test.HttpServerMock();
       api.CallsetsResourceApi res = new api.GenomicsApi(mock).callsets;
-      var arg_request = buildCallset();
-      var arg_callsetId = "foo";
+      var arg_request = buildCallSet();
+      var arg_callSetId = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
-        var obj = new api.Callset.fromJson(json);
-        checkCallset(obj);
+        var obj = new api.CallSet.fromJson(json);
+        checkCallSet(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("callsets/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_callsetId"));
+        unittest.expect(subPart, unittest.equals("$arg_callSetId"));
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2300,11 +2417,11 @@
         var h = {
           "content-type" : "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildCallset());
+        var resp = convert.JSON.encode(buildCallSet());
         return new async.Future.value(common_test.stringResponse(200, h, resp));
       }), true);
-      res.patch(arg_request, arg_callsetId).then(unittest.expectAsync(((api.Callset response) {
-        checkCallset(response);
+      res.patch(arg_request, arg_callSetId).then(unittest.expectAsync(((api.CallSet response) {
+        checkCallSet(response);
       })));
     });
 
@@ -2312,17 +2429,19 @@
 
       var mock = new common_test.HttpServerMock();
       api.CallsetsResourceApi res = new api.GenomicsApi(mock).callsets;
-      var arg_request = buildSearchCallsetsRequest();
+      var arg_request = buildSearchCallSetsRequest();
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
-        var obj = new api.SearchCallsetsRequest.fromJson(json);
-        checkSearchCallsetsRequest(obj);
+        var obj = new api.SearchCallSetsRequest.fromJson(json);
+        checkSearchCallSetsRequest(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("callsets/search"));
         pathOffset += 15;
 
@@ -2347,11 +2466,11 @@
         var h = {
           "content-type" : "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildSearchCallsetsResponse());
+        var resp = convert.JSON.encode(buildSearchCallSetsResponse());
         return new async.Future.value(common_test.stringResponse(200, h, resp));
       }), true);
-      res.search(arg_request).then(unittest.expectAsync(((api.SearchCallsetsResponse response) {
-        checkSearchCallsetsResponse(response);
+      res.search(arg_request).then(unittest.expectAsync(((api.SearchCallSetsResponse response) {
+        checkSearchCallSetsResponse(response);
       })));
     });
 
@@ -2359,23 +2478,25 @@
 
       var mock = new common_test.HttpServerMock();
       api.CallsetsResourceApi res = new api.GenomicsApi(mock).callsets;
-      var arg_request = buildCallset();
-      var arg_callsetId = "foo";
+      var arg_request = buildCallSet();
+      var arg_callSetId = "foo";
       mock.register(unittest.expectAsync((http.BaseRequest req, json) {
-        var obj = new api.Callset.fromJson(json);
-        checkCallset(obj);
+        var obj = new api.CallSet.fromJson(json);
+        checkCallSet(obj);
 
         var path = (req.url).path;
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("callsets/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
         pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_callsetId"));
+        unittest.expect(subPart, unittest.equals("$arg_callSetId"));
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -2398,11 +2519,11 @@
         var h = {
           "content-type" : "application/json; charset=utf-8",
         };
-        var resp = convert.JSON.encode(buildCallset());
+        var resp = convert.JSON.encode(buildCallSet());
         return new async.Future.value(common_test.stringResponse(200, h, resp));
       }), true);
-      res.update(arg_request, arg_callsetId).then(unittest.expectAsync(((api.Callset response) {
-        checkCallset(response);
+      res.update(arg_request, arg_callSetId).then(unittest.expectAsync(((api.CallSet response) {
+        checkCallSet(response);
       })));
     });
 
@@ -2423,8 +2544,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("datasets"));
         pathOffset += 8;
 
@@ -2467,8 +2590,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("datasets/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2512,8 +2637,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("datasets/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2561,8 +2688,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("datasets"));
         pathOffset += 8;
 
@@ -2612,8 +2741,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("datasets/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2659,8 +2790,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("datasets/"));
         pathOffset += 9;
         index = path.indexOf("/undelete", pathOffset);
@@ -2714,8 +2847,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("datasets/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2768,8 +2903,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 24), unittest.equals("experimental/jobs/create"));
         pathOffset += 24;
 
@@ -2816,8 +2953,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("jobs/"));
         pathOffset += 5;
         index = path.indexOf("/cancel", pathOffset);
@@ -2865,8 +3004,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("jobs/"));
         pathOffset += 5;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -2915,8 +3056,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("jobs/search"));
         pathOffset += 11;
 
@@ -2966,8 +3109,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("reads/search"));
         pathOffset += 12;
 
@@ -3014,8 +3159,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("readsets/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -3062,8 +3209,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("readsets/export"));
         pathOffset += 15;
 
@@ -3106,8 +3255,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("readsets/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -3156,8 +3307,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("readsets/import"));
         pathOffset += 15;
 
@@ -3204,8 +3357,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("readsets/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -3254,8 +3409,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("readsets/search"));
         pathOffset += 15;
 
@@ -3302,8 +3459,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("readsets/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -3359,8 +3518,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("readsets/"));
         pathOffset += 9;
         index = path.indexOf("/coveragebuckets", pathOffset);
@@ -3423,8 +3584,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("variants"));
         pathOffset += 8;
 
@@ -3467,8 +3630,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("variants/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -3515,8 +3680,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("variants/export"));
         pathOffset += 15;
 
@@ -3559,8 +3726,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("variants/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -3596,51 +3765,6 @@
       })));
     });
 
-    unittest.test("method--getSummary", () {
-
-      var mock = new common_test.HttpServerMock();
-      api.VariantsResourceApi res = new api.GenomicsApi(mock).variants;
-      var arg_variantsetId = "foo";
-      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
-        var path = (req.url).path;
-        var pathOffset = 0;
-        var index;
-        var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("variants/summary"));
-        pathOffset += 16;
-
-        var query = (req.url).query;
-        var queryOffset = 0;
-        var queryMap = {};
-        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
-        parseBool(n) {
-          if (n == "true") return true;
-          if (n == "false") return false;
-          if (n == null) return null;
-          throw new core.ArgumentError("Invalid boolean: $n");
-        }
-        if (query.length > 0) {
-          for (var part in query.split("&")) {
-            var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
-          }
-        }
-        unittest.expect(queryMap["variantsetId"].first, unittest.equals(arg_variantsetId));
-
-
-        var h = {
-          "content-type" : "application/json; charset=utf-8",
-        };
-        var resp = convert.JSON.encode(buildGetVariantsSummaryResponse());
-        return new async.Future.value(common_test.stringResponse(200, h, resp));
-      }), true);
-      res.getSummary(variantsetId: arg_variantsetId).then(unittest.expectAsync(((api.GetVariantsSummaryResponse response) {
-        checkGetVariantsSummaryResponse(response);
-      })));
-    });
-
     unittest.test("method--import", () {
 
       var mock = new common_test.HttpServerMock();
@@ -3654,8 +3778,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("variants/import"));
         pathOffset += 15;
 
@@ -3688,57 +3814,6 @@
       })));
     });
 
-    unittest.test("method--patch", () {
-
-      var mock = new common_test.HttpServerMock();
-      api.VariantsResourceApi res = new api.GenomicsApi(mock).variants;
-      var arg_request = buildVariant();
-      var arg_variantId = "foo";
-      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
-        var obj = new api.Variant.fromJson(json);
-        checkVariant(obj);
-
-        var path = (req.url).path;
-        var pathOffset = 0;
-        var index;
-        var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("variants/"));
-        pathOffset += 9;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_variantId"));
-
-        var query = (req.url).query;
-        var queryOffset = 0;
-        var queryMap = {};
-        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
-        parseBool(n) {
-          if (n == "true") return true;
-          if (n == "false") return false;
-          if (n == null) return null;
-          throw new core.ArgumentError("Invalid boolean: $n");
-        }
-        if (query.length > 0) {
-          for (var part in query.split("&")) {
-            var keyvalue = part.split("=");
-            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
-          }
-        }
-
-
-        var h = {
-          "content-type" : "application/json; charset=utf-8",
-        };
-        var resp = convert.JSON.encode(buildVariant());
-        return new async.Future.value(common_test.stringResponse(200, h, resp));
-      }), true);
-      res.patch(arg_request, arg_variantId).then(unittest.expectAsync(((api.Variant response) {
-        checkVariant(response);
-      })));
-    });
-
     unittest.test("method--search", () {
 
       var mock = new common_test.HttpServerMock();
@@ -3752,8 +3827,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("variants/search"));
         pathOffset += 15;
 
@@ -3800,8 +3877,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 17), unittest.equals("/genomics/v1beta/"));
-        pathOffset += 17;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("variants/"));
         pathOffset += 9;
         subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
@@ -3840,5 +3919,154 @@
   });
 
 
+  unittest.group("resource-VariantsetsResourceApi", () {
+    unittest.test("method--delete", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.VariantsetsResourceApi res = new api.GenomicsApi(mock).variantsets;
+      var arg_variantSetId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("variantsets/"));
+        pathOffset += 12;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_variantSetId"));
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = "";
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.delete(arg_variantSetId).then(unittest.expectAsync((_) {}));
+    });
+
+    unittest.test("method--get", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.VariantsetsResourceApi res = new api.GenomicsApi(mock).variantsets;
+      var arg_variantSetId = "foo";
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("variantsets/"));
+        pathOffset += 12;
+        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
+        pathOffset = path.length;
+        unittest.expect(subPart, unittest.equals("$arg_variantSetId"));
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildVariantSet());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.get(arg_variantSetId).then(unittest.expectAsync(((api.VariantSet response) {
+        checkVariantSet(response);
+      })));
+    });
+
+    unittest.test("method--search", () {
+
+      var mock = new common_test.HttpServerMock();
+      api.VariantsetsResourceApi res = new api.GenomicsApi(mock).variantsets;
+      var arg_request = buildSearchVariantSetsRequest();
+      mock.register(unittest.expectAsync((http.BaseRequest req, json) {
+        var obj = new api.SearchVariantSetsRequest.fromJson(json);
+        checkSearchVariantSetsRequest(obj);
+
+        var path = (req.url).path;
+        var pathOffset = 0;
+        var index;
+        var subPart;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("genomics/v1beta/"));
+        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("variantsets/search"));
+        pathOffset += 18;
+
+        var query = (req.url).query;
+        var queryOffset = 0;
+        var queryMap = {};
+        addQueryParam(n, v) => queryMap.putIfAbsent(n, () => []).add(v);
+        parseBool(n) {
+          if (n == "true") return true;
+          if (n == "false") return false;
+          if (n == null) return null;
+          throw new core.ArgumentError("Invalid boolean: $n");
+        }
+        if (query.length > 0) {
+          for (var part in query.split("&")) {
+            var keyvalue = part.split("=");
+            addQueryParam(core.Uri.decodeQueryComponent(keyvalue[0]), core.Uri.decodeQueryComponent(keyvalue[1]));
+          }
+        }
+
+
+        var h = {
+          "content-type" : "application/json; charset=utf-8",
+        };
+        var resp = convert.JSON.encode(buildSearchVariantSetsResponse());
+        return new async.Future.value(common_test.stringResponse(200, h, resp));
+      }), true);
+      res.search(arg_request).then(unittest.expectAsync(((api.SearchVariantSetsResponse response) {
+        checkSearchVariantSetsResponse(response);
+      })));
+    });
+
+  });
+
+
 }
 
diff --git a/generated/googleapis_beta/test/manager/v1beta2_test.dart b/generated/googleapis_beta/test/manager/v1beta2_test.dart
index 0cce073..2d0165e 100644
--- a/generated/googleapis_beta/test/manager/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/manager/v1beta2_test.dart
@@ -39,14 +39,14 @@
   buildCounterAccessConfig--;
 }
 
-buildUnnamed1092() {
+buildUnnamed1120() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1092(core.List<core.String> o) {
+checkUnnamed1120(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -57,7 +57,7 @@
   var o = new api.Action();
   buildCounterAction++;
   if (buildCounterAction < 3) {
-    o.commands = buildUnnamed1092();
+    o.commands = buildUnnamed1120();
     o.timeoutMs = 42;
   }
   buildCounterAction--;
@@ -67,20 +67,20 @@
 checkAction(api.Action o) {
   buildCounterAction++;
   if (buildCounterAction < 3) {
-    checkUnnamed1092(o.commands);
+    checkUnnamed1120(o.commands);
     unittest.expect(o.timeoutMs, unittest.equals(42));
   }
   buildCounterAction--;
 }
 
-buildUnnamed1093() {
+buildUnnamed1121() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1093(core.List<core.String> o) {
+checkUnnamed1121(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -92,7 +92,7 @@
   buildCounterAllowedRule++;
   if (buildCounterAllowedRule < 3) {
     o.IPProtocol = "foo";
-    o.ports = buildUnnamed1093();
+    o.ports = buildUnnamed1121();
   }
   buildCounterAllowedRule--;
   return o;
@@ -102,7 +102,7 @@
   buildCounterAllowedRule++;
   if (buildCounterAllowedRule < 3) {
     unittest.expect(o.IPProtocol, unittest.equals('foo'));
-    checkUnnamed1093(o.ports);
+    checkUnnamed1121(o.ports);
   }
   buildCounterAllowedRule--;
 }
@@ -178,27 +178,27 @@
   buildCounterDeployState--;
 }
 
-buildUnnamed1094() {
+buildUnnamed1122() {
   var o = new core.Map<core.String, api.ModuleStatus>();
   o["x"] = buildModuleStatus();
   o["y"] = buildModuleStatus();
   return o;
 }
 
-checkUnnamed1094(core.Map<core.String, api.ModuleStatus> o) {
+checkUnnamed1122(core.Map<core.String, api.ModuleStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkModuleStatus(o["x"]);
   checkModuleStatus(o["y"]);
 }
 
-buildUnnamed1095() {
+buildUnnamed1123() {
   var o = new core.List<api.ParamOverride>();
   o.add(buildParamOverride());
   o.add(buildParamOverride());
   return o;
 }
 
-checkUnnamed1095(core.List<api.ParamOverride> o) {
+checkUnnamed1123(core.List<api.ParamOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkParamOverride(o[0]);
   checkParamOverride(o[1]);
@@ -211,9 +211,9 @@
   if (buildCounterDeployment < 3) {
     o.creationDate = "foo";
     o.description = "foo";
-    o.modules = buildUnnamed1094();
+    o.modules = buildUnnamed1122();
     o.name = "foo";
-    o.overrides = buildUnnamed1095();
+    o.overrides = buildUnnamed1123();
     o.state = buildDeployState();
     o.templateName = "foo";
   }
@@ -226,23 +226,23 @@
   if (buildCounterDeployment < 3) {
     unittest.expect(o.creationDate, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1094(o.modules);
+    checkUnnamed1122(o.modules);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkUnnamed1095(o.overrides);
+    checkUnnamed1123(o.overrides);
     checkDeployState(o.state);
     unittest.expect(o.templateName, unittest.equals('foo'));
   }
   buildCounterDeployment--;
 }
 
-buildUnnamed1096() {
+buildUnnamed1124() {
   var o = new core.List<api.Deployment>();
   o.add(buildDeployment());
   o.add(buildDeployment());
   return o;
 }
 
-checkUnnamed1096(core.List<api.Deployment> o) {
+checkUnnamed1124(core.List<api.Deployment> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDeployment(o[0]);
   checkDeployment(o[1]);
@@ -254,7 +254,7 @@
   buildCounterDeploymentsListResponse++;
   if (buildCounterDeploymentsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed1096();
+    o.resources = buildUnnamed1124();
   }
   buildCounterDeploymentsListResponse--;
   return o;
@@ -264,7 +264,7 @@
   buildCounterDeploymentsListResponse++;
   if (buildCounterDeploymentsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1096(o.resources);
+    checkUnnamed1124(o.resources);
   }
   buildCounterDeploymentsListResponse--;
 }
@@ -332,53 +332,53 @@
   buildCounterExistingDisk--;
 }
 
-buildUnnamed1097() {
+buildUnnamed1125() {
   var o = new core.List<api.AllowedRule>();
   o.add(buildAllowedRule());
   o.add(buildAllowedRule());
   return o;
 }
 
-checkUnnamed1097(core.List<api.AllowedRule> o) {
+checkUnnamed1125(core.List<api.AllowedRule> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAllowedRule(o[0]);
   checkAllowedRule(o[1]);
 }
 
-buildUnnamed1098() {
+buildUnnamed1126() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1098(core.List<core.String> o) {
+checkUnnamed1126(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1099() {
+buildUnnamed1127() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1099(core.List<core.String> o) {
+checkUnnamed1127(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1100() {
+buildUnnamed1128() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1100(core.List<core.String> o) {
+checkUnnamed1128(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -389,12 +389,12 @@
   var o = new api.FirewallModule();
   buildCounterFirewallModule++;
   if (buildCounterFirewallModule < 3) {
-    o.allowed = buildUnnamed1097();
+    o.allowed = buildUnnamed1125();
     o.description = "foo";
     o.network = "foo";
-    o.sourceRanges = buildUnnamed1098();
-    o.sourceTags = buildUnnamed1099();
-    o.targetTags = buildUnnamed1100();
+    o.sourceRanges = buildUnnamed1126();
+    o.sourceTags = buildUnnamed1127();
+    o.targetTags = buildUnnamed1128();
   }
   buildCounterFirewallModule--;
   return o;
@@ -403,12 +403,12 @@
 checkFirewallModule(api.FirewallModule o) {
   buildCounterFirewallModule++;
   if (buildCounterFirewallModule < 3) {
-    checkUnnamed1097(o.allowed);
+    checkUnnamed1125(o.allowed);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
-    checkUnnamed1098(o.sourceRanges);
-    checkUnnamed1099(o.sourceTags);
-    checkUnnamed1100(o.targetTags);
+    checkUnnamed1126(o.sourceRanges);
+    checkUnnamed1127(o.sourceTags);
+    checkUnnamed1128(o.targetTags);
   }
   buildCounterFirewallModule--;
 }
@@ -484,27 +484,27 @@
   buildCounterHealthCheckModuleStatus--;
 }
 
-buildUnnamed1101() {
+buildUnnamed1129() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1101(core.List<core.String> o) {
+checkUnnamed1129(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1102() {
+buildUnnamed1130() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1102(core.List<core.String> o) {
+checkUnnamed1130(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -516,12 +516,12 @@
   buildCounterLbModule++;
   if (buildCounterLbModule < 3) {
     o.description = "foo";
-    o.healthChecks = buildUnnamed1101();
+    o.healthChecks = buildUnnamed1129();
     o.ipAddress = "foo";
     o.ipProtocol = "foo";
     o.portRange = "foo";
     o.sessionAffinity = "foo";
-    o.targetModules = buildUnnamed1102();
+    o.targetModules = buildUnnamed1130();
   }
   buildCounterLbModule--;
   return o;
@@ -531,12 +531,12 @@
   buildCounterLbModule++;
   if (buildCounterLbModule < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1101(o.healthChecks);
+    checkUnnamed1129(o.healthChecks);
     unittest.expect(o.ipAddress, unittest.equals('foo'));
     unittest.expect(o.ipProtocol, unittest.equals('foo'));
     unittest.expect(o.portRange, unittest.equals('foo'));
     unittest.expect(o.sessionAffinity, unittest.equals('foo'));
-    checkUnnamed1102(o.targetModules);
+    checkUnnamed1130(o.targetModules);
   }
   buildCounterLbModule--;
 }
@@ -562,14 +562,14 @@
   buildCounterLbModuleStatus--;
 }
 
-buildUnnamed1103() {
+buildUnnamed1131() {
   var o = new core.List<api.MetadataItem>();
   o.add(buildMetadataItem());
   o.add(buildMetadataItem());
   return o;
 }
 
-checkUnnamed1103(core.List<api.MetadataItem> o) {
+checkUnnamed1131(core.List<api.MetadataItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetadataItem(o[0]);
   checkMetadataItem(o[1]);
@@ -581,7 +581,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     o.fingerPrint = "foo";
-    o.items = buildUnnamed1103();
+    o.items = buildUnnamed1131();
   }
   buildCounterMetadata--;
   return o;
@@ -591,7 +591,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     unittest.expect(o.fingerPrint, unittest.equals('foo'));
-    checkUnnamed1103(o.items);
+    checkUnnamed1131(o.items);
   }
   buildCounterMetadata--;
 }
@@ -681,14 +681,14 @@
   buildCounterModuleStatus--;
 }
 
-buildUnnamed1104() {
+buildUnnamed1132() {
   var o = new core.List<api.AccessConfig>();
   o.add(buildAccessConfig());
   o.add(buildAccessConfig());
   return o;
 }
 
-checkUnnamed1104(core.List<api.AccessConfig> o) {
+checkUnnamed1132(core.List<api.AccessConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccessConfig(o[0]);
   checkAccessConfig(o[1]);
@@ -699,7 +699,7 @@
   var o = new api.NetworkInterface();
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    o.accessConfigs = buildUnnamed1104();
+    o.accessConfigs = buildUnnamed1132();
     o.name = "foo";
     o.network = "foo";
     o.networkIp = "foo";
@@ -711,7 +711,7 @@
 checkNetworkInterface(api.NetworkInterface o) {
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    checkUnnamed1104(o.accessConfigs);
+    checkUnnamed1132(o.accessConfigs);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.networkIp, unittest.equals('foo'));
@@ -792,6 +792,7 @@
   buildCounterNewDiskInitializeParams++;
   if (buildCounterNewDiskInitializeParams < 3) {
     o.diskSizeGb = "foo";
+    o.diskType = "foo";
     o.sourceImage = "foo";
   }
   buildCounterNewDiskInitializeParams--;
@@ -802,6 +803,7 @@
   buildCounterNewDiskInitializeParams++;
   if (buildCounterNewDiskInitializeParams < 3) {
     unittest.expect(o.diskSizeGb, unittest.equals('foo'));
+    unittest.expect(o.diskType, unittest.equals('foo'));
     unittest.expect(o.sourceImage, unittest.equals('foo'));
   }
   buildCounterNewDiskInitializeParams--;
@@ -828,27 +830,27 @@
   buildCounterParamOverride--;
 }
 
-buildUnnamed1105() {
+buildUnnamed1133() {
   var o = new core.Map<core.String, api.EnvVariable>();
   o["x"] = buildEnvVariable();
   o["y"] = buildEnvVariable();
   return o;
 }
 
-checkUnnamed1105(core.Map<core.String, api.EnvVariable> o) {
+checkUnnamed1133(core.Map<core.String, api.EnvVariable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEnvVariable(o["x"]);
   checkEnvVariable(o["y"]);
 }
 
-buildUnnamed1106() {
+buildUnnamed1134() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1106(core.List<core.String> o) {
+checkUnnamed1134(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -859,8 +861,8 @@
   var o = new api.ReplicaPoolModule();
   buildCounterReplicaPoolModule++;
   if (buildCounterReplicaPoolModule < 3) {
-    o.envVariables = buildUnnamed1105();
-    o.healthChecks = buildUnnamed1106();
+    o.envVariables = buildUnnamed1133();
+    o.healthChecks = buildUnnamed1134();
     o.numReplicas = 42;
     o.replicaPoolParams = buildReplicaPoolParams();
     o.resourceView = "foo";
@@ -872,8 +874,8 @@
 checkReplicaPoolModule(api.ReplicaPoolModule o) {
   buildCounterReplicaPoolModule++;
   if (buildCounterReplicaPoolModule < 3) {
-    checkUnnamed1105(o.envVariables);
-    checkUnnamed1106(o.healthChecks);
+    checkUnnamed1133(o.envVariables);
+    checkUnnamed1134(o.healthChecks);
     unittest.expect(o.numReplicas, unittest.equals(42));
     checkReplicaPoolParams(o.replicaPoolParams);
     unittest.expect(o.resourceView, unittest.equals('foo'));
@@ -921,53 +923,53 @@
   buildCounterReplicaPoolParams--;
 }
 
-buildUnnamed1107() {
+buildUnnamed1135() {
   var o = new core.List<api.ExistingDisk>();
   o.add(buildExistingDisk());
   o.add(buildExistingDisk());
   return o;
 }
 
-checkUnnamed1107(core.List<api.ExistingDisk> o) {
+checkUnnamed1135(core.List<api.ExistingDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExistingDisk(o[0]);
   checkExistingDisk(o[1]);
 }
 
-buildUnnamed1108() {
+buildUnnamed1136() {
   var o = new core.List<api.NewDisk>();
   o.add(buildNewDisk());
   o.add(buildNewDisk());
   return o;
 }
 
-checkUnnamed1108(core.List<api.NewDisk> o) {
+checkUnnamed1136(core.List<api.NewDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNewDisk(o[0]);
   checkNewDisk(o[1]);
 }
 
-buildUnnamed1109() {
+buildUnnamed1137() {
   var o = new core.List<api.NetworkInterface>();
   o.add(buildNetworkInterface());
   o.add(buildNetworkInterface());
   return o;
 }
 
-checkUnnamed1109(core.List<api.NetworkInterface> o) {
+checkUnnamed1137(core.List<api.NetworkInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetworkInterface(o[0]);
   checkNetworkInterface(o[1]);
 }
 
-buildUnnamed1110() {
+buildUnnamed1138() {
   var o = new core.List<api.ServiceAccount>();
   o.add(buildServiceAccount());
   o.add(buildServiceAccount());
   return o;
 }
 
-checkUnnamed1110(core.List<api.ServiceAccount> o) {
+checkUnnamed1138(core.List<api.ServiceAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceAccount(o[0]);
   checkServiceAccount(o[1]);
@@ -982,14 +984,14 @@
     o.baseInstanceName = "foo";
     o.canIpForward = true;
     o.description = "foo";
-    o.disksToAttach = buildUnnamed1107();
-    o.disksToCreate = buildUnnamed1108();
+    o.disksToAttach = buildUnnamed1135();
+    o.disksToCreate = buildUnnamed1136();
     o.initAction = "foo";
     o.machineType = "foo";
     o.metadata = buildMetadata();
-    o.networkInterfaces = buildUnnamed1109();
+    o.networkInterfaces = buildUnnamed1137();
     o.onHostMaintenance = "foo";
-    o.serviceAccounts = buildUnnamed1110();
+    o.serviceAccounts = buildUnnamed1138();
     o.tags = buildTag();
     o.zone = "foo";
   }
@@ -1004,28 +1006,28 @@
     unittest.expect(o.baseInstanceName, unittest.equals('foo'));
     unittest.expect(o.canIpForward, unittest.isTrue);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1107(o.disksToAttach);
-    checkUnnamed1108(o.disksToCreate);
+    checkUnnamed1135(o.disksToAttach);
+    checkUnnamed1136(o.disksToCreate);
     unittest.expect(o.initAction, unittest.equals('foo'));
     unittest.expect(o.machineType, unittest.equals('foo'));
     checkMetadata(o.metadata);
-    checkUnnamed1109(o.networkInterfaces);
+    checkUnnamed1137(o.networkInterfaces);
     unittest.expect(o.onHostMaintenance, unittest.equals('foo'));
-    checkUnnamed1110(o.serviceAccounts);
+    checkUnnamed1138(o.serviceAccounts);
     checkTag(o.tags);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterReplicaPoolParamsV1Beta1--;
 }
 
-buildUnnamed1111() {
+buildUnnamed1139() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1111(core.List<core.String> o) {
+checkUnnamed1139(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1037,7 +1039,7 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     o.email = "foo";
-    o.scopes = buildUnnamed1111();
+    o.scopes = buildUnnamed1139();
   }
   buildCounterServiceAccount--;
   return o;
@@ -1047,19 +1049,19 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     unittest.expect(o.email, unittest.equals('foo'));
-    checkUnnamed1111(o.scopes);
+    checkUnnamed1139(o.scopes);
   }
   buildCounterServiceAccount--;
 }
 
-buildUnnamed1112() {
+buildUnnamed1140() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1112(core.List<core.String> o) {
+checkUnnamed1140(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1071,7 +1073,7 @@
   buildCounterTag++;
   if (buildCounterTag < 3) {
     o.fingerPrint = "foo";
-    o.items = buildUnnamed1112();
+    o.items = buildUnnamed1140();
   }
   buildCounterTag--;
   return o;
@@ -1081,32 +1083,32 @@
   buildCounterTag++;
   if (buildCounterTag < 3) {
     unittest.expect(o.fingerPrint, unittest.equals('foo'));
-    checkUnnamed1112(o.items);
+    checkUnnamed1140(o.items);
   }
   buildCounterTag--;
 }
 
-buildUnnamed1113() {
+buildUnnamed1141() {
   var o = new core.Map<core.String, api.Action>();
   o["x"] = buildAction();
   o["y"] = buildAction();
   return o;
 }
 
-checkUnnamed1113(core.Map<core.String, api.Action> o) {
+checkUnnamed1141(core.Map<core.String, api.Action> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAction(o["x"]);
   checkAction(o["y"]);
 }
 
-buildUnnamed1114() {
+buildUnnamed1142() {
   var o = new core.Map<core.String, api.Module>();
   o["x"] = buildModule();
   o["y"] = buildModule();
   return o;
 }
 
-checkUnnamed1114(core.Map<core.String, api.Module> o) {
+checkUnnamed1142(core.Map<core.String, api.Module> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkModule(o["x"]);
   checkModule(o["y"]);
@@ -1117,9 +1119,9 @@
   var o = new api.Template();
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    o.actions = buildUnnamed1113();
+    o.actions = buildUnnamed1141();
     o.description = "foo";
-    o.modules = buildUnnamed1114();
+    o.modules = buildUnnamed1142();
     o.name = "foo";
   }
   buildCounterTemplate--;
@@ -1129,22 +1131,22 @@
 checkTemplate(api.Template o) {
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
-    checkUnnamed1113(o.actions);
+    checkUnnamed1141(o.actions);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1114(o.modules);
+    checkUnnamed1142(o.modules);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterTemplate--;
 }
 
-buildUnnamed1115() {
+buildUnnamed1143() {
   var o = new core.List<api.Template>();
   o.add(buildTemplate());
   o.add(buildTemplate());
   return o;
 }
 
-checkUnnamed1115(core.List<api.Template> o) {
+checkUnnamed1143(core.List<api.Template> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTemplate(o[0]);
   checkTemplate(o[1]);
@@ -1156,7 +1158,7 @@
   buildCounterTemplatesListResponse++;
   if (buildCounterTemplatesListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed1115();
+    o.resources = buildUnnamed1143();
   }
   buildCounterTemplatesListResponse--;
   return o;
@@ -1166,7 +1168,7 @@
   buildCounterTemplatesListResponse++;
   if (buildCounterTemplatesListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1115(o.resources);
+    checkUnnamed1143(o.resources);
   }
   buildCounterTemplatesListResponse--;
 }
@@ -1501,25 +1503,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/manager/v1beta2/projects/"));
-        pathOffset += 26;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/deployments/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/deployments/"));
-        pathOffset += 13;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_deploymentName"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1560,25 +1545,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/manager/v1beta2/projects/"));
-        pathOffset += 26;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/deployments/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/deployments/"));
-        pathOffset += 13;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_deploymentName"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1624,22 +1592,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/manager/v1beta2/projects/"));
-        pathOffset += 26;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/deployments", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/deployments"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1683,22 +1637,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/manager/v1beta2/projects/"));
-        pathOffset += 26;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/deployments", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/deployments"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1746,18 +1686,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/manager/v1beta2/projects/"));
-        pathOffset += 26;
-        index = path.indexOf("/templates/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/templates/"));
-        pathOffset += 11;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_templateName"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1797,18 +1727,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/manager/v1beta2/projects/"));
-        pathOffset += 26;
-        index = path.indexOf("/templates/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 11), unittest.equals("/templates/"));
-        pathOffset += 11;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_templateName"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1853,15 +1773,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/manager/v1beta2/projects/"));
-        pathOffset += 26;
-        index = path.indexOf("/templates", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/templates"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1904,15 +1817,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 26), unittest.equals("/manager/v1beta2/projects/"));
-        pathOffset += 26;
-        index = path.indexOf("/templates", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectId"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/templates"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
diff --git a/generated/googleapis_beta/test/pubsub/v1beta1_test.dart b/generated/googleapis_beta/test/pubsub/v1beta1_test.dart
index 7df6263..f7ea541 100644
--- a/generated/googleapis_beta/test/pubsub/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/pubsub/v1beta1_test.dart
@@ -16,14 +16,14 @@
 
 
 
-buildUnnamed1170() {
+buildUnnamed1201() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1170(core.List<core.String> o) {
+checkUnnamed1201(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -34,7 +34,7 @@
   var o = new api.AcknowledgeRequest();
   buildCounterAcknowledgeRequest++;
   if (buildCounterAcknowledgeRequest < 3) {
-    o.ackId = buildUnnamed1170();
+    o.ackId = buildUnnamed1201();
     o.subscription = "foo";
   }
   buildCounterAcknowledgeRequest--;
@@ -44,7 +44,7 @@
 checkAcknowledgeRequest(api.AcknowledgeRequest o) {
   buildCounterAcknowledgeRequest++;
   if (buildCounterAcknowledgeRequest < 3) {
-    checkUnnamed1170(o.ackId);
+    checkUnnamed1201(o.ackId);
     unittest.expect(o.subscription, unittest.equals('foo'));
   }
   buildCounterAcknowledgeRequest--;
@@ -73,14 +73,14 @@
   buildCounterLabel--;
 }
 
-buildUnnamed1171() {
+buildUnnamed1202() {
   var o = new core.List<api.Subscription>();
   o.add(buildSubscription());
   o.add(buildSubscription());
   return o;
 }
 
-checkUnnamed1171(core.List<api.Subscription> o) {
+checkUnnamed1202(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSubscription(o[0]);
   checkSubscription(o[1]);
@@ -92,7 +92,7 @@
   buildCounterListSubscriptionsResponse++;
   if (buildCounterListSubscriptionsResponse < 3) {
     o.nextPageToken = "foo";
-    o.subscription = buildUnnamed1171();
+    o.subscription = buildUnnamed1202();
   }
   buildCounterListSubscriptionsResponse--;
   return o;
@@ -102,19 +102,19 @@
   buildCounterListSubscriptionsResponse++;
   if (buildCounterListSubscriptionsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1171(o.subscription);
+    checkUnnamed1202(o.subscription);
   }
   buildCounterListSubscriptionsResponse--;
 }
 
-buildUnnamed1172() {
+buildUnnamed1203() {
   var o = new core.List<api.Topic>();
   o.add(buildTopic());
   o.add(buildTopic());
   return o;
 }
 
-checkUnnamed1172(core.List<api.Topic> o) {
+checkUnnamed1203(core.List<api.Topic> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTopic(o[0]);
   checkTopic(o[1]);
@@ -126,7 +126,7 @@
   buildCounterListTopicsResponse++;
   if (buildCounterListTopicsResponse < 3) {
     o.nextPageToken = "foo";
-    o.topic = buildUnnamed1172();
+    o.topic = buildUnnamed1203();
   }
   buildCounterListTopicsResponse--;
   return o;
@@ -136,7 +136,7 @@
   buildCounterListTopicsResponse++;
   if (buildCounterListTopicsResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1172(o.topic);
+    checkUnnamed1203(o.topic);
   }
   buildCounterListTopicsResponse--;
 }
@@ -231,14 +231,14 @@
   buildCounterPubsubEvent--;
 }
 
-buildUnnamed1173() {
+buildUnnamed1204() {
   var o = new core.List<api.Label>();
   o.add(buildLabel());
   o.add(buildLabel());
   return o;
 }
 
-checkUnnamed1173(core.List<api.Label> o) {
+checkUnnamed1204(core.List<api.Label> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabel(o[0]);
   checkLabel(o[1]);
@@ -250,7 +250,7 @@
   buildCounterPubsubMessage++;
   if (buildCounterPubsubMessage < 3) {
     o.data = "foo";
-    o.label = buildUnnamed1173();
+    o.label = buildUnnamed1204();
   }
   buildCounterPubsubMessage--;
   return o;
@@ -260,7 +260,7 @@
   buildCounterPubsubMessage++;
   if (buildCounterPubsubMessage < 3) {
     unittest.expect(o.data, unittest.equals('foo'));
-    checkUnnamed1173(o.label);
+    checkUnnamed1204(o.label);
   }
   buildCounterPubsubMessage--;
 }
@@ -512,8 +512,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/pubsub/v1beta1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("pubsub/v1beta1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 25), unittest.equals("subscriptions/acknowledge"));
         pathOffset += 25;
 
@@ -557,8 +559,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/pubsub/v1beta1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("pubsub/v1beta1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("subscriptions"));
         pathOffset += 13;
 
@@ -601,8 +605,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/pubsub/v1beta1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("pubsub/v1beta1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("subscriptions/"));
         pathOffset += 14;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
@@ -644,8 +650,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/pubsub/v1beta1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("pubsub/v1beta1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("subscriptions/"));
         pathOffset += 14;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
@@ -691,8 +699,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/pubsub/v1beta1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("pubsub/v1beta1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("subscriptions"));
         pathOffset += 13;
 
@@ -741,8 +751,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/pubsub/v1beta1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("pubsub/v1beta1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 31), unittest.equals("subscriptions/modifyAckDeadline"));
         pathOffset += 31;
 
@@ -786,8 +798,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/pubsub/v1beta1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("pubsub/v1beta1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 30), unittest.equals("subscriptions/modifyPushConfig"));
         pathOffset += 30;
 
@@ -831,8 +845,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/pubsub/v1beta1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("pubsub/v1beta1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 18), unittest.equals("subscriptions/pull"));
         pathOffset += 18;
 
@@ -882,8 +898,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/pubsub/v1beta1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("pubsub/v1beta1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("topics"));
         pathOffset += 6;
 
@@ -926,8 +944,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/pubsub/v1beta1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("pubsub/v1beta1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("topics/"));
         pathOffset += 7;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
@@ -969,8 +989,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/pubsub/v1beta1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("pubsub/v1beta1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("topics/"));
         pathOffset += 7;
         // NOTE: We cannot test reserved expansions due to the inability to reverse the operation;
@@ -1016,8 +1038,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/pubsub/v1beta1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("pubsub/v1beta1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("topics"));
         pathOffset += 6;
 
@@ -1066,8 +1090,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/pubsub/v1beta1/"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("pubsub/v1beta1/"));
+        pathOffset += 15;
         unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("topics/publish"));
         pathOffset += 14;
 
diff --git a/generated/googleapis_beta/test/replicapool/v1beta1_test.dart b/generated/googleapis_beta/test/replicapool/v1beta1_test.dart
index 9c6d1db..47cfda4 100644
--- a/generated/googleapis_beta/test/replicapool/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/replicapool/v1beta1_test.dart
@@ -39,27 +39,27 @@
   buildCounterAccessConfig--;
 }
 
-buildUnnamed1059() {
+buildUnnamed1087() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1059(core.List<core.String> o) {
+checkUnnamed1087(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1060() {
+buildUnnamed1088() {
   var o = new core.List<api.EnvVariable>();
   o.add(buildEnvVariable());
   o.add(buildEnvVariable());
   return o;
 }
 
-checkUnnamed1060(core.List<api.EnvVariable> o) {
+checkUnnamed1088(core.List<api.EnvVariable> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkEnvVariable(o[0]);
   checkEnvVariable(o[1]);
@@ -70,8 +70,8 @@
   var o = new api.Action();
   buildCounterAction++;
   if (buildCounterAction < 3) {
-    o.commands = buildUnnamed1059();
-    o.envVariables = buildUnnamed1060();
+    o.commands = buildUnnamed1087();
+    o.envVariables = buildUnnamed1088();
     o.timeoutMilliSeconds = 42;
   }
   buildCounterAction--;
@@ -81,8 +81,8 @@
 checkAction(api.Action o) {
   buildCounterAction++;
   if (buildCounterAction < 3) {
-    checkUnnamed1059(o.commands);
-    checkUnnamed1060(o.envVariables);
+    checkUnnamed1087(o.commands);
+    checkUnnamed1088(o.envVariables);
     unittest.expect(o.timeoutMilliSeconds, unittest.equals(42));
   }
   buildCounterAction--;
@@ -209,14 +209,14 @@
   buildCounterLabel--;
 }
 
-buildUnnamed1061() {
+buildUnnamed1089() {
   var o = new core.List<api.MetadataItem>();
   o.add(buildMetadataItem());
   o.add(buildMetadataItem());
   return o;
 }
 
-checkUnnamed1061(core.List<api.MetadataItem> o) {
+checkUnnamed1089(core.List<api.MetadataItem> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkMetadataItem(o[0]);
   checkMetadataItem(o[1]);
@@ -228,7 +228,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     o.fingerPrint = "foo";
-    o.items = buildUnnamed1061();
+    o.items = buildUnnamed1089();
   }
   buildCounterMetadata--;
   return o;
@@ -238,7 +238,7 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     unittest.expect(o.fingerPrint, unittest.equals('foo'));
-    checkUnnamed1061(o.items);
+    checkUnnamed1089(o.items);
   }
   buildCounterMetadata--;
 }
@@ -264,14 +264,14 @@
   buildCounterMetadataItem--;
 }
 
-buildUnnamed1062() {
+buildUnnamed1090() {
   var o = new core.List<api.AccessConfig>();
   o.add(buildAccessConfig());
   o.add(buildAccessConfig());
   return o;
 }
 
-checkUnnamed1062(core.List<api.AccessConfig> o) {
+checkUnnamed1090(core.List<api.AccessConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAccessConfig(o[0]);
   checkAccessConfig(o[1]);
@@ -282,7 +282,7 @@
   var o = new api.NetworkInterface();
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    o.accessConfigs = buildUnnamed1062();
+    o.accessConfigs = buildUnnamed1090();
     o.network = "foo";
     o.networkIp = "foo";
   }
@@ -293,7 +293,7 @@
 checkNetworkInterface(api.NetworkInterface o) {
   buildCounterNetworkInterface++;
   if (buildCounterNetworkInterface < 3) {
-    checkUnnamed1062(o.accessConfigs);
+    checkUnnamed1090(o.accessConfigs);
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.networkIp, unittest.equals('foo'));
   }
@@ -348,53 +348,53 @@
   buildCounterNewDiskInitializeParams--;
 }
 
-buildUnnamed1063() {
+buildUnnamed1091() {
   var o = new core.List<api.HealthCheck>();
   o.add(buildHealthCheck());
   o.add(buildHealthCheck());
   return o;
 }
 
-checkUnnamed1063(core.List<api.HealthCheck> o) {
+checkUnnamed1091(core.List<api.HealthCheck> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthCheck(o[0]);
   checkHealthCheck(o[1]);
 }
 
-buildUnnamed1064() {
+buildUnnamed1092() {
   var o = new core.List<api.Label>();
   o.add(buildLabel());
   o.add(buildLabel());
   return o;
 }
 
-checkUnnamed1064(core.List<api.Label> o) {
+checkUnnamed1092(core.List<api.Label> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabel(o[0]);
   checkLabel(o[1]);
 }
 
-buildUnnamed1065() {
+buildUnnamed1093() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1065(core.List<core.String> o) {
+checkUnnamed1093(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1066() {
+buildUnnamed1094() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1066(core.List<core.String> o) {
+checkUnnamed1094(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -409,15 +409,15 @@
     o.baseInstanceName = "foo";
     o.currentNumReplicas = 42;
     o.description = "foo";
-    o.healthChecks = buildUnnamed1063();
+    o.healthChecks = buildUnnamed1091();
     o.initialNumReplicas = 42;
-    o.labels = buildUnnamed1064();
+    o.labels = buildUnnamed1092();
     o.name = "foo";
     o.numReplicas = 42;
-    o.resourceViews = buildUnnamed1065();
+    o.resourceViews = buildUnnamed1093();
     o.selfLink = "foo";
     o.targetPool = "foo";
-    o.targetPools = buildUnnamed1066();
+    o.targetPools = buildUnnamed1094();
     o.template = buildTemplate();
     o.type = "foo";
   }
@@ -432,29 +432,29 @@
     unittest.expect(o.baseInstanceName, unittest.equals('foo'));
     unittest.expect(o.currentNumReplicas, unittest.equals(42));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1063(o.healthChecks);
+    checkUnnamed1091(o.healthChecks);
     unittest.expect(o.initialNumReplicas, unittest.equals(42));
-    checkUnnamed1064(o.labels);
+    checkUnnamed1092(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.numReplicas, unittest.equals(42));
-    checkUnnamed1065(o.resourceViews);
+    checkUnnamed1093(o.resourceViews);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.targetPool, unittest.equals('foo'));
-    checkUnnamed1066(o.targetPools);
+    checkUnnamed1094(o.targetPools);
     checkTemplate(o.template);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterPool--;
 }
 
-buildUnnamed1067() {
+buildUnnamed1095() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1067(core.List<core.String> o) {
+checkUnnamed1095(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -465,7 +465,7 @@
   var o = new api.PoolsDeleteRequest();
   buildCounterPoolsDeleteRequest++;
   if (buildCounterPoolsDeleteRequest < 3) {
-    o.abandonInstances = buildUnnamed1067();
+    o.abandonInstances = buildUnnamed1095();
   }
   buildCounterPoolsDeleteRequest--;
   return o;
@@ -474,19 +474,19 @@
 checkPoolsDeleteRequest(api.PoolsDeleteRequest o) {
   buildCounterPoolsDeleteRequest++;
   if (buildCounterPoolsDeleteRequest < 3) {
-    checkUnnamed1067(o.abandonInstances);
+    checkUnnamed1095(o.abandonInstances);
   }
   buildCounterPoolsDeleteRequest--;
 }
 
-buildUnnamed1068() {
+buildUnnamed1096() {
   var o = new core.List<api.Pool>();
   o.add(buildPool());
   o.add(buildPool());
   return o;
 }
 
-checkUnnamed1068(core.List<api.Pool> o) {
+checkUnnamed1096(core.List<api.Pool> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkPool(o[0]);
   checkPool(o[1]);
@@ -498,7 +498,7 @@
   buildCounterPoolsListResponse++;
   if (buildCounterPoolsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed1068();
+    o.resources = buildUnnamed1096();
   }
   buildCounterPoolsListResponse--;
   return o;
@@ -508,7 +508,7 @@
   buildCounterPoolsListResponse++;
   if (buildCounterPoolsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1068(o.resources);
+    checkUnnamed1096(o.resources);
   }
   buildCounterPoolsListResponse--;
 }
@@ -582,14 +582,14 @@
   buildCounterReplicasDeleteRequest--;
 }
 
-buildUnnamed1069() {
+buildUnnamed1097() {
   var o = new core.List<api.Replica>();
   o.add(buildReplica());
   o.add(buildReplica());
   return o;
 }
 
-checkUnnamed1069(core.List<api.Replica> o) {
+checkUnnamed1097(core.List<api.Replica> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkReplica(o[0]);
   checkReplica(o[1]);
@@ -601,7 +601,7 @@
   buildCounterReplicasListResponse++;
   if (buildCounterReplicasListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resources = buildUnnamed1069();
+    o.resources = buildUnnamed1097();
   }
   buildCounterReplicasListResponse--;
   return o;
@@ -611,19 +611,19 @@
   buildCounterReplicasListResponse++;
   if (buildCounterReplicasListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1069(o.resources);
+    checkUnnamed1097(o.resources);
   }
   buildCounterReplicasListResponse--;
 }
 
-buildUnnamed1070() {
+buildUnnamed1098() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1070(core.List<core.String> o) {
+checkUnnamed1098(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -635,7 +635,7 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     o.email = "foo";
-    o.scopes = buildUnnamed1070();
+    o.scopes = buildUnnamed1098();
   }
   buildCounterServiceAccount--;
   return o;
@@ -645,19 +645,19 @@
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
     unittest.expect(o.email, unittest.equals('foo'));
-    checkUnnamed1070(o.scopes);
+    checkUnnamed1098(o.scopes);
   }
   buildCounterServiceAccount--;
 }
 
-buildUnnamed1071() {
+buildUnnamed1099() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1071(core.List<core.String> o) {
+checkUnnamed1099(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -669,7 +669,7 @@
   buildCounterTag++;
   if (buildCounterTag < 3) {
     o.fingerPrint = "foo";
-    o.items = buildUnnamed1071();
+    o.items = buildUnnamed1099();
   }
   buildCounterTag--;
   return o;
@@ -679,19 +679,19 @@
   buildCounterTag++;
   if (buildCounterTag < 3) {
     unittest.expect(o.fingerPrint, unittest.equals('foo'));
-    checkUnnamed1071(o.items);
+    checkUnnamed1099(o.items);
   }
   buildCounterTag--;
 }
 
-buildUnnamed1072() {
+buildUnnamed1100() {
   var o = new core.List<api.HealthCheck>();
   o.add(buildHealthCheck());
   o.add(buildHealthCheck());
   return o;
 }
 
-checkUnnamed1072(core.List<api.HealthCheck> o) {
+checkUnnamed1100(core.List<api.HealthCheck> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkHealthCheck(o[0]);
   checkHealthCheck(o[1]);
@@ -703,7 +703,7 @@
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
     o.action = buildAction();
-    o.healthChecks = buildUnnamed1072();
+    o.healthChecks = buildUnnamed1100();
     o.version = "foo";
     o.vmParams = buildVmParams();
   }
@@ -715,60 +715,60 @@
   buildCounterTemplate++;
   if (buildCounterTemplate < 3) {
     checkAction(o.action);
-    checkUnnamed1072(o.healthChecks);
+    checkUnnamed1100(o.healthChecks);
     unittest.expect(o.version, unittest.equals('foo'));
     checkVmParams(o.vmParams);
   }
   buildCounterTemplate--;
 }
 
-buildUnnamed1073() {
+buildUnnamed1101() {
   var o = new core.List<api.ExistingDisk>();
   o.add(buildExistingDisk());
   o.add(buildExistingDisk());
   return o;
 }
 
-checkUnnamed1073(core.List<api.ExistingDisk> o) {
+checkUnnamed1101(core.List<api.ExistingDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkExistingDisk(o[0]);
   checkExistingDisk(o[1]);
 }
 
-buildUnnamed1074() {
+buildUnnamed1102() {
   var o = new core.List<api.NewDisk>();
   o.add(buildNewDisk());
   o.add(buildNewDisk());
   return o;
 }
 
-checkUnnamed1074(core.List<api.NewDisk> o) {
+checkUnnamed1102(core.List<api.NewDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNewDisk(o[0]);
   checkNewDisk(o[1]);
 }
 
-buildUnnamed1075() {
+buildUnnamed1103() {
   var o = new core.List<api.NetworkInterface>();
   o.add(buildNetworkInterface());
   o.add(buildNetworkInterface());
   return o;
 }
 
-checkUnnamed1075(core.List<api.NetworkInterface> o) {
+checkUnnamed1103(core.List<api.NetworkInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkNetworkInterface(o[0]);
   checkNetworkInterface(o[1]);
 }
 
-buildUnnamed1076() {
+buildUnnamed1104() {
   var o = new core.List<api.ServiceAccount>();
   o.add(buildServiceAccount());
   o.add(buildServiceAccount());
   return o;
 }
 
-checkUnnamed1076(core.List<api.ServiceAccount> o) {
+checkUnnamed1104(core.List<api.ServiceAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkServiceAccount(o[0]);
   checkServiceAccount(o[1]);
@@ -782,13 +782,13 @@
     o.baseInstanceName = "foo";
     o.canIpForward = true;
     o.description = "foo";
-    o.disksToAttach = buildUnnamed1073();
-    o.disksToCreate = buildUnnamed1074();
+    o.disksToAttach = buildUnnamed1101();
+    o.disksToCreate = buildUnnamed1102();
     o.machineType = "foo";
     o.metadata = buildMetadata();
-    o.networkInterfaces = buildUnnamed1075();
+    o.networkInterfaces = buildUnnamed1103();
     o.onHostMaintenance = "foo";
-    o.serviceAccounts = buildUnnamed1076();
+    o.serviceAccounts = buildUnnamed1104();
     o.tags = buildTag();
   }
   buildCounterVmParams--;
@@ -801,13 +801,13 @@
     unittest.expect(o.baseInstanceName, unittest.equals('foo'));
     unittest.expect(o.canIpForward, unittest.isTrue);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkUnnamed1073(o.disksToAttach);
-    checkUnnamed1074(o.disksToCreate);
+    checkUnnamed1101(o.disksToAttach);
+    checkUnnamed1102(o.disksToCreate);
     unittest.expect(o.machineType, unittest.equals('foo'));
     checkMetadata(o.metadata);
-    checkUnnamed1075(o.networkInterfaces);
+    checkUnnamed1103(o.networkInterfaces);
     unittest.expect(o.onHostMaintenance, unittest.equals('foo'));
-    checkUnnamed1076(o.serviceAccounts);
+    checkUnnamed1104(o.serviceAccounts);
     checkTag(o.tags);
   }
   buildCounterVmParams--;
@@ -1039,25 +1039,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 30), unittest.equals("/replicapool/v1beta1/projects/"));
-        pathOffset += 30;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/pools/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/pools/"));
-        pathOffset += 7;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_poolName"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1098,25 +1081,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 30), unittest.equals("/replicapool/v1beta1/projects/"));
-        pathOffset += 30;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/pools/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/pools/"));
-        pathOffset += 7;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_poolName"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1162,22 +1128,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 30), unittest.equals("/replicapool/v1beta1/projects/"));
-        pathOffset += 30;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/pools", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/pools"));
-        pathOffset += 6;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1221,22 +1173,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 30), unittest.equals("/replicapool/v1beta1/projects/"));
-        pathOffset += 30;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/pools", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/pools"));
-        pathOffset += 6;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1282,29 +1220,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 30), unittest.equals("/replicapool/v1beta1/projects/"));
-        pathOffset += 30;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/pools/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/pools/"));
-        pathOffset += 7;
-        index = path.indexOf("/resize", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_poolName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/resize"));
-        pathOffset += 7;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1352,29 +1269,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 30), unittest.equals("/replicapool/v1beta1/projects/"));
-        pathOffset += 30;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/pools/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/pools/"));
-        pathOffset += 7;
-        index = path.indexOf("/updateTemplate", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_poolName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/updateTemplate"));
-        pathOffset += 15;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1424,32 +1320,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 30), unittest.equals("/replicapool/v1beta1/projects/"));
-        pathOffset += 30;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/pools/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/pools/"));
-        pathOffset += 7;
-        index = path.indexOf("/replicas/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_poolName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/replicas/"));
-        pathOffset += 10;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_replicaName"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1493,32 +1365,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 30), unittest.equals("/replicapool/v1beta1/projects/"));
-        pathOffset += 30;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/pools/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/pools/"));
-        pathOffset += 7;
-        index = path.indexOf("/replicas/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_poolName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/replicas/"));
-        pathOffset += 10;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_replicaName"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1563,29 +1411,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 30), unittest.equals("/replicapool/v1beta1/projects/"));
-        pathOffset += 30;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/pools/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/pools/"));
-        pathOffset += 7;
-        index = path.indexOf("/replicas", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_poolName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/replicas"));
-        pathOffset += 9;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1631,36 +1458,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 30), unittest.equals("/replicapool/v1beta1/projects/"));
-        pathOffset += 30;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/pools/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/pools/"));
-        pathOffset += 7;
-        index = path.indexOf("/replicas/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_poolName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/replicas/"));
-        pathOffset += 10;
-        index = path.indexOf("/restart", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_replicaName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 8), unittest.equals("/restart"));
-        pathOffset += 8;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
diff --git a/generated/googleapis_beta/test/resourceviews/v1beta1_test.dart b/generated/googleapis_beta/test/resourceviews/v1beta1_test.dart
index b453ac3..51b32b7 100644
--- a/generated/googleapis_beta/test/resourceviews/v1beta1_test.dart
+++ b/generated/googleapis_beta/test/resourceviews/v1beta1_test.dart
@@ -37,14 +37,14 @@
   buildCounterLabel--;
 }
 
-buildUnnamed1082() {
+buildUnnamed1110() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1082(core.List<core.String> o) {
+checkUnnamed1110(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -55,7 +55,7 @@
   var o = new api.RegionViewsAddResourcesRequest();
   buildCounterRegionViewsAddResourcesRequest++;
   if (buildCounterRegionViewsAddResourcesRequest < 3) {
-    o.resources = buildUnnamed1082();
+    o.resources = buildUnnamed1110();
   }
   buildCounterRegionViewsAddResourcesRequest--;
   return o;
@@ -64,7 +64,7 @@
 checkRegionViewsAddResourcesRequest(api.RegionViewsAddResourcesRequest o) {
   buildCounterRegionViewsAddResourcesRequest++;
   if (buildCounterRegionViewsAddResourcesRequest < 3) {
-    checkUnnamed1082(o.resources);
+    checkUnnamed1110(o.resources);
   }
   buildCounterRegionViewsAddResourcesRequest--;
 }
@@ -88,14 +88,14 @@
   buildCounterRegionViewsInsertResponse--;
 }
 
-buildUnnamed1083() {
+buildUnnamed1111() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1083(core.List<core.String> o) {
+checkUnnamed1111(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -106,7 +106,7 @@
   var o = new api.RegionViewsListResourcesResponse();
   buildCounterRegionViewsListResourcesResponse++;
   if (buildCounterRegionViewsListResourcesResponse < 3) {
-    o.members = buildUnnamed1083();
+    o.members = buildUnnamed1111();
     o.nextPageToken = "foo";
   }
   buildCounterRegionViewsListResourcesResponse--;
@@ -116,20 +116,20 @@
 checkRegionViewsListResourcesResponse(api.RegionViewsListResourcesResponse o) {
   buildCounterRegionViewsListResourcesResponse++;
   if (buildCounterRegionViewsListResourcesResponse < 3) {
-    checkUnnamed1083(o.members);
+    checkUnnamed1111(o.members);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterRegionViewsListResourcesResponse--;
 }
 
-buildUnnamed1084() {
+buildUnnamed1112() {
   var o = new core.List<api.ResourceView>();
   o.add(buildResourceView());
   o.add(buildResourceView());
   return o;
 }
 
-checkUnnamed1084(core.List<api.ResourceView> o) {
+checkUnnamed1112(core.List<api.ResourceView> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceView(o[0]);
   checkResourceView(o[1]);
@@ -141,7 +141,7 @@
   buildCounterRegionViewsListResponse++;
   if (buildCounterRegionViewsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resourceViews = buildUnnamed1084();
+    o.resourceViews = buildUnnamed1112();
   }
   buildCounterRegionViewsListResponse--;
   return o;
@@ -151,19 +151,19 @@
   buildCounterRegionViewsListResponse++;
   if (buildCounterRegionViewsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1084(o.resourceViews);
+    checkUnnamed1112(o.resourceViews);
   }
   buildCounterRegionViewsListResponse--;
 }
 
-buildUnnamed1085() {
+buildUnnamed1113() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1085(core.List<core.String> o) {
+checkUnnamed1113(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -174,7 +174,7 @@
   var o = new api.RegionViewsRemoveResourcesRequest();
   buildCounterRegionViewsRemoveResourcesRequest++;
   if (buildCounterRegionViewsRemoveResourcesRequest < 3) {
-    o.resources = buildUnnamed1085();
+    o.resources = buildUnnamed1113();
   }
   buildCounterRegionViewsRemoveResourcesRequest--;
   return o;
@@ -183,32 +183,32 @@
 checkRegionViewsRemoveResourcesRequest(api.RegionViewsRemoveResourcesRequest o) {
   buildCounterRegionViewsRemoveResourcesRequest++;
   if (buildCounterRegionViewsRemoveResourcesRequest < 3) {
-    checkUnnamed1085(o.resources);
+    checkUnnamed1113(o.resources);
   }
   buildCounterRegionViewsRemoveResourcesRequest--;
 }
 
-buildUnnamed1086() {
+buildUnnamed1114() {
   var o = new core.List<api.Label>();
   o.add(buildLabel());
   o.add(buildLabel());
   return o;
 }
 
-checkUnnamed1086(core.List<api.Label> o) {
+checkUnnamed1114(core.List<api.Label> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkLabel(o[0]);
   checkLabel(o[1]);
 }
 
-buildUnnamed1087() {
+buildUnnamed1115() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1087(core.List<core.String> o) {
+checkUnnamed1115(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -223,9 +223,9 @@
     o.description = "foo";
     o.id = "foo";
     o.kind = "foo";
-    o.labels = buildUnnamed1086();
+    o.labels = buildUnnamed1114();
     o.lastModified = "foo";
-    o.members = buildUnnamed1087();
+    o.members = buildUnnamed1115();
     o.name = "foo";
     o.numMembers = 42;
     o.selfLink = "foo";
@@ -241,9 +241,9 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1086(o.labels);
+    checkUnnamed1114(o.labels);
     unittest.expect(o.lastModified, unittest.equals('foo'));
-    checkUnnamed1087(o.members);
+    checkUnnamed1115(o.members);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.numMembers, unittest.equals(42));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -251,14 +251,14 @@
   buildCounterResourceView--;
 }
 
-buildUnnamed1088() {
+buildUnnamed1116() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1088(core.List<core.String> o) {
+checkUnnamed1116(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -269,7 +269,7 @@
   var o = new api.ZoneViewsAddResourcesRequest();
   buildCounterZoneViewsAddResourcesRequest++;
   if (buildCounterZoneViewsAddResourcesRequest < 3) {
-    o.resources = buildUnnamed1088();
+    o.resources = buildUnnamed1116();
   }
   buildCounterZoneViewsAddResourcesRequest--;
   return o;
@@ -278,7 +278,7 @@
 checkZoneViewsAddResourcesRequest(api.ZoneViewsAddResourcesRequest o) {
   buildCounterZoneViewsAddResourcesRequest++;
   if (buildCounterZoneViewsAddResourcesRequest < 3) {
-    checkUnnamed1088(o.resources);
+    checkUnnamed1116(o.resources);
   }
   buildCounterZoneViewsAddResourcesRequest--;
 }
@@ -302,14 +302,14 @@
   buildCounterZoneViewsInsertResponse--;
 }
 
-buildUnnamed1089() {
+buildUnnamed1117() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1089(core.List<core.String> o) {
+checkUnnamed1117(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -320,7 +320,7 @@
   var o = new api.ZoneViewsListResourcesResponse();
   buildCounterZoneViewsListResourcesResponse++;
   if (buildCounterZoneViewsListResourcesResponse < 3) {
-    o.members = buildUnnamed1089();
+    o.members = buildUnnamed1117();
     o.nextPageToken = "foo";
   }
   buildCounterZoneViewsListResourcesResponse--;
@@ -330,20 +330,20 @@
 checkZoneViewsListResourcesResponse(api.ZoneViewsListResourcesResponse o) {
   buildCounterZoneViewsListResourcesResponse++;
   if (buildCounterZoneViewsListResourcesResponse < 3) {
-    checkUnnamed1089(o.members);
+    checkUnnamed1117(o.members);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterZoneViewsListResourcesResponse--;
 }
 
-buildUnnamed1090() {
+buildUnnamed1118() {
   var o = new core.List<api.ResourceView>();
   o.add(buildResourceView());
   o.add(buildResourceView());
   return o;
 }
 
-checkUnnamed1090(core.List<api.ResourceView> o) {
+checkUnnamed1118(core.List<api.ResourceView> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkResourceView(o[0]);
   checkResourceView(o[1]);
@@ -355,7 +355,7 @@
   buildCounterZoneViewsListResponse++;
   if (buildCounterZoneViewsListResponse < 3) {
     o.nextPageToken = "foo";
-    o.resourceViews = buildUnnamed1090();
+    o.resourceViews = buildUnnamed1118();
   }
   buildCounterZoneViewsListResponse--;
   return o;
@@ -365,19 +365,19 @@
   buildCounterZoneViewsListResponse++;
   if (buildCounterZoneViewsListResponse < 3) {
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkUnnamed1090(o.resourceViews);
+    checkUnnamed1118(o.resourceViews);
   }
   buildCounterZoneViewsListResponse--;
 }
 
-buildUnnamed1091() {
+buildUnnamed1119() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1091(core.List<core.String> o) {
+checkUnnamed1119(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -388,7 +388,7 @@
   var o = new api.ZoneViewsRemoveResourcesRequest();
   buildCounterZoneViewsRemoveResourcesRequest++;
   if (buildCounterZoneViewsRemoveResourcesRequest < 3) {
-    o.resources = buildUnnamed1091();
+    o.resources = buildUnnamed1119();
   }
   buildCounterZoneViewsRemoveResourcesRequest--;
   return o;
@@ -397,7 +397,7 @@
 checkZoneViewsRemoveResourcesRequest(api.ZoneViewsRemoveResourcesRequest o) {
   buildCounterZoneViewsRemoveResourcesRequest++;
   if (buildCounterZoneViewsRemoveResourcesRequest < 3) {
-    checkUnnamed1091(o.resources);
+    checkUnnamed1119(o.resources);
   }
   buildCounterZoneViewsRemoveResourcesRequest--;
 }
@@ -529,29 +529,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("/resourceviews/v1beta1/projects/"));
-        pathOffset += 32;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/resourceViews/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/resourceViews/"));
-        pathOffset += 15;
-        index = path.indexOf("/addResources", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_resourceViewName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/addResources"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -592,25 +571,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("/resourceviews/v1beta1/projects/"));
-        pathOffset += 32;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/resourceViews/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/resourceViews/"));
-        pathOffset += 15;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_resourceViewName"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -651,25 +613,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("/resourceviews/v1beta1/projects/"));
-        pathOffset += 32;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/resourceViews/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/resourceViews/"));
-        pathOffset += 15;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_resourceViewName"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -715,22 +660,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("/resourceviews/v1beta1/projects/"));
-        pathOffset += 32;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/resourceViews", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/resourceViews"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -774,22 +705,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("/resourceviews/v1beta1/projects/"));
-        pathOffset += 32;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/resourceViews", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/resourceViews"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -836,29 +753,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("/resourceviews/v1beta1/projects/"));
-        pathOffset += 32;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/resourceViews/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/resourceViews/"));
-        pathOffset += 15;
-        index = path.indexOf("/resources", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_resourceViewName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/resources"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -907,29 +803,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("/resourceviews/v1beta1/projects/"));
-        pathOffset += 32;
-        index = path.indexOf("/regions/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("/regions/"));
-        pathOffset += 9;
-        index = path.indexOf("/resourceViews/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_region"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/resourceViews/"));
-        pathOffset += 15;
-        index = path.indexOf("/removeResources", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_resourceViewName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/removeResources"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -978,29 +853,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("/resourceviews/v1beta1/projects/"));
-        pathOffset += 32;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/resourceViews/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/resourceViews/"));
-        pathOffset += 15;
-        index = path.indexOf("/addResources", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_resourceViewName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/addResources"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1041,25 +895,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("/resourceviews/v1beta1/projects/"));
-        pathOffset += 32;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/resourceViews/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/resourceViews/"));
-        pathOffset += 15;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_resourceViewName"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1100,25 +937,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("/resourceviews/v1beta1/projects/"));
-        pathOffset += 32;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/resourceViews/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/resourceViews/"));
-        pathOffset += 15;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_resourceViewName"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1164,22 +984,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("/resourceviews/v1beta1/projects/"));
-        pathOffset += 32;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/resourceViews", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/resourceViews"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1223,22 +1029,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("/resourceviews/v1beta1/projects/"));
-        pathOffset += 32;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/resourceViews", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 14), unittest.equals("/resourceViews"));
-        pathOffset += 14;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1285,29 +1077,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("/resourceviews/v1beta1/projects/"));
-        pathOffset += 32;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/resourceViews/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/resourceViews/"));
-        pathOffset += 15;
-        index = path.indexOf("/resources", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_resourceViewName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 10), unittest.equals("/resources"));
-        pathOffset += 10;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -1356,29 +1127,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 32), unittest.equals("/resourceviews/v1beta1/projects/"));
-        pathOffset += 32;
-        index = path.indexOf("/zones/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_projectName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/zones/"));
-        pathOffset += 7;
-        index = path.indexOf("/resourceViews/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_zone"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 15), unittest.equals("/resourceViews/"));
-        pathOffset += 15;
-        index = path.indexOf("/removeResources", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_resourceViewName"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 16), unittest.equals("/removeResources"));
-        pathOffset += 16;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
diff --git a/generated/googleapis_beta/test/sqladmin/v1beta3_test.dart b/generated/googleapis_beta/test/sqladmin/v1beta3_test.dart
index ce18a5b..1c0642b 100644
--- a/generated/googleapis_beta/test/sqladmin/v1beta3_test.dart
+++ b/generated/googleapis_beta/test/sqladmin/v1beta3_test.dart
@@ -78,14 +78,14 @@
   buildCounterBackupRun--;
 }
 
-buildUnnamed1033() {
+buildUnnamed1061() {
   var o = new core.List<api.BackupRun>();
   o.add(buildBackupRun());
   o.add(buildBackupRun());
   return o;
 }
 
-checkUnnamed1033(core.List<api.BackupRun> o) {
+checkUnnamed1061(core.List<api.BackupRun> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackupRun(o[0]);
   checkBackupRun(o[1]);
@@ -96,7 +96,7 @@
   var o = new api.BackupRunsListResponse();
   buildCounterBackupRunsListResponse++;
   if (buildCounterBackupRunsListResponse < 3) {
-    o.items = buildUnnamed1033();
+    o.items = buildUnnamed1061();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -107,7 +107,7 @@
 checkBackupRunsListResponse(api.BackupRunsListResponse o) {
   buildCounterBackupRunsListResponse++;
   if (buildCounterBackupRunsListResponse < 3) {
-    checkUnnamed1033(o.items);
+    checkUnnamed1061(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -183,27 +183,27 @@
   buildCounterDatabaseFlags--;
 }
 
-buildUnnamed1034() {
+buildUnnamed1062() {
   var o = new core.List<api.IpMapping>();
   o.add(buildIpMapping());
   o.add(buildIpMapping());
   return o;
 }
 
-checkUnnamed1034(core.List<api.IpMapping> o) {
+checkUnnamed1062(core.List<api.IpMapping> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkIpMapping(o[0]);
   checkIpMapping(o[1]);
 }
 
-buildUnnamed1035() {
+buildUnnamed1063() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1035(core.List<core.String> o) {
+checkUnnamed1063(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -219,13 +219,13 @@
     o.etag = "foo";
     o.instance = "foo";
     o.instanceType = "foo";
-    o.ipAddresses = buildUnnamed1034();
+    o.ipAddresses = buildUnnamed1062();
     o.kind = "foo";
     o.masterInstanceName = "foo";
     o.maxDiskSize = "foo";
     o.project = "foo";
     o.region = "foo";
-    o.replicaNames = buildUnnamed1035();
+    o.replicaNames = buildUnnamed1063();
     o.serverCaCert = buildSslCert();
     o.settings = buildSettings();
     o.state = "foo";
@@ -242,13 +242,13 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.instance, unittest.equals('foo'));
     unittest.expect(o.instanceType, unittest.equals('foo'));
-    checkUnnamed1034(o.ipAddresses);
+    checkUnnamed1062(o.ipAddresses);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.masterInstanceName, unittest.equals('foo'));
     unittest.expect(o.maxDiskSize, unittest.equals('foo'));
     unittest.expect(o.project, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
-    checkUnnamed1035(o.replicaNames);
+    checkUnnamed1063(o.replicaNames);
     checkSslCert(o.serverCaCert);
     checkSettings(o.settings);
     unittest.expect(o.state, unittest.equals('foo'));
@@ -256,27 +256,27 @@
   buildCounterDatabaseInstance--;
 }
 
-buildUnnamed1036() {
+buildUnnamed1064() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1036(core.List<core.String> o) {
+checkUnnamed1064(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1037() {
+buildUnnamed1065() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1037(core.List<core.String> o) {
+checkUnnamed1065(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -287,9 +287,9 @@
   var o = new api.ExportContext();
   buildCounterExportContext++;
   if (buildCounterExportContext < 3) {
-    o.database = buildUnnamed1036();
+    o.database = buildUnnamed1064();
     o.kind = "foo";
-    o.table = buildUnnamed1037();
+    o.table = buildUnnamed1065();
     o.uri = "foo";
   }
   buildCounterExportContext--;
@@ -299,35 +299,35 @@
 checkExportContext(api.ExportContext o) {
   buildCounterExportContext++;
   if (buildCounterExportContext < 3) {
-    checkUnnamed1036(o.database);
+    checkUnnamed1064(o.database);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1037(o.table);
+    checkUnnamed1065(o.table);
     unittest.expect(o.uri, unittest.equals('foo'));
   }
   buildCounterExportContext--;
 }
 
-buildUnnamed1038() {
+buildUnnamed1066() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1038(core.List<core.String> o) {
+checkUnnamed1066(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1039() {
+buildUnnamed1067() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1039(core.List<core.String> o) {
+checkUnnamed1067(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -338,8 +338,8 @@
   var o = new api.Flag();
   buildCounterFlag++;
   if (buildCounterFlag < 3) {
-    o.allowedStringValues = buildUnnamed1038();
-    o.appliesTo = buildUnnamed1039();
+    o.allowedStringValues = buildUnnamed1066();
+    o.appliesTo = buildUnnamed1067();
     o.kind = "foo";
     o.maxValue = "foo";
     o.minValue = "foo";
@@ -353,8 +353,8 @@
 checkFlag(api.Flag o) {
   buildCounterFlag++;
   if (buildCounterFlag < 3) {
-    checkUnnamed1038(o.allowedStringValues);
-    checkUnnamed1039(o.appliesTo);
+    checkUnnamed1066(o.allowedStringValues);
+    checkUnnamed1067(o.appliesTo);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.maxValue, unittest.equals('foo'));
     unittest.expect(o.minValue, unittest.equals('foo'));
@@ -364,14 +364,14 @@
   buildCounterFlag--;
 }
 
-buildUnnamed1040() {
+buildUnnamed1068() {
   var o = new core.List<api.Flag>();
   o.add(buildFlag());
   o.add(buildFlag());
   return o;
 }
 
-checkUnnamed1040(core.List<api.Flag> o) {
+checkUnnamed1068(core.List<api.Flag> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkFlag(o[0]);
   checkFlag(o[1]);
@@ -382,7 +382,7 @@
   var o = new api.FlagsListResponse();
   buildCounterFlagsListResponse++;
   if (buildCounterFlagsListResponse < 3) {
-    o.items = buildUnnamed1040();
+    o.items = buildUnnamed1068();
     o.kind = "foo";
   }
   buildCounterFlagsListResponse--;
@@ -392,20 +392,20 @@
 checkFlagsListResponse(api.FlagsListResponse o) {
   buildCounterFlagsListResponse++;
   if (buildCounterFlagsListResponse < 3) {
-    checkUnnamed1040(o.items);
+    checkUnnamed1068(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterFlagsListResponse--;
 }
 
-buildUnnamed1041() {
+buildUnnamed1069() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1041(core.List<core.String> o) {
+checkUnnamed1069(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -418,7 +418,7 @@
   if (buildCounterImportContext < 3) {
     o.database = "foo";
     o.kind = "foo";
-    o.uri = buildUnnamed1041();
+    o.uri = buildUnnamed1069();
   }
   buildCounterImportContext--;
   return o;
@@ -429,19 +429,19 @@
   if (buildCounterImportContext < 3) {
     unittest.expect(o.database, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1041(o.uri);
+    checkUnnamed1069(o.uri);
   }
   buildCounterImportContext--;
 }
 
-buildUnnamed1042() {
+buildUnnamed1070() {
   var o = new core.List<api.OperationError>();
   o.add(buildOperationError());
   o.add(buildOperationError());
   return o;
 }
 
-checkUnnamed1042(core.List<api.OperationError> o) {
+checkUnnamed1070(core.List<api.OperationError> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkOperationError(o[0]);
   checkOperationError(o[1]);
@@ -454,7 +454,7 @@
   if (buildCounterInstanceOperation < 3) {
     o.endTime = core.DateTime.parse("2002-02-27T14:01:02");
     o.enqueuedTime = core.DateTime.parse("2002-02-27T14:01:02");
-    o.error = buildUnnamed1042();
+    o.error = buildUnnamed1070();
     o.exportContext = buildExportContext();
     o.importContext = buildImportContext();
     o.instance = "foo";
@@ -474,7 +474,7 @@
   if (buildCounterInstanceOperation < 3) {
     unittest.expect(o.endTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.enqueuedTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUnnamed1042(o.error);
+    checkUnnamed1070(o.error);
     checkExportContext(o.exportContext);
     checkImportContext(o.importContext);
     unittest.expect(o.instance, unittest.equals('foo'));
@@ -669,14 +669,14 @@
   buildCounterInstancesInsertResponse--;
 }
 
-buildUnnamed1043() {
+buildUnnamed1071() {
   var o = new core.List<api.DatabaseInstance>();
   o.add(buildDatabaseInstance());
   o.add(buildDatabaseInstance());
   return o;
 }
 
-checkUnnamed1043(core.List<api.DatabaseInstance> o) {
+checkUnnamed1071(core.List<api.DatabaseInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatabaseInstance(o[0]);
   checkDatabaseInstance(o[1]);
@@ -687,7 +687,7 @@
   var o = new api.InstancesListResponse();
   buildCounterInstancesListResponse++;
   if (buildCounterInstancesListResponse < 3) {
-    o.items = buildUnnamed1043();
+    o.items = buildUnnamed1071();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -698,7 +698,7 @@
 checkInstancesListResponse(api.InstancesListResponse o) {
   buildCounterInstancesListResponse++;
   if (buildCounterInstancesListResponse < 3) {
-    checkUnnamed1043(o.items);
+    checkUnnamed1071(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -831,14 +831,14 @@
   buildCounterInstancesUpdateResponse--;
 }
 
-buildUnnamed1044() {
+buildUnnamed1072() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1044(core.List<core.String> o) {
+checkUnnamed1072(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -849,7 +849,7 @@
   var o = new api.IpConfiguration();
   buildCounterIpConfiguration++;
   if (buildCounterIpConfiguration < 3) {
-    o.authorizedNetworks = buildUnnamed1044();
+    o.authorizedNetworks = buildUnnamed1072();
     o.enabled = true;
     o.requireSsl = true;
   }
@@ -860,7 +860,7 @@
 checkIpConfiguration(api.IpConfiguration o) {
   buildCounterIpConfiguration++;
   if (buildCounterIpConfiguration < 3) {
-    checkUnnamed1044(o.authorizedNetworks);
+    checkUnnamed1072(o.authorizedNetworks);
     unittest.expect(o.enabled, unittest.isTrue);
     unittest.expect(o.requireSsl, unittest.isTrue);
   }
@@ -932,14 +932,14 @@
   buildCounterOperationError--;
 }
 
-buildUnnamed1045() {
+buildUnnamed1073() {
   var o = new core.List<api.InstanceOperation>();
   o.add(buildInstanceOperation());
   o.add(buildInstanceOperation());
   return o;
 }
 
-checkUnnamed1045(core.List<api.InstanceOperation> o) {
+checkUnnamed1073(core.List<api.InstanceOperation> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkInstanceOperation(o[0]);
   checkInstanceOperation(o[1]);
@@ -950,7 +950,7 @@
   var o = new api.OperationsListResponse();
   buildCounterOperationsListResponse++;
   if (buildCounterOperationsListResponse < 3) {
-    o.items = buildUnnamed1045();
+    o.items = buildUnnamed1073();
     o.kind = "foo";
     o.nextPageToken = "foo";
   }
@@ -961,7 +961,7 @@
 checkOperationsListResponse(api.OperationsListResponse o) {
   buildCounterOperationsListResponse++;
   if (buildCounterOperationsListResponse < 3) {
-    checkUnnamed1045(o.items);
+    checkUnnamed1073(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -989,40 +989,40 @@
   buildCounterSetRootPasswordContext--;
 }
 
-buildUnnamed1046() {
+buildUnnamed1074() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1046(core.List<core.String> o) {
+checkUnnamed1074(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1047() {
+buildUnnamed1075() {
   var o = new core.List<api.BackupConfiguration>();
   o.add(buildBackupConfiguration());
   o.add(buildBackupConfiguration());
   return o;
 }
 
-checkUnnamed1047(core.List<api.BackupConfiguration> o) {
+checkUnnamed1075(core.List<api.BackupConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkBackupConfiguration(o[0]);
   checkBackupConfiguration(o[1]);
 }
 
-buildUnnamed1048() {
+buildUnnamed1076() {
   var o = new core.List<api.DatabaseFlags>();
   o.add(buildDatabaseFlags());
   o.add(buildDatabaseFlags());
   return o;
 }
 
-checkUnnamed1048(core.List<api.DatabaseFlags> o) {
+checkUnnamed1076(core.List<api.DatabaseFlags> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkDatabaseFlags(o[0]);
   checkDatabaseFlags(o[1]);
@@ -1034,9 +1034,9 @@
   buildCounterSettings++;
   if (buildCounterSettings < 3) {
     o.activationPolicy = "foo";
-    o.authorizedGaeApplications = buildUnnamed1046();
-    o.backupConfiguration = buildUnnamed1047();
-    o.databaseFlags = buildUnnamed1048();
+    o.authorizedGaeApplications = buildUnnamed1074();
+    o.backupConfiguration = buildUnnamed1075();
+    o.databaseFlags = buildUnnamed1076();
     o.databaseReplicationEnabled = true;
     o.ipConfiguration = buildIpConfiguration();
     o.kind = "foo";
@@ -1054,9 +1054,9 @@
   buildCounterSettings++;
   if (buildCounterSettings < 3) {
     unittest.expect(o.activationPolicy, unittest.equals('foo'));
-    checkUnnamed1046(o.authorizedGaeApplications);
-    checkUnnamed1047(o.backupConfiguration);
-    checkUnnamed1048(o.databaseFlags);
+    checkUnnamed1074(o.authorizedGaeApplications);
+    checkUnnamed1075(o.backupConfiguration);
+    checkUnnamed1076(o.databaseFlags);
     unittest.expect(o.databaseReplicationEnabled, unittest.isTrue);
     checkIpConfiguration(o.ipConfiguration);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -1186,14 +1186,14 @@
   buildCounterSslCertsInsertResponse--;
 }
 
-buildUnnamed1049() {
+buildUnnamed1077() {
   var o = new core.List<api.SslCert>();
   o.add(buildSslCert());
   o.add(buildSslCert());
   return o;
 }
 
-checkUnnamed1049(core.List<api.SslCert> o) {
+checkUnnamed1077(core.List<api.SslCert> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkSslCert(o[0]);
   checkSslCert(o[1]);
@@ -1204,7 +1204,7 @@
   var o = new api.SslCertsListResponse();
   buildCounterSslCertsListResponse++;
   if (buildCounterSslCertsListResponse < 3) {
-    o.items = buildUnnamed1049();
+    o.items = buildUnnamed1077();
     o.kind = "foo";
   }
   buildCounterSslCertsListResponse--;
@@ -1214,20 +1214,20 @@
 checkSslCertsListResponse(api.SslCertsListResponse o) {
   buildCounterSslCertsListResponse++;
   if (buildCounterSslCertsListResponse < 3) {
-    checkUnnamed1049(o.items);
+    checkUnnamed1077(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterSslCertsListResponse--;
 }
 
-buildUnnamed1050() {
+buildUnnamed1078() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1050(core.List<core.String> o) {
+checkUnnamed1078(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -1241,7 +1241,7 @@
     o.DiskQuota = "foo";
     o.RAM = "foo";
     o.kind = "foo";
-    o.region = buildUnnamed1050();
+    o.region = buildUnnamed1078();
     o.tier = "foo";
   }
   buildCounterTier--;
@@ -1254,20 +1254,20 @@
     unittest.expect(o.DiskQuota, unittest.equals('foo'));
     unittest.expect(o.RAM, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUnnamed1050(o.region);
+    checkUnnamed1078(o.region);
     unittest.expect(o.tier, unittest.equals('foo'));
   }
   buildCounterTier--;
 }
 
-buildUnnamed1051() {
+buildUnnamed1079() {
   var o = new core.List<api.Tier>();
   o.add(buildTier());
   o.add(buildTier());
   return o;
 }
 
-checkUnnamed1051(core.List<api.Tier> o) {
+checkUnnamed1079(core.List<api.Tier> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTier(o[0]);
   checkTier(o[1]);
@@ -1278,7 +1278,7 @@
   var o = new api.TiersListResponse();
   buildCounterTiersListResponse++;
   if (buildCounterTiersListResponse < 3) {
-    o.items = buildUnnamed1051();
+    o.items = buildUnnamed1079();
     o.kind = "foo";
   }
   buildCounterTiersListResponse--;
@@ -1288,7 +1288,7 @@
 checkTiersListResponse(api.TiersListResponse o) {
   buildCounterTiersListResponse++;
   if (buildCounterTiersListResponse < 3) {
-    checkUnnamed1051(o.items);
+    checkUnnamed1079(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTiersListResponse--;
@@ -1697,8 +1697,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances/", pathOffset);
@@ -1763,8 +1765,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances/", pathOffset);
@@ -1827,8 +1831,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 5), unittest.equals("flags"));
         pathOffset += 5;
 
@@ -1879,8 +1885,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances/clone", pathOffset);
@@ -1931,8 +1939,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances/", pathOffset);
@@ -1990,8 +2000,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances/", pathOffset);
@@ -2049,8 +2061,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances/", pathOffset);
@@ -2108,8 +2122,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances/", pathOffset);
@@ -2170,8 +2186,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances", pathOffset);
@@ -2223,8 +2241,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances", pathOffset);
@@ -2281,8 +2301,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances/", pathOffset);
@@ -2336,8 +2358,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances/", pathOffset);
@@ -2395,8 +2419,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances/", pathOffset);
@@ -2454,8 +2480,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances/", pathOffset);
@@ -2515,8 +2543,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances/", pathOffset);
@@ -2580,8 +2610,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances/", pathOffset);
@@ -2643,8 +2675,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances/", pathOffset);
@@ -2703,8 +2737,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances/", pathOffset);
@@ -2767,8 +2803,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances/", pathOffset);
@@ -2833,8 +2871,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances/", pathOffset);
@@ -2896,8 +2936,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances/", pathOffset);
@@ -2962,8 +3004,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances/", pathOffset);
@@ -3021,8 +3065,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/instances/", pathOffset);
@@ -3083,8 +3129,10 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 13), unittest.equals("/sql/v1beta3/"));
-        pathOffset += 13;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
+        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("sql/v1beta3/"));
+        pathOffset += 12;
         unittest.expect(path.substring(pathOffset, pathOffset + 9), unittest.equals("projects/"));
         pathOffset += 9;
         index = path.indexOf("/tiers", pathOffset);
diff --git a/generated/googleapis_beta/test/taskqueue/v1beta2_test.dart b/generated/googleapis_beta/test/taskqueue/v1beta2_test.dart
index 1a855f9..24fd751 100644
--- a/generated/googleapis_beta/test/taskqueue/v1beta2_test.dart
+++ b/generated/googleapis_beta/test/taskqueue/v1beta2_test.dart
@@ -49,40 +49,40 @@
   buildCounterTask--;
 }
 
-buildUnnamed1077() {
+buildUnnamed1105() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1077(core.List<core.String> o) {
+checkUnnamed1105(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1078() {
+buildUnnamed1106() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1078(core.List<core.String> o) {
+checkUnnamed1106(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
 }
 
-buildUnnamed1079() {
+buildUnnamed1107() {
   var o = new core.List<core.String>();
   o.add("foo");
   o.add("foo");
   return o;
 }
 
-checkUnnamed1079(core.List<core.String> o) {
+checkUnnamed1107(core.List<core.String> o) {
   unittest.expect(o, unittest.hasLength(2));
   unittest.expect(o[0], unittest.equals('foo'));
   unittest.expect(o[1], unittest.equals('foo'));
@@ -93,9 +93,9 @@
   var o = new api.TaskQueueAcl();
   buildCounterTaskQueueAcl++;
   if (buildCounterTaskQueueAcl < 3) {
-    o.adminEmails = buildUnnamed1077();
-    o.consumerEmails = buildUnnamed1078();
-    o.producerEmails = buildUnnamed1079();
+    o.adminEmails = buildUnnamed1105();
+    o.consumerEmails = buildUnnamed1106();
+    o.producerEmails = buildUnnamed1107();
   }
   buildCounterTaskQueueAcl--;
   return o;
@@ -104,9 +104,9 @@
 checkTaskQueueAcl(api.TaskQueueAcl o) {
   buildCounterTaskQueueAcl++;
   if (buildCounterTaskQueueAcl < 3) {
-    checkUnnamed1077(o.adminEmails);
-    checkUnnamed1078(o.consumerEmails);
-    checkUnnamed1079(o.producerEmails);
+    checkUnnamed1105(o.adminEmails);
+    checkUnnamed1106(o.consumerEmails);
+    checkUnnamed1107(o.producerEmails);
   }
   buildCounterTaskQueueAcl--;
 }
@@ -163,14 +163,14 @@
   buildCounterTaskQueue--;
 }
 
-buildUnnamed1080() {
+buildUnnamed1108() {
   var o = new core.List<api.Task>();
   o.add(buildTask());
   o.add(buildTask());
   return o;
 }
 
-checkUnnamed1080(core.List<api.Task> o) {
+checkUnnamed1108(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTask(o[0]);
   checkTask(o[1]);
@@ -181,7 +181,7 @@
   var o = new api.Tasks();
   buildCounterTasks++;
   if (buildCounterTasks < 3) {
-    o.items = buildUnnamed1080();
+    o.items = buildUnnamed1108();
     o.kind = "foo";
   }
   buildCounterTasks--;
@@ -191,20 +191,20 @@
 checkTasks(api.Tasks o) {
   buildCounterTasks++;
   if (buildCounterTasks < 3) {
-    checkUnnamed1080(o.items);
+    checkUnnamed1108(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTasks--;
 }
 
-buildUnnamed1081() {
+buildUnnamed1109() {
   var o = new core.List<api.Task>();
   o.add(buildTask());
   o.add(buildTask());
   return o;
 }
 
-checkUnnamed1081(core.List<api.Task> o) {
+checkUnnamed1109(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
   checkTask(o[0]);
   checkTask(o[1]);
@@ -215,7 +215,7 @@
   var o = new api.Tasks2();
   buildCounterTasks2++;
   if (buildCounterTasks2 < 3) {
-    o.items = buildUnnamed1081();
+    o.items = buildUnnamed1109();
     o.kind = "foo";
   }
   buildCounterTasks2--;
@@ -225,7 +225,7 @@
 checkTasks2(api.Tasks2 o) {
   buildCounterTasks2++;
   if (buildCounterTasks2 < 3) {
-    checkUnnamed1081(o.items);
+    checkUnnamed1109(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterTasks2--;
@@ -300,18 +300,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("/taskqueue/v1beta2/projects/"));
-        pathOffset += 28;
-        index = path.indexOf("/taskqueues/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/taskqueues/"));
-        pathOffset += 12;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_taskqueue"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -359,25 +349,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("/taskqueue/v1beta2/projects/"));
-        pathOffset += 28;
-        index = path.indexOf("/taskqueues/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/taskqueues/"));
-        pathOffset += 12;
-        index = path.indexOf("/tasks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_taskqueue"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/tasks/"));
-        pathOffset += 7;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_task"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -418,25 +391,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("/taskqueue/v1beta2/projects/"));
-        pathOffset += 28;
-        index = path.indexOf("/taskqueues/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/taskqueues/"));
-        pathOffset += 12;
-        index = path.indexOf("/tasks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_taskqueue"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/tasks/"));
-        pathOffset += 7;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_task"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -482,22 +438,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("/taskqueue/v1beta2/projects/"));
-        pathOffset += 28;
-        index = path.indexOf("/taskqueues/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/taskqueues/"));
-        pathOffset += 12;
-        index = path.indexOf("/tasks", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_taskqueue"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/tasks"));
-        pathOffset += 6;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -543,22 +485,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("/taskqueue/v1beta2/projects/"));
-        pathOffset += 28;
-        index = path.indexOf("/taskqueues/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/taskqueues/"));
-        pathOffset += 12;
-        index = path.indexOf("/tasks/lease", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_taskqueue"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/tasks/lease"));
-        pathOffset += 12;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -604,22 +532,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("/taskqueue/v1beta2/projects/"));
-        pathOffset += 28;
-        index = path.indexOf("/taskqueues/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/taskqueues/"));
-        pathOffset += 12;
-        index = path.indexOf("/tasks", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_taskqueue"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 6), unittest.equals("/tasks"));
-        pathOffset += 6;
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -667,25 +581,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("/taskqueue/v1beta2/projects/"));
-        pathOffset += 28;
-        index = path.indexOf("/taskqueues/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/taskqueues/"));
-        pathOffset += 12;
-        index = path.indexOf("/tasks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_taskqueue"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/tasks/"));
-        pathOffset += 7;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_task"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
@@ -734,25 +631,8 @@
         var pathOffset = 0;
         var index;
         var subPart;
-        unittest.expect(path.substring(pathOffset, pathOffset + 28), unittest.equals("/taskqueue/v1beta2/projects/"));
-        pathOffset += 28;
-        index = path.indexOf("/taskqueues/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_project"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 12), unittest.equals("/taskqueues/"));
-        pathOffset += 12;
-        index = path.indexOf("/tasks/", pathOffset);
-        unittest.expect(index >= 0, unittest.isTrue);
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset, index));
-        pathOffset = index;
-        unittest.expect(subPart, unittest.equals("$arg_taskqueue"));
-        unittest.expect(path.substring(pathOffset, pathOffset + 7), unittest.equals("/tasks/"));
-        pathOffset += 7;
-        subPart = core.Uri.decodeQueryComponent(path.substring(pathOffset));
-        pathOffset = path.length;
-        unittest.expect(subPart, unittest.equals("$arg_task"));
+        unittest.expect(path.substring(pathOffset, pathOffset + 1), unittest.equals("/"));
+        pathOffset += 1;
 
         var query = (req.url).query;
         var queryOffset = 0;
diff --git a/pubspec.lock b/pubspec.lock
index f79939b..b21eda4 100644
--- a/pubspec.lock
+++ b/pubspec.lock
@@ -5,18 +5,6 @@
     description: args
     source: hosted
     version: "0.11.0+1"
-  asn1lib:
-    description: asn1lib
-    source: hosted
-    version: "0.3.2"
-  bignum:
-    description: bignum
-    source: hosted
-    version: "0.0.6"
-  cipher:
-    description: cipher
-    source: hosted
-    version: "0.7.1"
   collection:
     description: collection
     source: hosted
@@ -27,23 +15,11 @@
     version: "0.9.0"
   discovery_api_client_generator:
     description:
-      ref: "161e09c032d8fd3d42474120921f6ac9add66370"
-      resolved-ref: "161e09c032d8fd3d42474120921f6ac9add66370"
+      ref: "00b3043ef8e7c9269df63a93cf0f34f209657cb4"
+      resolved-ref: "00b3043ef8e7c9269df63a93cf0f34f209657cb4"
       url: "https://github.com/dart-lang/discovery_api_dart_client_generator"
     source: git
     version: "0.5.1-dev"
-  fixnum:
-    description: fixnum
-    source: hosted
-    version: "0.9.0"
-  google_discovery_v1_api:
-    description: google_discovery_v1_api
-    source: hosted
-    version: "0.4.13"
-  google_oauth2_client:
-    description: google_oauth2_client
-    source: hosted
-    version: "0.3.9"
   http:
     description: http
     source: hosted
@@ -52,22 +28,10 @@
     description: http_parser
     source: hosted
     version: "0.0.2+5"
-  json_web_token:
-    description: json_web_token
-    source: hosted
-    version: "0.1.3"
-  oauth2:
-    description: oauth2
-    source: hosted
-    version: "0.9.3"
   path:
     description: path
     source: hosted
     version: "1.3.0"
-  rsa_pkcs:
-    description: rsa_pkcs
-    source: hosted
-    version: "0.1.1"
   source_span:
     description: source_span
     source: hosted
diff --git a/pubspec.yaml b/pubspec.yaml
index f079cd8..3302406 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -6,5 +6,5 @@
   discovery_api_client_generator:
     git:
       url: https://github.com/dart-lang/discovery_api_dart_client_generator
-      ref: 161e09c032d8fd3d42474120921f6ac9add66370
+      ref: 00b3043ef8e7c9269df63a93cf0f34f209657cb4
     version: ">=0.5.0 <0.6.0"
diff --git a/resources/googleapis/CHANGELOG.md b/resources/googleapis/CHANGELOG.md
index 85f6c15..17d617f 100644
--- a/resources/googleapis/CHANGELOG.md
+++ b/resources/googleapis/CHANGELOG.md
@@ -1,3 +1,16 @@
+## 0.2.0
+
+* [apis] admin:directory: additional schemas/methods
+* [apis] admin:reports_v1: schema changes
+* [apis] androidpublisher:v2: additional schemas/methods
+* [apis] drive:v2: schema changes
+* [apis] identitytoolkit:v3: schema changes
+* [apis] mirror:v1: schema changes
+* [apis-breaking] mapsengine:v1: major changes (additional schemas/methods)
+* [apis-breaking] prediction:v1.6: double -> String change
+* [generator] Bugfix in resumable media uploader.
+* [generator] Bugfix json decoding optimization.
+
 ## 0.1.1
 
 * [apis] Added Discovery API
diff --git a/resources/googleapis_beta/CHANGELOG.md b/resources/googleapis_beta/CHANGELOG.md
index e01e4e7..9954163 100644
--- a/resources/googleapis_beta/CHANGELOG.md
+++ b/resources/googleapis_beta/CHANGELOG.md
@@ -1,3 +1,11 @@
+## 0.2.0
+
+* [apis] autoscaler:v1beta2: schema changes
+* [apis] datastore:v1beta2: new API scopes, more descriptions
+* [apis] manager:v1beta2: schema changes
+* [apis-breaking] genomics:v1beta: major changes (method argument changes, schema renames, method removals/additions)
+* [generator] Bugfix in resumable media uploader.
+
 ## 0.1.1
 
 * [generator] Make shorter descriptions in pubspec.yaml: Only list api:version tuples.
