// components/unexportable_keys/mojom/unexportable_key_service.mojom.h is auto generated by mojom_bindings_generator.py, do not edit

// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_UNEXPORTABLE_KEYS_MOJOM_UNEXPORTABLE_KEY_SERVICE_MOJOM_H_
#define COMPONENTS_UNEXPORTABLE_KEYS_MOJOM_UNEXPORTABLE_KEY_SERVICE_MOJOM_H_

#include <stdint.h>

#include <limits>
#include <optional>
#include <type_traits>
#include <utility>
#include "mojo/public/cpp/bindings/clone_traits.h"
#include "mojo/public/cpp/bindings/equals_traits.h"
#include "mojo/public/cpp/bindings/struct_ptr.h"
#include "mojo/public/cpp/bindings/struct_traits.h"
#include "mojo/public/cpp/bindings/union_traits.h"
#include "mojo/public/cpp/bindings/lib/serialization.h"

#include "third_party/perfetto/include/perfetto/tracing/traced_value_forward.h"

#include "components/unexportable_keys/mojom/unexportable_key_service.mojom-features.h"  // IWYU pragma: export
#include "components/unexportable_keys/mojom/unexportable_key_service.mojom-shared.h"  // IWYU pragma: export
#include "components/unexportable_keys/mojom/unexportable_key_service.mojom-forward.h"  // IWYU pragma: export
#include "mojo/public/mojom/base/time.mojom.h"
#include "mojo/public/mojom/base/unguessable_token.mojom.h"
#include <string>
#include <vector>

#include "mojo/public/cpp/bindings/lib/control_message_handler.h"
#include "mojo/public/cpp/bindings/raw_ptr_impl_ref_traits.h"


#include "base/types/expected.h"
#include "components/unexportable_keys/background_task_priority.h"
#include "components/unexportable_keys/mojom/unexportable_keys_mojom_traits.h"
#include "components/unexportable_keys/service_error.h"
#include "components/unexportable_keys/unexportable_key_id.h"
#include "crypto/signature_verifier.h"
#include "crypto/unexportable_key.h"




namespace unexportable_keys::mojom {

class UnexportableKeyServiceProxy;

template <typename ImplRefTraits>
class UnexportableKeyServiceStub;

class UnexportableKeyServiceRequestValidator;
class UnexportableKeyServiceResponseValidator;


class UnexportableKeyService
    : public UnexportableKeyServiceInterfaceBase {
 public:
  using IPCStableHashFunction = uint32_t(*)();
  static constexpr const char* Name_ = "unexportable_keys.mojom.UnexportableKeyService";
  static IPCStableHashFunction MessageToMethodInfo_(mojo::Message& message);
  static const char* MessageToMethodName_(mojo::Message& message);
  static constexpr uint32_t Version_ = 0;
  static constexpr bool PassesAssociatedKinds_ = false;
  static constexpr bool HasUninterruptableMethods_ = false;

  using Base_ = UnexportableKeyServiceInterfaceBase;
  using Proxy_ = UnexportableKeyServiceProxy;

  template <typename ImplRefTraits>
  using Stub_ = UnexportableKeyServiceStub<ImplRefTraits>;

  using RequestValidator_ = UnexportableKeyServiceRequestValidator;
  using ResponseValidator_ = UnexportableKeyServiceResponseValidator;
  enum MethodMinVersions : uint32_t {
    kGenerateSigningKeyMinVersion = 0,
    kFromWrappedSigningKeyMinVersion = 0,
    kGenerateAttestationKeyMinVersion = 0,
    kFromWrappedAttestationKeyMinVersion = 0,
    kSignMinVersion = 0,
    kCertifyMinVersion = 0,
    kGetAllKeysForGarbageCollectionMinVersion = 0,
    kDeleteKeysMinVersion = 0,
    kDeleteAllKeysMinVersion = 0,
  };

// crbug.com/1340245 - this causes binary size bloat on Fuchsia, and we're OK
// with not having this data in traces there.
#if !BUILDFLAG(IS_FUCHSIA)
  struct GenerateSigningKey_Sym {
    NOINLINE static uint32_t IPCStableHash();
  };
  struct FromWrappedSigningKey_Sym {
    NOINLINE static uint32_t IPCStableHash();
  };
  struct GenerateAttestationKey_Sym {
    NOINLINE static uint32_t IPCStableHash();
  };
  struct FromWrappedAttestationKey_Sym {
    NOINLINE static uint32_t IPCStableHash();
  };
  struct Sign_Sym {
    NOINLINE static uint32_t IPCStableHash();
  };
  struct Certify_Sym {
    NOINLINE static uint32_t IPCStableHash();
  };
  struct GetAllKeysForGarbageCollection_Sym {
    NOINLINE static uint32_t IPCStableHash();
  };
  struct DeleteKeys_Sym {
    NOINLINE static uint32_t IPCStableHash();
  };
  struct DeleteAllKeys_Sym {
    NOINLINE static uint32_t IPCStableHash();
  };
#endif // !BUILDFLAG(IS_FUCHSIA)
  virtual ~UnexportableKeyService() = default;

  using GenerateSigningKeyCallback = base::OnceCallback<void(base::expected<
  NewSigningKeyDataPtr,
  ::unexportable_keys::ServiceError>)>;
  using GenerateSigningKeyResult = base::expected<
  NewSigningKeyDataPtr,
  ::unexportable_keys::ServiceError>;
  using GenerateSigningKeyMojoCallback = base::OnceCallback<void(UnexportableKeyService_GenerateSigningKey_ResponseParam_ResultPtr)>;

  virtual void GenerateSigningKey(const std::vector<::crypto::SignatureVerifier::SignatureAlgorithm>& acceptable_algorithms, ::unexportable_keys::BackgroundTaskPriority priority, GenerateSigningKeyCallback callback) = 0;

  using FromWrappedSigningKeyCallback = base::OnceCallback<void(base::expected<
  NewSigningKeyDataPtr,
  ::unexportable_keys::ServiceError>)>;
  using FromWrappedSigningKeyResult = base::expected<
  NewSigningKeyDataPtr,
  ::unexportable_keys::ServiceError>;
  using FromWrappedSigningKeyMojoCallback = base::OnceCallback<void(UnexportableKeyService_FromWrappedSigningKey_ResponseParam_ResultPtr)>;

  virtual void FromWrappedSigningKey(const std::vector<uint8_t>& wrapped_key, ::unexportable_keys::BackgroundTaskPriority priority, FromWrappedSigningKeyCallback callback) = 0;

  using GenerateAttestationKeyCallback = base::OnceCallback<void(base::expected<
  NewAttestationKeyDataPtr,
  ::unexportable_keys::ServiceError>)>;
  using GenerateAttestationKeyResult = base::expected<
  NewAttestationKeyDataPtr,
  ::unexportable_keys::ServiceError>;
  using GenerateAttestationKeyMojoCallback = base::OnceCallback<void(UnexportableKeyService_GenerateAttestationKey_ResponseParam_ResultPtr)>;

  virtual void GenerateAttestationKey(const std::vector<::crypto::SignatureVerifier::SignatureAlgorithm>& acceptable_algorithms, ::unexportable_keys::BackgroundTaskPriority priority, GenerateAttestationKeyCallback callback) = 0;

  using FromWrappedAttestationKeyCallback = base::OnceCallback<void(base::expected<
  NewAttestationKeyDataPtr,
  ::unexportable_keys::ServiceError>)>;
  using FromWrappedAttestationKeyResult = base::expected<
  NewAttestationKeyDataPtr,
  ::unexportable_keys::ServiceError>;
  using FromWrappedAttestationKeyMojoCallback = base::OnceCallback<void(UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_ResultPtr)>;

  virtual void FromWrappedAttestationKey(const std::vector<uint8_t>& wrapped_key, ::unexportable_keys::BackgroundTaskPriority priority, FromWrappedAttestationKeyCallback callback) = 0;

  using SignCallback = base::OnceCallback<void(base::expected<
  std::vector<uint8_t>,
  ::unexportable_keys::ServiceError>)>;
  using SignResult = base::expected<
  std::vector<uint8_t>,
  ::unexportable_keys::ServiceError>;
  using SignMojoCallback = base::OnceCallback<void(UnexportableKeyService_Sign_ResponseParam_ResultPtr)>;

  virtual void Sign(const ::unexportable_keys::UnexportableSigningKeyId& key_id, const std::vector<uint8_t>& data, ::unexportable_keys::BackgroundTaskPriority priority, SignCallback callback) = 0;

  using CertifyCallback = base::OnceCallback<void(base::expected<
  ::crypto::AttestationStatement,
  ::unexportable_keys::ServiceError>)>;
  using CertifyResult = base::expected<
  ::crypto::AttestationStatement,
  ::unexportable_keys::ServiceError>;
  using CertifyMojoCallback = base::OnceCallback<void(UnexportableKeyService_Certify_ResponseParam_ResultPtr)>;

  virtual void Certify(const ::unexportable_keys::UnexportableAttestationKeyId& attestation_key_id, const ::unexportable_keys::UnexportableSigningKeyId& signing_key_id, const std::vector<uint8_t>& challenge, ::unexportable_keys::BackgroundTaskPriority priority, CertifyCallback callback) = 0;

  using GetAllKeysForGarbageCollectionCallback = base::OnceCallback<void(base::expected<
  std::vector<NewSigningKeyDataPtr>,
  ::unexportable_keys::ServiceError>)>;
  using GetAllKeysForGarbageCollectionResult = base::expected<
  std::vector<NewSigningKeyDataPtr>,
  ::unexportable_keys::ServiceError>;
  using GetAllKeysForGarbageCollectionMojoCallback = base::OnceCallback<void(UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_ResultPtr)>;

  virtual void GetAllKeysForGarbageCollection(::unexportable_keys::BackgroundTaskPriority priority, GetAllKeysForGarbageCollectionCallback callback) = 0;

  using DeleteKeysCallback = base::OnceCallback<void(base::expected<
  uint64_t,
  ::unexportable_keys::ServiceError>)>;
  using DeleteKeysResult = base::expected<
  uint64_t,
  ::unexportable_keys::ServiceError>;
  using DeleteKeysMojoCallback = base::OnceCallback<void(UnexportableKeyService_DeleteKeys_ResponseParam_ResultPtr)>;

  virtual void DeleteKeys(const std::vector<::unexportable_keys::UnexportableSigningKeyId>& key_ids, ::unexportable_keys::BackgroundTaskPriority priority, DeleteKeysCallback callback) = 0;

  using DeleteAllKeysCallback = base::OnceCallback<void(base::expected<
  uint64_t,
  ::unexportable_keys::ServiceError>)>;
  using DeleteAllKeysResult = base::expected<
  uint64_t,
  ::unexportable_keys::ServiceError>;
  using DeleteAllKeysMojoCallback = base::OnceCallback<void(UnexportableKeyService_DeleteAllKeys_ResponseParam_ResultPtr)>;

  virtual void DeleteAllKeys(DeleteAllKeysCallback callback) = 0;
};



class  UnexportableKeyServiceProxy
    : public UnexportableKeyService {
 public:
  using InterfaceType = UnexportableKeyService;

  explicit UnexportableKeyServiceProxy(mojo::MessageReceiverWithResponder* receiver);
  
  void GenerateSigningKey(const std::vector<::crypto::SignatureVerifier::SignatureAlgorithm>& acceptable_algorithms, ::unexportable_keys::BackgroundTaskPriority priority, GenerateSigningKeyCallback callback) final;
  
  void FromWrappedSigningKey(const std::vector<uint8_t>& wrapped_key, ::unexportable_keys::BackgroundTaskPriority priority, FromWrappedSigningKeyCallback callback) final;
  
  void GenerateAttestationKey(const std::vector<::crypto::SignatureVerifier::SignatureAlgorithm>& acceptable_algorithms, ::unexportable_keys::BackgroundTaskPriority priority, GenerateAttestationKeyCallback callback) final;
  
  void FromWrappedAttestationKey(const std::vector<uint8_t>& wrapped_key, ::unexportable_keys::BackgroundTaskPriority priority, FromWrappedAttestationKeyCallback callback) final;
  
  void Sign(const ::unexportable_keys::UnexportableSigningKeyId& key_id, const std::vector<uint8_t>& data, ::unexportable_keys::BackgroundTaskPriority priority, SignCallback callback) final;
  
  void Certify(const ::unexportable_keys::UnexportableAttestationKeyId& attestation_key_id, const ::unexportable_keys::UnexportableSigningKeyId& signing_key_id, const std::vector<uint8_t>& challenge, ::unexportable_keys::BackgroundTaskPriority priority, CertifyCallback callback) final;
  
  void GetAllKeysForGarbageCollection(::unexportable_keys::BackgroundTaskPriority priority, GetAllKeysForGarbageCollectionCallback callback) final;
  
  void DeleteKeys(const std::vector<::unexportable_keys::UnexportableSigningKeyId>& key_ids, ::unexportable_keys::BackgroundTaskPriority priority, DeleteKeysCallback callback) final;
  
  void DeleteAllKeys(DeleteAllKeysCallback callback) final;

 private:
  mojo::MessageReceiverWithResponder* receiver_;
};
class  UnexportableKeyServiceStubDispatch {
 public:
  static bool Accept(UnexportableKeyService* impl, mojo::Message* message);
  static bool AcceptWithResponder(
      UnexportableKeyService* impl,
      mojo::Message* message,
      std::unique_ptr<mojo::MessageReceiverWithStatus> responder);
};

template <typename ImplRefTraits =
              mojo::RawPtrImplRefTraits<UnexportableKeyService>>
class UnexportableKeyServiceStub
    : public mojo::MessageReceiverWithResponderStatus {
 public:
  using ImplPointerType = typename ImplRefTraits::PointerType;

  UnexportableKeyServiceStub() = default;
  ~UnexportableKeyServiceStub() override = default;

  void set_sink(ImplPointerType sink) { sink_ = std::move(sink); }
  ImplPointerType& sink() { return sink_; }

  bool Accept(mojo::Message* message) override {
    if (ImplRefTraits::IsNull(sink_))
      return false;
    return UnexportableKeyServiceStubDispatch::Accept(
        ImplRefTraits::GetRawPointer(&sink_), message);
  }

  bool AcceptWithResponder(
      mojo::Message* message,
      std::unique_ptr<mojo::MessageReceiverWithStatus> responder) override {
    if (ImplRefTraits::IsNull(sink_))
      return false;
    return UnexportableKeyServiceStubDispatch::AcceptWithResponder(
        ImplRefTraits::GetRawPointer(&sink_), message, std::move(responder));
  }

 private:
  ImplPointerType sink_;
};
class  UnexportableKeyServiceRequestValidator : public mojo::MessageReceiver {
 public:
  bool Accept(mojo::Message* message) override;
};
class  UnexportableKeyServiceResponseValidator : public mojo::MessageReceiver {
 public:
  bool Accept(mojo::Message* message) override;
};











class  UnexportableKeyService_GenerateSigningKey_ResponseParam_Result {
 public:
  using DataView = UnexportableKeyService_GenerateSigningKey_ResponseParam_ResultDataView;
  using Data_ = internal::UnexportableKeyService_GenerateSigningKey_ResponseParam_Result_Data;
  using Tag = Data_::UnexportableKeyService_GenerateSigningKey_ResponseParam_Result_Tag;

  template <typename... Args>
  static UnexportableKeyService_GenerateSigningKey_ResponseParam_ResultPtr New(Args&&... args) {
    static_assert(
        sizeof...(args) < 0,
        "Do not use Union::New(); to create a union of a given subtype, use "
        "New<SubType>(), not New() followed by set_<sub_type>(). To represent "
        "an empty union, mark the field or parameter as nullable in the mojom "
        "definition.");
    return nullptr;
  }

  // Construct an instance holding |success|.
  static UnexportableKeyService_GenerateSigningKey_ResponseParam_ResultPtr NewSuccess(
      NewSigningKeyDataPtr value);
  // Construct an instance holding |failure|.
  static UnexportableKeyService_GenerateSigningKey_ResponseParam_ResultPtr NewFailure(
      ::unexportable_keys::ServiceError value);

  template <typename U>
  static UnexportableKeyService_GenerateSigningKey_ResponseParam_ResultPtr From(const U& u) {
    return mojo::TypeConverter<UnexportableKeyService_GenerateSigningKey_ResponseParam_ResultPtr, U>::Convert(u);
  }

  template <typename U>
  U To() const {
    return mojo::TypeConverter<U, UnexportableKeyService_GenerateSigningKey_ResponseParam_Result>::Convert(*this);
  }
  ~UnexportableKeyService_GenerateSigningKey_ResponseParam_Result();

  // Delete the copy constructor and copy assignment operators because `data_`
  // contains raw pointers that must not be copied.
  UnexportableKeyService_GenerateSigningKey_ResponseParam_Result(const UnexportableKeyService_GenerateSigningKey_ResponseParam_Result& other) = delete;
  UnexportableKeyService_GenerateSigningKey_ResponseParam_Result& operator=(const UnexportableKeyService_GenerateSigningKey_ResponseParam_Result& other) = delete;

  // Clone() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Clone() or copy
  // constructor/assignment are available for members.
  template <typename UnionPtrType = UnexportableKeyService_GenerateSigningKey_ResponseParam_ResultPtr>
  UnexportableKeyService_GenerateSigningKey_ResponseParam_ResultPtr Clone() const;

  // Equals() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Equals() or == operator
  // are available for members.
  template <typename T,
            typename std::enable_if<std::is_same<
                T, UnexportableKeyService_GenerateSigningKey_ResponseParam_Result>::value>::type* = nullptr>
  bool Equals(const T& other) const;

  template <typename T,
            typename std::enable_if<std::is_same<
                T, UnexportableKeyService_GenerateSigningKey_ResponseParam_Result>::value>::type* = nullptr>
  bool operator==(const T& rhs) const { return Equals(rhs); }

  Tag which() const {
    return tag_;
  }

  bool is_success() const { return tag_ == Tag::kSuccess; }
  const NewSigningKeyDataPtr& get_success() const {
    CHECK(tag_ == Tag::kSuccess);
    return data_.success;
  }
  NewSigningKeyDataPtr& get_success() {
    CHECK(tag_ == Tag::kSuccess);
    return data_.success;
  }
  void set_success(NewSigningKeyDataPtr success);

  bool is_failure() const { return tag_ == Tag::kFailure; }
  ::unexportable_keys::ServiceError get_failure() const {
    CHECK(tag_ == Tag::kFailure);
    return data_.failure;
  }
  void set_failure(::unexportable_keys::ServiceError failure);

  template <typename UserType>
  static mojo::Message SerializeAsMessage(UserType* input) {
    return mojo::internal::SerializeAsMessageImpl<
        UnexportableKeyService_GenerateSigningKey_ResponseParam_Result::DataView>(input);
  }

  template <typename UserType>
  static bool DeserializeFromMessage(mojo::Message input,
                                     UserType* output) {
    return mojo::internal::DeserializeImpl<UnexportableKeyService_GenerateSigningKey_ResponseParam_Result::DataView>(
        input, input.payload(), input.payload_num_bytes(), output, Validate);
  }

 private:
  template <typename T>
  friend class ::mojo::InlinedStructPtr;
  template <typename T>
  friend class ::mojo::StructPtr;

  union Union_ {
    Union_(
        std::in_place_index_t<static_cast<size_t>(Tag::kSuccess)>,
        NewSigningKeyDataPtr value);
    Union_(
        std::in_place_index_t<static_cast<size_t>(Tag::kFailure)>,
        ::unexportable_keys::ServiceError value);
    // The contents of the union are explicitly destroyed by `DestroyActive()`.
    ~Union_() {}

    NewSigningKeyDataPtr success;
    ::unexportable_keys::ServiceError failure;
  };

  UnexportableKeyService_GenerateSigningKey_ResponseParam_Result(
      std::in_place_index_t<static_cast<size_t>(Tag::kSuccess)>,
      NewSigningKeyDataPtr value);
  UnexportableKeyService_GenerateSigningKey_ResponseParam_Result(
      std::in_place_index_t<static_cast<size_t>(Tag::kFailure)>,
      ::unexportable_keys::ServiceError value);

  static bool Validate(const void* data,
                       mojo::internal::ValidationContext* validation_context);

  void DestroyActive();
  Tag tag_;
  Union_ data_;
};



class  UnexportableKeyService_FromWrappedSigningKey_ResponseParam_Result {
 public:
  using DataView = UnexportableKeyService_FromWrappedSigningKey_ResponseParam_ResultDataView;
  using Data_ = internal::UnexportableKeyService_FromWrappedSigningKey_ResponseParam_Result_Data;
  using Tag = Data_::UnexportableKeyService_FromWrappedSigningKey_ResponseParam_Result_Tag;

  template <typename... Args>
  static UnexportableKeyService_FromWrappedSigningKey_ResponseParam_ResultPtr New(Args&&... args) {
    static_assert(
        sizeof...(args) < 0,
        "Do not use Union::New(); to create a union of a given subtype, use "
        "New<SubType>(), not New() followed by set_<sub_type>(). To represent "
        "an empty union, mark the field or parameter as nullable in the mojom "
        "definition.");
    return nullptr;
  }

  // Construct an instance holding |success|.
  static UnexportableKeyService_FromWrappedSigningKey_ResponseParam_ResultPtr NewSuccess(
      NewSigningKeyDataPtr value);
  // Construct an instance holding |failure|.
  static UnexportableKeyService_FromWrappedSigningKey_ResponseParam_ResultPtr NewFailure(
      ::unexportable_keys::ServiceError value);

  template <typename U>
  static UnexportableKeyService_FromWrappedSigningKey_ResponseParam_ResultPtr From(const U& u) {
    return mojo::TypeConverter<UnexportableKeyService_FromWrappedSigningKey_ResponseParam_ResultPtr, U>::Convert(u);
  }

  template <typename U>
  U To() const {
    return mojo::TypeConverter<U, UnexportableKeyService_FromWrappedSigningKey_ResponseParam_Result>::Convert(*this);
  }
  ~UnexportableKeyService_FromWrappedSigningKey_ResponseParam_Result();

  // Delete the copy constructor and copy assignment operators because `data_`
  // contains raw pointers that must not be copied.
  UnexportableKeyService_FromWrappedSigningKey_ResponseParam_Result(const UnexportableKeyService_FromWrappedSigningKey_ResponseParam_Result& other) = delete;
  UnexportableKeyService_FromWrappedSigningKey_ResponseParam_Result& operator=(const UnexportableKeyService_FromWrappedSigningKey_ResponseParam_Result& other) = delete;

  // Clone() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Clone() or copy
  // constructor/assignment are available for members.
  template <typename UnionPtrType = UnexportableKeyService_FromWrappedSigningKey_ResponseParam_ResultPtr>
  UnexportableKeyService_FromWrappedSigningKey_ResponseParam_ResultPtr Clone() const;

  // Equals() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Equals() or == operator
  // are available for members.
  template <typename T,
            typename std::enable_if<std::is_same<
                T, UnexportableKeyService_FromWrappedSigningKey_ResponseParam_Result>::value>::type* = nullptr>
  bool Equals(const T& other) const;

  template <typename T,
            typename std::enable_if<std::is_same<
                T, UnexportableKeyService_FromWrappedSigningKey_ResponseParam_Result>::value>::type* = nullptr>
  bool operator==(const T& rhs) const { return Equals(rhs); }

  Tag which() const {
    return tag_;
  }

  bool is_success() const { return tag_ == Tag::kSuccess; }
  const NewSigningKeyDataPtr& get_success() const {
    CHECK(tag_ == Tag::kSuccess);
    return data_.success;
  }
  NewSigningKeyDataPtr& get_success() {
    CHECK(tag_ == Tag::kSuccess);
    return data_.success;
  }
  void set_success(NewSigningKeyDataPtr success);

  bool is_failure() const { return tag_ == Tag::kFailure; }
  ::unexportable_keys::ServiceError get_failure() const {
    CHECK(tag_ == Tag::kFailure);
    return data_.failure;
  }
  void set_failure(::unexportable_keys::ServiceError failure);

  template <typename UserType>
  static mojo::Message SerializeAsMessage(UserType* input) {
    return mojo::internal::SerializeAsMessageImpl<
        UnexportableKeyService_FromWrappedSigningKey_ResponseParam_Result::DataView>(input);
  }

  template <typename UserType>
  static bool DeserializeFromMessage(mojo::Message input,
                                     UserType* output) {
    return mojo::internal::DeserializeImpl<UnexportableKeyService_FromWrappedSigningKey_ResponseParam_Result::DataView>(
        input, input.payload(), input.payload_num_bytes(), output, Validate);
  }

 private:
  template <typename T>
  friend class ::mojo::InlinedStructPtr;
  template <typename T>
  friend class ::mojo::StructPtr;

  union Union_ {
    Union_(
        std::in_place_index_t<static_cast<size_t>(Tag::kSuccess)>,
        NewSigningKeyDataPtr value);
    Union_(
        std::in_place_index_t<static_cast<size_t>(Tag::kFailure)>,
        ::unexportable_keys::ServiceError value);
    // The contents of the union are explicitly destroyed by `DestroyActive()`.
    ~Union_() {}

    NewSigningKeyDataPtr success;
    ::unexportable_keys::ServiceError failure;
  };

  UnexportableKeyService_FromWrappedSigningKey_ResponseParam_Result(
      std::in_place_index_t<static_cast<size_t>(Tag::kSuccess)>,
      NewSigningKeyDataPtr value);
  UnexportableKeyService_FromWrappedSigningKey_ResponseParam_Result(
      std::in_place_index_t<static_cast<size_t>(Tag::kFailure)>,
      ::unexportable_keys::ServiceError value);

  static bool Validate(const void* data,
                       mojo::internal::ValidationContext* validation_context);

  void DestroyActive();
  Tag tag_;
  Union_ data_;
};



class  UnexportableKeyService_GenerateAttestationKey_ResponseParam_Result {
 public:
  using DataView = UnexportableKeyService_GenerateAttestationKey_ResponseParam_ResultDataView;
  using Data_ = internal::UnexportableKeyService_GenerateAttestationKey_ResponseParam_Result_Data;
  using Tag = Data_::UnexportableKeyService_GenerateAttestationKey_ResponseParam_Result_Tag;

  template <typename... Args>
  static UnexportableKeyService_GenerateAttestationKey_ResponseParam_ResultPtr New(Args&&... args) {
    static_assert(
        sizeof...(args) < 0,
        "Do not use Union::New(); to create a union of a given subtype, use "
        "New<SubType>(), not New() followed by set_<sub_type>(). To represent "
        "an empty union, mark the field or parameter as nullable in the mojom "
        "definition.");
    return nullptr;
  }

  // Construct an instance holding |success|.
  static UnexportableKeyService_GenerateAttestationKey_ResponseParam_ResultPtr NewSuccess(
      NewAttestationKeyDataPtr value);
  // Construct an instance holding |failure|.
  static UnexportableKeyService_GenerateAttestationKey_ResponseParam_ResultPtr NewFailure(
      ::unexportable_keys::ServiceError value);

  template <typename U>
  static UnexportableKeyService_GenerateAttestationKey_ResponseParam_ResultPtr From(const U& u) {
    return mojo::TypeConverter<UnexportableKeyService_GenerateAttestationKey_ResponseParam_ResultPtr, U>::Convert(u);
  }

  template <typename U>
  U To() const {
    return mojo::TypeConverter<U, UnexportableKeyService_GenerateAttestationKey_ResponseParam_Result>::Convert(*this);
  }
  ~UnexportableKeyService_GenerateAttestationKey_ResponseParam_Result();

  // Delete the copy constructor and copy assignment operators because `data_`
  // contains raw pointers that must not be copied.
  UnexportableKeyService_GenerateAttestationKey_ResponseParam_Result(const UnexportableKeyService_GenerateAttestationKey_ResponseParam_Result& other) = delete;
  UnexportableKeyService_GenerateAttestationKey_ResponseParam_Result& operator=(const UnexportableKeyService_GenerateAttestationKey_ResponseParam_Result& other) = delete;

  // Clone() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Clone() or copy
  // constructor/assignment are available for members.
  template <typename UnionPtrType = UnexportableKeyService_GenerateAttestationKey_ResponseParam_ResultPtr>
  UnexportableKeyService_GenerateAttestationKey_ResponseParam_ResultPtr Clone() const;

  // Equals() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Equals() or == operator
  // are available for members.
  template <typename T,
            typename std::enable_if<std::is_same<
                T, UnexportableKeyService_GenerateAttestationKey_ResponseParam_Result>::value>::type* = nullptr>
  bool Equals(const T& other) const;

  template <typename T,
            typename std::enable_if<std::is_same<
                T, UnexportableKeyService_GenerateAttestationKey_ResponseParam_Result>::value>::type* = nullptr>
  bool operator==(const T& rhs) const { return Equals(rhs); }

  Tag which() const {
    return tag_;
  }

  bool is_success() const { return tag_ == Tag::kSuccess; }
  const NewAttestationKeyDataPtr& get_success() const {
    CHECK(tag_ == Tag::kSuccess);
    return data_.success;
  }
  NewAttestationKeyDataPtr& get_success() {
    CHECK(tag_ == Tag::kSuccess);
    return data_.success;
  }
  void set_success(NewAttestationKeyDataPtr success);

  bool is_failure() const { return tag_ == Tag::kFailure; }
  ::unexportable_keys::ServiceError get_failure() const {
    CHECK(tag_ == Tag::kFailure);
    return data_.failure;
  }
  void set_failure(::unexportable_keys::ServiceError failure);

  template <typename UserType>
  static mojo::Message SerializeAsMessage(UserType* input) {
    return mojo::internal::SerializeAsMessageImpl<
        UnexportableKeyService_GenerateAttestationKey_ResponseParam_Result::DataView>(input);
  }

  template <typename UserType>
  static bool DeserializeFromMessage(mojo::Message input,
                                     UserType* output) {
    return mojo::internal::DeserializeImpl<UnexportableKeyService_GenerateAttestationKey_ResponseParam_Result::DataView>(
        input, input.payload(), input.payload_num_bytes(), output, Validate);
  }

 private:
  template <typename T>
  friend class ::mojo::InlinedStructPtr;
  template <typename T>
  friend class ::mojo::StructPtr;

  union Union_ {
    Union_(
        std::in_place_index_t<static_cast<size_t>(Tag::kSuccess)>,
        NewAttestationKeyDataPtr value);
    Union_(
        std::in_place_index_t<static_cast<size_t>(Tag::kFailure)>,
        ::unexportable_keys::ServiceError value);
    // The contents of the union are explicitly destroyed by `DestroyActive()`.
    ~Union_() {}

    NewAttestationKeyDataPtr success;
    ::unexportable_keys::ServiceError failure;
  };

  UnexportableKeyService_GenerateAttestationKey_ResponseParam_Result(
      std::in_place_index_t<static_cast<size_t>(Tag::kSuccess)>,
      NewAttestationKeyDataPtr value);
  UnexportableKeyService_GenerateAttestationKey_ResponseParam_Result(
      std::in_place_index_t<static_cast<size_t>(Tag::kFailure)>,
      ::unexportable_keys::ServiceError value);

  static bool Validate(const void* data,
                       mojo::internal::ValidationContext* validation_context);

  void DestroyActive();
  Tag tag_;
  Union_ data_;
};



class  UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_Result {
 public:
  using DataView = UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_ResultDataView;
  using Data_ = internal::UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_Result_Data;
  using Tag = Data_::UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_Result_Tag;

  template <typename... Args>
  static UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_ResultPtr New(Args&&... args) {
    static_assert(
        sizeof...(args) < 0,
        "Do not use Union::New(); to create a union of a given subtype, use "
        "New<SubType>(), not New() followed by set_<sub_type>(). To represent "
        "an empty union, mark the field or parameter as nullable in the mojom "
        "definition.");
    return nullptr;
  }

  // Construct an instance holding |success|.
  static UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_ResultPtr NewSuccess(
      NewAttestationKeyDataPtr value);
  // Construct an instance holding |failure|.
  static UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_ResultPtr NewFailure(
      ::unexportable_keys::ServiceError value);

  template <typename U>
  static UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_ResultPtr From(const U& u) {
    return mojo::TypeConverter<UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_ResultPtr, U>::Convert(u);
  }

  template <typename U>
  U To() const {
    return mojo::TypeConverter<U, UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_Result>::Convert(*this);
  }
  ~UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_Result();

  // Delete the copy constructor and copy assignment operators because `data_`
  // contains raw pointers that must not be copied.
  UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_Result(const UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_Result& other) = delete;
  UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_Result& operator=(const UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_Result& other) = delete;

  // Clone() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Clone() or copy
  // constructor/assignment are available for members.
  template <typename UnionPtrType = UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_ResultPtr>
  UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_ResultPtr Clone() const;

  // Equals() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Equals() or == operator
  // are available for members.
  template <typename T,
            typename std::enable_if<std::is_same<
                T, UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_Result>::value>::type* = nullptr>
  bool Equals(const T& other) const;

  template <typename T,
            typename std::enable_if<std::is_same<
                T, UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_Result>::value>::type* = nullptr>
  bool operator==(const T& rhs) const { return Equals(rhs); }

  Tag which() const {
    return tag_;
  }

  bool is_success() const { return tag_ == Tag::kSuccess; }
  const NewAttestationKeyDataPtr& get_success() const {
    CHECK(tag_ == Tag::kSuccess);
    return data_.success;
  }
  NewAttestationKeyDataPtr& get_success() {
    CHECK(tag_ == Tag::kSuccess);
    return data_.success;
  }
  void set_success(NewAttestationKeyDataPtr success);

  bool is_failure() const { return tag_ == Tag::kFailure; }
  ::unexportable_keys::ServiceError get_failure() const {
    CHECK(tag_ == Tag::kFailure);
    return data_.failure;
  }
  void set_failure(::unexportable_keys::ServiceError failure);

  template <typename UserType>
  static mojo::Message SerializeAsMessage(UserType* input) {
    return mojo::internal::SerializeAsMessageImpl<
        UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_Result::DataView>(input);
  }

  template <typename UserType>
  static bool DeserializeFromMessage(mojo::Message input,
                                     UserType* output) {
    return mojo::internal::DeserializeImpl<UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_Result::DataView>(
        input, input.payload(), input.payload_num_bytes(), output, Validate);
  }

 private:
  template <typename T>
  friend class ::mojo::InlinedStructPtr;
  template <typename T>
  friend class ::mojo::StructPtr;

  union Union_ {
    Union_(
        std::in_place_index_t<static_cast<size_t>(Tag::kSuccess)>,
        NewAttestationKeyDataPtr value);
    Union_(
        std::in_place_index_t<static_cast<size_t>(Tag::kFailure)>,
        ::unexportable_keys::ServiceError value);
    // The contents of the union are explicitly destroyed by `DestroyActive()`.
    ~Union_() {}

    NewAttestationKeyDataPtr success;
    ::unexportable_keys::ServiceError failure;
  };

  UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_Result(
      std::in_place_index_t<static_cast<size_t>(Tag::kSuccess)>,
      NewAttestationKeyDataPtr value);
  UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_Result(
      std::in_place_index_t<static_cast<size_t>(Tag::kFailure)>,
      ::unexportable_keys::ServiceError value);

  static bool Validate(const void* data,
                       mojo::internal::ValidationContext* validation_context);

  void DestroyActive();
  Tag tag_;
  Union_ data_;
};



class  UnexportableKeyService_Sign_ResponseParam_Result {
 public:
  using DataView = UnexportableKeyService_Sign_ResponseParam_ResultDataView;
  using Data_ = internal::UnexportableKeyService_Sign_ResponseParam_Result_Data;
  using Tag = Data_::UnexportableKeyService_Sign_ResponseParam_Result_Tag;

  template <typename... Args>
  static UnexportableKeyService_Sign_ResponseParam_ResultPtr New(Args&&... args) {
    static_assert(
        sizeof...(args) < 0,
        "Do not use Union::New(); to create a union of a given subtype, use "
        "New<SubType>(), not New() followed by set_<sub_type>(). To represent "
        "an empty union, mark the field or parameter as nullable in the mojom "
        "definition.");
    return nullptr;
  }

  // Construct an instance holding |success|.
  static UnexportableKeyService_Sign_ResponseParam_ResultPtr NewSuccess(
      std::vector<uint8_t> value);
  // Construct an instance holding |failure|.
  static UnexportableKeyService_Sign_ResponseParam_ResultPtr NewFailure(
      ::unexportable_keys::ServiceError value);

  template <typename U>
  static UnexportableKeyService_Sign_ResponseParam_ResultPtr From(const U& u) {
    return mojo::TypeConverter<UnexportableKeyService_Sign_ResponseParam_ResultPtr, U>::Convert(u);
  }

  template <typename U>
  U To() const {
    return mojo::TypeConverter<U, UnexportableKeyService_Sign_ResponseParam_Result>::Convert(*this);
  }
  ~UnexportableKeyService_Sign_ResponseParam_Result();

  // Delete the copy constructor and copy assignment operators because `data_`
  // contains raw pointers that must not be copied.
  UnexportableKeyService_Sign_ResponseParam_Result(const UnexportableKeyService_Sign_ResponseParam_Result& other) = delete;
  UnexportableKeyService_Sign_ResponseParam_Result& operator=(const UnexportableKeyService_Sign_ResponseParam_Result& other) = delete;

  // Clone() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Clone() or copy
  // constructor/assignment are available for members.
  template <typename UnionPtrType = UnexportableKeyService_Sign_ResponseParam_ResultPtr>
  UnexportableKeyService_Sign_ResponseParam_ResultPtr Clone() const;

  // Equals() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Equals() or == operator
  // are available for members.
  template <typename T,
            typename std::enable_if<std::is_same<
                T, UnexportableKeyService_Sign_ResponseParam_Result>::value>::type* = nullptr>
  bool Equals(const T& other) const;

  template <typename T,
            typename std::enable_if<std::is_same<
                T, UnexportableKeyService_Sign_ResponseParam_Result>::value>::type* = nullptr>
  bool operator==(const T& rhs) const { return Equals(rhs); }

  Tag which() const {
    return tag_;
  }

  bool is_success() const { return tag_ == Tag::kSuccess; }
  const std::vector<uint8_t>& get_success() const {
    CHECK(tag_ == Tag::kSuccess);
    return data_.success;
  }
  std::vector<uint8_t>& get_success() {
    CHECK(tag_ == Tag::kSuccess);
    return data_.success;
  }
  void set_success(std::vector<uint8_t> success);

  bool is_failure() const { return tag_ == Tag::kFailure; }
  ::unexportable_keys::ServiceError get_failure() const {
    CHECK(tag_ == Tag::kFailure);
    return data_.failure;
  }
  void set_failure(::unexportable_keys::ServiceError failure);

  template <typename UserType>
  static mojo::Message SerializeAsMessage(UserType* input) {
    return mojo::internal::SerializeAsMessageImpl<
        UnexportableKeyService_Sign_ResponseParam_Result::DataView>(input);
  }

  template <typename UserType>
  static bool DeserializeFromMessage(mojo::Message input,
                                     UserType* output) {
    return mojo::internal::DeserializeImpl<UnexportableKeyService_Sign_ResponseParam_Result::DataView>(
        input, input.payload(), input.payload_num_bytes(), output, Validate);
  }

 private:
  template <typename T>
  friend class ::mojo::InlinedStructPtr;
  template <typename T>
  friend class ::mojo::StructPtr;

  union Union_ {
    Union_(
        std::in_place_index_t<static_cast<size_t>(Tag::kSuccess)>,
        std::vector<uint8_t> value);
    Union_(
        std::in_place_index_t<static_cast<size_t>(Tag::kFailure)>,
        ::unexportable_keys::ServiceError value);
    // The contents of the union are explicitly destroyed by `DestroyActive()`.
    ~Union_() {}

    std::vector<uint8_t> success;
    ::unexportable_keys::ServiceError failure;
  };

  UnexportableKeyService_Sign_ResponseParam_Result(
      std::in_place_index_t<static_cast<size_t>(Tag::kSuccess)>,
      std::vector<uint8_t> value);
  UnexportableKeyService_Sign_ResponseParam_Result(
      std::in_place_index_t<static_cast<size_t>(Tag::kFailure)>,
      ::unexportable_keys::ServiceError value);

  static bool Validate(const void* data,
                       mojo::internal::ValidationContext* validation_context);

  void DestroyActive();
  Tag tag_;
  Union_ data_;
};



class  UnexportableKeyService_Certify_ResponseParam_Result {
 public:
  using DataView = UnexportableKeyService_Certify_ResponseParam_ResultDataView;
  using Data_ = internal::UnexportableKeyService_Certify_ResponseParam_Result_Data;
  using Tag = Data_::UnexportableKeyService_Certify_ResponseParam_Result_Tag;

  template <typename... Args>
  static UnexportableKeyService_Certify_ResponseParam_ResultPtr New(Args&&... args) {
    static_assert(
        sizeof...(args) < 0,
        "Do not use Union::New(); to create a union of a given subtype, use "
        "New<SubType>(), not New() followed by set_<sub_type>(). To represent "
        "an empty union, mark the field or parameter as nullable in the mojom "
        "definition.");
    return nullptr;
  }

  // Construct an instance holding |success|.
  static UnexportableKeyService_Certify_ResponseParam_ResultPtr NewSuccess(
      const ::crypto::AttestationStatement& value);
  // Construct an instance holding |failure|.
  static UnexportableKeyService_Certify_ResponseParam_ResultPtr NewFailure(
      ::unexportable_keys::ServiceError value);

  template <typename U>
  static UnexportableKeyService_Certify_ResponseParam_ResultPtr From(const U& u) {
    return mojo::TypeConverter<UnexportableKeyService_Certify_ResponseParam_ResultPtr, U>::Convert(u);
  }

  template <typename U>
  U To() const {
    return mojo::TypeConverter<U, UnexportableKeyService_Certify_ResponseParam_Result>::Convert(*this);
  }
  ~UnexportableKeyService_Certify_ResponseParam_Result();

  // Delete the copy constructor and copy assignment operators because `data_`
  // contains raw pointers that must not be copied.
  UnexportableKeyService_Certify_ResponseParam_Result(const UnexportableKeyService_Certify_ResponseParam_Result& other) = delete;
  UnexportableKeyService_Certify_ResponseParam_Result& operator=(const UnexportableKeyService_Certify_ResponseParam_Result& other) = delete;

  // Clone() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Clone() or copy
  // constructor/assignment are available for members.
  template <typename UnionPtrType = UnexportableKeyService_Certify_ResponseParam_ResultPtr>
  UnexportableKeyService_Certify_ResponseParam_ResultPtr Clone() const;

  // Equals() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Equals() or == operator
  // are available for members.
  template <typename T,
            typename std::enable_if<std::is_same<
                T, UnexportableKeyService_Certify_ResponseParam_Result>::value>::type* = nullptr>
  bool Equals(const T& other) const;

  template <typename T,
            typename std::enable_if<std::is_same<
                T, UnexportableKeyService_Certify_ResponseParam_Result>::value>::type* = nullptr>
  bool operator==(const T& rhs) const { return Equals(rhs); }

  Tag which() const {
    return tag_;
  }

  bool is_success() const { return tag_ == Tag::kSuccess; }
  const ::crypto::AttestationStatement& get_success() const {
    CHECK(tag_ == Tag::kSuccess);
    return data_.success;
  }
  ::crypto::AttestationStatement& get_success() {
    CHECK(tag_ == Tag::kSuccess);
    return data_.success;
  }
  void set_success(const ::crypto::AttestationStatement& success);

  bool is_failure() const { return tag_ == Tag::kFailure; }
  ::unexportable_keys::ServiceError get_failure() const {
    CHECK(tag_ == Tag::kFailure);
    return data_.failure;
  }
  void set_failure(::unexportable_keys::ServiceError failure);

  template <typename UserType>
  static mojo::Message SerializeAsMessage(UserType* input) {
    return mojo::internal::SerializeAsMessageImpl<
        UnexportableKeyService_Certify_ResponseParam_Result::DataView>(input);
  }

  template <typename UserType>
  static bool DeserializeFromMessage(mojo::Message input,
                                     UserType* output) {
    return mojo::internal::DeserializeImpl<UnexportableKeyService_Certify_ResponseParam_Result::DataView>(
        input, input.payload(), input.payload_num_bytes(), output, Validate);
  }

 private:
  template <typename T>
  friend class ::mojo::InlinedStructPtr;
  template <typename T>
  friend class ::mojo::StructPtr;

  union Union_ {
    Union_(
        std::in_place_index_t<static_cast<size_t>(Tag::kSuccess)>,
        const ::crypto::AttestationStatement& value);
    Union_(
        std::in_place_index_t<static_cast<size_t>(Tag::kFailure)>,
        ::unexportable_keys::ServiceError value);
    // The contents of the union are explicitly destroyed by `DestroyActive()`.
    ~Union_() {}

    ::crypto::AttestationStatement success;
    ::unexportable_keys::ServiceError failure;
  };

  UnexportableKeyService_Certify_ResponseParam_Result(
      std::in_place_index_t<static_cast<size_t>(Tag::kSuccess)>,
      const ::crypto::AttestationStatement& value);
  UnexportableKeyService_Certify_ResponseParam_Result(
      std::in_place_index_t<static_cast<size_t>(Tag::kFailure)>,
      ::unexportable_keys::ServiceError value);

  static bool Validate(const void* data,
                       mojo::internal::ValidationContext* validation_context);

  void DestroyActive();
  Tag tag_;
  Union_ data_;
};



class  UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_Result {
 public:
  using DataView = UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_ResultDataView;
  using Data_ = internal::UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_Result_Data;
  using Tag = Data_::UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_Result_Tag;

  template <typename... Args>
  static UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_ResultPtr New(Args&&... args) {
    static_assert(
        sizeof...(args) < 0,
        "Do not use Union::New(); to create a union of a given subtype, use "
        "New<SubType>(), not New() followed by set_<sub_type>(). To represent "
        "an empty union, mark the field or parameter as nullable in the mojom "
        "definition.");
    return nullptr;
  }

  // Construct an instance holding |success|.
  static UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_ResultPtr NewSuccess(
      std::vector<NewSigningKeyDataPtr> value);
  // Construct an instance holding |failure|.
  static UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_ResultPtr NewFailure(
      ::unexportable_keys::ServiceError value);

  template <typename U>
  static UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_ResultPtr From(const U& u) {
    return mojo::TypeConverter<UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_ResultPtr, U>::Convert(u);
  }

  template <typename U>
  U To() const {
    return mojo::TypeConverter<U, UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_Result>::Convert(*this);
  }
  ~UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_Result();

  // Delete the copy constructor and copy assignment operators because `data_`
  // contains raw pointers that must not be copied.
  UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_Result(const UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_Result& other) = delete;
  UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_Result& operator=(const UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_Result& other) = delete;

  // Clone() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Clone() or copy
  // constructor/assignment are available for members.
  template <typename UnionPtrType = UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_ResultPtr>
  UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_ResultPtr Clone() const;

  // Equals() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Equals() or == operator
  // are available for members.
  template <typename T,
            typename std::enable_if<std::is_same<
                T, UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_Result>::value>::type* = nullptr>
  bool Equals(const T& other) const;

  template <typename T,
            typename std::enable_if<std::is_same<
                T, UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_Result>::value>::type* = nullptr>
  bool operator==(const T& rhs) const { return Equals(rhs); }

  Tag which() const {
    return tag_;
  }

  bool is_success() const { return tag_ == Tag::kSuccess; }
  const std::vector<NewSigningKeyDataPtr>& get_success() const {
    CHECK(tag_ == Tag::kSuccess);
    return data_.success;
  }
  std::vector<NewSigningKeyDataPtr>& get_success() {
    CHECK(tag_ == Tag::kSuccess);
    return data_.success;
  }
  void set_success(std::vector<NewSigningKeyDataPtr> success);

  bool is_failure() const { return tag_ == Tag::kFailure; }
  ::unexportable_keys::ServiceError get_failure() const {
    CHECK(tag_ == Tag::kFailure);
    return data_.failure;
  }
  void set_failure(::unexportable_keys::ServiceError failure);

  template <typename UserType>
  static mojo::Message SerializeAsMessage(UserType* input) {
    return mojo::internal::SerializeAsMessageImpl<
        UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_Result::DataView>(input);
  }

  template <typename UserType>
  static bool DeserializeFromMessage(mojo::Message input,
                                     UserType* output) {
    return mojo::internal::DeserializeImpl<UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_Result::DataView>(
        input, input.payload(), input.payload_num_bytes(), output, Validate);
  }

 private:
  template <typename T>
  friend class ::mojo::InlinedStructPtr;
  template <typename T>
  friend class ::mojo::StructPtr;

  union Union_ {
    Union_(
        std::in_place_index_t<static_cast<size_t>(Tag::kSuccess)>,
        std::vector<NewSigningKeyDataPtr> value);
    Union_(
        std::in_place_index_t<static_cast<size_t>(Tag::kFailure)>,
        ::unexportable_keys::ServiceError value);
    // The contents of the union are explicitly destroyed by `DestroyActive()`.
    ~Union_() {}

    std::vector<NewSigningKeyDataPtr> success;
    ::unexportable_keys::ServiceError failure;
  };

  UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_Result(
      std::in_place_index_t<static_cast<size_t>(Tag::kSuccess)>,
      std::vector<NewSigningKeyDataPtr> value);
  UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_Result(
      std::in_place_index_t<static_cast<size_t>(Tag::kFailure)>,
      ::unexportable_keys::ServiceError value);

  static bool Validate(const void* data,
                       mojo::internal::ValidationContext* validation_context);

  void DestroyActive();
  Tag tag_;
  Union_ data_;
};



class  UnexportableKeyService_DeleteKeys_ResponseParam_Result {
 public:
  using DataView = UnexportableKeyService_DeleteKeys_ResponseParam_ResultDataView;
  using Data_ = internal::UnexportableKeyService_DeleteKeys_ResponseParam_Result_Data;
  using Tag = Data_::UnexportableKeyService_DeleteKeys_ResponseParam_Result_Tag;

  template <typename... Args>
  static UnexportableKeyService_DeleteKeys_ResponseParam_ResultPtr New(Args&&... args) {
    static_assert(
        sizeof...(args) < 0,
        "Do not use Union::New(); to create a union of a given subtype, use "
        "New<SubType>(), not New() followed by set_<sub_type>(). To represent "
        "an empty union, mark the field or parameter as nullable in the mojom "
        "definition.");
    return nullptr;
  }

  // Construct an instance holding |success|.
  static UnexportableKeyService_DeleteKeys_ResponseParam_ResultPtr NewSuccess(
      uint64_t value);
  // Construct an instance holding |failure|.
  static UnexportableKeyService_DeleteKeys_ResponseParam_ResultPtr NewFailure(
      ::unexportable_keys::ServiceError value);

  template <typename U>
  static UnexportableKeyService_DeleteKeys_ResponseParam_ResultPtr From(const U& u) {
    return mojo::TypeConverter<UnexportableKeyService_DeleteKeys_ResponseParam_ResultPtr, U>::Convert(u);
  }

  template <typename U>
  U To() const {
    return mojo::TypeConverter<U, UnexportableKeyService_DeleteKeys_ResponseParam_Result>::Convert(*this);
  }
  ~UnexportableKeyService_DeleteKeys_ResponseParam_Result();


  // Clone() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Clone() or copy
  // constructor/assignment are available for members.
  template <typename UnionPtrType = UnexportableKeyService_DeleteKeys_ResponseParam_ResultPtr>
  UnexportableKeyService_DeleteKeys_ResponseParam_ResultPtr Clone() const;

  // Equals() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Equals() or == operator
  // are available for members.
  template <typename T,
            typename std::enable_if<std::is_same<
                T, UnexportableKeyService_DeleteKeys_ResponseParam_Result>::value>::type* = nullptr>
  bool Equals(const T& other) const;

  template <typename T,
            typename std::enable_if<std::is_same<
                T, UnexportableKeyService_DeleteKeys_ResponseParam_Result>::value>::type* = nullptr>
  bool operator==(const T& rhs) const { return Equals(rhs); }

  Tag which() const {
    return tag_;
  }

  bool is_success() const { return tag_ == Tag::kSuccess; }
  uint64_t get_success() const {
    CHECK(tag_ == Tag::kSuccess);
    return data_.success;
  }
  void set_success(uint64_t success);

  bool is_failure() const { return tag_ == Tag::kFailure; }
  ::unexportable_keys::ServiceError get_failure() const {
    CHECK(tag_ == Tag::kFailure);
    return data_.failure;
  }
  void set_failure(::unexportable_keys::ServiceError failure);

  template <typename UserType>
  static mojo::Message SerializeAsMessage(UserType* input) {
    return mojo::internal::SerializeAsMessageImpl<
        UnexportableKeyService_DeleteKeys_ResponseParam_Result::DataView>(input);
  }

  template <typename UserType>
  static bool DeserializeFromMessage(mojo::Message input,
                                     UserType* output) {
    return mojo::internal::DeserializeImpl<UnexportableKeyService_DeleteKeys_ResponseParam_Result::DataView>(
        input, input.payload(), input.payload_num_bytes(), output, Validate);
  }

 private:
  template <typename T>
  friend class ::mojo::InlinedStructPtr;
  template <typename T>
  friend class ::mojo::StructPtr;

  union Union_ {
    Union_(
        std::in_place_index_t<static_cast<size_t>(Tag::kSuccess)>,
        uint64_t value);
    Union_(
        std::in_place_index_t<static_cast<size_t>(Tag::kFailure)>,
        ::unexportable_keys::ServiceError value);
    // The contents of the union are explicitly destroyed by `DestroyActive()`.
    ~Union_() {}

    uint64_t success;
    ::unexportable_keys::ServiceError failure;
  };

  UnexportableKeyService_DeleteKeys_ResponseParam_Result(
      std::in_place_index_t<static_cast<size_t>(Tag::kSuccess)>,
      uint64_t value);
  UnexportableKeyService_DeleteKeys_ResponseParam_Result(
      std::in_place_index_t<static_cast<size_t>(Tag::kFailure)>,
      ::unexportable_keys::ServiceError value);

  static bool Validate(const void* data,
                       mojo::internal::ValidationContext* validation_context);

  void DestroyActive();
  Tag tag_;
  Union_ data_;
};



class  UnexportableKeyService_DeleteAllKeys_ResponseParam_Result {
 public:
  using DataView = UnexportableKeyService_DeleteAllKeys_ResponseParam_ResultDataView;
  using Data_ = internal::UnexportableKeyService_DeleteAllKeys_ResponseParam_Result_Data;
  using Tag = Data_::UnexportableKeyService_DeleteAllKeys_ResponseParam_Result_Tag;

  template <typename... Args>
  static UnexportableKeyService_DeleteAllKeys_ResponseParam_ResultPtr New(Args&&... args) {
    static_assert(
        sizeof...(args) < 0,
        "Do not use Union::New(); to create a union of a given subtype, use "
        "New<SubType>(), not New() followed by set_<sub_type>(). To represent "
        "an empty union, mark the field or parameter as nullable in the mojom "
        "definition.");
    return nullptr;
  }

  // Construct an instance holding |success|.
  static UnexportableKeyService_DeleteAllKeys_ResponseParam_ResultPtr NewSuccess(
      uint64_t value);
  // Construct an instance holding |failure|.
  static UnexportableKeyService_DeleteAllKeys_ResponseParam_ResultPtr NewFailure(
      ::unexportable_keys::ServiceError value);

  template <typename U>
  static UnexportableKeyService_DeleteAllKeys_ResponseParam_ResultPtr From(const U& u) {
    return mojo::TypeConverter<UnexportableKeyService_DeleteAllKeys_ResponseParam_ResultPtr, U>::Convert(u);
  }

  template <typename U>
  U To() const {
    return mojo::TypeConverter<U, UnexportableKeyService_DeleteAllKeys_ResponseParam_Result>::Convert(*this);
  }
  ~UnexportableKeyService_DeleteAllKeys_ResponseParam_Result();


  // Clone() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Clone() or copy
  // constructor/assignment are available for members.
  template <typename UnionPtrType = UnexportableKeyService_DeleteAllKeys_ResponseParam_ResultPtr>
  UnexportableKeyService_DeleteAllKeys_ResponseParam_ResultPtr Clone() const;

  // Equals() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Equals() or == operator
  // are available for members.
  template <typename T,
            typename std::enable_if<std::is_same<
                T, UnexportableKeyService_DeleteAllKeys_ResponseParam_Result>::value>::type* = nullptr>
  bool Equals(const T& other) const;

  template <typename T,
            typename std::enable_if<std::is_same<
                T, UnexportableKeyService_DeleteAllKeys_ResponseParam_Result>::value>::type* = nullptr>
  bool operator==(const T& rhs) const { return Equals(rhs); }

  Tag which() const {
    return tag_;
  }

  bool is_success() const { return tag_ == Tag::kSuccess; }
  uint64_t get_success() const {
    CHECK(tag_ == Tag::kSuccess);
    return data_.success;
  }
  void set_success(uint64_t success);

  bool is_failure() const { return tag_ == Tag::kFailure; }
  ::unexportable_keys::ServiceError get_failure() const {
    CHECK(tag_ == Tag::kFailure);
    return data_.failure;
  }
  void set_failure(::unexportable_keys::ServiceError failure);

  template <typename UserType>
  static mojo::Message SerializeAsMessage(UserType* input) {
    return mojo::internal::SerializeAsMessageImpl<
        UnexportableKeyService_DeleteAllKeys_ResponseParam_Result::DataView>(input);
  }

  template <typename UserType>
  static bool DeserializeFromMessage(mojo::Message input,
                                     UserType* output) {
    return mojo::internal::DeserializeImpl<UnexportableKeyService_DeleteAllKeys_ResponseParam_Result::DataView>(
        input, input.payload(), input.payload_num_bytes(), output, Validate);
  }

 private:
  template <typename T>
  friend class ::mojo::InlinedStructPtr;
  template <typename T>
  friend class ::mojo::StructPtr;

  union Union_ {
    Union_(
        std::in_place_index_t<static_cast<size_t>(Tag::kSuccess)>,
        uint64_t value);
    Union_(
        std::in_place_index_t<static_cast<size_t>(Tag::kFailure)>,
        ::unexportable_keys::ServiceError value);
    // The contents of the union are explicitly destroyed by `DestroyActive()`.
    ~Union_() {}

    uint64_t success;
    ::unexportable_keys::ServiceError failure;
  };

  UnexportableKeyService_DeleteAllKeys_ResponseParam_Result(
      std::in_place_index_t<static_cast<size_t>(Tag::kSuccess)>,
      uint64_t value);
  UnexportableKeyService_DeleteAllKeys_ResponseParam_Result(
      std::in_place_index_t<static_cast<size_t>(Tag::kFailure)>,
      ::unexportable_keys::ServiceError value);

  static bool Validate(const void* data,
                       mojo::internal::ValidationContext* validation_context);

  void DestroyActive();
  Tag tag_;
  Union_ data_;
};





class  UnexportableSigningKeyId {
 public:
  template <typename T>
  using EnableIfSame = std::enable_if_t<std::is_same<UnexportableSigningKeyId, T>::value>;
  using DataView = UnexportableSigningKeyIdDataView;
  using Data_ = internal::UnexportableSigningKeyId_Data;

  template <typename... Args>
  static UnexportableSigningKeyIdPtr New(Args&&... args) {
    return UnexportableSigningKeyIdPtr(
        std::in_place, std::forward<Args>(args)...);
  }

  template <typename U>
  static UnexportableSigningKeyIdPtr From(const U& u) {
    return mojo::TypeConverter<UnexportableSigningKeyIdPtr, U>::Convert(u);
  }

  template <typename U>
  U To() const {
    return mojo::TypeConverter<U, UnexportableSigningKeyId>::Convert(*this);
  }


  UnexportableSigningKeyId();

  explicit UnexportableSigningKeyId(
      const ::base::UnguessableToken& key_id);


  ~UnexportableSigningKeyId();

  // Clone() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Clone() or copy
  // constructor/assignment are available for members.
  template <typename StructPtrType = UnexportableSigningKeyIdPtr>
  UnexportableSigningKeyIdPtr Clone() const;

  // Equals() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Equals() or == operator
  // are available for members.
  template <typename T, UnexportableSigningKeyId::EnableIfSame<T>* = nullptr>
  bool Equals(const T& other) const;

  template <typename T, UnexportableSigningKeyId::EnableIfSame<T>* = nullptr>
  bool operator==(const T& rhs) const { return Equals(rhs); }

  template <typename T, UnexportableSigningKeyId::EnableIfSame<T>* = nullptr>
  bool operator!=(const T& rhs) const { return !operator==(rhs); }

  template <mojo::internal::SendValidation send_validation, typename UserType>
  static std::vector<uint8_t> Serialize(UserType* input) {
    return mojo::internal::SerializeImpl<
        UnexportableSigningKeyId::DataView, std::vector<uint8_t>, send_validation>(input);
  }

  template <typename UserType>
  static std::vector<uint8_t> Serialize(UserType* input) {
    return mojo::internal::SerializeImpl<
        UnexportableSigningKeyId::DataView, std::vector<uint8_t>>(input);
  }

  template <typename UserType>
  static mojo::Message SerializeAsMessage(UserType* input) {
    return mojo::internal::SerializeAsMessageImpl<
        UnexportableSigningKeyId::DataView>(input);
  }

  // The returned Message is serialized only if the message is moved
  // cross-process or cross-language. Otherwise if the message is Deserialized
  // as the same UserType |input| will just be moved to |output| in
  // DeserializeFromMessage.
  template <typename UserType>
  static mojo::Message WrapAsMessage(UserType input) {
    return mojo::Message(std::make_unique<
        internal::UnexportableSigningKeyId_UnserializedMessageContext<
            UserType, UnexportableSigningKeyId::DataView>>(0, 0, std::move(input)),
        MOJO_CREATE_MESSAGE_FLAG_NONE);
  }

  template <typename UserType>
  static bool Deserialize(const void* data,
                          size_t data_num_bytes,
                          UserType* output) {
    mojo::Message message;
    return mojo::internal::DeserializeImpl<UnexportableSigningKeyId::DataView>(
        message, data, data_num_bytes, output, Validate);
  }

  template <typename UserType>
  static bool Deserialize(base::span<const uint8_t> input,
                          UserType* output) {
    return UnexportableSigningKeyId::Deserialize(
        input.empty() ? nullptr : input.data(), input.size(), output);
  }

  template <typename UserType>
  static bool DeserializeFromMessage(mojo::Message input,
                                     UserType* output) {
    auto context = input.TakeUnserializedContext<
        internal::UnexportableSigningKeyId_UnserializedMessageContext<
            UserType, UnexportableSigningKeyId::DataView>>();
    if (context) {
      *output = std::move(context->TakeData());
      return true;
    }
    input.SerializeIfNecessary();
    return mojo::internal::DeserializeImpl<UnexportableSigningKeyId::DataView>(
        input, input.payload(), input.payload_num_bytes(), output, Validate);
  }

  
  ::base::UnguessableToken key_id;

  // Serialise this struct into a trace.
  void WriteIntoTrace(perfetto::TracedValue traced_context) const;

 private:
  static bool Validate(const void* data,
                       mojo::internal::ValidationContext* validation_context);
};

// The comparison operators are templates, so they are only instantiated if they
// are used. Thus, the bindings generator does not need to know whether
// comparison operators are available for members.
template <typename T, UnexportableSigningKeyId::EnableIfSame<T>* = nullptr>
bool operator<(const T& lhs, const T& rhs);

template <typename T, UnexportableSigningKeyId::EnableIfSame<T>* = nullptr>
bool operator<=(const T& lhs, const T& rhs) {
  return !(rhs < lhs);
}

template <typename T, UnexportableSigningKeyId::EnableIfSame<T>* = nullptr>
bool operator>(const T& lhs, const T& rhs) {
  return rhs < lhs;
}

template <typename T, UnexportableSigningKeyId::EnableIfSame<T>* = nullptr>
bool operator>=(const T& lhs, const T& rhs) {
  return !(lhs < rhs);
}





class  UnexportableAttestationKeyId {
 public:
  template <typename T>
  using EnableIfSame = std::enable_if_t<std::is_same<UnexportableAttestationKeyId, T>::value>;
  using DataView = UnexportableAttestationKeyIdDataView;
  using Data_ = internal::UnexportableAttestationKeyId_Data;

  template <typename... Args>
  static UnexportableAttestationKeyIdPtr New(Args&&... args) {
    return UnexportableAttestationKeyIdPtr(
        std::in_place, std::forward<Args>(args)...);
  }

  template <typename U>
  static UnexportableAttestationKeyIdPtr From(const U& u) {
    return mojo::TypeConverter<UnexportableAttestationKeyIdPtr, U>::Convert(u);
  }

  template <typename U>
  U To() const {
    return mojo::TypeConverter<U, UnexportableAttestationKeyId>::Convert(*this);
  }


  UnexportableAttestationKeyId();

  explicit UnexportableAttestationKeyId(
      const ::base::UnguessableToken& key_id);


  ~UnexportableAttestationKeyId();

  // Clone() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Clone() or copy
  // constructor/assignment are available for members.
  template <typename StructPtrType = UnexportableAttestationKeyIdPtr>
  UnexportableAttestationKeyIdPtr Clone() const;

  // Equals() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Equals() or == operator
  // are available for members.
  template <typename T, UnexportableAttestationKeyId::EnableIfSame<T>* = nullptr>
  bool Equals(const T& other) const;

  template <typename T, UnexportableAttestationKeyId::EnableIfSame<T>* = nullptr>
  bool operator==(const T& rhs) const { return Equals(rhs); }

  template <typename T, UnexportableAttestationKeyId::EnableIfSame<T>* = nullptr>
  bool operator!=(const T& rhs) const { return !operator==(rhs); }

  template <mojo::internal::SendValidation send_validation, typename UserType>
  static std::vector<uint8_t> Serialize(UserType* input) {
    return mojo::internal::SerializeImpl<
        UnexportableAttestationKeyId::DataView, std::vector<uint8_t>, send_validation>(input);
  }

  template <typename UserType>
  static std::vector<uint8_t> Serialize(UserType* input) {
    return mojo::internal::SerializeImpl<
        UnexportableAttestationKeyId::DataView, std::vector<uint8_t>>(input);
  }

  template <typename UserType>
  static mojo::Message SerializeAsMessage(UserType* input) {
    return mojo::internal::SerializeAsMessageImpl<
        UnexportableAttestationKeyId::DataView>(input);
  }

  // The returned Message is serialized only if the message is moved
  // cross-process or cross-language. Otherwise if the message is Deserialized
  // as the same UserType |input| will just be moved to |output| in
  // DeserializeFromMessage.
  template <typename UserType>
  static mojo::Message WrapAsMessage(UserType input) {
    return mojo::Message(std::make_unique<
        internal::UnexportableAttestationKeyId_UnserializedMessageContext<
            UserType, UnexportableAttestationKeyId::DataView>>(0, 0, std::move(input)),
        MOJO_CREATE_MESSAGE_FLAG_NONE);
  }

  template <typename UserType>
  static bool Deserialize(const void* data,
                          size_t data_num_bytes,
                          UserType* output) {
    mojo::Message message;
    return mojo::internal::DeserializeImpl<UnexportableAttestationKeyId::DataView>(
        message, data, data_num_bytes, output, Validate);
  }

  template <typename UserType>
  static bool Deserialize(base::span<const uint8_t> input,
                          UserType* output) {
    return UnexportableAttestationKeyId::Deserialize(
        input.empty() ? nullptr : input.data(), input.size(), output);
  }

  template <typename UserType>
  static bool DeserializeFromMessage(mojo::Message input,
                                     UserType* output) {
    auto context = input.TakeUnserializedContext<
        internal::UnexportableAttestationKeyId_UnserializedMessageContext<
            UserType, UnexportableAttestationKeyId::DataView>>();
    if (context) {
      *output = std::move(context->TakeData());
      return true;
    }
    input.SerializeIfNecessary();
    return mojo::internal::DeserializeImpl<UnexportableAttestationKeyId::DataView>(
        input, input.payload(), input.payload_num_bytes(), output, Validate);
  }

  
  ::base::UnguessableToken key_id;

  // Serialise this struct into a trace.
  void WriteIntoTrace(perfetto::TracedValue traced_context) const;

 private:
  static bool Validate(const void* data,
                       mojo::internal::ValidationContext* validation_context);
};

// The comparison operators are templates, so they are only instantiated if they
// are used. Thus, the bindings generator does not need to know whether
// comparison operators are available for members.
template <typename T, UnexportableAttestationKeyId::EnableIfSame<T>* = nullptr>
bool operator<(const T& lhs, const T& rhs);

template <typename T, UnexportableAttestationKeyId::EnableIfSame<T>* = nullptr>
bool operator<=(const T& lhs, const T& rhs) {
  return !(rhs < lhs);
}

template <typename T, UnexportableAttestationKeyId::EnableIfSame<T>* = nullptr>
bool operator>(const T& lhs, const T& rhs) {
  return rhs < lhs;
}

template <typename T, UnexportableAttestationKeyId::EnableIfSame<T>* = nullptr>
bool operator>=(const T& lhs, const T& rhs) {
  return !(lhs < rhs);
}





class  NewKeyMetadata {
 public:
  template <typename T>
  using EnableIfSame = std::enable_if_t<std::is_same<NewKeyMetadata, T>::value>;
  using DataView = NewKeyMetadataDataView;
  using Data_ = internal::NewKeyMetadata_Data;

  template <typename... Args>
  static NewKeyMetadataPtr New(Args&&... args) {
    return NewKeyMetadataPtr(
        std::in_place, std::forward<Args>(args)...);
  }

  template <typename U>
  static NewKeyMetadataPtr From(const U& u) {
    return mojo::TypeConverter<NewKeyMetadataPtr, U>::Convert(u);
  }

  template <typename U>
  U To() const {
    return mojo::TypeConverter<U, NewKeyMetadata>::Convert(*this);
  }


  NewKeyMetadata();

  NewKeyMetadata(
      std::vector<uint8_t> subject_public_key_info,
      std::vector<uint8_t> wrapped_key,
      ::crypto::SignatureVerifier::SignatureAlgorithm algorithm,
      const std::optional<std::string>& key_tag,
      std::optional<::base::Time> creation_time);


  ~NewKeyMetadata();

  // Clone() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Clone() or copy
  // constructor/assignment are available for members.
  template <typename StructPtrType = NewKeyMetadataPtr>
  NewKeyMetadataPtr Clone() const;

  // Equals() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Equals() or == operator
  // are available for members.
  template <typename T, NewKeyMetadata::EnableIfSame<T>* = nullptr>
  bool Equals(const T& other) const;

  template <typename T, NewKeyMetadata::EnableIfSame<T>* = nullptr>
  bool operator==(const T& rhs) const { return Equals(rhs); }

  template <typename T, NewKeyMetadata::EnableIfSame<T>* = nullptr>
  bool operator!=(const T& rhs) const { return !operator==(rhs); }

  template <mojo::internal::SendValidation send_validation, typename UserType>
  static std::vector<uint8_t> Serialize(UserType* input) {
    return mojo::internal::SerializeImpl<
        NewKeyMetadata::DataView, std::vector<uint8_t>, send_validation>(input);
  }

  template <typename UserType>
  static std::vector<uint8_t> Serialize(UserType* input) {
    return mojo::internal::SerializeImpl<
        NewKeyMetadata::DataView, std::vector<uint8_t>>(input);
  }

  template <typename UserType>
  static mojo::Message SerializeAsMessage(UserType* input) {
    return mojo::internal::SerializeAsMessageImpl<
        NewKeyMetadata::DataView>(input);
  }

  // The returned Message is serialized only if the message is moved
  // cross-process or cross-language. Otherwise if the message is Deserialized
  // as the same UserType |input| will just be moved to |output| in
  // DeserializeFromMessage.
  template <typename UserType>
  static mojo::Message WrapAsMessage(UserType input) {
    return mojo::Message(std::make_unique<
        internal::NewKeyMetadata_UnserializedMessageContext<
            UserType, NewKeyMetadata::DataView>>(0, 0, std::move(input)),
        MOJO_CREATE_MESSAGE_FLAG_NONE);
  }

  template <typename UserType>
  static bool Deserialize(const void* data,
                          size_t data_num_bytes,
                          UserType* output) {
    mojo::Message message;
    return mojo::internal::DeserializeImpl<NewKeyMetadata::DataView>(
        message, data, data_num_bytes, output, Validate);
  }

  template <typename UserType>
  static bool Deserialize(base::span<const uint8_t> input,
                          UserType* output) {
    return NewKeyMetadata::Deserialize(
        input.empty() ? nullptr : input.data(), input.size(), output);
  }

  template <typename UserType>
  static bool DeserializeFromMessage(mojo::Message input,
                                     UserType* output) {
    auto context = input.TakeUnserializedContext<
        internal::NewKeyMetadata_UnserializedMessageContext<
            UserType, NewKeyMetadata::DataView>>();
    if (context) {
      *output = std::move(context->TakeData());
      return true;
    }
    input.SerializeIfNecessary();
    return mojo::internal::DeserializeImpl<NewKeyMetadata::DataView>(
        input, input.payload(), input.payload_num_bytes(), output, Validate);
  }

  
  std::vector<uint8_t> subject_public_key_info;
  
  std::vector<uint8_t> wrapped_key;
  
  ::crypto::SignatureVerifier::SignatureAlgorithm algorithm;
  
  std::optional<std::string> key_tag;
  
  std::optional<::base::Time> creation_time;

  // Serialise this struct into a trace.
  void WriteIntoTrace(perfetto::TracedValue traced_context) const;

 private:
  static bool Validate(const void* data,
                       mojo::internal::ValidationContext* validation_context);
};

// The comparison operators are templates, so they are only instantiated if they
// are used. Thus, the bindings generator does not need to know whether
// comparison operators are available for members.
template <typename T, NewKeyMetadata::EnableIfSame<T>* = nullptr>
bool operator<(const T& lhs, const T& rhs);

template <typename T, NewKeyMetadata::EnableIfSame<T>* = nullptr>
bool operator<=(const T& lhs, const T& rhs) {
  return !(rhs < lhs);
}

template <typename T, NewKeyMetadata::EnableIfSame<T>* = nullptr>
bool operator>(const T& lhs, const T& rhs) {
  return rhs < lhs;
}

template <typename T, NewKeyMetadata::EnableIfSame<T>* = nullptr>
bool operator>=(const T& lhs, const T& rhs) {
  return !(lhs < rhs);
}





class  NewSigningKeyData {
 public:
  template <typename T>
  using EnableIfSame = std::enable_if_t<std::is_same<NewSigningKeyData, T>::value>;
  using DataView = NewSigningKeyDataDataView;
  using Data_ = internal::NewSigningKeyData_Data;

  template <typename... Args>
  static NewSigningKeyDataPtr New(Args&&... args) {
    return NewSigningKeyDataPtr(
        std::in_place, std::forward<Args>(args)...);
  }

  template <typename U>
  static NewSigningKeyDataPtr From(const U& u) {
    return mojo::TypeConverter<NewSigningKeyDataPtr, U>::Convert(u);
  }

  template <typename U>
  U To() const {
    return mojo::TypeConverter<U, NewSigningKeyData>::Convert(*this);
  }


  NewSigningKeyData();

  NewSigningKeyData(
      const ::unexportable_keys::UnexportableSigningKeyId& key_id,
      NewKeyMetadataPtr metadata);

NewSigningKeyData(const NewSigningKeyData&) = delete;
NewSigningKeyData& operator=(const NewSigningKeyData&) = delete;

  ~NewSigningKeyData();

  // Clone() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Clone() or copy
  // constructor/assignment are available for members.
  template <typename StructPtrType = NewSigningKeyDataPtr>
  NewSigningKeyDataPtr Clone() const;

  // Equals() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Equals() or == operator
  // are available for members.
  template <typename T, NewSigningKeyData::EnableIfSame<T>* = nullptr>
  bool Equals(const T& other) const;

  template <typename T, NewSigningKeyData::EnableIfSame<T>* = nullptr>
  bool operator==(const T& rhs) const { return Equals(rhs); }

  template <typename T, NewSigningKeyData::EnableIfSame<T>* = nullptr>
  bool operator!=(const T& rhs) const { return !operator==(rhs); }

  template <mojo::internal::SendValidation send_validation, typename UserType>
  static std::vector<uint8_t> Serialize(UserType* input) {
    return mojo::internal::SerializeImpl<
        NewSigningKeyData::DataView, std::vector<uint8_t>, send_validation>(input);
  }

  template <typename UserType>
  static std::vector<uint8_t> Serialize(UserType* input) {
    return mojo::internal::SerializeImpl<
        NewSigningKeyData::DataView, std::vector<uint8_t>>(input);
  }

  template <typename UserType>
  static mojo::Message SerializeAsMessage(UserType* input) {
    return mojo::internal::SerializeAsMessageImpl<
        NewSigningKeyData::DataView>(input);
  }

  // The returned Message is serialized only if the message is moved
  // cross-process or cross-language. Otherwise if the message is Deserialized
  // as the same UserType |input| will just be moved to |output| in
  // DeserializeFromMessage.
  template <typename UserType>
  static mojo::Message WrapAsMessage(UserType input) {
    return mojo::Message(std::make_unique<
        internal::NewSigningKeyData_UnserializedMessageContext<
            UserType, NewSigningKeyData::DataView>>(0, 0, std::move(input)),
        MOJO_CREATE_MESSAGE_FLAG_NONE);
  }

  template <typename UserType>
  static bool Deserialize(const void* data,
                          size_t data_num_bytes,
                          UserType* output) {
    mojo::Message message;
    return mojo::internal::DeserializeImpl<NewSigningKeyData::DataView>(
        message, data, data_num_bytes, output, Validate);
  }

  template <typename UserType>
  static bool Deserialize(base::span<const uint8_t> input,
                          UserType* output) {
    return NewSigningKeyData::Deserialize(
        input.empty() ? nullptr : input.data(), input.size(), output);
  }

  template <typename UserType>
  static bool DeserializeFromMessage(mojo::Message input,
                                     UserType* output) {
    auto context = input.TakeUnserializedContext<
        internal::NewSigningKeyData_UnserializedMessageContext<
            UserType, NewSigningKeyData::DataView>>();
    if (context) {
      *output = std::move(context->TakeData());
      return true;
    }
    input.SerializeIfNecessary();
    return mojo::internal::DeserializeImpl<NewSigningKeyData::DataView>(
        input, input.payload(), input.payload_num_bytes(), output, Validate);
  }

  
  ::unexportable_keys::UnexportableSigningKeyId key_id;
  
  NewKeyMetadataPtr metadata;

  // Serialise this struct into a trace.
  void WriteIntoTrace(perfetto::TracedValue traced_context) const;

 private:
  static bool Validate(const void* data,
                       mojo::internal::ValidationContext* validation_context);
};

// The comparison operators are templates, so they are only instantiated if they
// are used. Thus, the bindings generator does not need to know whether
// comparison operators are available for members.
template <typename T, NewSigningKeyData::EnableIfSame<T>* = nullptr>
bool operator<(const T& lhs, const T& rhs);

template <typename T, NewSigningKeyData::EnableIfSame<T>* = nullptr>
bool operator<=(const T& lhs, const T& rhs) {
  return !(rhs < lhs);
}

template <typename T, NewSigningKeyData::EnableIfSame<T>* = nullptr>
bool operator>(const T& lhs, const T& rhs) {
  return rhs < lhs;
}

template <typename T, NewSigningKeyData::EnableIfSame<T>* = nullptr>
bool operator>=(const T& lhs, const T& rhs) {
  return !(lhs < rhs);
}





class  NewAttestationKeyData {
 public:
  template <typename T>
  using EnableIfSame = std::enable_if_t<std::is_same<NewAttestationKeyData, T>::value>;
  using DataView = NewAttestationKeyDataDataView;
  using Data_ = internal::NewAttestationKeyData_Data;

  template <typename... Args>
  static NewAttestationKeyDataPtr New(Args&&... args) {
    return NewAttestationKeyDataPtr(
        std::in_place, std::forward<Args>(args)...);
  }

  template <typename U>
  static NewAttestationKeyDataPtr From(const U& u) {
    return mojo::TypeConverter<NewAttestationKeyDataPtr, U>::Convert(u);
  }

  template <typename U>
  U To() const {
    return mojo::TypeConverter<U, NewAttestationKeyData>::Convert(*this);
  }


  NewAttestationKeyData();

  NewAttestationKeyData(
      const ::unexportable_keys::UnexportableAttestationKeyId& key_id,
      NewKeyMetadataPtr metadata);

NewAttestationKeyData(const NewAttestationKeyData&) = delete;
NewAttestationKeyData& operator=(const NewAttestationKeyData&) = delete;

  ~NewAttestationKeyData();

  // Clone() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Clone() or copy
  // constructor/assignment are available for members.
  template <typename StructPtrType = NewAttestationKeyDataPtr>
  NewAttestationKeyDataPtr Clone() const;

  // Equals() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Equals() or == operator
  // are available for members.
  template <typename T, NewAttestationKeyData::EnableIfSame<T>* = nullptr>
  bool Equals(const T& other) const;

  template <typename T, NewAttestationKeyData::EnableIfSame<T>* = nullptr>
  bool operator==(const T& rhs) const { return Equals(rhs); }

  template <typename T, NewAttestationKeyData::EnableIfSame<T>* = nullptr>
  bool operator!=(const T& rhs) const { return !operator==(rhs); }

  template <mojo::internal::SendValidation send_validation, typename UserType>
  static std::vector<uint8_t> Serialize(UserType* input) {
    return mojo::internal::SerializeImpl<
        NewAttestationKeyData::DataView, std::vector<uint8_t>, send_validation>(input);
  }

  template <typename UserType>
  static std::vector<uint8_t> Serialize(UserType* input) {
    return mojo::internal::SerializeImpl<
        NewAttestationKeyData::DataView, std::vector<uint8_t>>(input);
  }

  template <typename UserType>
  static mojo::Message SerializeAsMessage(UserType* input) {
    return mojo::internal::SerializeAsMessageImpl<
        NewAttestationKeyData::DataView>(input);
  }

  // The returned Message is serialized only if the message is moved
  // cross-process or cross-language. Otherwise if the message is Deserialized
  // as the same UserType |input| will just be moved to |output| in
  // DeserializeFromMessage.
  template <typename UserType>
  static mojo::Message WrapAsMessage(UserType input) {
    return mojo::Message(std::make_unique<
        internal::NewAttestationKeyData_UnserializedMessageContext<
            UserType, NewAttestationKeyData::DataView>>(0, 0, std::move(input)),
        MOJO_CREATE_MESSAGE_FLAG_NONE);
  }

  template <typename UserType>
  static bool Deserialize(const void* data,
                          size_t data_num_bytes,
                          UserType* output) {
    mojo::Message message;
    return mojo::internal::DeserializeImpl<NewAttestationKeyData::DataView>(
        message, data, data_num_bytes, output, Validate);
  }

  template <typename UserType>
  static bool Deserialize(base::span<const uint8_t> input,
                          UserType* output) {
    return NewAttestationKeyData::Deserialize(
        input.empty() ? nullptr : input.data(), input.size(), output);
  }

  template <typename UserType>
  static bool DeserializeFromMessage(mojo::Message input,
                                     UserType* output) {
    auto context = input.TakeUnserializedContext<
        internal::NewAttestationKeyData_UnserializedMessageContext<
            UserType, NewAttestationKeyData::DataView>>();
    if (context) {
      *output = std::move(context->TakeData());
      return true;
    }
    input.SerializeIfNecessary();
    return mojo::internal::DeserializeImpl<NewAttestationKeyData::DataView>(
        input, input.payload(), input.payload_num_bytes(), output, Validate);
  }

  
  ::unexportable_keys::UnexportableAttestationKeyId key_id;
  
  NewKeyMetadataPtr metadata;

  // Serialise this struct into a trace.
  void WriteIntoTrace(perfetto::TracedValue traced_context) const;

 private:
  static bool Validate(const void* data,
                       mojo::internal::ValidationContext* validation_context);
};

// The comparison operators are templates, so they are only instantiated if they
// are used. Thus, the bindings generator does not need to know whether
// comparison operators are available for members.
template <typename T, NewAttestationKeyData::EnableIfSame<T>* = nullptr>
bool operator<(const T& lhs, const T& rhs);

template <typename T, NewAttestationKeyData::EnableIfSame<T>* = nullptr>
bool operator<=(const T& lhs, const T& rhs) {
  return !(rhs < lhs);
}

template <typename T, NewAttestationKeyData::EnableIfSame<T>* = nullptr>
bool operator>(const T& lhs, const T& rhs) {
  return rhs < lhs;
}

template <typename T, NewAttestationKeyData::EnableIfSame<T>* = nullptr>
bool operator>=(const T& lhs, const T& rhs) {
  return !(lhs < rhs);
}





class  AttestationStatement {
 public:
  template <typename T>
  using EnableIfSame = std::enable_if_t<std::is_same<AttestationStatement, T>::value>;
  using DataView = AttestationStatementDataView;
  using Data_ = internal::AttestationStatement_Data;

  template <typename... Args>
  static AttestationStatementPtr New(Args&&... args) {
    return AttestationStatementPtr(
        std::in_place, std::forward<Args>(args)...);
  }

  template <typename U>
  static AttestationStatementPtr From(const U& u) {
    return mojo::TypeConverter<AttestationStatementPtr, U>::Convert(u);
  }

  template <typename U>
  U To() const {
    return mojo::TypeConverter<U, AttestationStatement>::Convert(*this);
  }


  AttestationStatement();

  AttestationStatement(
      ::crypto::AttestationStatement::Format format,
      std::vector<uint8_t> statement,
      std::vector<uint8_t> signature);


  ~AttestationStatement();

  // Clone() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Clone() or copy
  // constructor/assignment are available for members.
  template <typename StructPtrType = AttestationStatementPtr>
  AttestationStatementPtr Clone() const;

  // Equals() is a template so it is only instantiated if it is used. Thus, the
  // bindings generator does not need to know whether Equals() or == operator
  // are available for members.
  template <typename T, AttestationStatement::EnableIfSame<T>* = nullptr>
  bool Equals(const T& other) const;

  template <typename T, AttestationStatement::EnableIfSame<T>* = nullptr>
  bool operator==(const T& rhs) const { return Equals(rhs); }

  template <typename T, AttestationStatement::EnableIfSame<T>* = nullptr>
  bool operator!=(const T& rhs) const { return !operator==(rhs); }

  template <mojo::internal::SendValidation send_validation, typename UserType>
  static std::vector<uint8_t> Serialize(UserType* input) {
    return mojo::internal::SerializeImpl<
        AttestationStatement::DataView, std::vector<uint8_t>, send_validation>(input);
  }

  template <typename UserType>
  static std::vector<uint8_t> Serialize(UserType* input) {
    return mojo::internal::SerializeImpl<
        AttestationStatement::DataView, std::vector<uint8_t>>(input);
  }

  template <typename UserType>
  static mojo::Message SerializeAsMessage(UserType* input) {
    return mojo::internal::SerializeAsMessageImpl<
        AttestationStatement::DataView>(input);
  }

  // The returned Message is serialized only if the message is moved
  // cross-process or cross-language. Otherwise if the message is Deserialized
  // as the same UserType |input| will just be moved to |output| in
  // DeserializeFromMessage.
  template <typename UserType>
  static mojo::Message WrapAsMessage(UserType input) {
    return mojo::Message(std::make_unique<
        internal::AttestationStatement_UnserializedMessageContext<
            UserType, AttestationStatement::DataView>>(0, 0, std::move(input)),
        MOJO_CREATE_MESSAGE_FLAG_NONE);
  }

  template <typename UserType>
  static bool Deserialize(const void* data,
                          size_t data_num_bytes,
                          UserType* output) {
    mojo::Message message;
    return mojo::internal::DeserializeImpl<AttestationStatement::DataView>(
        message, data, data_num_bytes, output, Validate);
  }

  template <typename UserType>
  static bool Deserialize(base::span<const uint8_t> input,
                          UserType* output) {
    return AttestationStatement::Deserialize(
        input.empty() ? nullptr : input.data(), input.size(), output);
  }

  template <typename UserType>
  static bool DeserializeFromMessage(mojo::Message input,
                                     UserType* output) {
    auto context = input.TakeUnserializedContext<
        internal::AttestationStatement_UnserializedMessageContext<
            UserType, AttestationStatement::DataView>>();
    if (context) {
      *output = std::move(context->TakeData());
      return true;
    }
    input.SerializeIfNecessary();
    return mojo::internal::DeserializeImpl<AttestationStatement::DataView>(
        input, input.payload(), input.payload_num_bytes(), output, Validate);
  }

  
  ::crypto::AttestationStatement::Format format;
  
  std::vector<uint8_t> statement;
  
  std::vector<uint8_t> signature;

  // Serialise this struct into a trace.
  void WriteIntoTrace(perfetto::TracedValue traced_context) const;

 private:
  static bool Validate(const void* data,
                       mojo::internal::ValidationContext* validation_context);
};

// The comparison operators are templates, so they are only instantiated if they
// are used. Thus, the bindings generator does not need to know whether
// comparison operators are available for members.
template <typename T, AttestationStatement::EnableIfSame<T>* = nullptr>
bool operator<(const T& lhs, const T& rhs);

template <typename T, AttestationStatement::EnableIfSame<T>* = nullptr>
bool operator<=(const T& lhs, const T& rhs) {
  return !(rhs < lhs);
}

template <typename T, AttestationStatement::EnableIfSame<T>* = nullptr>
bool operator>(const T& lhs, const T& rhs) {
  return rhs < lhs;
}

template <typename T, AttestationStatement::EnableIfSame<T>* = nullptr>
bool operator>=(const T& lhs, const T& rhs) {
  return !(lhs < rhs);
}

template <typename UnionPtrType>
UnexportableKeyService_GenerateSigningKey_ResponseParam_ResultPtr UnexportableKeyService_GenerateSigningKey_ResponseParam_Result::Clone() const {
  switch (tag_) {
    case Tag::kSuccess:
      return NewSuccess(
          mojo::Clone(data_.success));
    case Tag::kFailure:
      return NewFailure(
          mojo::Clone(data_.failure));
  }
  return nullptr;
}

template <typename T,
          typename std::enable_if<std::is_same<
              T, UnexportableKeyService_GenerateSigningKey_ResponseParam_Result>::value>::type*>
bool UnexportableKeyService_GenerateSigningKey_ResponseParam_Result::Equals(const T& other) const {
  if (tag_ != other.which())
    return false;

  switch (tag_) {
    case Tag::kSuccess:
      return mojo::Equals(data_.success, other.data_.success);
    case Tag::kFailure:
      return mojo::Equals(data_.failure, other.data_.failure);
  }

  return false;
}
template <typename UnionPtrType>
UnexportableKeyService_FromWrappedSigningKey_ResponseParam_ResultPtr UnexportableKeyService_FromWrappedSigningKey_ResponseParam_Result::Clone() const {
  switch (tag_) {
    case Tag::kSuccess:
      return NewSuccess(
          mojo::Clone(data_.success));
    case Tag::kFailure:
      return NewFailure(
          mojo::Clone(data_.failure));
  }
  return nullptr;
}

template <typename T,
          typename std::enable_if<std::is_same<
              T, UnexportableKeyService_FromWrappedSigningKey_ResponseParam_Result>::value>::type*>
bool UnexportableKeyService_FromWrappedSigningKey_ResponseParam_Result::Equals(const T& other) const {
  if (tag_ != other.which())
    return false;

  switch (tag_) {
    case Tag::kSuccess:
      return mojo::Equals(data_.success, other.data_.success);
    case Tag::kFailure:
      return mojo::Equals(data_.failure, other.data_.failure);
  }

  return false;
}
template <typename UnionPtrType>
UnexportableKeyService_GenerateAttestationKey_ResponseParam_ResultPtr UnexportableKeyService_GenerateAttestationKey_ResponseParam_Result::Clone() const {
  switch (tag_) {
    case Tag::kSuccess:
      return NewSuccess(
          mojo::Clone(data_.success));
    case Tag::kFailure:
      return NewFailure(
          mojo::Clone(data_.failure));
  }
  return nullptr;
}

template <typename T,
          typename std::enable_if<std::is_same<
              T, UnexportableKeyService_GenerateAttestationKey_ResponseParam_Result>::value>::type*>
bool UnexportableKeyService_GenerateAttestationKey_ResponseParam_Result::Equals(const T& other) const {
  if (tag_ != other.which())
    return false;

  switch (tag_) {
    case Tag::kSuccess:
      return mojo::Equals(data_.success, other.data_.success);
    case Tag::kFailure:
      return mojo::Equals(data_.failure, other.data_.failure);
  }

  return false;
}
template <typename UnionPtrType>
UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_ResultPtr UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_Result::Clone() const {
  switch (tag_) {
    case Tag::kSuccess:
      return NewSuccess(
          mojo::Clone(data_.success));
    case Tag::kFailure:
      return NewFailure(
          mojo::Clone(data_.failure));
  }
  return nullptr;
}

template <typename T,
          typename std::enable_if<std::is_same<
              T, UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_Result>::value>::type*>
bool UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_Result::Equals(const T& other) const {
  if (tag_ != other.which())
    return false;

  switch (tag_) {
    case Tag::kSuccess:
      return mojo::Equals(data_.success, other.data_.success);
    case Tag::kFailure:
      return mojo::Equals(data_.failure, other.data_.failure);
  }

  return false;
}
template <typename UnionPtrType>
UnexportableKeyService_Sign_ResponseParam_ResultPtr UnexportableKeyService_Sign_ResponseParam_Result::Clone() const {
  switch (tag_) {
    case Tag::kSuccess:
      return NewSuccess(
          mojo::Clone(data_.success));
    case Tag::kFailure:
      return NewFailure(
          mojo::Clone(data_.failure));
  }
  return nullptr;
}

template <typename T,
          typename std::enable_if<std::is_same<
              T, UnexportableKeyService_Sign_ResponseParam_Result>::value>::type*>
bool UnexportableKeyService_Sign_ResponseParam_Result::Equals(const T& other) const {
  if (tag_ != other.which())
    return false;

  switch (tag_) {
    case Tag::kSuccess:
      return mojo::Equals(data_.success, other.data_.success);
    case Tag::kFailure:
      return mojo::Equals(data_.failure, other.data_.failure);
  }

  return false;
}
template <typename UnionPtrType>
UnexportableKeyService_Certify_ResponseParam_ResultPtr UnexportableKeyService_Certify_ResponseParam_Result::Clone() const {
  switch (tag_) {
    case Tag::kSuccess:
      return NewSuccess(
          mojo::Clone(data_.success));
    case Tag::kFailure:
      return NewFailure(
          mojo::Clone(data_.failure));
  }
  return nullptr;
}

template <typename T,
          typename std::enable_if<std::is_same<
              T, UnexportableKeyService_Certify_ResponseParam_Result>::value>::type*>
bool UnexportableKeyService_Certify_ResponseParam_Result::Equals(const T& other) const {
  if (tag_ != other.which())
    return false;

  switch (tag_) {
    case Tag::kSuccess:
      return mojo::Equals(data_.success, other.data_.success);
    case Tag::kFailure:
      return mojo::Equals(data_.failure, other.data_.failure);
  }

  return false;
}
template <typename UnionPtrType>
UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_ResultPtr UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_Result::Clone() const {
  switch (tag_) {
    case Tag::kSuccess:
      return NewSuccess(
          mojo::Clone(data_.success));
    case Tag::kFailure:
      return NewFailure(
          mojo::Clone(data_.failure));
  }
  return nullptr;
}

template <typename T,
          typename std::enable_if<std::is_same<
              T, UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_Result>::value>::type*>
bool UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_Result::Equals(const T& other) const {
  if (tag_ != other.which())
    return false;

  switch (tag_) {
    case Tag::kSuccess:
      return mojo::Equals(data_.success, other.data_.success);
    case Tag::kFailure:
      return mojo::Equals(data_.failure, other.data_.failure);
  }

  return false;
}
template <typename UnionPtrType>
UnexportableKeyService_DeleteKeys_ResponseParam_ResultPtr UnexportableKeyService_DeleteKeys_ResponseParam_Result::Clone() const {
  switch (tag_) {
    case Tag::kSuccess:
      return NewSuccess(
          mojo::Clone(data_.success));
    case Tag::kFailure:
      return NewFailure(
          mojo::Clone(data_.failure));
  }
  return nullptr;
}

template <typename T,
          typename std::enable_if<std::is_same<
              T, UnexportableKeyService_DeleteKeys_ResponseParam_Result>::value>::type*>
bool UnexportableKeyService_DeleteKeys_ResponseParam_Result::Equals(const T& other) const {
  if (tag_ != other.which())
    return false;

  switch (tag_) {
    case Tag::kSuccess:
      return mojo::Equals(data_.success, other.data_.success);
    case Tag::kFailure:
      return mojo::Equals(data_.failure, other.data_.failure);
  }

  return false;
}
template <typename UnionPtrType>
UnexportableKeyService_DeleteAllKeys_ResponseParam_ResultPtr UnexportableKeyService_DeleteAllKeys_ResponseParam_Result::Clone() const {
  switch (tag_) {
    case Tag::kSuccess:
      return NewSuccess(
          mojo::Clone(data_.success));
    case Tag::kFailure:
      return NewFailure(
          mojo::Clone(data_.failure));
  }
  return nullptr;
}

template <typename T,
          typename std::enable_if<std::is_same<
              T, UnexportableKeyService_DeleteAllKeys_ResponseParam_Result>::value>::type*>
bool UnexportableKeyService_DeleteAllKeys_ResponseParam_Result::Equals(const T& other) const {
  if (tag_ != other.which())
    return false;

  switch (tag_) {
    case Tag::kSuccess:
      return mojo::Equals(data_.success, other.data_.success);
    case Tag::kFailure:
      return mojo::Equals(data_.failure, other.data_.failure);
  }

  return false;
}
template <typename StructPtrType>
UnexportableSigningKeyIdPtr UnexportableSigningKeyId::Clone() const {
  return New(
      mojo::Clone(key_id)
  );
}

template <typename T, UnexportableSigningKeyId::EnableIfSame<T>*>
bool UnexportableSigningKeyId::Equals(const T& other_struct) const {
  if (!mojo::Equals(this->key_id, other_struct.key_id))
    return false;
  return true;
}

template <typename T, UnexportableSigningKeyId::EnableIfSame<T>*>
bool operator<(const T& lhs, const T& rhs) {
  if (lhs.key_id < rhs.key_id)
    return true;
  if (rhs.key_id < lhs.key_id)
    return false;
  return false;
}
template <typename StructPtrType>
UnexportableAttestationKeyIdPtr UnexportableAttestationKeyId::Clone() const {
  return New(
      mojo::Clone(key_id)
  );
}

template <typename T, UnexportableAttestationKeyId::EnableIfSame<T>*>
bool UnexportableAttestationKeyId::Equals(const T& other_struct) const {
  if (!mojo::Equals(this->key_id, other_struct.key_id))
    return false;
  return true;
}

template <typename T, UnexportableAttestationKeyId::EnableIfSame<T>*>
bool operator<(const T& lhs, const T& rhs) {
  if (lhs.key_id < rhs.key_id)
    return true;
  if (rhs.key_id < lhs.key_id)
    return false;
  return false;
}
template <typename StructPtrType>
NewKeyMetadataPtr NewKeyMetadata::Clone() const {
  return New(
      mojo::Clone(subject_public_key_info),
      mojo::Clone(wrapped_key),
      mojo::Clone(algorithm),
      mojo::Clone(key_tag),
      mojo::Clone(creation_time)
  );
}

template <typename T, NewKeyMetadata::EnableIfSame<T>*>
bool NewKeyMetadata::Equals(const T& other_struct) const {
  if (!mojo::Equals(this->subject_public_key_info, other_struct.subject_public_key_info))
    return false;
  if (!mojo::Equals(this->wrapped_key, other_struct.wrapped_key))
    return false;
  if (!mojo::Equals(this->algorithm, other_struct.algorithm))
    return false;
  if (!mojo::Equals(this->key_tag, other_struct.key_tag))
    return false;
  if (!mojo::Equals(this->creation_time, other_struct.creation_time))
    return false;
  return true;
}

template <typename T, NewKeyMetadata::EnableIfSame<T>*>
bool operator<(const T& lhs, const T& rhs) {
  if (lhs.subject_public_key_info < rhs.subject_public_key_info)
    return true;
  if (rhs.subject_public_key_info < lhs.subject_public_key_info)
    return false;
  if (lhs.wrapped_key < rhs.wrapped_key)
    return true;
  if (rhs.wrapped_key < lhs.wrapped_key)
    return false;
  if (lhs.algorithm < rhs.algorithm)
    return true;
  if (rhs.algorithm < lhs.algorithm)
    return false;
  if (lhs.key_tag < rhs.key_tag)
    return true;
  if (rhs.key_tag < lhs.key_tag)
    return false;
  if (lhs.creation_time < rhs.creation_time)
    return true;
  if (rhs.creation_time < lhs.creation_time)
    return false;
  return false;
}
template <typename StructPtrType>
NewSigningKeyDataPtr NewSigningKeyData::Clone() const {
  return New(
      mojo::Clone(key_id),
      mojo::Clone(metadata)
  );
}

template <typename T, NewSigningKeyData::EnableIfSame<T>*>
bool NewSigningKeyData::Equals(const T& other_struct) const {
  if (!mojo::Equals(this->key_id, other_struct.key_id))
    return false;
  if (!mojo::Equals(this->metadata, other_struct.metadata))
    return false;
  return true;
}

template <typename T, NewSigningKeyData::EnableIfSame<T>*>
bool operator<(const T& lhs, const T& rhs) {
  if (lhs.key_id < rhs.key_id)
    return true;
  if (rhs.key_id < lhs.key_id)
    return false;
  if (lhs.metadata < rhs.metadata)
    return true;
  if (rhs.metadata < lhs.metadata)
    return false;
  return false;
}
template <typename StructPtrType>
NewAttestationKeyDataPtr NewAttestationKeyData::Clone() const {
  return New(
      mojo::Clone(key_id),
      mojo::Clone(metadata)
  );
}

template <typename T, NewAttestationKeyData::EnableIfSame<T>*>
bool NewAttestationKeyData::Equals(const T& other_struct) const {
  if (!mojo::Equals(this->key_id, other_struct.key_id))
    return false;
  if (!mojo::Equals(this->metadata, other_struct.metadata))
    return false;
  return true;
}

template <typename T, NewAttestationKeyData::EnableIfSame<T>*>
bool operator<(const T& lhs, const T& rhs) {
  if (lhs.key_id < rhs.key_id)
    return true;
  if (rhs.key_id < lhs.key_id)
    return false;
  if (lhs.metadata < rhs.metadata)
    return true;
  if (rhs.metadata < lhs.metadata)
    return false;
  return false;
}
template <typename StructPtrType>
AttestationStatementPtr AttestationStatement::Clone() const {
  return New(
      mojo::Clone(format),
      mojo::Clone(statement),
      mojo::Clone(signature)
  );
}

template <typename T, AttestationStatement::EnableIfSame<T>*>
bool AttestationStatement::Equals(const T& other_struct) const {
  if (!mojo::Equals(this->format, other_struct.format))
    return false;
  if (!mojo::Equals(this->statement, other_struct.statement))
    return false;
  if (!mojo::Equals(this->signature, other_struct.signature))
    return false;
  return true;
}

template <typename T, AttestationStatement::EnableIfSame<T>*>
bool operator<(const T& lhs, const T& rhs) {
  if (lhs.format < rhs.format)
    return true;
  if (rhs.format < lhs.format)
    return false;
  if (lhs.statement < rhs.statement)
    return true;
  if (rhs.statement < lhs.statement)
    return false;
  if (lhs.signature < rhs.signature)
    return true;
  if (rhs.signature < lhs.signature)
    return false;
  return false;
}


}  // unexportable_keys::mojom

namespace mojo {


template <>
struct  StructTraits<::unexportable_keys::mojom::UnexportableSigningKeyId::DataView,
                                         ::unexportable_keys::mojom::UnexportableSigningKeyIdPtr> {
  static bool IsNull(const ::unexportable_keys::mojom::UnexportableSigningKeyIdPtr& input) { return !input; }
  static void SetToNull(::unexportable_keys::mojom::UnexportableSigningKeyIdPtr* output) { output->reset(); }

  static const decltype(::unexportable_keys::mojom::UnexportableSigningKeyId::key_id)& key_id(
      const ::unexportable_keys::mojom::UnexportableSigningKeyIdPtr& input) {
    return input->key_id;
  }

  static bool Read(::unexportable_keys::mojom::UnexportableSigningKeyId::DataView input, ::unexportable_keys::mojom::UnexportableSigningKeyIdPtr* output);
};


template <>
struct  StructTraits<::unexportable_keys::mojom::UnexportableAttestationKeyId::DataView,
                                         ::unexportable_keys::mojom::UnexportableAttestationKeyIdPtr> {
  static bool IsNull(const ::unexportable_keys::mojom::UnexportableAttestationKeyIdPtr& input) { return !input; }
  static void SetToNull(::unexportable_keys::mojom::UnexportableAttestationKeyIdPtr* output) { output->reset(); }

  static const decltype(::unexportable_keys::mojom::UnexportableAttestationKeyId::key_id)& key_id(
      const ::unexportable_keys::mojom::UnexportableAttestationKeyIdPtr& input) {
    return input->key_id;
  }

  static bool Read(::unexportable_keys::mojom::UnexportableAttestationKeyId::DataView input, ::unexportable_keys::mojom::UnexportableAttestationKeyIdPtr* output);
};


template <>
struct  StructTraits<::unexportable_keys::mojom::NewKeyMetadata::DataView,
                                         ::unexportable_keys::mojom::NewKeyMetadataPtr> {
  static bool IsNull(const ::unexportable_keys::mojom::NewKeyMetadataPtr& input) { return !input; }
  static void SetToNull(::unexportable_keys::mojom::NewKeyMetadataPtr* output) { output->reset(); }

  static const decltype(::unexportable_keys::mojom::NewKeyMetadata::subject_public_key_info)& subject_public_key_info(
      const ::unexportable_keys::mojom::NewKeyMetadataPtr& input) {
    return input->subject_public_key_info;
  }

  static const decltype(::unexportable_keys::mojom::NewKeyMetadata::wrapped_key)& wrapped_key(
      const ::unexportable_keys::mojom::NewKeyMetadataPtr& input) {
    return input->wrapped_key;
  }

  static decltype(::unexportable_keys::mojom::NewKeyMetadata::algorithm) algorithm(
      const ::unexportable_keys::mojom::NewKeyMetadataPtr& input) {
    return input->algorithm;
  }

  static const decltype(::unexportable_keys::mojom::NewKeyMetadata::key_tag)& key_tag(
      const ::unexportable_keys::mojom::NewKeyMetadataPtr& input) {
    return input->key_tag;
  }

  static const decltype(::unexportable_keys::mojom::NewKeyMetadata::creation_time)& creation_time(
      const ::unexportable_keys::mojom::NewKeyMetadataPtr& input) {
    return input->creation_time;
  }

  static bool Read(::unexportable_keys::mojom::NewKeyMetadata::DataView input, ::unexportable_keys::mojom::NewKeyMetadataPtr* output);
};


template <>
struct  StructTraits<::unexportable_keys::mojom::NewSigningKeyData::DataView,
                                         ::unexportable_keys::mojom::NewSigningKeyDataPtr> {
  static bool IsNull(const ::unexportable_keys::mojom::NewSigningKeyDataPtr& input) { return !input; }
  static void SetToNull(::unexportable_keys::mojom::NewSigningKeyDataPtr* output) { output->reset(); }

  static const decltype(::unexportable_keys::mojom::NewSigningKeyData::key_id)& key_id(
      const ::unexportable_keys::mojom::NewSigningKeyDataPtr& input) {
    return input->key_id;
  }

  static const decltype(::unexportable_keys::mojom::NewSigningKeyData::metadata)& metadata(
      const ::unexportable_keys::mojom::NewSigningKeyDataPtr& input) {
    return input->metadata;
  }

  static bool Read(::unexportable_keys::mojom::NewSigningKeyData::DataView input, ::unexportable_keys::mojom::NewSigningKeyDataPtr* output);
};


template <>
struct  StructTraits<::unexportable_keys::mojom::NewAttestationKeyData::DataView,
                                         ::unexportable_keys::mojom::NewAttestationKeyDataPtr> {
  static bool IsNull(const ::unexportable_keys::mojom::NewAttestationKeyDataPtr& input) { return !input; }
  static void SetToNull(::unexportable_keys::mojom::NewAttestationKeyDataPtr* output) { output->reset(); }

  static const decltype(::unexportable_keys::mojom::NewAttestationKeyData::key_id)& key_id(
      const ::unexportable_keys::mojom::NewAttestationKeyDataPtr& input) {
    return input->key_id;
  }

  static const decltype(::unexportable_keys::mojom::NewAttestationKeyData::metadata)& metadata(
      const ::unexportable_keys::mojom::NewAttestationKeyDataPtr& input) {
    return input->metadata;
  }

  static bool Read(::unexportable_keys::mojom::NewAttestationKeyData::DataView input, ::unexportable_keys::mojom::NewAttestationKeyDataPtr* output);
};


template <>
struct  StructTraits<::unexportable_keys::mojom::AttestationStatement::DataView,
                                         ::unexportable_keys::mojom::AttestationStatementPtr> {
  static bool IsNull(const ::unexportable_keys::mojom::AttestationStatementPtr& input) { return !input; }
  static void SetToNull(::unexportable_keys::mojom::AttestationStatementPtr* output) { output->reset(); }

  static decltype(::unexportable_keys::mojom::AttestationStatement::format) format(
      const ::unexportable_keys::mojom::AttestationStatementPtr& input) {
    return input->format;
  }

  static const decltype(::unexportable_keys::mojom::AttestationStatement::statement)& statement(
      const ::unexportable_keys::mojom::AttestationStatementPtr& input) {
    return input->statement;
  }

  static const decltype(::unexportable_keys::mojom::AttestationStatement::signature)& signature(
      const ::unexportable_keys::mojom::AttestationStatementPtr& input) {
    return input->signature;
  }

  static bool Read(::unexportable_keys::mojom::AttestationStatement::DataView input, ::unexportable_keys::mojom::AttestationStatementPtr* output);
};


template <>
struct  UnionTraits<::unexportable_keys::mojom::UnexportableKeyService_GenerateSigningKey_ResponseParam_Result::DataView,
                                        ::unexportable_keys::mojom::UnexportableKeyService_GenerateSigningKey_ResponseParam_ResultPtr> {
  static bool IsNull(const ::unexportable_keys::mojom::UnexportableKeyService_GenerateSigningKey_ResponseParam_ResultPtr& input) { return !input; }
  static void SetToNull(::unexportable_keys::mojom::UnexportableKeyService_GenerateSigningKey_ResponseParam_ResultPtr* output) { output->reset(); }

  static ::unexportable_keys::mojom::UnexportableKeyService_GenerateSigningKey_ResponseParam_Result::Tag GetTag(const ::unexportable_keys::mojom::UnexportableKeyService_GenerateSigningKey_ResponseParam_ResultPtr& input) {
    return input->which();
  }

  static const ::unexportable_keys::mojom::NewSigningKeyDataPtr& success(const ::unexportable_keys::mojom::UnexportableKeyService_GenerateSigningKey_ResponseParam_ResultPtr& input) {
    return input->get_success();
  }

  static  ::unexportable_keys::ServiceError failure(const ::unexportable_keys::mojom::UnexportableKeyService_GenerateSigningKey_ResponseParam_ResultPtr& input) {
    return input->get_failure();
  }

  static bool Read(::unexportable_keys::mojom::UnexportableKeyService_GenerateSigningKey_ResponseParam_Result::DataView input, ::unexportable_keys::mojom::UnexportableKeyService_GenerateSigningKey_ResponseParam_ResultPtr* output);
};


template <>
struct  UnionTraits<::unexportable_keys::mojom::UnexportableKeyService_FromWrappedSigningKey_ResponseParam_Result::DataView,
                                        ::unexportable_keys::mojom::UnexportableKeyService_FromWrappedSigningKey_ResponseParam_ResultPtr> {
  static bool IsNull(const ::unexportable_keys::mojom::UnexportableKeyService_FromWrappedSigningKey_ResponseParam_ResultPtr& input) { return !input; }
  static void SetToNull(::unexportable_keys::mojom::UnexportableKeyService_FromWrappedSigningKey_ResponseParam_ResultPtr* output) { output->reset(); }

  static ::unexportable_keys::mojom::UnexportableKeyService_FromWrappedSigningKey_ResponseParam_Result::Tag GetTag(const ::unexportable_keys::mojom::UnexportableKeyService_FromWrappedSigningKey_ResponseParam_ResultPtr& input) {
    return input->which();
  }

  static const ::unexportable_keys::mojom::NewSigningKeyDataPtr& success(const ::unexportable_keys::mojom::UnexportableKeyService_FromWrappedSigningKey_ResponseParam_ResultPtr& input) {
    return input->get_success();
  }

  static  ::unexportable_keys::ServiceError failure(const ::unexportable_keys::mojom::UnexportableKeyService_FromWrappedSigningKey_ResponseParam_ResultPtr& input) {
    return input->get_failure();
  }

  static bool Read(::unexportable_keys::mojom::UnexportableKeyService_FromWrappedSigningKey_ResponseParam_Result::DataView input, ::unexportable_keys::mojom::UnexportableKeyService_FromWrappedSigningKey_ResponseParam_ResultPtr* output);
};


template <>
struct  UnionTraits<::unexportable_keys::mojom::UnexportableKeyService_GenerateAttestationKey_ResponseParam_Result::DataView,
                                        ::unexportable_keys::mojom::UnexportableKeyService_GenerateAttestationKey_ResponseParam_ResultPtr> {
  static bool IsNull(const ::unexportable_keys::mojom::UnexportableKeyService_GenerateAttestationKey_ResponseParam_ResultPtr& input) { return !input; }
  static void SetToNull(::unexportable_keys::mojom::UnexportableKeyService_GenerateAttestationKey_ResponseParam_ResultPtr* output) { output->reset(); }

  static ::unexportable_keys::mojom::UnexportableKeyService_GenerateAttestationKey_ResponseParam_Result::Tag GetTag(const ::unexportable_keys::mojom::UnexportableKeyService_GenerateAttestationKey_ResponseParam_ResultPtr& input) {
    return input->which();
  }

  static const ::unexportable_keys::mojom::NewAttestationKeyDataPtr& success(const ::unexportable_keys::mojom::UnexportableKeyService_GenerateAttestationKey_ResponseParam_ResultPtr& input) {
    return input->get_success();
  }

  static  ::unexportable_keys::ServiceError failure(const ::unexportable_keys::mojom::UnexportableKeyService_GenerateAttestationKey_ResponseParam_ResultPtr& input) {
    return input->get_failure();
  }

  static bool Read(::unexportable_keys::mojom::UnexportableKeyService_GenerateAttestationKey_ResponseParam_Result::DataView input, ::unexportable_keys::mojom::UnexportableKeyService_GenerateAttestationKey_ResponseParam_ResultPtr* output);
};


template <>
struct  UnionTraits<::unexportable_keys::mojom::UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_Result::DataView,
                                        ::unexportable_keys::mojom::UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_ResultPtr> {
  static bool IsNull(const ::unexportable_keys::mojom::UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_ResultPtr& input) { return !input; }
  static void SetToNull(::unexportable_keys::mojom::UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_ResultPtr* output) { output->reset(); }

  static ::unexportable_keys::mojom::UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_Result::Tag GetTag(const ::unexportable_keys::mojom::UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_ResultPtr& input) {
    return input->which();
  }

  static const ::unexportable_keys::mojom::NewAttestationKeyDataPtr& success(const ::unexportable_keys::mojom::UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_ResultPtr& input) {
    return input->get_success();
  }

  static  ::unexportable_keys::ServiceError failure(const ::unexportable_keys::mojom::UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_ResultPtr& input) {
    return input->get_failure();
  }

  static bool Read(::unexportable_keys::mojom::UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_Result::DataView input, ::unexportable_keys::mojom::UnexportableKeyService_FromWrappedAttestationKey_ResponseParam_ResultPtr* output);
};


template <>
struct  UnionTraits<::unexportable_keys::mojom::UnexportableKeyService_Sign_ResponseParam_Result::DataView,
                                        ::unexportable_keys::mojom::UnexportableKeyService_Sign_ResponseParam_ResultPtr> {
  static bool IsNull(const ::unexportable_keys::mojom::UnexportableKeyService_Sign_ResponseParam_ResultPtr& input) { return !input; }
  static void SetToNull(::unexportable_keys::mojom::UnexportableKeyService_Sign_ResponseParam_ResultPtr* output) { output->reset(); }

  static ::unexportable_keys::mojom::UnexportableKeyService_Sign_ResponseParam_Result::Tag GetTag(const ::unexportable_keys::mojom::UnexportableKeyService_Sign_ResponseParam_ResultPtr& input) {
    return input->which();
  }

  static const std::vector<uint8_t>& success(const ::unexportable_keys::mojom::UnexportableKeyService_Sign_ResponseParam_ResultPtr& input) {
    return input->get_success();
  }

  static  ::unexportable_keys::ServiceError failure(const ::unexportable_keys::mojom::UnexportableKeyService_Sign_ResponseParam_ResultPtr& input) {
    return input->get_failure();
  }

  static bool Read(::unexportable_keys::mojom::UnexportableKeyService_Sign_ResponseParam_Result::DataView input, ::unexportable_keys::mojom::UnexportableKeyService_Sign_ResponseParam_ResultPtr* output);
};


template <>
struct  UnionTraits<::unexportable_keys::mojom::UnexportableKeyService_Certify_ResponseParam_Result::DataView,
                                        ::unexportable_keys::mojom::UnexportableKeyService_Certify_ResponseParam_ResultPtr> {
  static bool IsNull(const ::unexportable_keys::mojom::UnexportableKeyService_Certify_ResponseParam_ResultPtr& input) { return !input; }
  static void SetToNull(::unexportable_keys::mojom::UnexportableKeyService_Certify_ResponseParam_ResultPtr* output) { output->reset(); }

  static ::unexportable_keys::mojom::UnexportableKeyService_Certify_ResponseParam_Result::Tag GetTag(const ::unexportable_keys::mojom::UnexportableKeyService_Certify_ResponseParam_ResultPtr& input) {
    return input->which();
  }

  static const ::crypto::AttestationStatement& success(const ::unexportable_keys::mojom::UnexportableKeyService_Certify_ResponseParam_ResultPtr& input) {
    return input->get_success();
  }

  static  ::unexportable_keys::ServiceError failure(const ::unexportable_keys::mojom::UnexportableKeyService_Certify_ResponseParam_ResultPtr& input) {
    return input->get_failure();
  }

  static bool Read(::unexportable_keys::mojom::UnexportableKeyService_Certify_ResponseParam_Result::DataView input, ::unexportable_keys::mojom::UnexportableKeyService_Certify_ResponseParam_ResultPtr* output);
};


template <>
struct  UnionTraits<::unexportable_keys::mojom::UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_Result::DataView,
                                        ::unexportable_keys::mojom::UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_ResultPtr> {
  static bool IsNull(const ::unexportable_keys::mojom::UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_ResultPtr& input) { return !input; }
  static void SetToNull(::unexportable_keys::mojom::UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_ResultPtr* output) { output->reset(); }

  static ::unexportable_keys::mojom::UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_Result::Tag GetTag(const ::unexportable_keys::mojom::UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_ResultPtr& input) {
    return input->which();
  }

  static const std::vector<::unexportable_keys::mojom::NewSigningKeyDataPtr>& success(const ::unexportable_keys::mojom::UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_ResultPtr& input) {
    return input->get_success();
  }

  static  ::unexportable_keys::ServiceError failure(const ::unexportable_keys::mojom::UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_ResultPtr& input) {
    return input->get_failure();
  }

  static bool Read(::unexportable_keys::mojom::UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_Result::DataView input, ::unexportable_keys::mojom::UnexportableKeyService_GetAllKeysForGarbageCollection_ResponseParam_ResultPtr* output);
};


template <>
struct  UnionTraits<::unexportable_keys::mojom::UnexportableKeyService_DeleteKeys_ResponseParam_Result::DataView,
                                        ::unexportable_keys::mojom::UnexportableKeyService_DeleteKeys_ResponseParam_ResultPtr> {
  static bool IsNull(const ::unexportable_keys::mojom::UnexportableKeyService_DeleteKeys_ResponseParam_ResultPtr& input) { return !input; }
  static void SetToNull(::unexportable_keys::mojom::UnexportableKeyService_DeleteKeys_ResponseParam_ResultPtr* output) { output->reset(); }

  static ::unexportable_keys::mojom::UnexportableKeyService_DeleteKeys_ResponseParam_Result::Tag GetTag(const ::unexportable_keys::mojom::UnexportableKeyService_DeleteKeys_ResponseParam_ResultPtr& input) {
    return input->which();
  }

  static  uint64_t success(const ::unexportable_keys::mojom::UnexportableKeyService_DeleteKeys_ResponseParam_ResultPtr& input) {
    return input->get_success();
  }

  static  ::unexportable_keys::ServiceError failure(const ::unexportable_keys::mojom::UnexportableKeyService_DeleteKeys_ResponseParam_ResultPtr& input) {
    return input->get_failure();
  }

  static bool Read(::unexportable_keys::mojom::UnexportableKeyService_DeleteKeys_ResponseParam_Result::DataView input, ::unexportable_keys::mojom::UnexportableKeyService_DeleteKeys_ResponseParam_ResultPtr* output);
};


template <>
struct  UnionTraits<::unexportable_keys::mojom::UnexportableKeyService_DeleteAllKeys_ResponseParam_Result::DataView,
                                        ::unexportable_keys::mojom::UnexportableKeyService_DeleteAllKeys_ResponseParam_ResultPtr> {
  static bool IsNull(const ::unexportable_keys::mojom::UnexportableKeyService_DeleteAllKeys_ResponseParam_ResultPtr& input) { return !input; }
  static void SetToNull(::unexportable_keys::mojom::UnexportableKeyService_DeleteAllKeys_ResponseParam_ResultPtr* output) { output->reset(); }

  static ::unexportable_keys::mojom::UnexportableKeyService_DeleteAllKeys_ResponseParam_Result::Tag GetTag(const ::unexportable_keys::mojom::UnexportableKeyService_DeleteAllKeys_ResponseParam_ResultPtr& input) {
    return input->which();
  }

  static  uint64_t success(const ::unexportable_keys::mojom::UnexportableKeyService_DeleteAllKeys_ResponseParam_ResultPtr& input) {
    return input->get_success();
  }

  static  ::unexportable_keys::ServiceError failure(const ::unexportable_keys::mojom::UnexportableKeyService_DeleteAllKeys_ResponseParam_ResultPtr& input) {
    return input->get_failure();
  }

  static bool Read(::unexportable_keys::mojom::UnexportableKeyService_DeleteAllKeys_ResponseParam_Result::DataView input, ::unexportable_keys::mojom::UnexportableKeyService_DeleteAllKeys_ResponseParam_ResultPtr* output);
};

}  // namespace mojo

#endif  // COMPONENTS_UNEXPORTABLE_KEYS_MOJOM_UNEXPORTABLE_KEY_SERVICE_MOJOM_H_