Repository: googleapis/storage-testbench

Issue:
Implement bidirectional writes in GRPC

Hints from issue comments:

Solution patch:
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
index 0a9e354..bedba38 100644
--- a/.github/workflows/build.yaml
+++ b/.github/workflows/build.yaml
@@ -31,7 +31,7 @@ jobs:
           pytest --cov=./ --cov-report=xml
       - name: Upload coverage to Codecov
         if: ${{ matrix.python-version == '3.12' }}
-        uses: Wandalen/wretry.action@v1.3.0
+        uses: Wandalen/wretry.action@v1.4.4
         with:
           action: codecov/codecov-action@v3
           with: |
diff --git a/gcs/upload.py b/gcs/upload.py
index 864d4e5..82a423c 100644
--- a/gcs/upload.py
+++ b/gcs/upload.py
@@ -26,6 +26,8 @@ from google.protobuf import json_format
 import testbench
 from google.storage.v2 import storage_pb2
 
+from . import object
+
 
 class Upload(types.SimpleNamespace):
     """Holds data during an upload.
@@ -280,6 +282,136 @@ class Upload(types.SimpleNamespace):
             upload.metadata.metadata["x_emulator_no_md5"] = "true"
         return upload, is_resumable
 
+    @classmethod
+    def process_bidi_write_object_grpc(cls, db, request_iterator, context):
+        """Process a BidiWriteObject streaming RPC, and yield a stream of responses."""
+        upload, object_checksums, is_resumable = None, None, False
+        for request in request_iterator:
+            first_message = request.WhichOneof("first_message")
+            if first_message == "upload_id":  # resumable upload
+                upload = db.get_upload(request.upload_id, context)
+                if upload.complete:
+                    # Resuming an already finalized object will result with a response
+                    # containing the uploaded object's metadata.
+                    yield storage_pb2.BidiWriteObjectResponse(
+                        resource=upload.blob.metadata
+                    )
+                is_resumable = True
+            elif (
+                first_message == "write_object_spec"
+            ):  # one shot upload (non-resumable)
+                bucket = db.get_bucket(
+                    request.write_object_spec.resource.bucket, context
+                ).metadata
+                upload = cls.__init_first_write_grpc(request, bucket, context)
+            elif upload is None:
+                return testbench.error.invalid(
+                    "Upload missing a first_message field", context
+                )
+
+            if request.HasField("object_checksums"):
+                # The object checksums may appear only in the first message *or* the last message, but not both
+                if first_message is None and request.finish_write == False:
+                    return testbench.error.invalid(
+                        "Object checksums can be included only in the first or last message",
+                        context,
+                    )
+                if object_checksums is not None:
+                    return testbench.error.invalid(
+                        "Duplicate object checksums in upload",
+                        context,
+                    )
+                object_checksums = request.object_checksums
+
+            data = request.WhichOneof("data")
+            if data == "checksummed_data":
+                checksummed_data = request.checksummed_data
+            elif data is None and request.finish_write:
+                # Handles final message with no data to insert.
+                upload.complete = True
+                continue
+
+            content = checksummed_data.content
+            crc32c_hash = (
+                checksummed_data.crc32c if checksummed_data.HasField("crc32c") else None
+            )
+            if crc32c_hash is not None:
+                actual_crc32c = crc32c.crc32c(content)
+                if actual_crc32c != crc32c_hash:
+                    return testbench.error.mismatch(
+                        "crc32c in checksummed data",
+                        crc32c_hash,
+                        actual_crc32c,
+                        context,
+                    )
+
+            # The testbench should ignore any request bytes that have already been persisted,
+            # thus we validate write_offset against persisted_size.
+            # https://github.com/googleapis/googleapis/blob/15b48f9ed0ae8b034e753c6895eb045f436e257c/google/storage/v2/storage.proto#L320-L329
+            if request.write_offset < len(upload.media):
+                range_start = len(upload.media) - request.write_offset
+                content = testbench.common.partial_media(
+                    content, range_end=len(content), range_start=range_start
+                )
+            # Currently, the testbench will always checkpoint and flush data for testing purposes,
+            # instead of the 15 seconds interval used in the GCS server.
+            # TODO(#592): Refactor testbench checkpointing to more closely follow GCS server behavior.
+            upload.media += content
+            if request.finish_write:
+                upload.complete = True
+            elif request.state_lookup:
+                # For uploads not yet completed, yield response with persisted_size.
+                # For uploads that are complete, finalize the upload outside the request loop by
+                # storing full object checksums, creating new object, and yielding response with
+                # object metadata.
+                yield storage_pb2.BidiWriteObjectResponse(
+                    persisted_size=len(upload.media)
+                )
+
+        if upload is None:
+            return testbench.error.invalid("Missing BidiWriteObjectRequest", context)
+        if object_checksums is None:
+            upload.metadata.metadata["x_emulator_no_crc32c"] = "true"
+            upload.metadata.metadata["x_emulator_no_md5"] = "true"
+        else:
+            if object_checksums.HasField("crc32c"):
+                upload.metadata.metadata[
+                    "x_emulator_crc32c"
+                ] = testbench.common.rest_crc32c_from_proto(object_checksums.crc32c)
+            else:
+                upload.metadata.metadata["x_emulator_no_crc32c"] = "true"
+            if (
+                object_checksums.md5_hash is not None
+                and object_checksums.md5_hash != b""
+            ):
+                upload.metadata.metadata[
+                    "x_emulator_md5"
+                ] = testbench.common.rest_md5_from_proto(object_checksums.md5_hash)
+            else:
+                upload.metadata.metadata["x_emulator_no_md5"] = "true"
+
+        # Create a new object when the write is completed.
+        if upload.complete:
+            blob, _ = object.Object.init(
+                upload.request,
+                upload.metadata,
+                upload.media,
+                upload.bucket,
+                False,
+                context,
+            )
+            upload.blob = blob
+            db.insert_object(
+                upload.bucket.name,
+                blob,
+                context=context,
+                preconditions=upload.preconditions,
+            )
+            yield storage_pb2.BidiWriteObjectResponse(resource=blob.metadata)
+        else:
+            if not is_resumable:
+                return testbench.error.missing("finish_write in request", context)
+
     def resumable_status_rest(self, override_308=False):
         response = flask.make_response()
         if len(self.media) > 1 and not self.complete:
diff --git a/google/iam/v1/iam_policy_pb2.py b/google/iam/v1/iam_policy_pb2.py
index a4c6b1f..31910fd 100644
--- a/google/iam/v1/iam_policy_pb2.py
+++ b/google/iam/v1/iam_policy_pb2.py
@@ -20,7 +20,7 @@ from google.iam.v1 import policy_pb2 as google_dot_iam_dot_v1_dot_policy__pb2
 from google.protobuf import field_mask_pb2 as google_dot_protobuf_dot_field__mask__pb2
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1egoogle/iam/v1/iam_policy.proto\x12\rgoogle.iam.v1\x1a\x1cgoogle/api/annotations.proto\x1a\x17google/api/client.proto\x1a\x1fgoogle/api/field_behavior.proto\x1a\x19google/api/resource.proto\x1a\x1bgoogle/iam/v1/options.proto\x1a\x1agoogle/iam/v1/policy.proto\x1a google/protobuf/field_mask.proto\"\x91\x01\n\x13SetIamPolicyRequest\x12\x1c\n\x08resource\x18\x01 \x01(\tB\n\xe2\x41\x01\x02\xfa\x41\x03\n\x01*\x12+\n\x06policy\x18\x02 \x01(\x0b\x32\x15.google.iam.v1.PolicyB\x04\xe2\x41\x01\x02\x12/\n\x0bupdate_mask\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\"e\n\x13GetIamPolicyRequest\x12\x1c\n\x08resource\x18\x01 \x01(\tB\n\xe2\x41\x01\x02\xfa\x41\x03\n\x01*\x12\x30\n\x07options\x18\x02 \x01(\x0b\x32\x1f.google.iam.v1.GetPolicyOptions\"T\n\x19TestIamPermissionsRequest\x12\x1c\n\x08resource\x18\x01 \x01(\tB\n\xe2\x41\x01\x02\xfa\x41\x03\n\x01*\x12\x19\n\x0bpermissions\x18\x02 \x03(\tB\x04\xe2\x41\x01\x02\"1\n\x1aTestIamPermissionsResponse\x12\x13\n\x0bpermissions\x18\x01 \x03(\t2\xb4\x03\n\tIAMPolicy\x12t\n\x0cSetIamPolicy\x12\".google.iam.v1.SetIamPolicyRequest\x1a\x15.google.iam.v1.Policy\")\x82\xd3\xe4\x93\x02#\"\x1e/v1/{resource=**}:setIamPolicy:\x01*\x12t\n\x0cGetIamPolicy\x12\".google.iam.v1.GetIamPolicyRequest\x1a\x15.google.iam.v1.Policy\")\x82\xd3\xe4\x93\x02#\"\x1e/v1/{resource=**}:getIamPolicy:\x01*\x12\x9a\x01\n\x12TestIamPermissions\x12(.google.iam.v1.TestIamPermissionsRequest\x1a).google.iam.v1.TestIamPermissionsResponse\"/\x82\xd3\xe4\x93\x02)\"$/v1/{resource=**}:testIamPermissions:\x01*\x1a\x1e\xca\x41\x1biam-meta-api.googleapis.comB\x7f\n\x11\x63om.google.iam.v1B\x0eIamPolicyProtoP\x01Z)cloud.google.com/go/iam/apiv1/iampb;iampb\xf8\x01\x01\xaa\x02\x13Google.Cloud.Iam.V1\xca\x02\x13Google\\Cloud\\Iam\\V1b\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1egoogle/iam/v1/iam_policy.proto\x12\rgoogle.iam.v1\x1a\x1cgoogle/api/annotations.proto\x1a\x17google/api/client.proto\x1a\x1fgoogle/api/field_behavior.proto\x1a\x19google/api/resource.proto\x1a\x1bgoogle/iam/v1/options.proto\x1a\x1agoogle/iam/v1/policy.proto\x1a google/protobuf/field_mask.proto\"\x8f\x01\n\x13SetIamPolicyRequest\x12\x1b\n\x08resource\x18\x01 \x01(\tB\t\xe0\x41\x02\xfa\x41\x03\n\x01*\x12*\n\x06policy\x18\x02 \x01(\x0b\x32\x15.google.iam.v1.PolicyB\x03\xe0\x41\x02\x12/\n\x0bupdate_mask\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\"d\n\x13GetIamPolicyRequest\x12\x1b\n\x08resource\x18\x01 \x01(\tB\t\xe0\x41\x02\xfa\x41\x03\n\x01*\x12\x30\n\x07options\x18\x02 \x01(\x0b\x32\x1f.google.iam.v1.GetPolicyOptions\"R\n\x19TestIamPermissionsRequest\x12\x1b\n\x08resource\x18\x01 \x01(\tB\t\xe0\x41\x02\xfa\x41\x03\n\x01*\x12\x18\n\x0bpermissions\x18\x02 \x03(\tB\x03\xe0\x41\x02\"1\n\x1aTestIamPermissionsResponse\x12\x13\n\x0bpermissions\x18\x01 \x03(\t2\xb4\x03\n\tIAMPolicy\x12t\n\x0cSetIamPolicy\x12\".google.iam.v1.SetIamPolicyRequest\x1a\x15.google.iam.v1.Policy\")\x82\xd3\xe4\x93\x02#\"\x1e/v1/{resource=**}:setIamPolicy:\x01*\x12t\n\x0cGetIamPolicy\x12\".google.iam.v1.GetIamPolicyRequest\x1a\x15.google.iam.v1.Policy\")\x82\xd3\xe4\x93\x02#\"\x1e/v1/{resource=**}:getIamPolicy:\x01*\x12\x9a\x01\n\x12TestIamPermissions\x12(.google.iam.v1.TestIamPermissionsRequest\x1a).google.iam.v1.TestIamPermissionsResponse\"/\x82\xd3\xe4\x93\x02)\"$/v1/{resource=**}:testIamPermissions:\x01*\x1a\x1e\xca\x41\x1biam-meta-api.googleapis.comB\x7f\n\x11\x63om.google.iam.v1B\x0eIamPolicyProtoP\x01Z)cloud.google.com/go/iam/apiv1/iampb;iampb\xf8\x01\x01\xaa\x02\x13Google.Cloud.Iam.V1\xca\x02\x13Google\\Cloud\\Iam\\V1b\x06proto3')
 
 _globals = globals()
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -29,15 +29,15 @@ if _descriptor._USE_C_DESCRIPTORS == False:
   DESCRIPTOR._options = None
   DESCRIPTOR._serialized_options = b'\n\021com.google.iam.v1B\016IamPolicyProtoP\001Z)cloud.google.com/go/iam/apiv1/iampb;iampb\370\001\001\252\002\023Google.Cloud.Iam.V1\312\002\023Google\\Cloud\\Iam\\V1'
   _SETIAMPOLICYREQUEST.fields_by_name['resource']._options = None
-  _SETIAMPOLICYREQUEST.fields_by_name['resource']._serialized_options = b'\342A\001\002\372A\003\n\001*'
+  _SETIAMPOLICYREQUEST.fields_by_name['resource']._serialized_options = b'\340A\002\372A\003\n\001*'
   _SETIAMPOLICYREQUEST.fields_by_name['policy']._options = None
-  _SETIAMPOLICYREQUEST.fields_by_name['policy']._serialized_options = b'\342A\001\002'
+  _SETIAMPOLICYREQUEST.fields_by_name['policy']._serialized_options = b'\340A\002'
   _GETIAMPOLICYREQUEST.fields_by_name['resource']._options = None
-  _GETIAMPOLICYREQUEST.fields_by_name['resource']._serialized_options = b'\342A\001\002\372A\003\n\001*'
+  _GETIAMPOLICYREQUEST.fields_by_name['resource']._serialized_options = b'\340A\002\372A\003\n\001*'
   _TESTIAMPERMISSIONSREQUEST.fields_by_name['resource']._options = None
-  _TESTIAMPERMISSIONSREQUEST.fields_by_name['resource']._serialized_options = b'\342A\001\002\372A\003\n\001*'
+  _TESTIAMPERMISSIONSREQUEST.fields_by_name['resource']._serialized_options = b'\340A\002\372A\003\n\001*'
   _TESTIAMPERMISSIONSREQUEST.fields_by_name['permissions']._options = None
-  _TESTIAMPERMISSIONSREQUEST.fields_by_name['permissions']._serialized_options = b'\342A\001\002'
+  _TESTIAMPERMISSIONSREQUEST.fields_by_name['permissions']._serialized_options = b'\340A\002'
   _IAMPOLICY._options = None
   _IAMPOLICY._serialized_options = b'\312A\033iam-meta-api.googleapis.com'
   _IAMPOLICY.methods_by_name['SetIamPolicy']._options = None
@@ -47,13 +47,13 @@ if _descriptor._USE_C_DESCRIPTORS == False:
   _IAMPOLICY.methods_by_name['TestIamPermissions']._options = None
   _IAMPOLICY.methods_by_name['TestIamPermissions']._serialized_options = b'\202\323\344\223\002)\"$/v1/{resource=**}:testIamPermissions:\001*'
   _globals['_SETIAMPOLICYREQUEST']._serialized_start=256
-  _globals['_SETIAMPOLICYREQUEST']._serialized_end=401
-  _globals['_GETIAMPOLICYREQUEST']._serialized_start=403
-  _globals['_GETIAMPOLICYREQUEST']._serialized_end=504
-  _globals['_TESTIAMPERMISSIONSREQUEST']._serialized_start=506
-  _globals['_TESTIAMPERMISSIONSREQUEST']._serialized_end=590
-  _globals['_TESTIAMPERMISSIONSRESPONSE']._serialized_start=592
-  _globals['_TESTIAMPERMISSIONSRESPONSE']._serialized_end=641
-  _globals['_IAMPOLICY']._serialized_start=644
-  _globals['_IAMPOLICY']._serialized_end=1080
+  _globals['_SETIAMPOLICYREQUEST']._serialized_end=399
+  _globals['_GETIAMPOLICYREQUEST']._serialized_start=401
+  _globals['_GETIAMPOLICYREQUEST']._serialized_end=501
+  _globals['_TESTIAMPERMISSIONSREQUEST']._serialized_start=503
+  _globals['_TESTIAMPERMISSIONSREQUEST']._serialized_end=585
+  _globals['_TESTIAMPERMISSIONSRESPONSE']._serialized_start=587
+  _globals['_TESTIAMPERMISSIONSRESPONSE']._serialized_end=636
+  _globals['_IAMPOLICY']._serialized_start=639
+  _globals['_IAMPOLICY']._serialized_end=1075
 # @@protoc_insertion_point(module_scope)
diff --git a/google/storage/v2/storage_pb2.py b/google/storage/v2/storage_pb2.py
index 4aef445..562b35b 100644
--- a/google/storage/v2/storage_pb2.py
+++ b/google/storage/v2/storage_pb2.py
@@ -24,7 +24,7 @@ from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__
 from google.type import date_pb2 as google_dot_type_dot_date__pb2
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fgoogle/storage/v2/storage.proto\x12\x11google.storage.v2\x1a\x17google/api/client.proto\x1a\x1fgoogle/api/field_behavior.proto\x1a\x19google/api/resource.proto\x1a\x18google/api/routing.proto\x1a\x1egoogle/iam/v1/iam_policy.proto\x1a\x1agoogle/iam/v1/policy.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x16google/type/date.proto\"\xd7\x01\n\x13\x44\x65leteBucketRequest\x12\x34\n\x04name\x18\x01 \x01(\tB&\xe2\x41\x01\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12$\n\x17if_metageneration_match\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x03 \x01(\x03H\x01\x88\x01\x01\x42\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_match\"\x96\x02\n\x10GetBucketRequest\x12\x34\n\x04name\x18\x01 \x01(\tB&\xe2\x41\x01\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12$\n\x17if_metageneration_match\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x03 \x01(\x03H\x01\x88\x01\x01\x12\x32\n\tread_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x02\x88\x01\x01\x42\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x0c\n\n_read_mask\"\xd0\x01\n\x13\x43reateBucketRequest\x12\x36\n\x06parent\x18\x01 \x01(\tB&\xe2\x41\x01\x02\xfa\x41\x1f\x12\x1dstorage.googleapis.com/Bucket\x12)\n\x06\x62ucket\x18\x02 \x01(\x0b\x32\x19.google.storage.v2.Bucket\x12\x17\n\tbucket_id\x18\x03 \x01(\tB\x04\xe2\x41\x01\x02\x12\x16\n\x0epredefined_acl\x18\x06 \x01(\t\x12%\n\x1dpredefined_default_object_acl\x18\x07 \x01(\t\"\xc5\x01\n\x12ListBucketsRequest\x12\x36\n\x06parent\x18\x01 \x01(\tB&\xe2\x41\x01\x02\xfa\x41\x1f\x12\x1dstorage.googleapis.com/Bucket\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x12\n\npage_token\x18\x03 \x01(\t\x12\x0e\n\x06prefix\x18\x04 \x01(\t\x12\x32\n\tread_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x00\x88\x01\x01\x42\x0c\n\n_read_mask\"Z\n\x13ListBucketsResponse\x12*\n\x07\x62uckets\x18\x01 \x03(\x0b\x32\x19.google.storage.v2.Bucket\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"\x81\x01\n LockBucketRetentionPolicyRequest\x12\x36\n\x06\x62ucket\x18\x01 \x01(\tB&\xe2\x41\x01\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12%\n\x17if_metageneration_match\x18\x02 \x01(\x03\x42\x04\xe2\x41\x01\x02\"\xc8\x02\n\x13UpdateBucketRequest\x12/\n\x06\x62ucket\x18\x01 \x01(\x0b\x32\x19.google.storage.v2.BucketB\x04\xe2\x41\x01\x02\x12$\n\x17if_metageneration_match\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x03 \x01(\x03H\x01\x88\x01\x01\x12\x16\n\x0epredefined_acl\x18\x08 \x01(\t\x12%\n\x1dpredefined_default_object_acl\x18\t \x01(\t\x12\x35\n\x0bupdate_mask\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\x04\xe2\x41\x01\x02\x42\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_match\"c\n\x1f\x44\x65leteNotificationConfigRequest\x12@\n\x04name\x18\x01 \x01(\tB2\xe2\x41\x01\x02\xfa\x41+\n)storage.googleapis.com/NotificationConfig\"`\n\x1cGetNotificationConfigRequest\x12@\n\x04name\x18\x01 \x01(\tB2\xe2\x41\x01\x02\xfa\x41+\n)storage.googleapis.com/NotificationConfig\"\xaf\x01\n\x1f\x43reateNotificationConfigRequest\x12\x42\n\x06parent\x18\x01 \x01(\tB2\xe2\x41\x01\x02\xfa\x41+\x12)storage.googleapis.com/NotificationConfig\x12H\n\x13notification_config\x18\x02 \x01(\x0b\x32%.google.storage.v2.NotificationConfigB\x04\xe2\x41\x01\x02\"\x8b\x01\n\x1eListNotificationConfigsRequest\x12\x42\n\x06parent\x18\x01 \x01(\tB2\xe2\x41\x01\x02\xfa\x41+\x12)storage.googleapis.com/NotificationConfig\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x12\n\npage_token\x18\x03 \x01(\t\"\x7f\n\x1fListNotificationConfigsResponse\x12\x43\n\x14notification_configs\x18\x01 \x03(\x0b\x32%.google.storage.v2.NotificationConfig\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"\xf7\x05\n\x14\x43omposeObjectRequest\x12\x34\n\x0b\x64\x65stination\x18\x01 \x01(\x0b\x32\x19.google.storage.v2.ObjectB\x04\xe2\x41\x01\x02\x12L\n\x0esource_objects\x18\x02 \x03(\x0b\x32\x34.google.storage.v2.ComposeObjectRequest.SourceObject\x12\"\n\x1a\x64\x65stination_predefined_acl\x18\t \x01(\t\x12 \n\x13if_generation_match\x18\x04 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x05 \x01(\x03H\x01\x88\x01\x01\x12\x37\n\x07kms_key\x18\x06 \x01(\tB&\xfa\x41#\n!cloudkms.googleapis.com/CryptoKey\x12R\n\x1c\x63ommon_object_request_params\x18\x07 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParams\x12<\n\x10object_checksums\x18\n \x01(\x0b\x32\".google.storage.v2.ObjectChecksums\x1a\xef\x01\n\x0cSourceObject\x12\x12\n\x04name\x18\x01 \x01(\tB\x04\xe2\x41\x01\x02\x12\x12\n\ngeneration\x18\x02 \x01(\x03\x12\x66\n\x14object_preconditions\x18\x03 \x01(\x0b\x32H.google.storage.v2.ComposeObjectRequest.SourceObject.ObjectPreconditions\x1aO\n\x13ObjectPreconditions\x12 \n\x13if_generation_match\x18\x01 \x01(\x03H\x00\x88\x01\x01\x42\x16\n\x14_if_generation_matchB\x16\n\x14_if_generation_matchB\x1a\n\x18_if_metageneration_match\"\xd3\x03\n\x13\x44\x65leteObjectRequest\x12\x36\n\x06\x62ucket\x18\x01 \x01(\tB&\xe2\x41\x01\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x14\n\x06object\x18\x02 \x01(\tB\x04\xe2\x41\x01\x02\x12\x12\n\ngeneration\x18\x04 \x01(\x03\x12 \n\x13if_generation_match\x18\x05 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x06 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x07 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x08 \x01(\x03H\x03\x88\x01\x01\x12R\n\x1c\x63ommon_object_request_params\x18\n \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_match\"\x8c\x04\n\x14RestoreObjectRequest\x12\x36\n\x06\x62ucket\x18\x01 \x01(\tB&\xe2\x41\x01\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x14\n\x06object\x18\x02 \x01(\tB\x04\xe2\x41\x01\x02\x12\x18\n\ngeneration\x18\x03 \x01(\x03\x42\x04\xe2\x41\x01\x02\x12 \n\x13if_generation_match\x18\x04 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x05 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x06 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x07 \x01(\x03H\x03\x88\x01\x01\x12\x1c\n\x0f\x63opy_source_acl\x18\t \x01(\x08H\x04\x88\x01\x01\x12R\n\x1c\x63ommon_object_request_params\x18\x08 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x12\n\x10_copy_source_acl\"6\n\x1b\x43\x61ncelResumableWriteRequest\x12\x17\n\tupload_id\x18\x01 \x01(\tB\x04\xe2\x41\x01\x02\"\x1e\n\x1c\x43\x61ncelResumableWriteResponse\"\xbc\x04\n\x11ReadObjectRequest\x12\x36\n\x06\x62ucket\x18\x01 \x01(\tB&\xe2\x41\x01\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x14\n\x06object\x18\x02 \x01(\tB\x04\xe2\x41\x01\x02\x12\x12\n\ngeneration\x18\x03 \x01(\x03\x12\x13\n\x0bread_offset\x18\x04 \x01(\x03\x12\x12\n\nread_limit\x18\x05 \x01(\x03\x12 \n\x13if_generation_match\x18\x06 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x07 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x08 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\t \x01(\x03H\x03\x88\x01\x01\x12R\n\x1c\x63ommon_object_request_params\x18\n \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParams\x12\x32\n\tread_mask\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x04\x88\x01\x01\x42\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x0c\n\n_read_mask\"\xbe\x04\n\x10GetObjectRequest\x12\x36\n\x06\x62ucket\x18\x01 \x01(\tB&\xe2\x41\x01\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x14\n\x06object\x18\x02 \x01(\tB\x04\xe2\x41\x01\x02\x12\x12\n\ngeneration\x18\x03 \x01(\x03\x12\x19\n\x0csoft_deleted\x18\x0b \x01(\x08H\x00\x88\x01\x01\x12 \n\x13if_generation_match\x18\x04 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x05 \x01(\x03H\x02\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x06 \x01(\x03H\x03\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x07 \x01(\x03H\x04\x88\x01\x01\x12R\n\x1c\x63ommon_object_request_params\x18\x08 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParams\x12\x32\n\tread_mask\x18\n \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x05\x88\x01\x01\x42\x0f\n\r_soft_deletedB\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x0c\n\n_read_mask\"\xf5\x01\n\x12ReadObjectResponse\x12<\n\x10\x63hecksummed_data\x18\x01 \x01(\x0b\x32\".google.storage.v2.ChecksummedData\x12<\n\x10object_checksums\x18\x02 \x01(\x0b\x32\".google.storage.v2.ObjectChecksums\x12\x36\n\rcontent_range\x18\x03 \x01(\x0b\x32\x1f.google.storage.v2.ContentRange\x12+\n\x08metadata\x18\x04 \x01(\x0b\x32\x19.google.storage.v2.Object\"\x8e\x03\n\x0fWriteObjectSpec\x12\x31\n\x08resource\x18\x01 \x01(\x0b\x32\x19.google.storage.v2.ObjectB\x04\xe2\x41\x01\x02\x12\x16\n\x0epredefined_acl\x18\x07 \x01(\t\x12 \n\x13if_generation_match\x18\x03 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x04 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x05 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x06 \x01(\x03H\x03\x88\x01\x01\x12\x18\n\x0bobject_size\x18\x08 \x01(\x03H\x04\x88\x01\x01\x42\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x0e\n\x0c_object_size\"\x87\x03\n\x12WriteObjectRequest\x12\x13\n\tupload_id\x18\x01 \x01(\tH\x00\x12?\n\x11write_object_spec\x18\x02 \x01(\x0b\x32\".google.storage.v2.WriteObjectSpecH\x00\x12\x1a\n\x0cwrite_offset\x18\x03 \x01(\x03\x42\x04\xe2\x41\x01\x02\x12>\n\x10\x63hecksummed_data\x18\x04 \x01(\x0b\x32\".google.storage.v2.ChecksummedDataH\x01\x12<\n\x10object_checksums\x18\x06 \x01(\x0b\x32\".google.storage.v2.ObjectChecksums\x12\x14\n\x0c\x66inish_write\x18\x07 \x01(\x08\x12R\n\x1c\x63ommon_object_request_params\x18\x08 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x0f\n\rfirst_messageB\x06\n\x04\x64\x61ta\"n\n\x13WriteObjectResponse\x12\x18\n\x0epersisted_size\x18\x01 \x01(\x03H\x00\x12-\n\x08resource\x18\x02 \x01(\x0b\x32\x19.google.storage.v2.ObjectH\x00\x42\x0e\n\x0cwrite_status\"\xb0\x03\n\x16\x42idiWriteObjectRequest\x12\x13\n\tupload_id\x18\x01 \x01(\tH\x00\x12?\n\x11write_object_spec\x18\x02 \x01(\x0b\x32\".google.storage.v2.WriteObjectSpecH\x00\x12\x1a\n\x0cwrite_offset\x18\x03 \x01(\x03\x42\x04\xe2\x41\x01\x02\x12>\n\x10\x63hecksummed_data\x18\x04 \x01(\x0b\x32\".google.storage.v2.ChecksummedDataH\x01\x12<\n\x10object_checksums\x18\x06 \x01(\x0b\x32\".google.storage.v2.ObjectChecksums\x12\x14\n\x0cstate_lookup\x18\x07 \x01(\x08\x12\r\n\x05\x66lush\x18\x08 \x01(\x08\x12\x14\n\x0c\x66inish_write\x18\t \x01(\x08\x12R\n\x1c\x63ommon_object_request_params\x18\n \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x0f\n\rfirst_messageB\x06\n\x04\x64\x61ta\"r\n\x17\x42idiWriteObjectResponse\x12\x18\n\x0epersisted_size\x18\x01 \x01(\x03H\x00\x12-\n\x08resource\x18\x02 \x01(\x0b\x32\x19.google.storage.v2.ObjectH\x00\x42\x0e\n\x0cwrite_status\"\x88\x03\n\x12ListObjectsRequest\x12\x36\n\x06parent\x18\x01 \x01(\tB&\xe2\x41\x01\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x12\n\npage_token\x18\x03 \x01(\t\x12\x11\n\tdelimiter\x18\x04 \x01(\t\x12\"\n\x1ainclude_trailing_delimiter\x18\x05 \x01(\x08\x12\x0e\n\x06prefix\x18\x06 \x01(\t\x12\x10\n\x08versions\x18\x07 \x01(\x08\x12\x32\n\tread_mask\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x00\x88\x01\x01\x12!\n\x13lexicographic_start\x18\n \x01(\tB\x04\xe2\x41\x01\x01\x12\x1f\n\x11lexicographic_end\x18\x0b \x01(\tB\x04\xe2\x41\x01\x01\x12\x1a\n\x0csoft_deleted\x18\x0c \x01(\x08\x42\x04\xe2\x41\x01\x01\x12\x18\n\nmatch_glob\x18\x0e \x01(\tB\x04\xe2\x41\x01\x01\x42\x0c\n\n_read_mask\"\x86\x01\n\x17QueryWriteStatusRequest\x12\x17\n\tupload_id\x18\x01 \x01(\tB\x04\xe2\x41\x01\x02\x12R\n\x1c\x63ommon_object_request_params\x18\x02 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParams\"s\n\x18QueryWriteStatusResponse\x12\x18\n\x0epersisted_size\x18\x01 \x01(\x03H\x00\x12-\n\x08resource\x18\x02 \x01(\x0b\x32\x19.google.storage.v2.ObjectH\x00\x42\x0e\n\x0cwrite_status\"\xa8\n\n\x14RewriteObjectRequest\x12\x1f\n\x10\x64\x65stination_name\x18\x18 \x01(\tB\x05\xe2\x41\x02\x02\x05\x12\x43\n\x12\x64\x65stination_bucket\x18\x19 \x01(\tB\'\xe2\x41\x02\x02\x05\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x43\n\x13\x64\x65stination_kms_key\x18\x1b \x01(\tB&\xfa\x41#\n!cloudkms.googleapis.com/CryptoKey\x12.\n\x0b\x64\x65stination\x18\x01 \x01(\x0b\x32\x19.google.storage.v2.Object\x12=\n\rsource_bucket\x18\x02 \x01(\tB&\xe2\x41\x01\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x1b\n\rsource_object\x18\x03 \x01(\tB\x04\xe2\x41\x01\x02\x12\x19\n\x11source_generation\x18\x04 \x01(\x03\x12\x15\n\rrewrite_token\x18\x05 \x01(\t\x12\"\n\x1a\x64\x65stination_predefined_acl\x18\x1c \x01(\t\x12 \n\x13if_generation_match\x18\x07 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x08 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\t \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\n \x01(\x03H\x03\x88\x01\x01\x12\'\n\x1aif_source_generation_match\x18\x0b \x01(\x03H\x04\x88\x01\x01\x12+\n\x1eif_source_generation_not_match\x18\x0c \x01(\x03H\x05\x88\x01\x01\x12+\n\x1eif_source_metageneration_match\x18\r \x01(\x03H\x06\x88\x01\x01\x12/\n\"if_source_metageneration_not_match\x18\x0e \x01(\x03H\x07\x88\x01\x01\x12$\n\x1cmax_bytes_rewritten_per_call\x18\x0f \x01(\x03\x12(\n copy_source_encryption_algorithm\x18\x10 \x01(\t\x12(\n copy_source_encryption_key_bytes\x18\x15 \x01(\x0c\x12/\n\'copy_source_encryption_key_sha256_bytes\x18\x16 \x01(\x0c\x12R\n\x1c\x63ommon_object_request_params\x18\x13 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParams\x12<\n\x10object_checksums\x18\x1d \x01(\x0b\x32\".google.storage.v2.ObjectChecksumsB\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x1d\n\x1b_if_source_generation_matchB!\n\x1f_if_source_generation_not_matchB!\n\x1f_if_source_metageneration_matchB%\n#_if_source_metageneration_not_match\"\x97\x01\n\x0fRewriteResponse\x12\x1d\n\x15total_bytes_rewritten\x18\x01 \x01(\x03\x12\x13\n\x0bobject_size\x18\x02 \x01(\x03\x12\x0c\n\x04\x64one\x18\x03 \x01(\x08\x12\x15\n\rrewrite_token\x18\x04 \x01(\t\x12+\n\x08resource\x18\x05 \x01(\x0b\x32\x19.google.storage.v2.Object\"\xf3\x01\n\x1aStartResumableWriteRequest\x12\x43\n\x11write_object_spec\x18\x01 \x01(\x0b\x32\".google.storage.v2.WriteObjectSpecB\x04\xe2\x41\x01\x02\x12R\n\x1c\x63ommon_object_request_params\x18\x03 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParams\x12<\n\x10object_checksums\x18\x05 \x01(\x0b\x32\".google.storage.v2.ObjectChecksums\"0\n\x1bStartResumableWriteResponse\x12\x11\n\tupload_id\x18\x01 \x01(\t\"\xf1\x03\n\x13UpdateObjectRequest\x12/\n\x06object\x18\x01 \x01(\x0b\x32\x19.google.storage.v2.ObjectB\x04\xe2\x41\x01\x02\x12 \n\x13if_generation_match\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x03 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x04 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x05 \x01(\x03H\x03\x88\x01\x01\x12\x16\n\x0epredefined_acl\x18\n \x01(\t\x12\x35\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\x04\xe2\x41\x01\x02\x12R\n\x1c\x63ommon_object_request_params\x18\x08 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_match\"a\n\x18GetServiceAccountRequest\x12\x45\n\x07project\x18\x01 \x01(\tB4\xe2\x41\x01\x02\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\"\x82\x01\n\x14\x43reateHmacKeyRequest\x12\x45\n\x07project\x18\x01 \x01(\tB4\xe2\x41\x01\x02\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\x12#\n\x15service_account_email\x18\x02 \x01(\tB\x04\xe2\x41\x01\x02\"g\n\x15\x43reateHmacKeyResponse\x12\x34\n\x08metadata\x18\x01 \x01(\x0b\x32\".google.storage.v2.HmacKeyMetadata\x12\x18\n\x10secret_key_bytes\x18\x03 \x01(\x0c\"v\n\x14\x44\x65leteHmacKeyRequest\x12\x17\n\taccess_id\x18\x01 \x01(\tB\x04\xe2\x41\x01\x02\x12\x45\n\x07project\x18\x02 \x01(\tB4\xe2\x41\x01\x02\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\"s\n\x11GetHmacKeyRequest\x12\x17\n\taccess_id\x18\x01 \x01(\tB\x04\xe2\x41\x01\x02\x12\x45\n\x07project\x18\x02 \x01(\tB4\xe2\x41\x01\x02\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\"\xbd\x01\n\x13ListHmacKeysRequest\x12\x45\n\x07project\x18\x01 \x01(\tB4\xe2\x41\x01\x02\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x12\n\npage_token\x18\x03 \x01(\t\x12\x1d\n\x15service_account_email\x18\x04 \x01(\t\x12\x19\n\x11show_deleted_keys\x18\x05 \x01(\x08\"f\n\x14ListHmacKeysResponse\x12\x35\n\thmac_keys\x18\x01 \x03(\x0b\x32\".google.storage.v2.HmacKeyMetadata\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"\x83\x01\n\x14UpdateHmacKeyRequest\x12:\n\x08hmac_key\x18\x01 \x01(\x0b\x32\".google.storage.v2.HmacKeyMetadataB\x04\xe2\x41\x01\x02\x12/\n\x0bupdate_mask\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\"|\n\x19\x43ommonObjectRequestParams\x12\x1c\n\x14\x65ncryption_algorithm\x18\x01 \x01(\t\x12\x1c\n\x14\x65ncryption_key_bytes\x18\x04 \x01(\x0c\x12#\n\x1b\x65ncryption_key_sha256_bytes\x18\x05 \x01(\x0c\"\xca\x05\n\x10ServiceConstants\"\xb5\x05\n\x06Values\x12\x16\n\x12VALUES_UNSPECIFIED\x10\x00\x12\x1b\n\x14MAX_READ_CHUNK_BYTES\x10\x80\x80\x80\x01\x12\x1c\n\x15MAX_WRITE_CHUNK_BYTES\x10\x80\x80\x80\x01\x12\x19\n\x12MAX_OBJECT_SIZE_MB\x10\x80\x80\xc0\x02\x12)\n$MAX_CUSTOM_METADATA_FIELD_NAME_BYTES\x10\x80\x08\x12*\n%MAX_CUSTOM_METADATA_FIELD_VALUE_BYTES\x10\x80 \x12)\n$MAX_CUSTOM_METADATA_TOTAL_SIZE_BYTES\x10\x80@\x12*\n$MAX_BUCKET_METADATA_TOTAL_SIZE_BYTES\x10\x80\xa0\x01\x12\'\n#MAX_NOTIFICATION_CONFIGS_PER_BUCKET\x10\x64\x12\"\n\x1eMAX_LIFECYCLE_RULES_PER_BUCKET\x10\x64\x12&\n\"MAX_NOTIFICATION_CUSTOM_ATTRIBUTES\x10\x05\x12\x31\n,MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_KEY_LENGTH\x10\x80\x02\x12\x33\n.MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_VALUE_LENGTH\x10\x80\x08\x12\x1c\n\x18MAX_LABELS_ENTRIES_COUNT\x10@\x12\x1f\n\x1bMAX_LABELS_KEY_VALUE_LENGTH\x10?\x12\x1f\n\x1aMAX_LABELS_KEY_VALUE_BYTES\x10\x80\x01\x12.\n)MAX_OBJECT_IDS_PER_DELETE_OBJECTS_REQUEST\x10\xe8\x07\x12\x1e\n\x1aSPLIT_TOKEN_MAX_VALID_DAYS\x10\x0e\x1a\x02\x10\x01\"\x99\x1b\n\x06\x42ucket\x12\x12\n\x04name\x18\x01 \x01(\tB\x04\xe2\x41\x01\x05\x12\x17\n\tbucket_id\x18\x02 \x01(\tB\x04\xe2\x41\x01\x03\x12\x0c\n\x04\x65tag\x18\x1d \x01(\t\x12\x45\n\x07project\x18\x03 \x01(\tB4\xe2\x41\x01\x05\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\x12\x1c\n\x0emetageneration\x18\x04 \x01(\x03\x42\x04\xe2\x41\x01\x03\x12\x16\n\x08location\x18\x05 \x01(\tB\x04\xe2\x41\x01\x05\x12\x1b\n\rlocation_type\x18\x06 \x01(\tB\x04\xe2\x41\x01\x03\x12\x15\n\rstorage_class\x18\x07 \x01(\t\x12\x0b\n\x03rpo\x18\x1b \x01(\t\x12\x33\n\x03\x61\x63l\x18\x08 \x03(\x0b\x32&.google.storage.v2.BucketAccessControl\x12\x42\n\x12\x64\x65\x66\x61ult_object_acl\x18\t \x03(\x0b\x32&.google.storage.v2.ObjectAccessControl\x12\x36\n\tlifecycle\x18\n \x01(\x0b\x32#.google.storage.v2.Bucket.Lifecycle\x12\x35\n\x0b\x63reate_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x04\xe2\x41\x01\x03\x12,\n\x04\x63ors\x18\x0c \x03(\x0b\x32\x1e.google.storage.v2.Bucket.Cors\x12\x35\n\x0bupdate_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x04\xe2\x41\x01\x03\x12 \n\x18\x64\x65\x66\x61ult_event_based_hold\x18\x0e \x01(\x08\x12\x35\n\x06labels\x18\x0f \x03(\x0b\x32%.google.storage.v2.Bucket.LabelsEntry\x12\x32\n\x07website\x18\x10 \x01(\x0b\x32!.google.storage.v2.Bucket.Website\x12\x38\n\nversioning\x18\x11 \x01(\x0b\x32$.google.storage.v2.Bucket.Versioning\x12\x32\n\x07logging\x18\x12 \x01(\x0b\x32!.google.storage.v2.Bucket.Logging\x12-\n\x05owner\x18\x13 \x01(\x0b\x32\x18.google.storage.v2.OwnerB\x04\xe2\x41\x01\x03\x12\x38\n\nencryption\x18\x14 \x01(\x0b\x32$.google.storage.v2.Bucket.Encryption\x12\x32\n\x07\x62illing\x18\x15 \x01(\x0b\x32!.google.storage.v2.Bucket.Billing\x12\x43\n\x10retention_policy\x18\x16 \x01(\x0b\x32).google.storage.v2.Bucket.RetentionPolicy\x12\x37\n\niam_config\x18\x17 \x01(\x0b\x32#.google.storage.v2.Bucket.IamConfig\x12\x15\n\rsatisfies_pzs\x18\x19 \x01(\x08\x12P\n\x17\x63ustom_placement_config\x18\x1a \x01(\x0b\x32/.google.storage.v2.Bucket.CustomPlacementConfig\x12\x36\n\tautoclass\x18\x1c \x01(\x0b\x32#.google.storage.v2.Bucket.Autoclass\x12L\n\x12soft_delete_policy\x18\x1f \x01(\x0b\x32*.google.storage.v2.Bucket.SoftDeletePolicyB\x04\xe2\x41\x01\x01\x1a!\n\x07\x42illing\x12\x16\n\x0erequester_pays\x18\x01 \x01(\x08\x1aX\n\x04\x43ors\x12\x0e\n\x06origin\x18\x01 \x03(\t\x12\x0e\n\x06method\x18\x02 \x03(\t\x12\x17\n\x0fresponse_header\x18\x03 \x03(\t\x12\x17\n\x0fmax_age_seconds\x18\x04 \x01(\x05\x1aM\n\nEncryption\x12?\n\x0f\x64\x65\x66\x61ult_kms_key\x18\x01 \x01(\tB&\xfa\x41#\n!cloudkms.googleapis.com/CryptoKey\x1a\xec\x01\n\tIamConfig\x12\x61\n\x1buniform_bucket_level_access\x18\x01 \x01(\x0b\x32<.google.storage.v2.Bucket.IamConfig.UniformBucketLevelAccess\x12 \n\x18public_access_prevention\x18\x03 \x01(\t\x1aZ\n\x18UniformBucketLevelAccess\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12-\n\tlock_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1a\xf3\x05\n\tLifecycle\x12\x36\n\x04rule\x18\x01 \x03(\x0b\x32(.google.storage.v2.Bucket.Lifecycle.Rule\x1a\xad\x05\n\x04Rule\x12?\n\x06\x61\x63tion\x18\x01 \x01(\x0b\x32/.google.storage.v2.Bucket.Lifecycle.Rule.Action\x12\x45\n\tcondition\x18\x02 \x01(\x0b\x32\x32.google.storage.v2.Bucket.Lifecycle.Rule.Condition\x1a-\n\x06\x41\x63tion\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x15\n\rstorage_class\x18\x02 \x01(\t\x1a\xed\x03\n\tCondition\x12\x15\n\x08\x61ge_days\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12)\n\x0e\x63reated_before\x18\x02 \x01(\x0b\x32\x11.google.type.Date\x12\x14\n\x07is_live\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12\x1f\n\x12num_newer_versions\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12\x1d\n\x15matches_storage_class\x18\x05 \x03(\t\x12#\n\x16\x64\x61ys_since_custom_time\x18\x07 \x01(\x05H\x03\x88\x01\x01\x12-\n\x12\x63ustom_time_before\x18\x08 \x01(\x0b\x32\x11.google.type.Date\x12\'\n\x1a\x64\x61ys_since_noncurrent_time\x18\t \x01(\x05H\x04\x88\x01\x01\x12\x31\n\x16noncurrent_time_before\x18\n \x01(\x0b\x32\x11.google.type.Date\x12\x16\n\x0ematches_prefix\x18\x0b \x03(\t\x12\x16\n\x0ematches_suffix\x18\x0c \x03(\tB\x0b\n\t_age_daysB\n\n\x08_is_liveB\x15\n\x13_num_newer_versionsB\x19\n\x17_days_since_custom_timeB\x1d\n\x1b_days_since_noncurrent_time\x1a\x38\n\x07Logging\x12\x12\n\nlog_bucket\x18\x01 \x01(\t\x12\x19\n\x11log_object_prefix\x18\x02 \x01(\t\x1a\x8f\x01\n\x0fRetentionPolicy\x12\x32\n\x0e\x65\x66\x66\x65\x63tive_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x11\n\tis_locked\x18\x02 \x01(\x08\x12\x35\n\x12retention_duration\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\xb1\x01\n\x10SoftDeletePolicy\x12:\n\x12retention_duration\x18\x01 \x01(\x0b\x32\x19.google.protobuf.DurationH\x00\x88\x01\x01\x12\x37\n\x0e\x65\x66\x66\x65\x63tive_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x01\x88\x01\x01\x42\x15\n\x13_retention_durationB\x11\n\x0f_effective_time\x1a\x1d\n\nVersioning\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x1a;\n\x07Website\x12\x18\n\x10main_page_suffix\x18\x01 \x01(\t\x12\x16\n\x0enot_found_page\x18\x02 \x01(\t\x1a/\n\x15\x43ustomPlacementConfig\x12\x16\n\x0e\x64\x61ta_locations\x18\x01 \x03(\t\x1a\x8d\x02\n\tAutoclass\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x35\n\x0btoggle_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x04\xe2\x41\x01\x03\x12#\n\x16terminal_storage_class\x18\x03 \x01(\tH\x00\x88\x01\x01\x12Q\n\"terminal_storage_class_update_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x04\xe2\x41\x01\x03H\x01\x88\x01\x01\x42\x19\n\x17_terminal_storage_classB%\n#_terminal_storage_class_update_time\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01:G\xea\x41\x44\n\x1dstorage.googleapis.com/Bucket\x12#projects/{project}/buckets/{bucket}\"\xcf\x01\n\x13\x42ucketAccessControl\x12\x0c\n\x04role\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x0e\n\x06\x65ntity\x18\x03 \x01(\t\x12\x18\n\nentity_alt\x18\t \x01(\tB\x04\xe2\x41\x01\x03\x12\x11\n\tentity_id\x18\x04 \x01(\t\x12\x0c\n\x04\x65tag\x18\x08 \x01(\t\x12\r\n\x05\x65mail\x18\x05 \x01(\t\x12\x0e\n\x06\x64omain\x18\x06 \x01(\t\x12\x34\n\x0cproject_team\x18\x07 \x01(\x0b\x32\x1e.google.storage.v2.ProjectTeam\"J\n\x0f\x43hecksummedData\x12\x17\n\x07\x63ontent\x18\x01 \x01(\x0c\x42\x06\x08\x01\xe2\x41\x01\x01\x12\x13\n\x06\x63rc32c\x18\x02 \x01(\x07H\x00\x88\x01\x01\x42\t\n\x07_crc32c\"C\n\x0fObjectChecksums\x12\x13\n\x06\x63rc32c\x18\x01 \x01(\x07H\x00\x88\x01\x01\x12\x10\n\x08md5_hash\x18\x02 \x01(\x0c\x42\t\n\x07_crc32c\"\xb3\x02\n\x0fHmacKeyMetadata\x12\x10\n\x02id\x18\x01 \x01(\tB\x04\xe2\x41\x01\x05\x12\x17\n\taccess_id\x18\x02 \x01(\tB\x04\xe2\x41\x01\x05\x12\x45\n\x07project\x18\x03 \x01(\tB4\xe2\x41\x01\x05\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\x12#\n\x15service_account_email\x18\x04 \x01(\tB\x04\xe2\x41\x01\x03\x12\r\n\x05state\x18\x05 \x01(\t\x12\x35\n\x0b\x63reate_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x04\xe2\x41\x01\x03\x12\x35\n\x0bupdate_time\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x04\xe2\x41\x01\x03\x12\x0c\n\x04\x65tag\x18\x08 \x01(\t\"\xaa\x03\n\x12NotificationConfig\x12\x12\n\x04name\x18\x01 \x01(\tB\x04\xe2\x41\x01\x02\x12\x13\n\x05topic\x18\x02 \x01(\tB\x04\xe2\x41\x01\x02\x12\x0c\n\x04\x65tag\x18\x07 \x01(\t\x12\x13\n\x0b\x65vent_types\x18\x03 \x03(\t\x12V\n\x11\x63ustom_attributes\x18\x04 \x03(\x0b\x32;.google.storage.v2.NotificationConfig.CustomAttributesEntry\x12\x1a\n\x12object_name_prefix\x18\x05 \x01(\t\x12\x1c\n\x0epayload_format\x18\x06 \x01(\tB\x04\xe2\x41\x01\x02\x1a\x37\n\x15\x43ustomAttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01:}\xea\x41z\n)storage.googleapis.com/NotificationConfig\x12Mprojects/{project}/buckets/{bucket}/notificationConfigs/{notification_config}\"L\n\x12\x43ustomerEncryption\x12\x1c\n\x14\x65ncryption_algorithm\x18\x01 \x01(\t\x12\x18\n\x10key_sha256_bytes\x18\x03 \x01(\x0c\"\x8e\t\n\x06Object\x12\x12\n\x04name\x18\x01 \x01(\tB\x04\xe2\x41\x01\x05\x12\x36\n\x06\x62ucket\x18\x02 \x01(\tB&\xe2\x41\x01\x05\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x0c\n\x04\x65tag\x18\x1b \x01(\t\x12\x18\n\ngeneration\x18\x03 \x01(\x03\x42\x04\xe2\x41\x01\x05\x12\x1c\n\x0emetageneration\x18\x04 \x01(\x03\x42\x04\xe2\x41\x01\x03\x12\x15\n\rstorage_class\x18\x05 \x01(\t\x12\x12\n\x04size\x18\x06 \x01(\x03\x42\x04\xe2\x41\x01\x03\x12\x18\n\x10\x63ontent_encoding\x18\x07 \x01(\t\x12\x1b\n\x13\x63ontent_disposition\x18\x08 \x01(\t\x12\x15\n\rcache_control\x18\t \x01(\t\x12\x33\n\x03\x61\x63l\x18\n \x03(\x0b\x32&.google.storage.v2.ObjectAccessControl\x12\x18\n\x10\x63ontent_language\x18\x0b \x01(\t\x12\x35\n\x0b\x64\x65lete_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x04\xe2\x41\x01\x03\x12\x14\n\x0c\x63ontent_type\x18\r \x01(\t\x12\x35\n\x0b\x63reate_time\x18\x0e \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x04\xe2\x41\x01\x03\x12\x1d\n\x0f\x63omponent_count\x18\x0f \x01(\x05\x42\x04\xe2\x41\x01\x03\x12;\n\tchecksums\x18\x10 \x01(\x0b\x32\".google.storage.v2.ObjectChecksumsB\x04\xe2\x41\x01\x03\x12\x35\n\x0bupdate_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x04\xe2\x41\x01\x03\x12\x37\n\x07kms_key\x18\x12 \x01(\tB&\xfa\x41#\n!cloudkms.googleapis.com/CryptoKey\x12\x43\n\x19update_storage_class_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x04\xe2\x41\x01\x03\x12\x16\n\x0etemporary_hold\x18\x14 \x01(\x08\x12\x39\n\x15retention_expire_time\x18\x15 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x39\n\x08metadata\x18\x16 \x03(\x0b\x32\'.google.storage.v2.Object.MetadataEntry\x12\x1d\n\x10\x65vent_based_hold\x18\x17 \x01(\x08H\x00\x88\x01\x01\x12-\n\x05owner\x18\x18 \x01(\x0b\x32\x18.google.storage.v2.OwnerB\x04\xe2\x41\x01\x03\x12\x42\n\x13\x63ustomer_encryption\x18\x19 \x01(\x0b\x32%.google.storage.v2.CustomerEncryption\x12/\n\x0b\x63ustom_time\x18\x1a \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x13\n\x11_event_based_hold\"\xcf\x01\n\x13ObjectAccessControl\x12\x0c\n\x04role\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x0e\n\x06\x65ntity\x18\x03 \x01(\t\x12\x18\n\nentity_alt\x18\t \x01(\tB\x04\xe2\x41\x01\x03\x12\x11\n\tentity_id\x18\x04 \x01(\t\x12\x0c\n\x04\x65tag\x18\x08 \x01(\t\x12\r\n\x05\x65mail\x18\x05 \x01(\t\x12\x0e\n\x06\x64omain\x18\x06 \x01(\t\x12\x34\n\x0cproject_team\x18\x07 \x01(\x0b\x32\x1e.google.storage.v2.ProjectTeam\"l\n\x13ListObjectsResponse\x12*\n\x07objects\x18\x01 \x03(\x0b\x32\x19.google.storage.v2.Object\x12\x10\n\x08prefixes\x18\x02 \x03(\t\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\t\"3\n\x0bProjectTeam\x12\x16\n\x0eproject_number\x18\x01 \x01(\t\x12\x0c\n\x04team\x18\x02 \x01(\t\"\'\n\x0eServiceAccount\x12\x15\n\remail_address\x18\x01 \x01(\t\"*\n\x05Owner\x12\x0e\n\x06\x65ntity\x18\x01 \x01(\t\x12\x11\n\tentity_id\x18\x02 \x01(\t\"C\n\x0c\x43ontentRange\x12\r\n\x05start\x18\x01 \x01(\x03\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x03\x12\x17\n\x0f\x63omplete_length\x18\x03 \x01(\x03\x32\x98(\n\x07Storage\x12r\n\x0c\x44\x65leteBucket\x12&.google.storage.v2.DeleteBucketRequest\x1a\x16.google.protobuf.Empty\"\"\xda\x41\x04name\x8a\xd3\xe4\x93\x02\x15\x12\x13\n\x04name\x12\x0b{bucket=**}\x12o\n\tGetBucket\x12#.google.storage.v2.GetBucketRequest\x1a\x19.google.storage.v2.Bucket\"\"\xda\x41\x04name\x8a\xd3\xe4\x93\x02\x15\x12\x13\n\x04name\x12\x0b{bucket=**}\x12\xab\x01\n\x0c\x43reateBucket\x12&.google.storage.v2.CreateBucketRequest\x1a\x19.google.storage.v2.Bucket\"X\xda\x41\x17parent,bucket,bucket_id\x8a\xd3\xe4\x93\x02\x38\x12\x16\n\x06parent\x12\x0c{project=**}\x12\x1e\n\x0e\x62ucket.project\x12\x0c{project=**}\x12\x85\x01\n\x0bListBuckets\x12%.google.storage.v2.ListBucketsRequest\x1a&.google.storage.v2.ListBucketsResponse\"\'\xda\x41\x06parent\x8a\xd3\xe4\x93\x02\x18\x12\x16\n\x06parent\x12\x0c{project=**}\x12\x93\x01\n\x19LockBucketRetentionPolicy\x12\x33.google.storage.v2.LockBucketRetentionPolicyRequest\x1a\x19.google.storage.v2.Bucket\"&\xda\x41\x06\x62ucket\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}\x12\xab\x01\n\x0cGetIamPolicy\x12\".google.iam.v1.GetIamPolicyRequest\x1a\x15.google.iam.v1.Policy\"`\xda\x41\x08resource\x8a\xd3\xe4\x93\x02O\x12\x17\n\x08resource\x12\x0b{bucket=**}\x12\x34\n\x08resource\x12({bucket=projects/*/buckets/*}/objects/**\x12\xb2\x01\n\x0cSetIamPolicy\x12\".google.iam.v1.SetIamPolicyRequest\x1a\x15.google.iam.v1.Policy\"g\xda\x41\x0fresource,policy\x8a\xd3\xe4\x93\x02O\x12\x17\n\x08resource\x12\x0b{bucket=**}\x12\x34\n\x08resource\x12({bucket=projects/*/buckets/*}/objects/**\x12\xd7\x01\n\x12TestIamPermissions\x12(.google.iam.v1.TestIamPermissionsRequest\x1a).google.iam.v1.TestIamPermissionsResponse\"l\xda\x41\x14resource,permissions\x8a\xd3\xe4\x93\x02O\x12\x17\n\x08resource\x12\x0b{bucket=**}\x12\x34\n\x08resource\x12({bucket=projects/*/buckets/*}/objects/**\x12\x8a\x01\n\x0cUpdateBucket\x12&.google.storage.v2.UpdateBucketRequest\x1a\x19.google.storage.v2.Bucket\"7\xda\x41\x12\x62ucket,update_mask\x8a\xd3\xe4\x93\x02\x1c\x12\x1a\n\x0b\x62ucket.name\x12\x0b{bucket=**}\x12\x9f\x01\n\x18\x44\x65leteNotificationConfig\x12\x32.google.storage.v2.DeleteNotificationConfigRequest\x1a\x16.google.protobuf.Empty\"7\xda\x41\x04name\x8a\xd3\xe4\x93\x02*\x12(\n\x04name\x12 {bucket=projects/*/buckets/*}/**\x12\xa8\x01\n\x15GetNotificationConfig\x12/.google.storage.v2.GetNotificationConfigRequest\x1a%.google.storage.v2.NotificationConfig\"7\xda\x41\x04name\x8a\xd3\xe4\x93\x02*\x12(\n\x04name\x12 {bucket=projects/*/buckets/*}/**\x12\xb1\x01\n\x18\x43reateNotificationConfig\x12\x32.google.storage.v2.CreateNotificationConfigRequest\x1a%.google.storage.v2.NotificationConfig\":\xda\x41\x1aparent,notification_config\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06parent\x12\x0b{bucket=**}\x12\xa8\x01\n\x17ListNotificationConfigs\x12\x31.google.storage.v2.ListNotificationConfigsRequest\x1a\x32.google.storage.v2.ListNotificationConfigsResponse\"&\xda\x41\x06parent\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06parent\x12\x0b{bucket=**}\x12~\n\rComposeObject\x12\'.google.storage.v2.ComposeObjectRequest\x1a\x19.google.storage.v2.Object\")\x8a\xd3\xe4\x93\x02#\x12!\n\x12\x64\x65stination.bucket\x12\x0b{bucket=**}\x12\x98\x01\n\x0c\x44\x65leteObject\x12&.google.storage.v2.DeleteObjectRequest\x1a\x16.google.protobuf.Empty\"H\xda\x41\rbucket,object\xda\x41\x18\x62ucket,object,generation\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}\x12\x8d\x01\n\rRestoreObject\x12\'.google.storage.v2.RestoreObjectRequest\x1a\x19.google.storage.v2.Object\"8\xda\x41\x18\x62ucket,object,generation\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}\x12\xba\x01\n\x14\x43\x61ncelResumableWrite\x12..google.storage.v2.CancelResumableWriteRequest\x1a/.google.storage.v2.CancelResumableWriteResponse\"A\xda\x41\tupload_id\x8a\xd3\xe4\x93\x02/\x12-\n\tupload_id\x12 {bucket=projects/*/buckets/*}/**\x12\x95\x01\n\tGetObject\x12#.google.storage.v2.GetObjectRequest\x1a\x19.google.storage.v2.Object\"H\xda\x41\rbucket,object\xda\x41\x18\x62ucket,object,generation\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}\x12\xa5\x01\n\nReadObject\x12$.google.storage.v2.ReadObjectRequest\x1a%.google.storage.v2.ReadObjectResponse\"H\xda\x41\rbucket,object\xda\x41\x18\x62ucket,object,generation\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}0\x01\x12\x8c\x01\n\x0cUpdateObject\x12&.google.storage.v2.UpdateObjectRequest\x1a\x19.google.storage.v2.Object\"9\xda\x41\x12object,update_mask\x8a\xd3\xe4\x93\x02\x1e\x12\x1c\n\robject.bucket\x12\x0b{bucket=**}\x12`\n\x0bWriteObject\x12%.google.storage.v2.WriteObjectRequest\x1a&.google.storage.v2.WriteObjectResponse\"\x00(\x01\x12n\n\x0f\x42idiWriteObject\x12).google.storage.v2.BidiWriteObjectRequest\x1a*.google.storage.v2.BidiWriteObjectResponse\"\x00(\x01\x30\x01\x12\x84\x01\n\x0bListObjects\x12%.google.storage.v2.ListObjectsRequest\x1a&.google.storage.v2.ListObjectsResponse\"&\xda\x41\x06parent\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06parent\x12\x0b{bucket=**}\x12\x98\x01\n\rRewriteObject\x12\'.google.storage.v2.RewriteObjectRequest\x1a\".google.storage.v2.RewriteResponse\":\x8a\xd3\xe4\x93\x02\x34\x12\x0f\n\rsource_bucket\x12!\n\x12\x64\x65stination_bucket\x12\x0b{bucket=**}\x12\xae\x01\n\x13StartResumableWrite\x12-.google.storage.v2.StartResumableWriteRequest\x1a..google.storage.v2.StartResumableWriteResponse\"8\x8a\xd3\xe4\x93\x02\x32\x12\x30\n!write_object_spec.resource.bucket\x12\x0b{bucket=**}\x12\xae\x01\n\x10QueryWriteStatus\x12*.google.storage.v2.QueryWriteStatusRequest\x1a+.google.storage.v2.QueryWriteStatusResponse\"A\xda\x41\tupload_id\x8a\xd3\xe4\x93\x02/\x12-\n\tupload_id\x12 {bucket=projects/*/buckets/*}/**\x12\x80\x01\n\x11GetServiceAccount\x12+.google.storage.v2.GetServiceAccountRequest\x1a!.google.storage.v2.ServiceAccount\"\x1b\xda\x41\x07project\x8a\xd3\xe4\x93\x02\x0b\x12\t\n\x07project\x12\x95\x01\n\rCreateHmacKey\x12\'.google.storage.v2.CreateHmacKeyRequest\x1a(.google.storage.v2.CreateHmacKeyResponse\"1\xda\x41\x1dproject,service_account_email\x8a\xd3\xe4\x93\x02\x0b\x12\t\n\x07project\x12w\n\rDeleteHmacKey\x12\'.google.storage.v2.DeleteHmacKeyRequest\x1a\x16.google.protobuf.Empty\"%\xda\x41\x11\x61\x63\x63\x65ss_id,project\x8a\xd3\xe4\x93\x02\x0b\x12\t\n\x07project\x12}\n\nGetHmacKey\x12$.google.storage.v2.GetHmacKeyRequest\x1a\".google.storage.v2.HmacKeyMetadata\"%\xda\x41\x11\x61\x63\x63\x65ss_id,project\x8a\xd3\xe4\x93\x02\x0b\x12\t\n\x07project\x12|\n\x0cListHmacKeys\x12&.google.storage.v2.ListHmacKeysRequest\x1a\'.google.storage.v2.ListHmacKeysResponse\"\x1b\xda\x41\x07project\x8a\xd3\xe4\x93\x02\x0b\x12\t\n\x07project\x12\x9d\x01\n\rUpdateHmacKey\x12\'.google.storage.v2.UpdateHmacKeyRequest\x1a\".google.storage.v2.HmacKeyMetadata\"?\xda\x41\x14hmac_key,update_mask\x8a\xd3\xe4\x93\x02\"\x12 \n\x10hmac_key.project\x12\x0c{project=**}\x1a\xa7\x02\xca\x41\x16storage.googleapis.com\xd2\x41\x8a\x02https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/cloud-platform.read-only,https://www.googleapis.com/auth/devstorage.full_control,https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/devstorage.read_writeB\xe2\x01\n\x15\x63om.google.storage.v2B\x0cStorageProtoP\x01Z>cloud.google.com/go/storage/internal/apiv2/storagepb;storagepb\xea\x41x\n!cloudkms.googleapis.com/CryptoKey\x12Sprojects/{project}/locations/{location}/keyRings/{key_ring}/cryptoKeys/{crypto_key}b\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fgoogle/storage/v2/storage.proto\x12\x11google.storage.v2\x1a\x17google/api/client.proto\x1a\x1fgoogle/api/field_behavior.proto\x1a\x19google/api/resource.proto\x1a\x18google/api/routing.proto\x1a\x1egoogle/iam/v1/iam_policy.proto\x1a\x1agoogle/iam/v1/policy.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a google/protobuf/field_mask.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x16google/type/date.proto\"\xd6\x01\n\x13\x44\x65leteBucketRequest\x12\x33\n\x04name\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12$\n\x17if_metageneration_match\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x03 \x01(\x03H\x01\x88\x01\x01\x42\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_match\"\x95\x02\n\x10GetBucketRequest\x12\x33\n\x04name\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12$\n\x17if_metageneration_match\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x03 \x01(\x03H\x01\x88\x01\x01\x12\x32\n\tread_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x02\x88\x01\x01\x42\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x0c\n\n_read_mask\"\xce\x01\n\x13\x43reateBucketRequest\x12\x35\n\x06parent\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\x12\x1dstorage.googleapis.com/Bucket\x12)\n\x06\x62ucket\x18\x02 \x01(\x0b\x32\x19.google.storage.v2.Bucket\x12\x16\n\tbucket_id\x18\x03 \x01(\tB\x03\xe0\x41\x02\x12\x16\n\x0epredefined_acl\x18\x06 \x01(\t\x12%\n\x1dpredefined_default_object_acl\x18\x07 \x01(\t\"\xc4\x01\n\x12ListBucketsRequest\x12\x35\n\x06parent\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\x12\x1dstorage.googleapis.com/Bucket\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x12\n\npage_token\x18\x03 \x01(\t\x12\x0e\n\x06prefix\x18\x04 \x01(\t\x12\x32\n\tread_mask\x18\x05 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x00\x88\x01\x01\x42\x0c\n\n_read_mask\"Z\n\x13ListBucketsResponse\x12*\n\x07\x62uckets\x18\x01 \x03(\x0b\x32\x19.google.storage.v2.Bucket\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"\x7f\n LockBucketRetentionPolicyRequest\x12\x35\n\x06\x62ucket\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12$\n\x17if_metageneration_match\x18\x02 \x01(\x03\x42\x03\xe0\x41\x02\"\xc6\x02\n\x13UpdateBucketRequest\x12.\n\x06\x62ucket\x18\x01 \x01(\x0b\x32\x19.google.storage.v2.BucketB\x03\xe0\x41\x02\x12$\n\x17if_metageneration_match\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x03 \x01(\x03H\x01\x88\x01\x01\x12\x16\n\x0epredefined_acl\x18\x08 \x01(\t\x12%\n\x1dpredefined_default_object_acl\x18\t \x01(\t\x12\x34\n\x0bupdate_mask\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\x03\xe0\x41\x02\x42\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_match\"b\n\x1f\x44\x65leteNotificationConfigRequest\x12?\n\x04name\x18\x01 \x01(\tB1\xe0\x41\x02\xfa\x41+\n)storage.googleapis.com/NotificationConfig\"_\n\x1cGetNotificationConfigRequest\x12?\n\x04name\x18\x01 \x01(\tB1\xe0\x41\x02\xfa\x41+\n)storage.googleapis.com/NotificationConfig\"\xad\x01\n\x1f\x43reateNotificationConfigRequest\x12\x41\n\x06parent\x18\x01 \x01(\tB1\xe0\x41\x02\xfa\x41+\x12)storage.googleapis.com/NotificationConfig\x12G\n\x13notification_config\x18\x02 \x01(\x0b\x32%.google.storage.v2.NotificationConfigB\x03\xe0\x41\x02\"\x8a\x01\n\x1eListNotificationConfigsRequest\x12\x41\n\x06parent\x18\x01 \x01(\tB1\xe0\x41\x02\xfa\x41+\x12)storage.googleapis.com/NotificationConfig\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x12\n\npage_token\x18\x03 \x01(\t\"\x7f\n\x1fListNotificationConfigsResponse\x12\x43\n\x14notification_configs\x18\x01 \x03(\x0b\x32%.google.storage.v2.NotificationConfig\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"\xf5\x05\n\x14\x43omposeObjectRequest\x12\x33\n\x0b\x64\x65stination\x18\x01 \x01(\x0b\x32\x19.google.storage.v2.ObjectB\x03\xe0\x41\x02\x12L\n\x0esource_objects\x18\x02 \x03(\x0b\x32\x34.google.storage.v2.ComposeObjectRequest.SourceObject\x12\"\n\x1a\x64\x65stination_predefined_acl\x18\t \x01(\t\x12 \n\x13if_generation_match\x18\x04 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x05 \x01(\x03H\x01\x88\x01\x01\x12\x37\n\x07kms_key\x18\x06 \x01(\tB&\xfa\x41#\n!cloudkms.googleapis.com/CryptoKey\x12R\n\x1c\x63ommon_object_request_params\x18\x07 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParams\x12<\n\x10object_checksums\x18\n \x01(\x0b\x32\".google.storage.v2.ObjectChecksums\x1a\xee\x01\n\x0cSourceObject\x12\x11\n\x04name\x18\x01 \x01(\tB\x03\xe0\x41\x02\x12\x12\n\ngeneration\x18\x02 \x01(\x03\x12\x66\n\x14object_preconditions\x18\x03 \x01(\x0b\x32H.google.storage.v2.ComposeObjectRequest.SourceObject.ObjectPreconditions\x1aO\n\x13ObjectPreconditions\x12 \n\x13if_generation_match\x18\x01 \x01(\x03H\x00\x88\x01\x01\x42\x16\n\x14_if_generation_matchB\x16\n\x14_if_generation_matchB\x1a\n\x18_if_metageneration_match\"\xd1\x03\n\x13\x44\x65leteObjectRequest\x12\x35\n\x06\x62ucket\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x13\n\x06object\x18\x02 \x01(\tB\x03\xe0\x41\x02\x12\x12\n\ngeneration\x18\x04 \x01(\x03\x12 \n\x13if_generation_match\x18\x05 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x06 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x07 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x08 \x01(\x03H\x03\x88\x01\x01\x12R\n\x1c\x63ommon_object_request_params\x18\n \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_match\"\x89\x04\n\x14RestoreObjectRequest\x12\x35\n\x06\x62ucket\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x13\n\x06object\x18\x02 \x01(\tB\x03\xe0\x41\x02\x12\x17\n\ngeneration\x18\x03 \x01(\x03\x42\x03\xe0\x41\x02\x12 \n\x13if_generation_match\x18\x04 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x05 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x06 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x07 \x01(\x03H\x03\x88\x01\x01\x12\x1c\n\x0f\x63opy_source_acl\x18\t \x01(\x08H\x04\x88\x01\x01\x12R\n\x1c\x63ommon_object_request_params\x18\x08 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x12\n\x10_copy_source_acl\"5\n\x1b\x43\x61ncelResumableWriteRequest\x12\x16\n\tupload_id\x18\x01 \x01(\tB\x03\xe0\x41\x02\"\x1e\n\x1c\x43\x61ncelResumableWriteResponse\"\xba\x04\n\x11ReadObjectRequest\x12\x35\n\x06\x62ucket\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x13\n\x06object\x18\x02 \x01(\tB\x03\xe0\x41\x02\x12\x12\n\ngeneration\x18\x03 \x01(\x03\x12\x13\n\x0bread_offset\x18\x04 \x01(\x03\x12\x12\n\nread_limit\x18\x05 \x01(\x03\x12 \n\x13if_generation_match\x18\x06 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x07 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x08 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\t \x01(\x03H\x03\x88\x01\x01\x12R\n\x1c\x63ommon_object_request_params\x18\n \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParams\x12\x32\n\tread_mask\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x04\x88\x01\x01\x42\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x0c\n\n_read_mask\"\xbc\x04\n\x10GetObjectRequest\x12\x35\n\x06\x62ucket\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x13\n\x06object\x18\x02 \x01(\tB\x03\xe0\x41\x02\x12\x12\n\ngeneration\x18\x03 \x01(\x03\x12\x19\n\x0csoft_deleted\x18\x0b \x01(\x08H\x00\x88\x01\x01\x12 \n\x13if_generation_match\x18\x04 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x05 \x01(\x03H\x02\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x06 \x01(\x03H\x03\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x07 \x01(\x03H\x04\x88\x01\x01\x12R\n\x1c\x63ommon_object_request_params\x18\x08 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParams\x12\x32\n\tread_mask\x18\n \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x05\x88\x01\x01\x42\x0f\n\r_soft_deletedB\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x0c\n\n_read_mask\"\xf5\x01\n\x12ReadObjectResponse\x12<\n\x10\x63hecksummed_data\x18\x01 \x01(\x0b\x32\".google.storage.v2.ChecksummedData\x12<\n\x10object_checksums\x18\x02 \x01(\x0b\x32\".google.storage.v2.ObjectChecksums\x12\x36\n\rcontent_range\x18\x03 \x01(\x0b\x32\x1f.google.storage.v2.ContentRange\x12+\n\x08metadata\x18\x04 \x01(\x0b\x32\x19.google.storage.v2.Object\"\x8d\x03\n\x0fWriteObjectSpec\x12\x30\n\x08resource\x18\x01 \x01(\x0b\x32\x19.google.storage.v2.ObjectB\x03\xe0\x41\x02\x12\x16\n\x0epredefined_acl\x18\x07 \x01(\t\x12 \n\x13if_generation_match\x18\x03 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x04 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x05 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x06 \x01(\x03H\x03\x88\x01\x01\x12\x18\n\x0bobject_size\x18\x08 \x01(\x03H\x04\x88\x01\x01\x42\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x0e\n\x0c_object_size\"\x86\x03\n\x12WriteObjectRequest\x12\x13\n\tupload_id\x18\x01 \x01(\tH\x00\x12?\n\x11write_object_spec\x18\x02 \x01(\x0b\x32\".google.storage.v2.WriteObjectSpecH\x00\x12\x19\n\x0cwrite_offset\x18\x03 \x01(\x03\x42\x03\xe0\x41\x02\x12>\n\x10\x63hecksummed_data\x18\x04 \x01(\x0b\x32\".google.storage.v2.ChecksummedDataH\x01\x12<\n\x10object_checksums\x18\x06 \x01(\x0b\x32\".google.storage.v2.ObjectChecksums\x12\x14\n\x0c\x66inish_write\x18\x07 \x01(\x08\x12R\n\x1c\x63ommon_object_request_params\x18\x08 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x0f\n\rfirst_messageB\x06\n\x04\x64\x61ta\"n\n\x13WriteObjectResponse\x12\x18\n\x0epersisted_size\x18\x01 \x01(\x03H\x00\x12-\n\x08resource\x18\x02 \x01(\x0b\x32\x19.google.storage.v2.ObjectH\x00\x42\x0e\n\x0cwrite_status\"\xaf\x03\n\x16\x42idiWriteObjectRequest\x12\x13\n\tupload_id\x18\x01 \x01(\tH\x00\x12?\n\x11write_object_spec\x18\x02 \x01(\x0b\x32\".google.storage.v2.WriteObjectSpecH\x00\x12\x19\n\x0cwrite_offset\x18\x03 \x01(\x03\x42\x03\xe0\x41\x02\x12>\n\x10\x63hecksummed_data\x18\x04 \x01(\x0b\x32\".google.storage.v2.ChecksummedDataH\x01\x12<\n\x10object_checksums\x18\x06 \x01(\x0b\x32\".google.storage.v2.ObjectChecksums\x12\x14\n\x0cstate_lookup\x18\x07 \x01(\x08\x12\r\n\x05\x66lush\x18\x08 \x01(\x08\x12\x14\n\x0c\x66inish_write\x18\t \x01(\x08\x12R\n\x1c\x63ommon_object_request_params\x18\n \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x0f\n\rfirst_messageB\x06\n\x04\x64\x61ta\"r\n\x17\x42idiWriteObjectResponse\x12\x18\n\x0epersisted_size\x18\x01 \x01(\x03H\x00\x12-\n\x08resource\x18\x02 \x01(\x0b\x32\x19.google.storage.v2.ObjectH\x00\x42\x0e\n\x0cwrite_status\"\x83\x03\n\x12ListObjectsRequest\x12\x35\n\x06parent\x18\x01 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x12\n\npage_token\x18\x03 \x01(\t\x12\x11\n\tdelimiter\x18\x04 \x01(\t\x12\"\n\x1ainclude_trailing_delimiter\x18\x05 \x01(\x08\x12\x0e\n\x06prefix\x18\x06 \x01(\t\x12\x10\n\x08versions\x18\x07 \x01(\x08\x12\x32\n\tread_mask\x18\x08 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskH\x00\x88\x01\x01\x12 \n\x13lexicographic_start\x18\n \x01(\tB\x03\xe0\x41\x01\x12\x1e\n\x11lexicographic_end\x18\x0b \x01(\tB\x03\xe0\x41\x01\x12\x19\n\x0csoft_deleted\x18\x0c \x01(\x08\x42\x03\xe0\x41\x01\x12\x17\n\nmatch_glob\x18\x0e \x01(\tB\x03\xe0\x41\x01\x42\x0c\n\n_read_mask\"\x85\x01\n\x17QueryWriteStatusRequest\x12\x16\n\tupload_id\x18\x01 \x01(\tB\x03\xe0\x41\x02\x12R\n\x1c\x63ommon_object_request_params\x18\x02 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParams\"s\n\x18QueryWriteStatusResponse\x12\x18\n\x0epersisted_size\x18\x01 \x01(\x03H\x00\x12-\n\x08resource\x18\x02 \x01(\x0b\x32\x19.google.storage.v2.ObjectH\x00\x42\x0e\n\x0cwrite_status\"\xa8\n\n\x14RewriteObjectRequest\x12 \n\x10\x64\x65stination_name\x18\x18 \x01(\tB\x06\xe0\x41\x02\xe0\x41\x05\x12\x44\n\x12\x64\x65stination_bucket\x18\x19 \x01(\tB(\xe0\x41\x02\xe0\x41\x05\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x43\n\x13\x64\x65stination_kms_key\x18\x1b \x01(\tB&\xfa\x41#\n!cloudkms.googleapis.com/CryptoKey\x12.\n\x0b\x64\x65stination\x18\x01 \x01(\x0b\x32\x19.google.storage.v2.Object\x12<\n\rsource_bucket\x18\x02 \x01(\tB%\xe0\x41\x02\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x1a\n\rsource_object\x18\x03 \x01(\tB\x03\xe0\x41\x02\x12\x19\n\x11source_generation\x18\x04 \x01(\x03\x12\x15\n\rrewrite_token\x18\x05 \x01(\t\x12\"\n\x1a\x64\x65stination_predefined_acl\x18\x1c \x01(\t\x12 \n\x13if_generation_match\x18\x07 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x08 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\t \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\n \x01(\x03H\x03\x88\x01\x01\x12\'\n\x1aif_source_generation_match\x18\x0b \x01(\x03H\x04\x88\x01\x01\x12+\n\x1eif_source_generation_not_match\x18\x0c \x01(\x03H\x05\x88\x01\x01\x12+\n\x1eif_source_metageneration_match\x18\r \x01(\x03H\x06\x88\x01\x01\x12/\n\"if_source_metageneration_not_match\x18\x0e \x01(\x03H\x07\x88\x01\x01\x12$\n\x1cmax_bytes_rewritten_per_call\x18\x0f \x01(\x03\x12(\n copy_source_encryption_algorithm\x18\x10 \x01(\t\x12(\n copy_source_encryption_key_bytes\x18\x15 \x01(\x0c\x12/\n\'copy_source_encryption_key_sha256_bytes\x18\x16 \x01(\x0c\x12R\n\x1c\x63ommon_object_request_params\x18\x13 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParams\x12<\n\x10object_checksums\x18\x1d \x01(\x0b\x32\".google.storage.v2.ObjectChecksumsB\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_matchB\x1d\n\x1b_if_source_generation_matchB!\n\x1f_if_source_generation_not_matchB!\n\x1f_if_source_metageneration_matchB%\n#_if_source_metageneration_not_match\"\x97\x01\n\x0fRewriteResponse\x12\x1d\n\x15total_bytes_rewritten\x18\x01 \x01(\x03\x12\x13\n\x0bobject_size\x18\x02 \x01(\x03\x12\x0c\n\x04\x64one\x18\x03 \x01(\x08\x12\x15\n\rrewrite_token\x18\x04 \x01(\t\x12+\n\x08resource\x18\x05 \x01(\x0b\x32\x19.google.storage.v2.Object\"\xf2\x01\n\x1aStartResumableWriteRequest\x12\x42\n\x11write_object_spec\x18\x01 \x01(\x0b\x32\".google.storage.v2.WriteObjectSpecB\x03\xe0\x41\x02\x12R\n\x1c\x63ommon_object_request_params\x18\x03 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParams\x12<\n\x10object_checksums\x18\x05 \x01(\x0b\x32\".google.storage.v2.ObjectChecksums\"0\n\x1bStartResumableWriteResponse\x12\x11\n\tupload_id\x18\x01 \x01(\t\"\xef\x03\n\x13UpdateObjectRequest\x12.\n\x06object\x18\x01 \x01(\x0b\x32\x19.google.storage.v2.ObjectB\x03\xe0\x41\x02\x12 \n\x13if_generation_match\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17if_generation_not_match\x18\x03 \x01(\x03H\x01\x88\x01\x01\x12$\n\x17if_metageneration_match\x18\x04 \x01(\x03H\x02\x88\x01\x01\x12(\n\x1bif_metageneration_not_match\x18\x05 \x01(\x03H\x03\x88\x01\x01\x12\x16\n\x0epredefined_acl\x18\n \x01(\t\x12\x34\n\x0bupdate_mask\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.FieldMaskB\x03\xe0\x41\x02\x12R\n\x1c\x63ommon_object_request_params\x18\x08 \x01(\x0b\x32,.google.storage.v2.CommonObjectRequestParamsB\x16\n\x14_if_generation_matchB\x1a\n\x18_if_generation_not_matchB\x1a\n\x18_if_metageneration_matchB\x1e\n\x1c_if_metageneration_not_match\"`\n\x18GetServiceAccountRequest\x12\x44\n\x07project\x18\x01 \x01(\tB3\xe0\x41\x02\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\"\x80\x01\n\x14\x43reateHmacKeyRequest\x12\x44\n\x07project\x18\x01 \x01(\tB3\xe0\x41\x02\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\x12\"\n\x15service_account_email\x18\x02 \x01(\tB\x03\xe0\x41\x02\"g\n\x15\x43reateHmacKeyResponse\x12\x34\n\x08metadata\x18\x01 \x01(\x0b\x32\".google.storage.v2.HmacKeyMetadata\x12\x18\n\x10secret_key_bytes\x18\x03 \x01(\x0c\"t\n\x14\x44\x65leteHmacKeyRequest\x12\x16\n\taccess_id\x18\x01 \x01(\tB\x03\xe0\x41\x02\x12\x44\n\x07project\x18\x02 \x01(\tB3\xe0\x41\x02\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\"q\n\x11GetHmacKeyRequest\x12\x16\n\taccess_id\x18\x01 \x01(\tB\x03\xe0\x41\x02\x12\x44\n\x07project\x18\x02 \x01(\tB3\xe0\x41\x02\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\"\xbc\x01\n\x13ListHmacKeysRequest\x12\x44\n\x07project\x18\x01 \x01(\tB3\xe0\x41\x02\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\x12\x11\n\tpage_size\x18\x02 \x01(\x05\x12\x12\n\npage_token\x18\x03 \x01(\t\x12\x1d\n\x15service_account_email\x18\x04 \x01(\t\x12\x19\n\x11show_deleted_keys\x18\x05 \x01(\x08\"f\n\x14ListHmacKeysResponse\x12\x35\n\thmac_keys\x18\x01 \x03(\x0b\x32\".google.storage.v2.HmacKeyMetadata\x12\x17\n\x0fnext_page_token\x18\x02 \x01(\t\"\x82\x01\n\x14UpdateHmacKeyRequest\x12\x39\n\x08hmac_key\x18\x01 \x01(\x0b\x32\".google.storage.v2.HmacKeyMetadataB\x03\xe0\x41\x02\x12/\n\x0bupdate_mask\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.FieldMask\"|\n\x19\x43ommonObjectRequestParams\x12\x1c\n\x14\x65ncryption_algorithm\x18\x01 \x01(\t\x12\x1c\n\x14\x65ncryption_key_bytes\x18\x04 \x01(\x0c\x12#\n\x1b\x65ncryption_key_sha256_bytes\x18\x05 \x01(\x0c\"\xca\x05\n\x10ServiceConstants\"\xb5\x05\n\x06Values\x12\x16\n\x12VALUES_UNSPECIFIED\x10\x00\x12\x1b\n\x14MAX_READ_CHUNK_BYTES\x10\x80\x80\x80\x01\x12\x1c\n\x15MAX_WRITE_CHUNK_BYTES\x10\x80\x80\x80\x01\x12\x19\n\x12MAX_OBJECT_SIZE_MB\x10\x80\x80\xc0\x02\x12)\n$MAX_CUSTOM_METADATA_FIELD_NAME_BYTES\x10\x80\x08\x12*\n%MAX_CUSTOM_METADATA_FIELD_VALUE_BYTES\x10\x80 \x12)\n$MAX_CUSTOM_METADATA_TOTAL_SIZE_BYTES\x10\x80@\x12*\n$MAX_BUCKET_METADATA_TOTAL_SIZE_BYTES\x10\x80\xa0\x01\x12\'\n#MAX_NOTIFICATION_CONFIGS_PER_BUCKET\x10\x64\x12\"\n\x1eMAX_LIFECYCLE_RULES_PER_BUCKET\x10\x64\x12&\n\"MAX_NOTIFICATION_CUSTOM_ATTRIBUTES\x10\x05\x12\x31\n,MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_KEY_LENGTH\x10\x80\x02\x12\x33\n.MAX_NOTIFICATION_CUSTOM_ATTRIBUTE_VALUE_LENGTH\x10\x80\x08\x12\x1c\n\x18MAX_LABELS_ENTRIES_COUNT\x10@\x12\x1f\n\x1bMAX_LABELS_KEY_VALUE_LENGTH\x10?\x12\x1f\n\x1aMAX_LABELS_KEY_VALUE_BYTES\x10\x80\x01\x12.\n)MAX_OBJECT_IDS_PER_DELETE_OBJECTS_REQUEST\x10\xe8\x07\x12\x1e\n\x1aSPLIT_TOKEN_MAX_VALID_DAYS\x10\x0e\x1a\x02\x10\x01\"\x8d\x1b\n\x06\x42ucket\x12\x11\n\x04name\x18\x01 \x01(\tB\x03\xe0\x41\x05\x12\x16\n\tbucket_id\x18\x02 \x01(\tB\x03\xe0\x41\x03\x12\x0c\n\x04\x65tag\x18\x1d \x01(\t\x12\x44\n\x07project\x18\x03 \x01(\tB3\xe0\x41\x05\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\x12\x1b\n\x0emetageneration\x18\x04 \x01(\x03\x42\x03\xe0\x41\x03\x12\x15\n\x08location\x18\x05 \x01(\tB\x03\xe0\x41\x05\x12\x1a\n\rlocation_type\x18\x06 \x01(\tB\x03\xe0\x41\x03\x12\x15\n\rstorage_class\x18\x07 \x01(\t\x12\x0b\n\x03rpo\x18\x1b \x01(\t\x12\x33\n\x03\x61\x63l\x18\x08 \x03(\x0b\x32&.google.storage.v2.BucketAccessControl\x12\x42\n\x12\x64\x65\x66\x61ult_object_acl\x18\t \x03(\x0b\x32&.google.storage.v2.ObjectAccessControl\x12\x36\n\tlifecycle\x18\n \x01(\x0b\x32#.google.storage.v2.Bucket.Lifecycle\x12\x34\n\x0b\x63reate_time\x18\x0b \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12,\n\x04\x63ors\x18\x0c \x03(\x0b\x32\x1e.google.storage.v2.Bucket.Cors\x12\x34\n\x0bupdate_time\x18\r \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12 \n\x18\x64\x65\x66\x61ult_event_based_hold\x18\x0e \x01(\x08\x12\x35\n\x06labels\x18\x0f \x03(\x0b\x32%.google.storage.v2.Bucket.LabelsEntry\x12\x32\n\x07website\x18\x10 \x01(\x0b\x32!.google.storage.v2.Bucket.Website\x12\x38\n\nversioning\x18\x11 \x01(\x0b\x32$.google.storage.v2.Bucket.Versioning\x12\x32\n\x07logging\x18\x12 \x01(\x0b\x32!.google.storage.v2.Bucket.Logging\x12,\n\x05owner\x18\x13 \x01(\x0b\x32\x18.google.storage.v2.OwnerB\x03\xe0\x41\x03\x12\x38\n\nencryption\x18\x14 \x01(\x0b\x32$.google.storage.v2.Bucket.Encryption\x12\x32\n\x07\x62illing\x18\x15 \x01(\x0b\x32!.google.storage.v2.Bucket.Billing\x12\x43\n\x10retention_policy\x18\x16 \x01(\x0b\x32).google.storage.v2.Bucket.RetentionPolicy\x12\x37\n\niam_config\x18\x17 \x01(\x0b\x32#.google.storage.v2.Bucket.IamConfig\x12\x15\n\rsatisfies_pzs\x18\x19 \x01(\x08\x12P\n\x17\x63ustom_placement_config\x18\x1a \x01(\x0b\x32/.google.storage.v2.Bucket.CustomPlacementConfig\x12\x36\n\tautoclass\x18\x1c \x01(\x0b\x32#.google.storage.v2.Bucket.Autoclass\x12K\n\x12soft_delete_policy\x18\x1f \x01(\x0b\x32*.google.storage.v2.Bucket.SoftDeletePolicyB\x03\xe0\x41\x01\x1a!\n\x07\x42illing\x12\x16\n\x0erequester_pays\x18\x01 \x01(\x08\x1aX\n\x04\x43ors\x12\x0e\n\x06origin\x18\x01 \x03(\t\x12\x0e\n\x06method\x18\x02 \x03(\t\x12\x17\n\x0fresponse_header\x18\x03 \x03(\t\x12\x17\n\x0fmax_age_seconds\x18\x04 \x01(\x05\x1aM\n\nEncryption\x12?\n\x0f\x64\x65\x66\x61ult_kms_key\x18\x01 \x01(\tB&\xfa\x41#\n!cloudkms.googleapis.com/CryptoKey\x1a\xec\x01\n\tIamConfig\x12\x61\n\x1buniform_bucket_level_access\x18\x01 \x01(\x0b\x32<.google.storage.v2.Bucket.IamConfig.UniformBucketLevelAccess\x12 \n\x18public_access_prevention\x18\x03 \x01(\t\x1aZ\n\x18UniformBucketLevelAccess\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12-\n\tlock_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1a\xf3\x05\n\tLifecycle\x12\x36\n\x04rule\x18\x01 \x03(\x0b\x32(.google.storage.v2.Bucket.Lifecycle.Rule\x1a\xad\x05\n\x04Rule\x12?\n\x06\x61\x63tion\x18\x01 \x01(\x0b\x32/.google.storage.v2.Bucket.Lifecycle.Rule.Action\x12\x45\n\tcondition\x18\x02 \x01(\x0b\x32\x32.google.storage.v2.Bucket.Lifecycle.Rule.Condition\x1a-\n\x06\x41\x63tion\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x15\n\rstorage_class\x18\x02 \x01(\t\x1a\xed\x03\n\tCondition\x12\x15\n\x08\x61ge_days\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12)\n\x0e\x63reated_before\x18\x02 \x01(\x0b\x32\x11.google.type.Date\x12\x14\n\x07is_live\x18\x03 \x01(\x08H\x01\x88\x01\x01\x12\x1f\n\x12num_newer_versions\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12\x1d\n\x15matches_storage_class\x18\x05 \x03(\t\x12#\n\x16\x64\x61ys_since_custom_time\x18\x07 \x01(\x05H\x03\x88\x01\x01\x12-\n\x12\x63ustom_time_before\x18\x08 \x01(\x0b\x32\x11.google.type.Date\x12\'\n\x1a\x64\x61ys_since_noncurrent_time\x18\t \x01(\x05H\x04\x88\x01\x01\x12\x31\n\x16noncurrent_time_before\x18\n \x01(\x0b\x32\x11.google.type.Date\x12\x16\n\x0ematches_prefix\x18\x0b \x03(\t\x12\x16\n\x0ematches_suffix\x18\x0c \x03(\tB\x0b\n\t_age_daysB\n\n\x08_is_liveB\x15\n\x13_num_newer_versionsB\x19\n\x17_days_since_custom_timeB\x1d\n\x1b_days_since_noncurrent_time\x1a\x38\n\x07Logging\x12\x12\n\nlog_bucket\x18\x01 \x01(\t\x12\x19\n\x11log_object_prefix\x18\x02 \x01(\t\x1a\x8f\x01\n\x0fRetentionPolicy\x12\x32\n\x0e\x65\x66\x66\x65\x63tive_time\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x11\n\tis_locked\x18\x02 \x01(\x08\x12\x35\n\x12retention_duration\x18\x04 \x01(\x0b\x32\x19.google.protobuf.Duration\x1a\xb1\x01\n\x10SoftDeletePolicy\x12:\n\x12retention_duration\x18\x01 \x01(\x0b\x32\x19.google.protobuf.DurationH\x00\x88\x01\x01\x12\x37\n\x0e\x65\x66\x66\x65\x63tive_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x01\x88\x01\x01\x42\x15\n\x13_retention_durationB\x11\n\x0f_effective_time\x1a\x1d\n\nVersioning\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x1a;\n\x07Website\x12\x18\n\x10main_page_suffix\x18\x01 \x01(\t\x12\x16\n\x0enot_found_page\x18\x02 \x01(\t\x1a/\n\x15\x43ustomPlacementConfig\x12\x16\n\x0e\x64\x61ta_locations\x18\x01 \x03(\t\x1a\x8b\x02\n\tAutoclass\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x34\n\x0btoggle_time\x18\x02 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12#\n\x16terminal_storage_class\x18\x03 \x01(\tH\x00\x88\x01\x01\x12P\n\"terminal_storage_class_update_time\x18\x04 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03H\x01\x88\x01\x01\x42\x19\n\x17_terminal_storage_classB%\n#_terminal_storage_class_update_time\x1a-\n\x0bLabelsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01:G\xea\x41\x44\n\x1dstorage.googleapis.com/Bucket\x12#projects/{project}/buckets/{bucket}\"\xce\x01\n\x13\x42ucketAccessControl\x12\x0c\n\x04role\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x0e\n\x06\x65ntity\x18\x03 \x01(\t\x12\x17\n\nentity_alt\x18\t \x01(\tB\x03\xe0\x41\x03\x12\x11\n\tentity_id\x18\x04 \x01(\t\x12\x0c\n\x04\x65tag\x18\x08 \x01(\t\x12\r\n\x05\x65mail\x18\x05 \x01(\t\x12\x0e\n\x06\x64omain\x18\x06 \x01(\t\x12\x34\n\x0cproject_team\x18\x07 \x01(\x0b\x32\x1e.google.storage.v2.ProjectTeam\"I\n\x0f\x43hecksummedData\x12\x16\n\x07\x63ontent\x18\x01 \x01(\x0c\x42\x05\x08\x01\xe0\x41\x01\x12\x13\n\x06\x63rc32c\x18\x02 \x01(\x07H\x00\x88\x01\x01\x42\t\n\x07_crc32c\"C\n\x0fObjectChecksums\x12\x13\n\x06\x63rc32c\x18\x01 \x01(\x07H\x00\x88\x01\x01\x12\x10\n\x08md5_hash\x18\x02 \x01(\x0c\x42\t\n\x07_crc32c\"\xad\x02\n\x0fHmacKeyMetadata\x12\x0f\n\x02id\x18\x01 \x01(\tB\x03\xe0\x41\x05\x12\x16\n\taccess_id\x18\x02 \x01(\tB\x03\xe0\x41\x05\x12\x44\n\x07project\x18\x03 \x01(\tB3\xe0\x41\x05\xfa\x41-\n+cloudresourcemanager.googleapis.com/Project\x12\"\n\x15service_account_email\x18\x04 \x01(\tB\x03\xe0\x41\x03\x12\r\n\x05state\x18\x05 \x01(\t\x12\x34\n\x0b\x63reate_time\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12\x34\n\x0bupdate_time\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12\x0c\n\x04\x65tag\x18\x08 \x01(\t\"\xa7\x03\n\x12NotificationConfig\x12\x11\n\x04name\x18\x01 \x01(\tB\x03\xe0\x41\x02\x12\x12\n\x05topic\x18\x02 \x01(\tB\x03\xe0\x41\x02\x12\x0c\n\x04\x65tag\x18\x07 \x01(\t\x12\x13\n\x0b\x65vent_types\x18\x03 \x03(\t\x12V\n\x11\x63ustom_attributes\x18\x04 \x03(\x0b\x32;.google.storage.v2.NotificationConfig.CustomAttributesEntry\x12\x1a\n\x12object_name_prefix\x18\x05 \x01(\t\x12\x1b\n\x0epayload_format\x18\x06 \x01(\tB\x03\xe0\x41\x02\x1a\x37\n\x15\x43ustomAttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01:}\xea\x41z\n)storage.googleapis.com/NotificationConfig\x12Mprojects/{project}/buckets/{bucket}/notificationConfigs/{notification_config}\"L\n\x12\x43ustomerEncryption\x12\x1c\n\x14\x65ncryption_algorithm\x18\x01 \x01(\t\x12\x18\n\x10key_sha256_bytes\x18\x03 \x01(\x0c\"\x82\t\n\x06Object\x12\x11\n\x04name\x18\x01 \x01(\tB\x03\xe0\x41\x05\x12\x35\n\x06\x62ucket\x18\x02 \x01(\tB%\xe0\x41\x05\xfa\x41\x1f\n\x1dstorage.googleapis.com/Bucket\x12\x0c\n\x04\x65tag\x18\x1b \x01(\t\x12\x17\n\ngeneration\x18\x03 \x01(\x03\x42\x03\xe0\x41\x05\x12\x1b\n\x0emetageneration\x18\x04 \x01(\x03\x42\x03\xe0\x41\x03\x12\x15\n\rstorage_class\x18\x05 \x01(\t\x12\x11\n\x04size\x18\x06 \x01(\x03\x42\x03\xe0\x41\x03\x12\x18\n\x10\x63ontent_encoding\x18\x07 \x01(\t\x12\x1b\n\x13\x63ontent_disposition\x18\x08 \x01(\t\x12\x15\n\rcache_control\x18\t \x01(\t\x12\x33\n\x03\x61\x63l\x18\n \x03(\x0b\x32&.google.storage.v2.ObjectAccessControl\x12\x18\n\x10\x63ontent_language\x18\x0b \x01(\t\x12\x34\n\x0b\x64\x65lete_time\x18\x0c \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12\x14\n\x0c\x63ontent_type\x18\r \x01(\t\x12\x34\n\x0b\x63reate_time\x18\x0e \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12\x1c\n\x0f\x63omponent_count\x18\x0f \x01(\x05\x42\x03\xe0\x41\x03\x12:\n\tchecksums\x18\x10 \x01(\x0b\x32\".google.storage.v2.ObjectChecksumsB\x03\xe0\x41\x03\x12\x34\n\x0bupdate_time\x18\x11 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12\x37\n\x07kms_key\x18\x12 \x01(\tB&\xfa\x41#\n!cloudkms.googleapis.com/CryptoKey\x12\x42\n\x19update_storage_class_time\x18\x13 \x01(\x0b\x32\x1a.google.protobuf.TimestampB\x03\xe0\x41\x03\x12\x16\n\x0etemporary_hold\x18\x14 \x01(\x08\x12\x39\n\x15retention_expire_time\x18\x15 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x39\n\x08metadata\x18\x16 \x03(\x0b\x32\'.google.storage.v2.Object.MetadataEntry\x12\x1d\n\x10\x65vent_based_hold\x18\x17 \x01(\x08H\x00\x88\x01\x01\x12,\n\x05owner\x18\x18 \x01(\x0b\x32\x18.google.storage.v2.OwnerB\x03\xe0\x41\x03\x12\x42\n\x13\x63ustomer_encryption\x18\x19 \x01(\x0b\x32%.google.storage.v2.CustomerEncryption\x12/\n\x0b\x63ustom_time\x18\x1a \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x13\n\x11_event_based_hold\"\xce\x01\n\x13ObjectAccessControl\x12\x0c\n\x04role\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\x12\x0e\n\x06\x65ntity\x18\x03 \x01(\t\x12\x17\n\nentity_alt\x18\t \x01(\tB\x03\xe0\x41\x03\x12\x11\n\tentity_id\x18\x04 \x01(\t\x12\x0c\n\x04\x65tag\x18\x08 \x01(\t\x12\r\n\x05\x65mail\x18\x05 \x01(\t\x12\x0e\n\x06\x64omain\x18\x06 \x01(\t\x12\x34\n\x0cproject_team\x18\x07 \x01(\x0b\x32\x1e.google.storage.v2.ProjectTeam\"l\n\x13ListObjectsResponse\x12*\n\x07objects\x18\x01 \x03(\x0b\x32\x19.google.storage.v2.Object\x12\x10\n\x08prefixes\x18\x02 \x03(\t\x12\x17\n\x0fnext_page_token\x18\x03 \x01(\t\"3\n\x0bProjectTeam\x12\x16\n\x0eproject_number\x18\x01 \x01(\t\x12\x0c\n\x04team\x18\x02 \x01(\t\"\'\n\x0eServiceAccount\x12\x15\n\remail_address\x18\x01 \x01(\t\"*\n\x05Owner\x12\x0e\n\x06\x65ntity\x18\x01 \x01(\t\x12\x11\n\tentity_id\x18\x02 \x01(\t\"C\n\x0c\x43ontentRange\x12\r\n\x05start\x18\x01 \x01(\x03\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x03\x12\x17\n\x0f\x63omplete_length\x18\x03 \x01(\x03\x32\xaa\'\n\x07Storage\x12r\n\x0c\x44\x65leteBucket\x12&.google.storage.v2.DeleteBucketRequest\x1a\x16.google.protobuf.Empty\"\"\xda\x41\x04name\x8a\xd3\xe4\x93\x02\x15\x12\x13\n\x04name\x12\x0b{bucket=**}\x12o\n\tGetBucket\x12#.google.storage.v2.GetBucketRequest\x1a\x19.google.storage.v2.Bucket\"\"\xda\x41\x04name\x8a\xd3\xe4\x93\x02\x15\x12\x13\n\x04name\x12\x0b{bucket=**}\x12\xab\x01\n\x0c\x43reateBucket\x12&.google.storage.v2.CreateBucketRequest\x1a\x19.google.storage.v2.Bucket\"X\xda\x41\x17parent,bucket,bucket_id\x8a\xd3\xe4\x93\x02\x38\x12\x16\n\x06parent\x12\x0c{project=**}\x12\x1e\n\x0e\x62ucket.project\x12\x0c{project=**}\x12\x85\x01\n\x0bListBuckets\x12%.google.storage.v2.ListBucketsRequest\x1a&.google.storage.v2.ListBucketsResponse\"\'\xda\x41\x06parent\x8a\xd3\xe4\x93\x02\x18\x12\x16\n\x06parent\x12\x0c{project=**}\x12\x93\x01\n\x19LockBucketRetentionPolicy\x12\x33.google.storage.v2.LockBucketRetentionPolicyRequest\x1a\x19.google.storage.v2.Bucket\"&\xda\x41\x06\x62ucket\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}\x12u\n\x0cGetIamPolicy\x12\".google.iam.v1.GetIamPolicyRequest\x1a\x15.google.iam.v1.Policy\"*\xda\x41\x08resource\x8a\xd3\xe4\x93\x02\x19\x12\x17\n\x08resource\x12\x0b{bucket=**}\x12|\n\x0cSetIamPolicy\x12\".google.iam.v1.SetIamPolicyRequest\x1a\x15.google.iam.v1.Policy\"1\xda\x41\x0fresource,policy\x8a\xd3\xe4\x93\x02\x19\x12\x17\n\x08resource\x12\x0b{bucket=**}\x12\xd7\x01\n\x12TestIamPermissions\x12(.google.iam.v1.TestIamPermissionsRequest\x1a).google.iam.v1.TestIamPermissionsResponse\"l\xda\x41\x14resource,permissions\x8a\xd3\xe4\x93\x02O\x12\x17\n\x08resource\x12\x0b{bucket=**}\x12\x34\n\x08resource\x12({bucket=projects/*/buckets/*}/objects/**\x12\x8a\x01\n\x0cUpdateBucket\x12&.google.storage.v2.UpdateBucketRequest\x1a\x19.google.storage.v2.Bucket\"7\xda\x41\x12\x62ucket,update_mask\x8a\xd3\xe4\x93\x02\x1c\x12\x1a\n\x0b\x62ucket.name\x12\x0b{bucket=**}\x12\x9f\x01\n\x18\x44\x65leteNotificationConfig\x12\x32.google.storage.v2.DeleteNotificationConfigRequest\x1a\x16.google.protobuf.Empty\"7\xda\x41\x04name\x8a\xd3\xe4\x93\x02*\x12(\n\x04name\x12 {bucket=projects/*/buckets/*}/**\x12\xa8\x01\n\x15GetNotificationConfig\x12/.google.storage.v2.GetNotificationConfigRequest\x1a%.google.storage.v2.NotificationConfig\"7\xda\x41\x04name\x8a\xd3\xe4\x93\x02*\x12(\n\x04name\x12 {bucket=projects/*/buckets/*}/**\x12\xb1\x01\n\x18\x43reateNotificationConfig\x12\x32.google.storage.v2.CreateNotificationConfigRequest\x1a%.google.storage.v2.NotificationConfig\":\xda\x41\x1aparent,notification_config\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06parent\x12\x0b{bucket=**}\x12\xa8\x01\n\x17ListNotificationConfigs\x12\x31.google.storage.v2.ListNotificationConfigsRequest\x1a\x32.google.storage.v2.ListNotificationConfigsResponse\"&\xda\x41\x06parent\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06parent\x12\x0b{bucket=**}\x12~\n\rComposeObject\x12\'.google.storage.v2.ComposeObjectRequest\x1a\x19.google.storage.v2.Object\")\x8a\xd3\xe4\x93\x02#\x12!\n\x12\x64\x65stination.bucket\x12\x0b{bucket=**}\x12\x98\x01\n\x0c\x44\x65leteObject\x12&.google.storage.v2.DeleteObjectRequest\x1a\x16.google.protobuf.Empty\"H\xda\x41\rbucket,object\xda\x41\x18\x62ucket,object,generation\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}\x12\x8d\x01\n\rRestoreObject\x12\'.google.storage.v2.RestoreObjectRequest\x1a\x19.google.storage.v2.Object\"8\xda\x41\x18\x62ucket,object,generation\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}\x12\xba\x01\n\x14\x43\x61ncelResumableWrite\x12..google.storage.v2.CancelResumableWriteRequest\x1a/.google.storage.v2.CancelResumableWriteResponse\"A\xda\x41\tupload_id\x8a\xd3\xe4\x93\x02/\x12-\n\tupload_id\x12 {bucket=projects/*/buckets/*}/**\x12\x95\x01\n\tGetObject\x12#.google.storage.v2.GetObjectRequest\x1a\x19.google.storage.v2.Object\"H\xda\x41\rbucket,object\xda\x41\x18\x62ucket,object,generation\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}\x12\xa5\x01\n\nReadObject\x12$.google.storage.v2.ReadObjectRequest\x1a%.google.storage.v2.ReadObjectResponse\"H\xda\x41\rbucket,object\xda\x41\x18\x62ucket,object,generation\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06\x62ucket\x12\x0b{bucket=**}0\x01\x12\x8c\x01\n\x0cUpdateObject\x12&.google.storage.v2.UpdateObjectRequest\x1a\x19.google.storage.v2.Object\"9\xda\x41\x12object,update_mask\x8a\xd3\xe4\x93\x02\x1e\x12\x1c\n\robject.bucket\x12\x0b{bucket=**}\x12`\n\x0bWriteObject\x12%.google.storage.v2.WriteObjectRequest\x1a&.google.storage.v2.WriteObjectResponse\"\x00(\x01\x12n\n\x0f\x42idiWriteObject\x12).google.storage.v2.BidiWriteObjectRequest\x1a*.google.storage.v2.BidiWriteObjectResponse\"\x00(\x01\x30\x01\x12\x84\x01\n\x0bListObjects\x12%.google.storage.v2.ListObjectsRequest\x1a&.google.storage.v2.ListObjectsResponse\"&\xda\x41\x06parent\x8a\xd3\xe4\x93\x02\x17\x12\x15\n\x06parent\x12\x0b{bucket=**}\x12\x98\x01\n\rRewriteObject\x12\'.google.storage.v2.RewriteObjectRequest\x1a\".google.storage.v2.RewriteResponse\":\x8a\xd3\xe4\x93\x02\x34\x12\x0f\n\rsource_bucket\x12!\n\x12\x64\x65stination_bucket\x12\x0b{bucket=**}\x12\xae\x01\n\x13StartResumableWrite\x12-.google.storage.v2.StartResumableWriteRequest\x1a..google.storage.v2.StartResumableWriteResponse\"8\x8a\xd3\xe4\x93\x02\x32\x12\x30\n!write_object_spec.resource.bucket\x12\x0b{bucket=**}\x12\xae\x01\n\x10QueryWriteStatus\x12*.google.storage.v2.QueryWriteStatusRequest\x1a+.google.storage.v2.QueryWriteStatusResponse\"A\xda\x41\tupload_id\x8a\xd3\xe4\x93\x02/\x12-\n\tupload_id\x12 {bucket=projects/*/buckets/*}/**\x12\x80\x01\n\x11GetServiceAccount\x12+.google.storage.v2.GetServiceAccountRequest\x1a!.google.storage.v2.ServiceAccount\"\x1b\xda\x41\x07project\x8a\xd3\xe4\x93\x02\x0b\x12\t\n\x07project\x12\x95\x01\n\rCreateHmacKey\x12\'.google.storage.v2.CreateHmacKeyRequest\x1a(.google.storage.v2.CreateHmacKeyResponse\"1\xda\x41\x1dproject,service_account_email\x8a\xd3\xe4\x93\x02\x0b\x12\t\n\x07project\x12w\n\rDeleteHmacKey\x12\'.google.storage.v2.DeleteHmacKeyRequest\x1a\x16.google.protobuf.Empty\"%\xda\x41\x11\x61\x63\x63\x65ss_id,project\x8a\xd3\xe4\x93\x02\x0b\x12\t\n\x07project\x12}\n\nGetHmacKey\x12$.google.storage.v2.GetHmacKeyRequest\x1a\".google.storage.v2.HmacKeyMetadata\"%\xda\x41\x11\x61\x63\x63\x65ss_id,project\x8a\xd3\xe4\x93\x02\x0b\x12\t\n\x07project\x12|\n\x0cListHmacKeys\x12&.google.storage.v2.ListHmacKeysRequest\x1a\'.google.storage.v2.ListHmacKeysResponse\"\x1b\xda\x41\x07project\x8a\xd3\xe4\x93\x02\x0b\x12\t\n\x07project\x12\x9d\x01\n\rUpdateHmacKey\x12\'.google.storage.v2.UpdateHmacKeyRequest\x1a\".google.storage.v2.HmacKeyMetadata\"?\xda\x41\x14hmac_key,update_mask\x8a\xd3\xe4\x93\x02\"\x12 \n\x10hmac_key.project\x12\x0c{project=**}\x1a\xa7\x02\xca\x41\x16storage.googleapis.com\xd2\x41\x8a\x02https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/cloud-platform.read-only,https://www.googleapis.com/auth/devstorage.full_control,https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/devstorage.read_writeB\xe2\x01\n\x15\x63om.google.storage.v2B\x0cStorageProtoP\x01Z>cloud.google.com/go/storage/internal/apiv2/storagepb;storagepb\xea\x41x\n!cloudkms.googleapis.com/CryptoKey\x12Sprojects/{project}/locations/{location}/keyRings/{key_ring}/cryptoKeys/{crypto_key}b\x06proto3')
 
 _globals = globals()
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -33,199 +33,199 @@ if _descriptor._USE_C_DESCRIPTORS == False:
   DESCRIPTOR._options = None
   DESCRIPTOR._serialized_options = b'\n\025com.google.storage.v2B\014StorageProtoP\001Z>cloud.google.com/go/storage/internal/apiv2/storagepb;storagepb\352Ax\n!cloudkms.googleapis.com/CryptoKey\022Sprojects/{project}/locations/{location}/keyRings/{key_ring}/cryptoKeys/{crypto_key}'
   _DELETEBUCKETREQUEST.fields_by_name['name']._options = None
-  _DELETEBUCKETREQUEST.fields_by_name['name']._serialized_options = b'\342A\001\002\372A\037\n\035storage.googleapis.com/Bucket'
+  _DELETEBUCKETREQUEST.fields_by_name['name']._serialized_options = b'\340A\002\372A\037\n\035storage.googleapis.com/Bucket'
   _GETBUCKETREQUEST.fields_by_name['name']._options = None
-  _GETBUCKETREQUEST.fields_by_name['name']._serialized_options = b'\342A\001\002\372A\037\n\035storage.googleapis.com/Bucket'
+  _GETBUCKETREQUEST.fields_by_name['name']._serialized_options = b'\340A\002\372A\037\n\035storage.googleapis.com/Bucket'
   _CREATEBUCKETREQUEST.fields_by_name['parent']._options = None
-  _CREATEBUCKETREQUEST.fields_by_name['parent']._serialized_options = b'\342A\001\002\372A\037\022\035storage.googleapis.com/Bucket'
+  _CREATEBUCKETREQUEST.fields_by_name['parent']._serialized_options = b'\340A\002\372A\037\022\035storage.googleapis.com/Bucket'
   _CREATEBUCKETREQUEST.fields_by_name['bucket_id']._options = None
-  _CREATEBUCKETREQUEST.fields_by_name['bucket_id']._serialized_options = b'\342A\001\002'
+  _CREATEBUCKETREQUEST.fields_by_name['bucket_id']._serialized_options = b'\340A\002'
   _LISTBUCKETSREQUEST.fields_by_name['parent']._options = None
-  _LISTBUCKETSREQUEST.fields_by_name['parent']._serialized_options = b'\342A\001\002\372A\037\022\035storage.googleapis.com/Bucket'
+  _LISTBUCKETSREQUEST.fields_by_name['parent']._serialized_options = b'\340A\002\372A\037\022\035storage.googleapis.com/Bucket'
   _LOCKBUCKETRETENTIONPOLICYREQUEST.fields_by_name['bucket']._options = None
-  _LOCKBUCKETRETENTIONPOLICYREQUEST.fields_by_name['bucket']._serialized_options = b'\342A\001\002\372A\037\n\035storage.googleapis.com/Bucket'
+  _LOCKBUCKETRETENTIONPOLICYREQUEST.fields_by_name['bucket']._serialized_options = b'\340A\002\372A\037\n\035storage.googleapis.com/Bucket'
   _LOCKBUCKETRETENTIONPOLICYREQUEST.fields_by_name['if_metageneration_match']._options = None
-  _LOCKBUCKETRETENTIONPOLICYREQUEST.fields_by_name['if_metageneration_match']._serialized_options = b'\342A\001\002'
+  _LOCKBUCKETRETENTIONPOLICYREQUEST.fields_by_name['if_metageneration_match']._serialized_options = b'\340A\002'
   _UPDATEBUCKETREQUEST.fields_by_name['bucket']._options = None
-  _UPDATEBUCKETREQUEST.fields_by_name['bucket']._serialized_options = b'\342A\001\002'
+  _UPDATEBUCKETREQUEST.fields_by_name['bucket']._serialized_options = b'\340A\002'
   _UPDATEBUCKETREQUEST.fields_by_name['update_mask']._options = None
-  _UPDATEBUCKETREQUEST.fields_by_name['update_mask']._serialized_options = b'\342A\001\002'
+  _UPDATEBUCKETREQUEST.fields_by_name['update_mask']._serialized_options = b'\340A\002'
   _DELETENOTIFICATIONCONFIGREQUEST.fields_by_name['name']._options = None
-  _DELETENOTIFICATIONCONFIGREQUEST.fields_by_name['name']._serialized_options = b'\342A\001\002\372A+\n)storage.googleapis.com/NotificationConfig'
+  _DELETENOTIFICATIONCONFIGREQUEST.fields_by_name['name']._serialized_options = b'\340A\002\372A+\n)storage.googleapis.com/NotificationConfig'
   _GETNOTIFICATIONCONFIGREQUEST.fields_by_name['name']._options = None
-  _GETNOTIFICATIONCONFIGREQUEST.fields_by_name['name']._serialized_options = b'\342A\001\002\372A+\n)storage.googleapis.com/NotificationConfig'
+  _GETNOTIFICATIONCONFIGREQUEST.fields_by_name['name']._serialized_options = b'\340A\002\372A+\n)storage.googleapis.com/NotificationConfig'
   _CREATENOTIFICATIONCONFIGREQUEST.fields_by_name['parent']._options = None
-  _CREATENOTIFICATIONCONFIGREQUEST.fields_by_name['parent']._serialized_options = b'\342A\001\002\372A+\022)storage.googleapis.com/NotificationConfig'
+  _CREATENOTIFICATIONCONFIGREQUEST.fields_by_name['parent']._serialized_options = b'\340A\002\372A+\022)storage.googleapis.com/NotificationConfig'
   _CREATENOTIFICATIONCONFIGREQUEST.fields_by_name['notification_config']._options = None
-  _CREATENOTIFICATIONCONFIGREQUEST.fields_by_name['notification_config']._serialized_options = b'\342A\001\002'
+  _CREATENOTIFICATIONCONFIGREQUEST.fields_by_name['notification_config']._serialized_options = b'\340A\002'
   _LISTNOTIFICATIONCONFIGSREQUEST.fields_by_name['parent']._options = None
-  _LISTNOTIFICATIONCONFIGSREQUEST.fields_by_name['parent']._serialized_options = b'\342A\001\002\372A+\022)storage.googleapis.com/NotificationConfig'
+  _LISTNOTIFICATIONCONFIGSREQUEST.fields_by_name['parent']._serialized_options = b'\340A\002\372A+\022)storage.googleapis.com/NotificationConfig'
   _COMPOSEOBJECTREQUEST_SOURCEOBJECT.fields_by_name['name']._options = None
-  _COMPOSEOBJECTREQUEST_SOURCEOBJECT.fields_by_name['name']._serialized_options = b'\342A\001\002'
+  _COMPOSEOBJECTREQUEST_SOURCEOBJECT.fields_by_name['name']._serialized_options = b'\340A\002'
   _COMPOSEOBJECTREQUEST.fields_by_name['destination']._options = None
-  _COMPOSEOBJECTREQUEST.fields_by_name['destination']._serialized_options = b'\342A\001\002'
+  _COMPOSEOBJECTREQUEST.fields_by_name['destination']._serialized_options = b'\340A\002'
   _COMPOSEOBJECTREQUEST.fields_by_name['kms_key']._options = None
   _COMPOSEOBJECTREQUEST.fields_by_name['kms_key']._serialized_options = b'\372A#\n!cloudkms.googleapis.com/CryptoKey'
   _DELETEOBJECTREQUEST.fields_by_name['bucket']._options = None
-  _DELETEOBJECTREQUEST.fields_by_name['bucket']._serialized_options = b'\342A\001\002\372A\037\n\035storage.googleapis.com/Bucket'
+  _DELETEOBJECTREQUEST.fields_by_name['bucket']._serialized_options = b'\340A\002\372A\037\n\035storage.googleapis.com/Bucket'
   _DELETEOBJECTREQUEST.fields_by_name['object']._options = None
-  _DELETEOBJECTREQUEST.fields_by_name['object']._serialized_options = b'\342A\001\002'
+  _DELETEOBJECTREQUEST.fields_by_name['object']._serialized_options = b'\340A\002'
   _RESTOREOBJECTREQUEST.fields_by_name['bucket']._options = None
-  _RESTOREOBJECTREQUEST.fields_by_name['bucket']._serialized_options = b'\342A\001\002\372A\037\n\035storage.googleapis.com/Bucket'
+  _RESTOREOBJECTREQUEST.fields_by_name['bucket']._serialized_options = b'\340A\002\372A\037\n\035storage.googleapis.com/Bucket'
   _RESTOREOBJECTREQUEST.fields_by_name['object']._options = None
-  _RESTOREOBJECTREQUEST.fields_by_name['object']._serialized_options = b'\342A\001\002'
+  _RESTOREOBJECTREQUEST.fields_by_name['object']._serialized_options = b'\340A\002'
   _RESTOREOBJECTREQUEST.fields_by_name['generation']._options = None
-  _RESTOREOBJECTREQUEST.fields_by_name['generation']._serialized_options = b'\342A\001\002'
+  _RESTOREOBJECTREQUEST.fields_by_name['generation']._serialized_options = b'\340A\002'
   _CANCELRESUMABLEWRITEREQUEST.fields_by_name['upload_id']._options = None
-  _CANCELRESUMABLEWRITEREQUEST.fields_by_name['upload_id']._serialized_options = b'\342A\001\002'
+  _CANCELRESUMABLEWRITEREQUEST.fields_by_name['upload_id']._serialized_options = b'\340A\002'
   _READOBJECTREQUEST.fields_by_name['bucket']._options = None
-  _READOBJECTREQUEST.fields_by_name['bucket']._serialized_options = b'\342A\001\002\372A\037\n\035storage.googleapis.com/Bucket'
+  _READOBJECTREQUEST.fields_by_name['bucket']._serialized_options = b'\340A\002\372A\037\n\035storage.googleapis.com/Bucket'
   _READOBJECTREQUEST.fields_by_name['object']._options = None
-  _READOBJECTREQUEST.fields_by_name['object']._serialized_options = b'\342A\001\002'
+  _READOBJECTREQUEST.fields_by_name['object']._serialized_options = b'\340A\002'
   _GETOBJECTREQUEST.fields_by_name['bucket']._options = None
-  _GETOBJECTREQUEST.fields_by_name['bucket']._serialized_options = b'\342A\001\002\372A\037\n\035storage.googleapis.com/Bucket'
+  _GETOBJECTREQUEST.fields_by_name['bucket']._serialized_options = b'\340A\002\372A\037\n\035storage.googleapis.com/Bucket'
   _GETOBJECTREQUEST.fields_by_name['object']._options = None
-  _GETOBJECTREQUEST.fields_by_name['object']._serialized_options = b'\342A\001\002'
+  _GETOBJECTREQUEST.fields_by_name['object']._serialized_options = b'\340A\002'
   _WRITEOBJECTSPEC.fields_by_name['resource']._options = None
-  _WRITEOBJECTSPEC.fields_by_name['resource']._serialized_options = b'\342A\001\002'
+  _WRITEOBJECTSPEC.fields_by_name['resource']._serialized_options = b'\340A\002'
   _WRITEOBJECTREQUEST.fields_by_name['write_offset']._options = None
-  _WRITEOBJECTREQUEST.fields_by_name['write_offset']._serialized_options = b'\342A\001\002'
+  _WRITEOBJECTREQUEST.fields_by_name['write_offset']._serialized_options = b'\340A\002'
   _BIDIWRITEOBJECTREQUEST.fields_by_name['write_offset']._options = None
-  _BIDIWRITEOBJECTREQUEST.fields_by_name['write_offset']._serialized_options = b'\342A\001\002'
+  _BIDIWRITEOBJECTREQUEST.fields_by_name['write_offset']._serialized_options = b'\340A\002'
   _LISTOBJECTSREQUEST.fields_by_name['parent']._options = None
-  _LISTOBJECTSREQUEST.fields_by_name['parent']._serialized_options = b'\342A\001\002\372A\037\n\035storage.googleapis.com/Bucket'
+  _LISTOBJECTSREQUEST.fields_by_name['parent']._serialized_options = b'\340A\002\372A\037\n\035storage.googleapis.com/Bucket'
   _LISTOBJECTSREQUEST.fields_by_name['lexicographic_start']._options = None
-  _LISTOBJECTSREQUEST.fields_by_name['lexicographic_start']._serialized_options = b'\342A\001\001'
+  _LISTOBJECTSREQUEST.fields_by_name['lexicographic_start']._serialized_options = b'\340A\001'
   _LISTOBJECTSREQUEST.fields_by_name['lexicographic_end']._options = None
-  _LISTOBJECTSREQUEST.fields_by_name['lexicographic_end']._serialized_options = b'\342A\001\001'
+  _LISTOBJECTSREQUEST.fields_by_name['lexicographic_end']._serialized_options = b'\340A\001'
   _LISTOBJECTSREQUEST.fields_by_name['soft_deleted']._options = None
-  _LISTOBJECTSREQUEST.fields_by_name['soft_deleted']._serialized_options = b'\342A\001\001'
+  _LISTOBJECTSREQUEST.fields_by_name['soft_deleted']._serialized_options = b'\340A\001'
   _LISTOBJECTSREQUEST.fields_by_name['match_glob']._options = None
-  _LISTOBJECTSREQUEST.fields_by_name['match_glob']._serialized_options = b'\342A\001\001'
+  _LISTOBJECTSREQUEST.fields_by_name['match_glob']._serialized_options = b'\340A\001'
   _QUERYWRITESTATUSREQUEST.fields_by_name['upload_id']._options = None
-  _QUERYWRITESTATUSREQUEST.fields_by_name['upload_id']._serialized_options = b'\342A\001\002'
+  _QUERYWRITESTATUSREQUEST.fields_by_name['upload_id']._serialized_options = b'\340A\002'
   _REWRITEOBJECTREQUEST.fields_by_name['destination_name']._options = None
-  _REWRITEOBJECTREQUEST.fields_by_name['destination_name']._serialized_options = b'\342A\002\002\005'
+  _REWRITEOBJECTREQUEST.fields_by_name['destination_name']._serialized_options = b'\340A\002\340A\005'
   _REWRITEOBJECTREQUEST.fields_by_name['destination_bucket']._options = None
-  _REWRITEOBJECTREQUEST.fields_by_name['destination_bucket']._serialized_options = b'\342A\002\002\005\372A\037\n\035storage.googleapis.com/Bucket'
+  _REWRITEOBJECTREQUEST.fields_by_name['destination_bucket']._serialized_options = b'\340A\002\340A\005\372A\037\n\035storage.googleapis.com/Bucket'
   _REWRITEOBJECTREQUEST.fields_by_name['destination_kms_key']._options = None
   _REWRITEOBJECTREQUEST.fields_by_name['destination_kms_key']._serialized_options = b'\372A#\n!cloudkms.googleapis.com/CryptoKey'
   _REWRITEOBJECTREQUEST.fields_by_name['source_bucket']._options = None
-  _REWRITEOBJECTREQUEST.fields_by_name['source_bucket']._serialized_options = b'\342A\001\002\372A\037\n\035storage.googleapis.com/Bucket'
+  _REWRITEOBJECTREQUEST.fields_by_name['source_bucket']._serialized_options = b'\340A\002\372A\037\n\035storage.googleapis.com/Bucket'
   _REWRITEOBJECTREQUEST.fields_by_name['source_object']._options = None
-  _REWRITEOBJECTREQUEST.fields_by_name['source_object']._serialized_options = b'\342A\001\002'
+  _REWRITEOBJECTREQUEST.fields_by_name['source_object']._serialized_options = b'\340A\002'
   _STARTRESUMABLEWRITEREQUEST.fields_by_name['write_object_spec']._options = None
-  _STARTRESUMABLEWRITEREQUEST.fields_by_name['write_object_spec']._serialized_options = b'\342A\001\002'
+  _STARTRESUMABLEWRITEREQUEST.fields_by_name['write_object_spec']._serialized_options = b'\340A\002'
   _UPDATEOBJECTREQUEST.fields_by_name['object']._options = None
-  _UPDATEOBJECTREQUEST.fields_by_name['object']._serialized_options = b'\342A\001\002'
+  _UPDATEOBJECTREQUEST.fields_by_name['object']._serialized_options = b'\340A\002'
   _UPDATEOBJECTREQUEST.fields_by_name['update_mask']._options = None
-  _UPDATEOBJECTREQUEST.fields_by_name['update_mask']._serialized_options = b'\342A\001\002'
+  _UPDATEOBJECTREQUEST.fields_by_name['update_mask']._serialized_options = b'\340A\002'
   _GETSERVICEACCOUNTREQUEST.fields_by_name['project']._options = None
-  _GETSERVICEACCOUNTREQUEST.fields_by_name['project']._serialized_options = b'\342A\001\002\372A-\n+cloudresourcemanager.googleapis.com/Project'
+  _GETSERVICEACCOUNTREQUEST.fields_by_name['project']._serialized_options = b'\340A\002\372A-\n+cloudresourcemanager.googleapis.com/Project'
   _CREATEHMACKEYREQUEST.fields_by_name['project']._options = None
-  _CREATEHMACKEYREQUEST.fields_by_name['project']._serialized_options = b'\342A\001\002\372A-\n+cloudresourcemanager.googleapis.com/Project'
+  _CREATEHMACKEYREQUEST.fields_by_name['project']._serialized_options = b'\340A\002\372A-\n+cloudresourcemanager.googleapis.com/Project'
   _CREATEHMACKEYREQUEST.fields_by_name['service_account_email']._options = None
-  _CREATEHMACKEYREQUEST.fields_by_name['service_account_email']._serialized_options = b'\342A\001\002'
+  _CREATEHMACKEYREQUEST.fields_by_name['service_account_email']._serialized_options = b'\340A\002'
   _DELETEHMACKEYREQUEST.fields_by_name['access_id']._options = None
-  _DELETEHMACKEYREQUEST.fields_by_name['access_id']._serialized_options = b'\342A\001\002'
+  _DELETEHMACKEYREQUEST.fields_by_name['access_id']._serialized_options = b'\340A\002'
   _DELETEHMACKEYREQUEST.fields_by_name['project']._options = None
-  _DELETEHMACKEYREQUEST.fields_by_name['project']._serialized_options = b'\342A\001\002\372A-\n+cloudresourcemanager.googleapis.com/Project'
+  _DELETEHMACKEYREQUEST.fields_by_name['project']._serialized_options = b'\340A\002\372A-\n+cloudresourcemanager.googleapis.com/Project'
   _GETHMACKEYREQUEST.fields_by_name['access_id']._options = None
-  _GETHMACKEYREQUEST.fields_by_name['access_id']._serialized_options = b'\342A\001\002'
+  _GETHMACKEYREQUEST.fields_by_name['access_id']._serialized_options = b'\340A\002'
   _GETHMACKEYREQUEST.fields_by_name['project']._options = None
-  _GETHMACKEYREQUEST.fields_by_name['project']._serialized_options = b'\342A\001\002\372A-\n+cloudresourcemanager.googleapis.com/Project'
+  _GETHMACKEYREQUEST.fields_by_name['project']._serialized_options = b'\340A\002\372A-\n+cloudresourcemanager.googleapis.com/Project'
   _LISTHMACKEYSREQUEST.fields_by_name['project']._options = None
-  _LISTHMACKEYSREQUEST.fields_by_name['project']._serialized_options = b'\342A\001\002\372A-\n+cloudresourcemanager.googleapis.com/Project'
+  _LISTHMACKEYSREQUEST.fields_by_name['project']._serialized_options = b'\340A\002\372A-\n+cloudresourcemanager.googleapis.com/Project'
   _UPDATEHMACKEYREQUEST.fields_by_name['hmac_key']._options = None
-  _UPDATEHMACKEYREQUEST.fields_by_name['hmac_key']._serialized_options = b'\342A\001\002'
+  _UPDATEHMACKEYREQUEST.fields_by_name['hmac_key']._serialized_options = b'\340A\002'
   _SERVICECONSTANTS_VALUES._options = None
   _SERVICECONSTANTS_VALUES._serialized_options = b'\020\001'
   _BUCKET_ENCRYPTION.fields_by_name['default_kms_key']._options = None
   _BUCKET_ENCRYPTION.fields_by_name['default_kms_key']._serialized_options = b'\372A#\n!cloudkms.googleapis.com/CryptoKey'
   _BUCKET_AUTOCLASS.fields_by_name['toggle_time']._options = None
-  _BUCKET_AUTOCLASS.fields_by_name['toggle_time']._serialized_options = b'\342A\001\003'
+  _BUCKET_AUTOCLASS.fields_by_name['toggle_time']._serialized_options = b'\340A\003'
   _BUCKET_AUTOCLASS.fields_by_name['terminal_storage_class_update_time']._options = None
-  _BUCKET_AUTOCLASS.fields_by_name['terminal_storage_class_update_time']._serialized_options = b'\342A\001\003'
+  _BUCKET_AUTOCLASS.fields_by_name['terminal_storage_class_update_time']._serialized_options = b'\340A\003'
   _BUCKET_LABELSENTRY._options = None
   _BUCKET_LABELSENTRY._serialized_options = b'8\001'
   _BUCKET.fields_by_name['name']._options = None
-  _BUCKET.fields_by_name['name']._serialized_options = b'\342A\001\005'
+  _BUCKET.fields_by_name['name']._serialized_options = b'\340A\005'
   _BUCKET.fields_by_name['bucket_id']._options = None
-  _BUCKET.fields_by_name['bucket_id']._serialized_options = b'\342A\001\003'
+  _BUCKET.fields_by_name['bucket_id']._serialized_options = b'\340A\003'
   _BUCKET.fields_by_name['project']._options = None
-  _BUCKET.fields_by_name['project']._serialized_options = b'\342A\001\005\372A-\n+cloudresourcemanager.googleapis.com/Project'
+  _BUCKET.fields_by_name['project']._serialized_options = b'\340A\005\372A-\n+cloudresourcemanager.googleapis.com/Project'
   _BUCKET.fields_by_name['metageneration']._options = None
-  _BUCKET.fields_by_name['metageneration']._serialized_options = b'\342A\001\003'
+  _BUCKET.fields_by_name['metageneration']._serialized_options = b'\340A\003'
   _BUCKET.fields_by_name['location']._options = None
-  _BUCKET.fields_by_name['location']._serialized_options = b'\342A\001\005'
+  _BUCKET.fields_by_name['location']._serialized_options = b'\340A\005'
   _BUCKET.fields_by_name['location_type']._options = None
-  _BUCKET.fields_by_name['location_type']._serialized_options = b'\342A\001\003'
+  _BUCKET.fields_by_name['location_type']._serialized_options = b'\340A\003'
   _BUCKET.fields_by_name['create_time']._options = None
-  _BUCKET.fields_by_name['create_time']._serialized_options = b'\342A\001\003'
+  _BUCKET.fields_by_name['create_time']._serialized_options = b'\340A\003'
   _BUCKET.fields_by_name['update_time']._options = None
-  _BUCKET.fields_by_name['update_time']._serialized_options = b'\342A\001\003'
+  _BUCKET.fields_by_name['update_time']._serialized_options = b'\340A\003'
   _BUCKET.fields_by_name['owner']._options = None
-  _BUCKET.fields_by_name['owner']._serialized_options = b'\342A\001\003'
+  _BUCKET.fields_by_name['owner']._serialized_options = b'\340A\003'
   _BUCKET.fields_by_name['soft_delete_policy']._options = None
-  _BUCKET.fields_by_name['soft_delete_policy']._serialized_options = b'\342A\001\001'
+  _BUCKET.fields_by_name['soft_delete_policy']._serialized_options = b'\340A\001'
   _BUCKET._options = None
   _BUCKET._serialized_options = b'\352AD\n\035storage.googleapis.com/Bucket\022#projects/{project}/buckets/{bucket}'
   _BUCKETACCESSCONTROL.fields_by_name['entity_alt']._options = None
-  _BUCKETACCESSCONTROL.fields_by_name['entity_alt']._serialized_options = b'\342A\001\003'
+  _BUCKETACCESSCONTROL.fields_by_name['entity_alt']._serialized_options = b'\340A\003'
   _CHECKSUMMEDDATA.fields_by_name['content']._options = None
-  _CHECKSUMMEDDATA.fields_by_name['content']._serialized_options = b'\010\001\342A\001\001'
+  _CHECKSUMMEDDATA.fields_by_name['content']._serialized_options = b'\010\001\340A\001'
   _HMACKEYMETADATA.fields_by_name['id']._options = None
-  _HMACKEYMETADATA.fields_by_name['id']._serialized_options = b'\342A\001\005'
+  _HMACKEYMETADATA.fields_by_name['id']._serialized_options = b'\340A\005'
   _HMACKEYMETADATA.fields_by_name['access_id']._options = None
-  _HMACKEYMETADATA.fields_by_name['access_id']._serialized_options = b'\342A\001\005'
+  _HMACKEYMETADATA.fields_by_name['access_id']._serialized_options = b'\340A\005'
   _HMACKEYMETADATA.fields_by_name['project']._options = None
-  _HMACKEYMETADATA.fields_by_name['project']._serialized_options = b'\342A\001\005\372A-\n+cloudresourcemanager.googleapis.com/Project'
+  _HMACKEYMETADATA.fields_by_name['project']._serialized_options = b'\340A\005\372A-\n+cloudresourcemanager.googleapis.com/Project'
   _HMACKEYMETADATA.fields_by_name['service_account_email']._options = None
-  _HMACKEYMETADATA.fields_by_name['service_account_email']._serialized_options = b'\342A\001\003'
+  _HMACKEYMETADATA.fields_by_name['service_account_email']._serialized_options = b'\340A\003'
   _HMACKEYMETADATA.fields_by_name['create_time']._options = None
-  _HMACKEYMETADATA.fields_by_name['create_time']._serialized_options = b'\342A\001\003'
+  _HMACKEYMETADATA.fields_by_name['create_time']._serialized_options = b'\340A\003'
   _HMACKEYMETADATA.fields_by_name['update_time']._options = None
-  _HMACKEYMETADATA.fields_by_name['update_time']._serialized_options = b'\342A\001\003'
+  _HMACKEYMETADATA.fields_by_name['update_time']._serialized_options = b'\340A\003'
   _NOTIFICATIONCONFIG_CUSTOMATTRIBUTESENTRY._options = None
   _NOTIFICATIONCONFIG_CUSTOMATTRIBUTESENTRY._serialized_options = b'8\001'
   _NOTIFICATIONCONFIG.fields_by_name['name']._options = None
-  _NOTIFICATIONCONFIG.fields_by_name['name']._serialized_options = b'\342A\001\002'
+  _NOTIFICATIONCONFIG.fields_by_name['name']._serialized_options = b'\340A\002'
   _NOTIFICATIONCONFIG.fields_by_name['topic']._options = None
-  _NOTIFICATIONCONFIG.fields_by_name['topic']._serialized_options = b'\342A\001\002'
+  _NOTIFICATIONCONFIG.fields_by_name['topic']._serialized_options = b'\340A\002'
   _NOTIFICATIONCONFIG.fields_by_name['payload_format']._options = None
-  _NOTIFICATIONCONFIG.fields_by_name['payload_format']._serialized_options = b'\342A\001\002'
+  _NOTIFICATIONCONFIG.fields_by_name['payload_format']._serialized_options = b'\340A\002'
   _NOTIFICATIONCONFIG._options = None
   _NOTIFICATIONCONFIG._serialized_options = b'\352Az\n)storage.googleapis.com/NotificationConfig\022Mprojects/{project}/buckets/{bucket}/notificationConfigs/{notification_config}'
   _OBJECT_METADATAENTRY._options = None
   _OBJECT_METADATAENTRY._serialized_options = b'8\001'
   _OBJECT.fields_by_name['name']._options = None
-  _OBJECT.fields_by_name['name']._serialized_options = b'\342A\001\005'
+  _OBJECT.fields_by_name['name']._serialized_options = b'\340A\005'
   _OBJECT.fields_by_name['bucket']._options = None
-  _OBJECT.fields_by_name['bucket']._serialized_options = b'\342A\001\005\372A\037\n\035storage.googleapis.com/Bucket'
+  _OBJECT.fields_by_name['bucket']._serialized_options = b'\340A\005\372A\037\n\035storage.googleapis.com/Bucket'
   _OBJECT.fields_by_name['generation']._options = None
-  _OBJECT.fields_by_name['generation']._serialized_options = b'\342A\001\005'
+  _OBJECT.fields_by_name['generation']._serialized_options = b'\340A\005'
   _OBJECT.fields_by_name['metageneration']._options = None
-  _OBJECT.fields_by_name['metageneration']._serialized_options = b'\342A\001\003'
+  _OBJECT.fields_by_name['metageneration']._serialized_options = b'\340A\003'
   _OBJECT.fields_by_name['size']._options = None
-  _OBJECT.fields_by_name['size']._serialized_options = b'\342A\001\003'
+  _OBJECT.fields_by_name['size']._serialized_options = b'\340A\003'
   _OBJECT.fields_by_name['delete_time']._options = None
-  _OBJECT.fields_by_name['delete_time']._serialized_options = b'\342A\001\003'
+  _OBJECT.fields_by_name['delete_time']._serialized_options = b'\340A\003'
   _OBJECT.fields_by_name['create_time']._options = None
-  _OBJECT.fields_by_name['create_time']._serialized_options = b'\342A\001\003'
+  _OBJECT.fields_by_name['create_time']._serialized_options = b'\340A\003'
   _OBJECT.fields_by_name['component_count']._options = None
-  _OBJECT.fields_by_name['component_count']._serialized_options = b'\342A\001\003'
+  _OBJECT.fields_by_name['component_count']._serialized_options = b'\340A\003'
   _OBJECT.fields_by_name['checksums']._options = None
-  _OBJECT.fields_by_name['checksums']._serialized_options = b'\342A\001\003'
+  _OBJECT.fields_by_name['checksums']._serialized_options = b'\340A\003'
   _OBJECT.fields_by_name['update_time']._options = None
-  _OBJECT.fields_by_name['update_time']._serialized_options = b'\342A\001\003'
+  _OBJECT.fields_by_name['update_time']._serialized_options = b'\340A\003'
   _OBJECT.fields_by_name['kms_key']._options = None
   _OBJECT.fields_by_name['kms_key']._serialized_options = b'\372A#\n!cloudkms.googleapis.com/CryptoKey'
   _OBJECT.fields_by_name['update_storage_class_time']._options = None
-  _OBJECT.fields_by_name['update_storage_class_time']._serialized_options = b'\342A\001\003'
+  _OBJECT.fields_by_name['update_storage_class_time']._serialized_options = b'\340A\003'
   _OBJECT.fields_by_name['owner']._options = None
-  _OBJECT.fields_by_name['owner']._serialized_options = b'\342A\001\003'
+  _OBJECT.fields_by_name['owner']._serialized_options = b'\340A\003'
   _OBJECTACCESSCONTROL.fields_by_name['entity_alt']._options = None
-  _OBJECTACCESSCONTROL.fields_by_name['entity_alt']._serialized_options = b'\342A\001\003'
+  _OBJECTACCESSCONTROL.fields_by_name['entity_alt']._serialized_options = b'\340A\003'
   _STORAGE._options = None
   _STORAGE._serialized_options = b'\312A\026storage.googleapis.com\322A\212\002https://www.googleapis.com/auth/cloud-platform,https://www.googleapis.com/auth/cloud-platform.read-only,https://www.googleapis.com/auth/devstorage.full_control,https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/devstorage.read_write'
   _STORAGE.methods_by_name['DeleteBucket']._options = None
@@ -239,9 +239,9 @@ if _descriptor._USE_C_DESCRIPTORS == False:
   _STORAGE.methods_by_name['LockBucketRetentionPolicy']._options = None
   _STORAGE.methods_by_name['LockBucketRetentionPolicy']._serialized_options = b'\332A\006bucket\212\323\344\223\002\027\022\025\n\006bucket\022\013{bucket=**}'
   _STORAGE.methods_by_name['GetIamPolicy']._options = None
-  _STORAGE.methods_by_name['GetIamPolicy']._serialized_options = b'\332A\010resource\212\323\344\223\002O\022\027\n\010resource\022\013{bucket=**}\0224\n\010resource\022({bucket=projects/*/buckets/*}/objects/**'
+  _STORAGE.methods_by_name['GetIamPolicy']._serialized_options = b'\332A\010resource\212\323\344\223\002\031\022\027\n\010resource\022\013{bucket=**}'
   _STORAGE.methods_by_name['SetIamPolicy']._options = None
-  _STORAGE.methods_by_name['SetIamPolicy']._serialized_options = b'\332A\017resource,policy\212\323\344\223\002O\022\027\n\010resource\022\013{bucket=**}\0224\n\010resource\022({bucket=projects/*/buckets/*}/objects/**'
+  _STORAGE.methods_by_name['SetIamPolicy']._serialized_options = b'\332A\017resource,policy\212\323\344\223\002\031\022\027\n\010resource\022\013{bucket=**}'
   _STORAGE.methods_by_name['TestIamPermissions']._options = None
   _STORAGE.methods_by_name['TestIamPermissions']._serialized_options = b'\332A\024resource,permissions\212\323\344\223\002O\022\027\n\010resource\022\013{bucket=**}\0224\n\010resource\022({bucket=projects/*/buckets/*}/objects/**'
   _STORAGE.methods_by_name['UpdateBucket']._options = None
@@ -289,163 +289,163 @@ if _descriptor._USE_C_DESCRIPTORS == False:
   _STORAGE.methods_by_name['UpdateHmacKey']._options = None
   _STORAGE.methods_by_name['UpdateHmacKey']._serialized_options = b'\332A\024hmac_key,update_mask\212\323\344\223\002\"\022 \n\020hmac_key.project\022\014{project=**}'
   _globals['_DELETEBUCKETREQUEST']._serialized_start=378
-  _globals['_DELETEBUCKETREQUEST']._serialized_end=593
-  _globals['_GETBUCKETREQUEST']._serialized_start=596
-  _globals['_GETBUCKETREQUEST']._serialized_end=874
-  _globals['_CREATEBUCKETREQUEST']._serialized_start=877
-  _globals['_CREATEBUCKETREQUEST']._serialized_end=1085
-  _globals['_LISTBUCKETSREQUEST']._serialized_start=1088
-  _globals['_LISTBUCKETSREQUEST']._serialized_end=1285
-  _globals['_LISTBUCKETSRESPONSE']._serialized_start=1287
-  _globals['_LISTBUCKETSRESPONSE']._serialized_end=1377
-  _globals['_LOCKBUCKETRETENTIONPOLICYREQUEST']._serialized_start=1380
-  _globals['_LOCKBUCKETRETENTIONPOLICYREQUEST']._serialized_end=1509
-  _globals['_UPDATEBUCKETREQUEST']._serialized_start=1512
-  _globals['_UPDATEBUCKETREQUEST']._serialized_end=1840
-  _globals['_DELETENOTIFICATIONCONFIGREQUEST']._serialized_start=1842
-  _globals['_DELETENOTIFICATIONCONFIGREQUEST']._serialized_end=1941
-  _globals['_GETNOTIFICATIONCONFIGREQUEST']._serialized_start=1943
-  _globals['_GETNOTIFICATIONCONFIGREQUEST']._serialized_end=2039
-  _globals['_CREATENOTIFICATIONCONFIGREQUEST']._serialized_start=2042
-  _globals['_CREATENOTIFICATIONCONFIGREQUEST']._serialized_end=2217
-  _globals['_LISTNOTIFICATIONCONFIGSREQUEST']._serialized_start=2220
-  _globals['_LISTNOTIFICATIONCONFIGSREQUEST']._serialized_end=2359
-  _globals['_LISTNOTIFICATIONCONFIGSRESPONSE']._serialized_start=2361
-  _globals['_LISTNOTIFICATIONCONFIGSRESPONSE']._serialized_end=2488
-  _globals['_COMPOSEOBJECTREQUEST']._serialized_start=2491
-  _globals['_COMPOSEOBJECTREQUEST']._serialized_end=3250
-  _globals['_COMPOSEOBJECTREQUEST_SOURCEOBJECT']._serialized_start=2959
-  _globals['_COMPOSEOBJECTREQUEST_SOURCEOBJECT']._serialized_end=3198
-  _globals['_COMPOSEOBJECTREQUEST_SOURCEOBJECT_OBJECTPRECONDITIONS']._serialized_start=3119
-  _globals['_COMPOSEOBJECTREQUEST_SOURCEOBJECT_OBJECTPRECONDITIONS']._serialized_end=3198
-  _globals['_DELETEOBJECTREQUEST']._serialized_start=3253
-  _globals['_DELETEOBJECTREQUEST']._serialized_end=3720
-  _globals['_RESTOREOBJECTREQUEST']._serialized_start=3723
-  _globals['_RESTOREOBJECTREQUEST']._serialized_end=4247
-  _globals['_CANCELRESUMABLEWRITEREQUEST']._serialized_start=4249
-  _globals['_CANCELRESUMABLEWRITEREQUEST']._serialized_end=4303
-  _globals['_CANCELRESUMABLEWRITERESPONSE']._serialized_start=4305
-  _globals['_CANCELRESUMABLEWRITERESPONSE']._serialized_end=4335
-  _globals['_READOBJECTREQUEST']._serialized_start=4338
-  _globals['_READOBJECTREQUEST']._serialized_end=4910
-  _globals['_GETOBJECTREQUEST']._serialized_start=4913
-  _globals['_GETOBJECTREQUEST']._serialized_end=5487
-  _globals['_READOBJECTRESPONSE']._serialized_start=5490
-  _globals['_READOBJECTRESPONSE']._serialized_end=5735
-  _globals['_WRITEOBJECTSPEC']._serialized_start=5738
-  _globals['_WRITEOBJECTSPEC']._serialized_end=6136
-  _globals['_WRITEOBJECTREQUEST']._serialized_start=6139
-  _globals['_WRITEOBJECTREQUEST']._serialized_end=6530
-  _globals['_WRITEOBJECTRESPONSE']._serialized_start=6532
-  _globals['_WRITEOBJECTRESPONSE']._serialized_end=6642
-  _globals['_BIDIWRITEOBJECTREQUEST']._serialized_start=6645
-  _globals['_BIDIWRITEOBJECTREQUEST']._serialized_end=7077
-  _globals['_BIDIWRITEOBJECTRESPONSE']._serialized_start=7079
-  _globals['_BIDIWRITEOBJECTRESPONSE']._serialized_end=7193
-  _globals['_LISTOBJECTSREQUEST']._serialized_start=7196
-  _globals['_LISTOBJECTSREQUEST']._serialized_end=7588
-  _globals['_QUERYWRITESTATUSREQUEST']._serialized_start=7591
-  _globals['_QUERYWRITESTATUSREQUEST']._serialized_end=7725
-  _globals['_QUERYWRITESTATUSRESPONSE']._serialized_start=7727
-  _globals['_QUERYWRITESTATUSRESPONSE']._serialized_end=7842
-  _globals['_REWRITEOBJECTREQUEST']._serialized_start=7845
-  _globals['_REWRITEOBJECTREQUEST']._serialized_end=9165
-  _globals['_REWRITERESPONSE']._serialized_start=9168
-  _globals['_REWRITERESPONSE']._serialized_end=9319
-  _globals['_STARTRESUMABLEWRITEREQUEST']._serialized_start=9322
-  _globals['_STARTRESUMABLEWRITEREQUEST']._serialized_end=9565
-  _globals['_STARTRESUMABLEWRITERESPONSE']._serialized_start=9567
-  _globals['_STARTRESUMABLEWRITERESPONSE']._serialized_end=9615
-  _globals['_UPDATEOBJECTREQUEST']._serialized_start=9618
-  _globals['_UPDATEOBJECTREQUEST']._serialized_end=10115
-  _globals['_GETSERVICEACCOUNTREQUEST']._serialized_start=10117
-  _globals['_GETSERVICEACCOUNTREQUEST']._serialized_end=10214
-  _globals['_CREATEHMACKEYREQUEST']._serialized_start=10217
-  _globals['_CREATEHMACKEYREQUEST']._serialized_end=10347
-  _globals['_CREATEHMACKEYRESPONSE']._serialized_start=10349
-  _globals['_CREATEHMACKEYRESPONSE']._serialized_end=10452
-  _globals['_DELETEHMACKEYREQUEST']._serialized_start=10454
-  _globals['_DELETEHMACKEYREQUEST']._serialized_end=10572
-  _globals['_GETHMACKEYREQUEST']._serialized_start=10574
-  _globals['_GETHMACKEYREQUEST']._serialized_end=10689
-  _globals['_LISTHMACKEYSREQUEST']._serialized_start=10692
-  _globals['_LISTHMACKEYSREQUEST']._serialized_end=10881
-  _globals['_LISTHMACKEYSRESPONSE']._serialized_start=10883
-  _globals['_LISTHMACKEYSRESPONSE']._serialized_end=10985
-  _globals['_UPDATEHMACKEYREQUEST']._serialized_start=10988
-  _globals['_UPDATEHMACKEYREQUEST']._serialized_end=11119
-  _globals['_COMMONOBJECTREQUESTPARAMS']._serialized_start=11121
-  _globals['_COMMONOBJECTREQUESTPARAMS']._serialized_end=11245
-  _globals['_SERVICECONSTANTS']._serialized_start=11248
-  _globals['_SERVICECONSTANTS']._serialized_end=11962
-  _globals['_SERVICECONSTANTS_VALUES']._serialized_start=11269
-  _globals['_SERVICECONSTANTS_VALUES']._serialized_end=11962
-  _globals['_BUCKET']._serialized_start=11965
-  _globals['_BUCKET']._serialized_end=15446
-  _globals['_BUCKET_BILLING']._serialized_start=13330
-  _globals['_BUCKET_BILLING']._serialized_end=13363
-  _globals['_BUCKET_CORS']._serialized_start=13365
-  _globals['_BUCKET_CORS']._serialized_end=13453
-  _globals['_BUCKET_ENCRYPTION']._serialized_start=13455
-  _globals['_BUCKET_ENCRYPTION']._serialized_end=13532
-  _globals['_BUCKET_IAMCONFIG']._serialized_start=13535
-  _globals['_BUCKET_IAMCONFIG']._serialized_end=13771
-  _globals['_BUCKET_IAMCONFIG_UNIFORMBUCKETLEVELACCESS']._serialized_start=13681
-  _globals['_BUCKET_IAMCONFIG_UNIFORMBUCKETLEVELACCESS']._serialized_end=13771
-  _globals['_BUCKET_LIFECYCLE']._serialized_start=13774
-  _globals['_BUCKET_LIFECYCLE']._serialized_end=14529
-  _globals['_BUCKET_LIFECYCLE_RULE']._serialized_start=13844
-  _globals['_BUCKET_LIFECYCLE_RULE']._serialized_end=14529
-  _globals['_BUCKET_LIFECYCLE_RULE_ACTION']._serialized_start=13988
-  _globals['_BUCKET_LIFECYCLE_RULE_ACTION']._serialized_end=14033
-  _globals['_BUCKET_LIFECYCLE_RULE_CONDITION']._serialized_start=14036
-  _globals['_BUCKET_LIFECYCLE_RULE_CONDITION']._serialized_end=14529
-  _globals['_BUCKET_LOGGING']._serialized_start=14531
-  _globals['_BUCKET_LOGGING']._serialized_end=14587
-  _globals['_BUCKET_RETENTIONPOLICY']._serialized_start=14590
-  _globals['_BUCKET_RETENTIONPOLICY']._serialized_end=14733
-  _globals['_BUCKET_SOFTDELETEPOLICY']._serialized_start=14736
-  _globals['_BUCKET_SOFTDELETEPOLICY']._serialized_end=14913
-  _globals['_BUCKET_VERSIONING']._serialized_start=14915
-  _globals['_BUCKET_VERSIONING']._serialized_end=14944
-  _globals['_BUCKET_WEBSITE']._serialized_start=14946
-  _globals['_BUCKET_WEBSITE']._serialized_end=15005
-  _globals['_BUCKET_CUSTOMPLACEMENTCONFIG']._serialized_start=15007
-  _globals['_BUCKET_CUSTOMPLACEMENTCONFIG']._serialized_end=15054
-  _globals['_BUCKET_AUTOCLASS']._serialized_start=15057
-  _globals['_BUCKET_AUTOCLASS']._serialized_end=15326
-  _globals['_BUCKET_LABELSENTRY']._serialized_start=15328
-  _globals['_BUCKET_LABELSENTRY']._serialized_end=15373
-  _globals['_BUCKETACCESSCONTROL']._serialized_start=15449
-  _globals['_BUCKETACCESSCONTROL']._serialized_end=15656
-  _globals['_CHECKSUMMEDDATA']._serialized_start=15658
-  _globals['_CHECKSUMMEDDATA']._serialized_end=15732
-  _globals['_OBJECTCHECKSUMS']._serialized_start=15734
-  _globals['_OBJECTCHECKSUMS']._serialized_end=15801
-  _globals['_HMACKEYMETADATA']._serialized_start=15804
-  _globals['_HMACKEYMETADATA']._serialized_end=16111
-  _globals['_NOTIFICATIONCONFIG']._serialized_start=16114
-  _globals['_NOTIFICATIONCONFIG']._serialized_end=16540
-  _globals['_NOTIFICATIONCONFIG_CUSTOMATTRIBUTESENTRY']._serialized_start=16358
-  _globals['_NOTIFICATIONCONFIG_CUSTOMATTRIBUTESENTRY']._serialized_end=16413
-  _globals['_CUSTOMERENCRYPTION']._serialized_start=16542
-  _globals['_CUSTOMERENCRYPTION']._serialized_end=16618
-  _globals['_OBJECT']._serialized_start=16621
-  _globals['_OBJECT']._serialized_end=17787
-  _globals['_OBJECT_METADATAENTRY']._serialized_start=17719
-  _globals['_OBJECT_METADATAENTRY']._serialized_end=17766
-  _globals['_OBJECTACCESSCONTROL']._serialized_start=17790
-  _globals['_OBJECTACCESSCONTROL']._serialized_end=17997
-  _globals['_LISTOBJECTSRESPONSE']._serialized_start=17999
-  _globals['_LISTOBJECTSRESPONSE']._serialized_end=18107
-  _globals['_PROJECTTEAM']._serialized_start=18109
-  _globals['_PROJECTTEAM']._serialized_end=18160
-  _globals['_SERVICEACCOUNT']._serialized_start=18162
-  _globals['_SERVICEACCOUNT']._serialized_end=18201
-  _globals['_OWNER']._serialized_start=18203
-  _globals['_OWNER']._serialized_end=18245
-  _globals['_CONTENTRANGE']._serialized_start=18247
-  _globals['_CONTENTRANGE']._serialized_end=18314
-  _globals['_STORAGE']._serialized_start=18317
-  _globals['_STORAGE']._serialized_end=23461
+  _globals['_DELETEBUCKETREQUEST']._serialized_end=592
+  _globals['_GETBUCKETREQUEST']._serialized_start=595
+  _globals['_GETBUCKETREQUEST']._serialized_end=872
+  _globals['_CREATEBUCKETREQUEST']._serialized_start=875
+  _globals['_CREATEBUCKETREQUEST']._serialized_end=1081
+  _globals['_LISTBUCKETSREQUEST']._serialized_start=1084
+  _globals['_LISTBUCKETSREQUEST']._serialized_end=1280
+  _globals['_LISTBUCKETSRESPONSE']._serialized_start=1282
+  _globals['_LISTBUCKETSRESPONSE']._serialized_end=1372
+  _globals['_LOCKBUCKETRETENTIONPOLICYREQUEST']._serialized_start=1374
+  _globals['_LOCKBUCKETRETENTIONPOLICYREQUEST']._serialized_end=1501
+  _globals['_UPDATEBUCKETREQUEST']._serialized_start=1504
+  _globals['_UPDATEBUCKETREQUEST']._serialized_end=1830
+  _globals['_DELETENOTIFICATIONCONFIGREQUEST']._serialized_start=1832
+  _globals['_DELETENOTIFICATIONCONFIGREQUEST']._serialized_end=1930
+  _globals['_GETNOTIFICATIONCONFIGREQUEST']._serialized_start=1932
+  _globals['_GETNOTIFICATIONCONFIGREQUEST']._serialized_end=2027
+  _globals['_CREATENOTIFICATIONCONFIGREQUEST']._serialized_start=2030
+  _globals['_CREATENOTIFICATIONCONFIGREQUEST']._serialized_end=2203
+  _globals['_LISTNOTIFICATIONCONFIGSREQUEST']._serialized_start=2206
+  _globals['_LISTNOTIFICATIONCONFIGSREQUEST']._serialized_end=2344
+  _globals['_LISTNOTIFICATIONCONFIGSRESPONSE']._serialized_start=2346
+  _globals['_LISTNOTIFICATIONCONFIGSRESPONSE']._serialized_end=2473
+  _globals['_COMPOSEOBJECTREQUEST']._serialized_start=2476
+  _globals['_COMPOSEOBJECTREQUEST']._serialized_end=3233
+  _globals['_COMPOSEOBJECTREQUEST_SOURCEOBJECT']._serialized_start=2943
+  _globals['_COMPOSEOBJECTREQUEST_SOURCEOBJECT']._serialized_end=3181
+  _globals['_COMPOSEOBJECTREQUEST_SOURCEOBJECT_OBJECTPRECONDITIONS']._serialized_start=3102
+  _globals['_COMPOSEOBJECTREQUEST_SOURCEOBJECT_OBJECTPRECONDITIONS']._serialized_end=3181
+  _globals['_DELETEOBJECTREQUEST']._serialized_start=3236
+  _globals['_DELETEOBJECTREQUEST']._serialized_end=3701
+  _globals['_RESTOREOBJECTREQUEST']._serialized_start=3704
+  _globals['_RESTOREOBJECTREQUEST']._serialized_end=4225
+  _globals['_CANCELRESUMABLEWRITEREQUEST']._serialized_start=4227
+  _globals['_CANCELRESUMABLEWRITEREQUEST']._serialized_end=4280
+  _globals['_CANCELRESUMABLEWRITERESPONSE']._serialized_start=4282
+  _globals['_CANCELRESUMABLEWRITERESPONSE']._serialized_end=4312
+  _globals['_READOBJECTREQUEST']._serialized_start=4315
+  _globals['_READOBJECTREQUEST']._serialized_end=4885
+  _globals['_GETOBJECTREQUEST']._serialized_start=4888
+  _globals['_GETOBJECTREQUEST']._serialized_end=5460
+  _globals['_READOBJECTRESPONSE']._serialized_start=5463
+  _globals['_READOBJECTRESPONSE']._serialized_end=5708
+  _globals['_WRITEOBJECTSPEC']._serialized_start=5711
+  _globals['_WRITEOBJECTSPEC']._serialized_end=6108
+  _globals['_WRITEOBJECTREQUEST']._serialized_start=6111
+  _globals['_WRITEOBJECTREQUEST']._serialized_end=6501
+  _globals['_WRITEOBJECTRESPONSE']._serialized_start=6503
+  _globals['_WRITEOBJECTRESPONSE']._serialized_end=6613
+  _globals['_BIDIWRITEOBJECTREQUEST']._serialized_start=6616
+  _globals['_BIDIWRITEOBJECTREQUEST']._serialized_end=7047
+  _globals['_BIDIWRITEOBJECTRESPONSE']._serialized_start=7049
+  _globals['_BIDIWRITEOBJECTRESPONSE']._serialized_end=7163
+  _globals['_LISTOBJECTSREQUEST']._serialized_start=7166
+  _globals['_LISTOBJECTSREQUEST']._serialized_end=7553
+  _globals['_QUERYWRITESTATUSREQUEST']._serialized_start=7556
+  _globals['_QUERYWRITESTATUSREQUEST']._serialized_end=7689
+  _globals['_QUERYWRITESTATUSRESPONSE']._serialized_start=7691
+  _globals['_QUERYWRITESTATUSRESPONSE']._serialized_end=7806
+  _globals['_REWRITEOBJECTREQUEST']._serialized_start=7809
+  _globals['_REWRITEOBJECTREQUEST']._serialized_end=9129
+  _globals['_REWRITERESPONSE']._serialized_start=9132
+  _globals['_REWRITERESPONSE']._serialized_end=9283
+  _globals['_STARTRESUMABLEWRITEREQUEST']._serialized_start=9286
+  _globals['_STARTRESUMABLEWRITEREQUEST']._serialized_end=9528
+  _globals['_STARTRESUMABLEWRITERESPONSE']._serialized_start=9530
+  _globals['_STARTRESUMABLEWRITERESPONSE']._serialized_end=9578
+  _globals['_UPDATEOBJECTREQUEST']._serialized_start=9581
+  _globals['_UPDATEOBJECTREQUEST']._serialized_end=10076
+  _globals['_GETSERVICEACCOUNTREQUEST']._serialized_start=10078
+  _globals['_GETSERVICEACCOUNTREQUEST']._serialized_end=10174
+  _globals['_CREATEHMACKEYREQUEST']._serialized_start=10177
+  _globals['_CREATEHMACKEYREQUEST']._serialized_end=10305
+  _globals['_CREATEHMACKEYRESPONSE']._serialized_start=10307
+  _globals['_CREATEHMACKEYRESPONSE']._serialized_end=10410
+  _globals['_DELETEHMACKEYREQUEST']._serialized_start=10412
+  _globals['_DELETEHMACKEYREQUEST']._serialized_end=10528
+  _globals['_GETHMACKEYREQUEST']._serialized_start=10530
+  _globals['_GETHMACKEYREQUEST']._serialized_end=10643
+  _globals['_LISTHMACKEYSREQUEST']._serialized_start=10646
+  _globals['_LISTHMACKEYSREQUEST']._serialized_end=10834
+  _globals['_LISTHMACKEYSRESPONSE']._serialized_start=10836
+  _globals['_LISTHMACKEYSRESPONSE']._serialized_end=10938
+  _globals['_UPDATEHMACKEYREQUEST']._serialized_start=10941
+  _globals['_UPDATEHMACKEYREQUEST']._serialized_end=11071
+  _globals['_COMMONOBJECTREQUESTPARAMS']._serialized_start=11073
+  _globals['_COMMONOBJECTREQUESTPARAMS']._serialized_end=11197
+  _globals['_SERVICECONSTANTS']._serialized_start=11200
+  _globals['_SERVICECONSTANTS']._serialized_end=11914
+  _globals['_SERVICECONSTANTS_VALUES']._serialized_start=11221
+  _globals['_SERVICECONSTANTS_VALUES']._serialized_end=11914
+  _globals['_BUCKET']._serialized_start=11917
+  _globals['_BUCKET']._serialized_end=15386
+  _globals['_BUCKET_BILLING']._serialized_start=13272
+  _globals['_BUCKET_BILLING']._serialized_end=13305
+  _globals['_BUCKET_CORS']._serialized_start=13307
+  _globals['_BUCKET_CORS']._serialized_end=13395
+  _globals['_BUCKET_ENCRYPTION']._serialized_start=13397
+  _globals['_BUCKET_ENCRYPTION']._serialized_end=13474
+  _globals['_BUCKET_IAMCONFIG']._serialized_start=13477
+  _globals['_BUCKET_IAMCONFIG']._serialized_end=13713
+  _globals['_BUCKET_IAMCONFIG_UNIFORMBUCKETLEVELACCESS']._serialized_start=13623
+  _globals['_BUCKET_IAMCONFIG_UNIFORMBUCKETLEVELACCESS']._serialized_end=13713
+  _globals['_BUCKET_LIFECYCLE']._serialized_start=13716
+  _globals['_BUCKET_LIFECYCLE']._serialized_end=14471
+  _globals['_BUCKET_LIFECYCLE_RULE']._serialized_start=13786
+  _globals['_BUCKET_LIFECYCLE_RULE']._serialized_end=14471
+  _globals['_BUCKET_LIFECYCLE_RULE_ACTION']._serialized_start=13930
+  _globals['_BUCKET_LIFECYCLE_RULE_ACTION']._serialized_end=13975
+  _globals['_BUCKET_LIFECYCLE_RULE_CONDITION']._serialized_start=13978
+  _globals['_BUCKET_LIFECYCLE_RULE_CONDITION']._serialized_end=14471
+  _globals['_BUCKET_LOGGING']._serialized_start=14473
+  _globals['_BUCKET_LOGGING']._serialized_end=14529
+  _globals['_BUCKET_RETENTIONPOLICY']._serialized_start=14532
+  _globals['_BUCKET_RETENTIONPOLICY']._serialized_end=14675
+  _globals['_BUCKET_SOFTDELETEPOLICY']._serialized_start=14678
+  _globals['_BUCKET_SOFTDELETEPOLICY']._serialized_end=14855
+  _globals['_BUCKET_VERSIONING']._serialized_start=14857
+  _globals['_BUCKET_VERSIONING']._serialized_end=14886
+  _globals['_BUCKET_WEBSITE']._serialized_start=14888
+  _globals['_BUCKET_WEBSITE']._serialized_end=14947
+  _globals['_BUCKET_CUSTOMPLACEMENTCONFIG']._serialized_start=14949
+  _globals['_BUCKET_CUSTOMPLACEMENTCONFIG']._serialized_end=14996
+  _globals['_BUCKET_AUTOCLASS']._serialized_start=14999
+  _globals['_BUCKET_AUTOCLASS']._serialized_end=15266
+  _globals['_BUCKET_LABELSENTRY']._serialized_start=15268
+  _globals['_BUCKET_LABELSENTRY']._serialized_end=15313
+  _globals['_BUCKETACCESSCONTROL']._serialized_start=15389
+  _globals['_BUCKETACCESSCONTROL']._serialized_end=15595
+  _globals['_CHECKSUMMEDDATA']._serialized_start=15597
+  _globals['_CHECKSUMMEDDATA']._serialized_end=15670
+  _globals['_OBJECTCHECKSUMS']._serialized_start=15672
+  _globals['_OBJECTCHECKSUMS']._serialized_end=15739
+  _globals['_HMACKEYMETADATA']._serialized_start=15742
+  _globals['_HMACKEYMETADATA']._serialized_end=16043
+  _globals['_NOTIFICATIONCONFIG']._serialized_start=16046
+  _globals['_NOTIFICATIONCONFIG']._serialized_end=16469
+  _globals['_NOTIFICATIONCONFIG_CUSTOMATTRIBUTESENTRY']._serialized_start=16287
+  _globals['_NOTIFICATIONCONFIG_CUSTOMATTRIBUTESENTRY']._serialized_end=16342
+  _globals['_CUSTOMERENCRYPTION']._serialized_start=16471
+  _globals['_CUSTOMERENCRYPTION']._serialized_end=16547
+  _globals['_OBJECT']._serialized_start=16550
+  _globals['_OBJECT']._serialized_end=17704
+  _globals['_OBJECT_METADATAENTRY']._serialized_start=17636
+  _globals['_OBJECT_METADATAENTRY']._serialized_end=17683
+  _globals['_OBJECTACCESSCONTROL']._serialized_start=17707
+  _globals['_OBJECTACCESSCONTROL']._serialized_end=17913
+  _globals['_LISTOBJECTSRESPONSE']._serialized_start=17915
+  _globals['_LISTOBJECTSRESPONSE']._serialized_end=18023
+  _globals['_PROJECTTEAM']._serialized_start=18025
+  _globals['_PROJECTTEAM']._serialized_end=18076
+  _globals['_SERVICEACCOUNT']._serialized_start=18078
+  _globals['_SERVICEACCOUNT']._serialized_end=18117
+  _globals['_OWNER']._serialized_start=18119
+  _globals['_OWNER']._serialized_end=18161
+  _globals['_CONTENTRANGE']._serialized_start=18163
+  _globals['_CONTENTRANGE']._serialized_end=18230
+  _globals['_STORAGE']._serialized_start=18233
+  _globals['_STORAGE']._serialized_end=23267
 # @@protoc_insertion_point(module_scope)
diff --git a/google/storage/v2/storage_pb2_grpc.py b/google/storage/v2/storage_pb2_grpc.py
index dc60e50..1ad9290 100644
--- a/google/storage/v2/storage_pb2_grpc.py
+++ b/google/storage/v2/storage_pb2_grpc.py
@@ -260,20 +260,18 @@ class StorageServicer(object):
         raise NotImplementedError('Method not implemented!')
 
     def GetIamPolicy(self, request, context):
-        """Gets the IAM policy for a specified bucket or object.
+        """Gets the IAM policy for a specified bucket.
         The `resource` field in the request should be
-        `projects/_/buckets/{bucket}` for a bucket or
-        `projects/_/buckets/{bucket}/objects/{object}` for an object.
+        `projects/_/buckets/{bucket}`.
         """
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
 
     def SetIamPolicy(self, request, context):
-        """Updates an IAM policy for the specified bucket or object.
+        """Updates an IAM policy for the specified bucket.
         The `resource` field in the request should be
-        `projects/_/buckets/{bucket}` for a bucket or
-        `projects/_/buckets/{bucket}/objects/{object}` for an object.
+        `projects/_/buckets/{bucket}`.
         """
         context.set_code(grpc.StatusCode.UNIMPLEMENTED)
         context.set_details('Method not implemented!')
diff --git a/setup.py b/setup.py
index 4df2cbd..539dd7b 100644
--- a/setup.py
+++ b/setup.py
@@ -43,16 +43,16 @@ setuptools.setup(
     ],
     python_requires=">=3.8",
     install_requires=[
-        "grpcio==1.59.0",
+        "grpcio==1.60.1",
         "googleapis-common-protos==1.61.0",
         "protobuf==4.25.1",
-        "flask==2.3.3",
+        "flask==3.0.2",
         "requests-toolbelt==1.0.0",
         "scalpl==0.4.2",
         "crc32c==2.3",
         "gunicorn==21.2.0",
-        "waitress==2.1.2",
-        "Werkzeug==3.0.0",
+        "waitress==3.0.0",
+        "Werkzeug==3.0.1",
     ],
     # Support installing via https://pypa.github.io/pipx/
     entry_points={
diff --git a/testbench/grpc_server.py b/testbench/grpc_server.py
index e42ebe3..c3f4a51 100644
--- a/testbench/grpc_server.py
+++ b/testbench/grpc_server.py
@@ -702,6 +702,11 @@ class StorageServicer(storage_pb2_grpc.StorageServicer):
         )
         return storage_pb2.WriteObjectResponse(resource=blob.metadata)
 
+    def BidiWriteObject(self, request_iterator, context):
+        return gcs.upload.Upload.process_bidi_write_object_grpc(
+            self.db, request_iterator, context
+        )
+
     @retry_test(method="storage.objects.list")
     def ListObjects(self, request, context):
         items, prefixes = self.db.list_object(request, request.parent, context)


Test patch:
diff --git a/tests/test_grpc_server.py b/tests/test_grpc_server.py
index 6878537..ac6f8ab 100755
--- a/tests/test_grpc_server.py
+++ b/tests/test_grpc_server.py
@@ -2056,6 +2056,128 @@ class TestGrpc(unittest.TestCase):
         self.assertIn(("x-req-hdr1", "foo"), call.initial_metadata())
         server.stop(grace=0)
 
+    def test_bidi_write_object(self):
+        QUANTUM = 256 * 1024
+        media = TestGrpc._create_block(2 * QUANTUM + QUANTUM / 2).encode("utf-8")
+
+        offset = 0
+        content = media[0:QUANTUM]
+        r1 = storage_pb2.BidiWriteObjectRequest(
+            write_object_spec=storage_pb2.WriteObjectSpec(
+                resource={
+                    "name": "object-name",
+                    "bucket": "projects/_/buckets/bucket-name",
+                },
+            ),
+            write_offset=offset,
+            checksummed_data=storage_pb2.ChecksummedData(
+                content=content, crc32c=crc32c.crc32c(content)
+            ),
+            flush=True,
+            state_lookup=True,
+            finish_write=False,
+        )
+
+        offset = QUANTUM
+        content = media[QUANTUM : 2 * QUANTUM]
+        r2 = storage_pb2.BidiWriteObjectRequest(
+            write_offset=offset,
+            checksummed_data=storage_pb2.ChecksummedData(
+                content=content, crc32c=crc32c.crc32c(content)
+            ),
+            flush=True,
+            state_lookup=True,
+            finish_write=False,
+        )
+
+        offset = 2 * QUANTUM
+        content = media[QUANTUM:]
+        r3 = storage_pb2.BidiWriteObjectRequest(
+            write_offset=QUANTUM,
+            checksummed_data=storage_pb2.ChecksummedData(
+                content=content, crc32c=crc32c.crc32c(content)
+            ),
+            finish_write=True,
+        )
+        streamer = self.grpc.BidiWriteObject([r1, r2, r3], context=self.mock_context())
+        responses = list(streamer)
+        # We expect a total of 3 responses with state_lookup set to True.
+        self.assertEqual(len(responses), 3)
+        self.assertIsNotNone(responses[0].persisted_size)
+        self.assertIsNotNone(responses[1].persisted_size)
+        self.assertIsNotNone(responses[2].resource)
+        blob = responses[2].resource
+        self.assertEqual(blob.name, "object-name")
+        self.assertEqual(blob.bucket, "projects/_/buckets/bucket-name")
+
+    def test_bidi_write_object_resumable(self):
+        start = self.grpc.StartResumableWrite(
+            storage_pb2.StartResumableWriteRequest(
+                write_object_spec=storage_pb2.WriteObjectSpec(
+                    resource=storage_pb2.Object(
+                        name="object-name", bucket="projects/_/buckets/bucket-name"
+                    )
+                )
+            ),
+            context=unittest.mock.MagicMock(),
+        )
+        self.assertIsNotNone(start.upload_id)
+
+        QUANTUM = 256 * 1024
+        media = TestGrpc._create_block(2 * QUANTUM + QUANTUM / 2).encode("utf-8")
+        offset = 0
+        content = media[0:QUANTUM]
+        r1 = storage_pb2.BidiWriteObjectRequest(
+            upload_id=start.upload_id,
+            write_offset=offset,
+            checksummed_data=storage_pb2.ChecksummedData(
+                content=content, crc32c=crc32c.crc32c(content)
+            ),
+            flush=True,
+            finish_write=False,
+        )
+        offset = QUANTUM
+        content = media[QUANTUM : 2 * QUANTUM]
+        r2 = storage_pb2.BidiWriteObjectRequest(
+            upload_id=start.upload_id,
+            write_offset=offset,
+            checksummed_data=storage_pb2.ChecksummedData(
+                content=content, crc32c=crc32c.crc32c(content)
+            ),
+            flush=True,
+            state_lookup=True,
+            finish_write=False,
+        )
+        streamer = self.grpc.BidiWriteObject([r1, r2], "fake-context")
+        responses = list(streamer)
+        # We only expect 1 response with r2 state_lookup set to True.
+        self.assertEqual(len(responses), 1)
+        self.assertIsNotNone(responses[0])
+        self.assertEqual(responses[0].persisted_size, 2 * QUANTUM)
+
+        status = self.grpc.QueryWriteStatus(
+            storage_pb2.QueryWriteStatusRequest(upload_id=start.upload_id),
+            "fake-context",
+        )
+        self.assertEqual(status.persisted_size, 2 * QUANTUM)
+
+        offset = 2 * QUANTUM
+        content = media[2 * QUANTUM :]
+        r3 = storage_pb2.BidiWriteObjectRequest(
+            upload_id=start.upload_id,
+            write_offset=QUANTUM,
+            checksummed_data=storage_pb2.ChecksummedData(
+                content=content, crc32c=crc32c.crc32c(content)
+            ),
+            finish_write=True,
+        )
+        streamer = self.grpc.BidiWriteObject([r3], "fake-context")
+        responses = list(streamer)
+        self.assertEqual(len(responses), 1)
+        blob = responses[0].resource
+        self.assertEqual(blob.name, "object-name")
+        self.assertEqual(blob.bucket, "projects/_/buckets/bucket-name")
+
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/tests/test_upload.py b/tests/test_upload.py
index 8664c5f..ed24148 100644
--- a/tests/test_upload.py
+++ b/tests/test_upload.py
@@ -694,6 +694,302 @@ class TestHolder(unittest.TestCase):
         self.assertEqual(upload.metadata.name, "object")
         self.assertEqual(upload.metadata.bucket, "projects/_/buckets/bucket-name")
 
+    def test_process_bidi_write_grpc_resumable(self):
+        request = testbench.common.FakeRequest(
+            args={}, data=json.dumps({"name": "bucket-name"})
+        )
+        bucket, _ = gcs.bucket.Bucket.init(request, None)
+        request = storage_pb2.StartResumableWriteRequest(
+            write_object_spec=storage_pb2.WriteObjectSpec(
+                resource={"name": "object", "bucket": "projects/_/buckets/bucket-name"}
+            )
+        )
+        context = self.mock_context()
+        upload = gcs.upload.Upload.init_resumable_grpc(
+            request, bucket.metadata, context
+        )
+
+        line = b"The quick brown fox jumps over the lazy dog"
+        r1 = storage_pb2.BidiWriteObjectRequest(
+            upload_id=upload.upload_id,
+            write_offset=0,
+            checksummed_data=storage_pb2.ChecksummedData(
+                content=line, crc32c=crc32c.crc32c(line)
+            ),
+            finish_write=True,
+        )
+        db = unittest.mock.Mock()
+        db.get_bucket = unittest.mock.MagicMock(return_value=bucket)
+        db.get_upload = unittest.mock.MagicMock(return_value=upload)
+
+        context = self.mock_context()
+        streamer = gcs.upload.Upload.process_bidi_write_object_grpc(db, [r1], context)
+        responses = list(streamer)
+        blob = responses[0].resource
+        self.assertEqual(blob.name, "object")
+        self.assertEqual(blob.bucket, "projects/_/buckets/bucket-name")
+
+        # Test resuming an already finalized object will result with
+        # a response containing the finalized object's metadata.
+        context = self.mock_context()
+        streamer = gcs.upload.Upload.process_bidi_write_object_grpc(db, [r1], context)
+        responses = list(streamer)
+        blob = responses[0].resource
+        self.assertEqual(blob.name, "object")
+        self.assertEqual(blob.bucket, "projects/_/buckets/bucket-name")
+
+    def test_process_bidi_write_grpc_missing_first_message(self):
+        line = b"The quick brown fox jumps over the lazy dog"
+        r1 = storage_pb2.BidiWriteObjectRequest(
+            write_offset=0,
+            checksummed_data=storage_pb2.ChecksummedData(
+                content=line, crc32c=crc32c.crc32c(line)
+            ),
+            finish_write=True,
+        )
+        db = unittest.mock.Mock()
+        context = self.mock_context()
+        list(gcs.upload.Upload.process_bidi_write_object_grpc(db, [r1], context))
+        context.abort.assert_called_once_with(
+            grpc.StatusCode.INVALID_ARGUMENT, unittest.mock.ANY
+        )
+
+    def test_process_bidi_write_grpc_missing_finish_write(self):
+        line = b"The quick brown fox jumps over the lazy dog"
+        r1 = storage_pb2.BidiWriteObjectRequest(
+            write_object_spec=storage_pb2.WriteObjectSpec(
+                resource={"name": "object", "bucket": "projects/_/buckets/bucket-name"},
+            ),
+            write_offset=0,
+            checksummed_data=storage_pb2.ChecksummedData(
+                content=line, crc32c=crc32c.crc32c(line)
+            ),
+            finish_write=False,
+        )
+        db = unittest.mock.Mock()
+        context = self.mock_context()
+        list(gcs.upload.Upload.process_bidi_write_object_grpc(db, [r1], context))
+        context.abort.assert_called_once_with(
+            grpc.StatusCode.INVALID_ARGUMENT, unittest.mock.ANY
+        )
+
+    def test_process_bidi_write_grpc_missing_checksum_at_invalid_place(self):
+        line = b"The quick brown fox jumps over the lazy dog"
+        r1 = storage_pb2.BidiWriteObjectRequest(
+            write_object_spec=storage_pb2.WriteObjectSpec(
+                resource={"name": "object", "bucket": "projects/_/buckets/bucket-name"},
+            ),
+            write_offset=0,
+            checksummed_data=storage_pb2.ChecksummedData(
+                content=line, crc32c=crc32c.crc32c(line)
+            ),
+            finish_write=False,
+        )
+        r2 = storage_pb2.BidiWriteObjectRequest(
+            write_offset=len(line),
+            checksummed_data=storage_pb2.ChecksummedData(
+                content=line, crc32c=crc32c.crc32c(line)
+            ),
+            object_checksums=storage_pb2.ObjectChecksums(
+                crc32c=crc32c.crc32c(b"".join(3 * [line]))
+            ),
+            finish_write=False,
+        )
+        r3 = storage_pb2.BidiWriteObjectRequest(
+            write_offset=2 * len(line),
+            checksummed_data=storage_pb2.ChecksummedData(
+                content=line, crc32c=crc32c.crc32c(line)
+            ),
+            finish_write=True,
+        )
+        db = unittest.mock.Mock()
+        context = self.mock_context()
+        list(
+            gcs.upload.Upload.process_bidi_write_object_grpc(db, [r1, r2, r3], context)
+        )
+        context.abort.assert_called_once_with(
+            grpc.StatusCode.INVALID_ARGUMENT, unittest.mock.ANY
+        )
+
+    def test_process_bidi_write_grpc_checksum_duplicated(self):
+        line = b"The quick brown fox jumps over the lazy dog"
+        r1 = storage_pb2.BidiWriteObjectRequest(
+            write_object_spec=storage_pb2.WriteObjectSpec(
+                resource={"name": "object", "bucket": "projects/_/buckets/bucket-name"},
+            ),
+            write_offset=0,
+            checksummed_data=storage_pb2.ChecksummedData(
+                content=line, crc32c=crc32c.crc32c(line)
+            ),
+            object_checksums=storage_pb2.ObjectChecksums(
+                crc32c=crc32c.crc32c(b"".join(3 * [line]))
+            ),
+            finish_write=False,
+        )
+        r2 = storage_pb2.BidiWriteObjectRequest(
+            write_offset=len(line),
+            checksummed_data=storage_pb2.ChecksummedData(
+                content=line, crc32c=crc32c.crc32c(line)
+            ),
+            finish_write=False,
+        )
+        r3 = storage_pb2.BidiWriteObjectRequest(
+            write_offset=2 * len(line),
+            checksummed_data=storage_pb2.ChecksummedData(
+                content=line, crc32c=crc32c.crc32c(line)
+            ),
+            object_checksums=storage_pb2.ObjectChecksums(
+                crc32c=crc32c.crc32c(b"".join(3 * [line]))
+            ),
+            finish_write=True,
+        )
+        db = unittest.mock.Mock()
+        context = self.mock_context()
+        list(
+            gcs.upload.Upload.process_bidi_write_object_grpc(db, [r1, r2, r3], context)
+        )
+        context.abort.assert_called_once_with(
+            grpc.StatusCode.INVALID_ARGUMENT, unittest.mock.ANY
+        )
+
+    def test_process_bidi_write_grpc_invalid_checksum(self):
+        line = b"The quick brown fox jumps over the lazy dog"
+        r1 = storage_pb2.BidiWriteObjectRequest(
+            write_object_spec=storage_pb2.WriteObjectSpec(
+                resource={"name": "object", "bucket": "projects/_/buckets/bucket-name"},
+            ),
+            write_offset=0,
+            checksummed_data=storage_pb2.ChecksummedData(
+                content=line, crc32c=crc32c.crc32c(2 * line)
+            ),
+            object_checksums=storage_pb2.ObjectChecksums(
+                crc32c=crc32c.crc32c(b"".join(3 * [line]))
+            ),
+            finish_write=True,
+        )
+        db = unittest.mock.Mock()
+        context = self.mock_context()
+        list(gcs.upload.Upload.process_bidi_write_object_grpc(db, [r1], context))
+        context.abort.assert_called_once_with(
+            grpc.StatusCode.FAILED_PRECONDITION, unittest.mock.ANY
+        )
+
+    def test_process_bidi_write_grpc_checksums(self):
+        media = b"The quick brown fox jumps over the lazy dog"
+        proto_crc32c = crc32c.crc32c(media)
+        proto_md5_hash = hashlib.md5(media).digest()
+
+        TEST_CASES = {
+            "both": {
+                "checksums": storage_pb2.ObjectChecksums(
+                    crc32c=proto_crc32c, md5_hash=proto_md5_hash
+                ),
+                "expected": {
+                    "x_emulator_crc32c": testbench.common.rest_crc32c_from_proto(
+                        proto_crc32c
+                    ),
+                    "x_emulator_md5": testbench.common.rest_md5_from_proto(
+                        proto_md5_hash
+                    ),
+                },
+            },
+            "only md5": {
+                "checksums": storage_pb2.ObjectChecksums(md5_hash=proto_md5_hash),
+                "expected": {
+                    "x_emulator_md5": testbench.common.rest_md5_from_proto(
+                        proto_md5_hash
+                    ),
+                    "x_emulator_no_crc32c": "true",
+                },
+            },
+            "only crc32c": {
+                "checksums": storage_pb2.ObjectChecksums(crc32c=proto_crc32c),
+                "expected": {
+                    "x_emulator_crc32c": testbench.common.rest_crc32c_from_proto(
+                        proto_crc32c
+                    ),
+                    "x_emulator_no_md5": "true",
+                },
+            },
+        }
+        for name, test in TEST_CASES.items():
+            request = testbench.common.FakeRequest(
+                args={}, data=json.dumps({"name": "bucket-name"})
+            )
+            bucket, _ = gcs.bucket.Bucket.init(request, None)
+            spec = storage_pb2.WriteObjectSpec(
+                resource={"name": "object", "bucket": "projects/_/buckets/bucket-name"},
+            )
+            request = storage_pb2.BidiWriteObjectRequest(
+                write_object_spec=spec,
+                write_offset=0,
+                object_checksums=test["checksums"],
+                finish_write=True,
+            )
+
+            context = self.mock_context()
+            db = unittest.mock.Mock()
+            db.get_bucket = unittest.mock.MagicMock(return_value=bucket)
+            responses = list(
+                gcs.upload.Upload.process_bidi_write_object_grpc(db, [request], context)
+            )
+            # Verify the annotations inserted by the testbench.
+            annotations = responses[0].resource.metadata
+            expected = test["expected"]
+            self.maxDiff = None
+            self.assertEqual(
+                annotations,
+                {**annotations, **expected},
+                msg="Testing with %s checksums" % name,
+            )
+
+    def test_process_bidi_write_grpc_empty(self):
+        db = unittest.mock.Mock()
+        context = self.mock_context()
+        list(gcs.upload.Upload.process_bidi_write_object_grpc(db, [], context))
+        context.abort.assert_called_once_with(
+            grpc.StatusCode.INVALID_ARGUMENT, unittest.mock.ANY
+        )
+
+    def test_process_bidi_write_grpc_final_message_empty_data(self):
+        request = testbench.common.FakeRequest(
+            args={}, data=json.dumps({"name": "bucket-name"})
+        )
+        bucket, _ = gcs.bucket.Bucket.init(request, None)
+        request = storage_pb2.StartResumableWriteRequest(
+            write_object_spec=storage_pb2.WriteObjectSpec(
+                resource={"name": "object", "bucket": "projects/_/buckets/bucket-name"}
+            )
+        )
+        context = self.mock_context()
+        upload = gcs.upload.Upload.init_resumable_grpc(
+            request, bucket.metadata, context
+        )
+
+        line = b"The quick brown fox jumps over the lazy dog"
+        r1 = storage_pb2.BidiWriteObjectRequest(
+            upload_id=upload.upload_id,
+            write_offset=0,
+            checksummed_data=storage_pb2.ChecksummedData(
+                content=line, crc32c=crc32c.crc32c(line)
+            ),
+            finish_write=False,
+        )
+        r2 = storage_pb2.BidiWriteObjectRequest(
+            write_offset=len(line),
+            finish_write=True,
+        )
+        context = self.mock_context()
+        db = unittest.mock.Mock()
+        db.get_bucket = unittest.mock.MagicMock(return_value=bucket)
+        db.get_upload = unittest.mock.MagicMock(return_value=upload)
+        responses = list(
+            gcs.upload.Upload.process_bidi_write_object_grpc(db, [r1, r2], context)
+        )
+        blob = responses[0].resource
+        self.assertEqual(blob.name, "object")
+        self.assertEqual(blob.bucket, "projects/_/buckets/bucket-name")
+
 
 if __name__ == "__main__":
     unittest.main()