Api roll 1: 2014-09-23

R=sgjesse@google.com

Review URL: https://codereview.chromium.org//595873002
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/");
 }