// mojo/public/cpp/bindings/tests/remote_unittest.test-mojom-lite-for-compile.js is auto generated by mojom_bindings_generator.py, do not edit

// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
 * @fileoverview
 * @suppress {missingRequire}
 */
'use strict';

goog.require('mojo.internal');
goog.require('mojo.internal.interfaceSupport');







goog.provide('mojo.test.remoteUnittest.mojom.SharedRemoteSyncTest');
goog.provide('mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestReceiver');
goog.provide('mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestCallbackRouter');
goog.provide('mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestInterface');
goog.provide('mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestRemote');
goog.provide('mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestPendingReceiver');


/**
 * @implements {mojo.internal.interfaceSupport.PendingReceiver}
 * @export
 */
mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestPendingReceiver = class {
  /**
   * @param {!MojoHandle|!mojo.internal.interfaceSupport.Endpoint} handle
   */
  constructor(handle) {
    /** @public {!mojo.internal.interfaceSupport.Endpoint} */
    this.handle = mojo.internal.interfaceSupport.getEndpointForReceiver(handle);
  }

  /** @param {string=} scope */
  bindInBrowser(scope = 'context') {
    mojo.internal.interfaceSupport.bind(
        this.handle,
        mojo.test.remoteUnittest.mojom.SharedRemoteSyncTest.$interfaceName,
        scope);
  }
};

/** @interface */
mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestInterface = class {
  
  /**
   * @return {!Promise<{
        value: !number,
   *  }>}
   */

  fetch() {}
};

/**
 * @export
 * @implements { mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestInterface }
 */
mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestRemote = class {
  /** @param {MojoHandle|mojo.internal.interfaceSupport.Endpoint=} handle */
  constructor(handle = undefined) {
    /**
     * @private {!mojo.internal.interfaceSupport.InterfaceRemoteBase<!mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestPendingReceiver>}
     */
    this.proxy =
        new mojo.internal.interfaceSupport.InterfaceRemoteBase(
          mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestPendingReceiver,
          handle);

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceRemoteBaseWrapper<!mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestPendingReceiver>}
     */
    this.$ = new mojo.internal.interfaceSupport.InterfaceRemoteBaseWrapper(this.proxy);

    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.proxy.getConnectionErrorEventRouter();
  }

  
  /**
   * @return {!Promise<{
        value: !number,
   *  }>}
   */

  fetch() {
    return this.proxy.sendMessage(
        0,
        mojo.test.remoteUnittest.mojom.SharedRemoteSyncTest_Fetch_ParamsSpec.$,
        mojo.test.remoteUnittest.mojom.SharedRemoteSyncTest_Fetch_ResponseParamsSpec.$,
        [
        ]);
  }
};

/**
 * An object which receives request messages for the SharedRemoteSyncTest
 * mojom interface. Must be constructed over an object which implements that
 * interface.
 *
 * @export
 */
mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestReceiver = class {
  /**
   * @param {!mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestInterface } impl
   */
  constructor(impl) {
    /** @private {!mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal<!mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestRemote>} */
    this.helper_internal_ = new mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal(
        mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestRemote);

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceReceiverHelper<!mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestRemote>}
     */
    this.$ = new mojo.internal.interfaceSupport.InterfaceReceiverHelper(this.helper_internal_);


    this.helper_internal_.registerHandler(
        0,
        mojo.test.remoteUnittest.mojom.SharedRemoteSyncTest_Fetch_ParamsSpec.$,
        mojo.test.remoteUnittest.mojom.SharedRemoteSyncTest_Fetch_ResponseParamsSpec.$,
        impl.fetch.bind(impl));
    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.helper_internal_.getConnectionErrorEventRouter();
  }
};

/**
 *  @export
 */
mojo.test.remoteUnittest.mojom.SharedRemoteSyncTest = class {
  /**
   * @return {!string}
   */
  static get $interfaceName() {
    return "mojo.test.remote_unittest.mojom.SharedRemoteSyncTest";
  }

  /**
   * Returns a remote for this interface which sends messages to the browser.
   * The browser must have an interface request binder registered for this
   * interface and accessible to the calling document's frame.
   *
   * @return {!mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestRemote}
   * @export
   */
  static getRemote() {
    let remote = new mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestRemote;
    remote.$.bindNewPipeAndPassReceiver().bindInBrowser();
    return remote;
  }
};


/**
 * An object which receives request messages for the SharedRemoteSyncTest
 * mojom interface and dispatches them as callbacks. One callback receiver exists
 * on this object for each message defined in the mojom interface, and each
 * receiver can have any number of listeners added to it.
 *
 * @export
 */
mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestCallbackRouter = class {
  constructor() {
    this.helper_internal_ = new mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal(
      mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestRemote);

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceReceiverHelper<!mojo.test.remoteUnittest.mojom.SharedRemoteSyncTestRemote>}
     */
    this.$ = new mojo.internal.interfaceSupport.InterfaceReceiverHelper(this.helper_internal_);

    this.router_ = new mojo.internal.interfaceSupport.CallbackRouter;

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.fetch =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        0,
        mojo.test.remoteUnittest.mojom.SharedRemoteSyncTest_Fetch_ParamsSpec.$,
        mojo.test.remoteUnittest.mojom.SharedRemoteSyncTest_Fetch_ResponseParamsSpec.$,
        this.fetch.createReceiverHandler(true /* expectsResponse */));
    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.helper_internal_.getConnectionErrorEventRouter();
  }

  /**
   * @param {number} id An ID returned by a prior call to addListener.
   * @return {boolean} True iff the identified listener was found and removed.
   * @export
   */
  removeListener(id) {
    return this.router_.removeListener(id);
  }
};


goog.provide('mojo.test.remoteUnittest.mojom.LargeMessageTest');
goog.provide('mojo.test.remoteUnittest.mojom.LargeMessageTestReceiver');
goog.provide('mojo.test.remoteUnittest.mojom.LargeMessageTestCallbackRouter');
goog.provide('mojo.test.remoteUnittest.mojom.LargeMessageTestInterface');
goog.provide('mojo.test.remoteUnittest.mojom.LargeMessageTestRemote');
goog.provide('mojo.test.remoteUnittest.mojom.LargeMessageTestPendingReceiver');


/**
 * @implements {mojo.internal.interfaceSupport.PendingReceiver}
 * @export
 */
mojo.test.remoteUnittest.mojom.LargeMessageTestPendingReceiver = class {
  /**
   * @param {!MojoHandle|!mojo.internal.interfaceSupport.Endpoint} handle
   */
  constructor(handle) {
    /** @public {!mojo.internal.interfaceSupport.Endpoint} */
    this.handle = mojo.internal.interfaceSupport.getEndpointForReceiver(handle);
  }

  /** @param {string=} scope */
  bindInBrowser(scope = 'context') {
    mojo.internal.interfaceSupport.bind(
        this.handle,
        mojo.test.remoteUnittest.mojom.LargeMessageTest.$interfaceName,
        scope);
  }
};

/** @interface */
mojo.test.remoteUnittest.mojom.LargeMessageTestInterface = class {
  
  /**
   * @param { !Array<!number> } data
   * @return {!Promise<{
        dataSize: !bigint,
   *  }>}
   */

  processData(data) {}
  
  /**
   * @param { !Array<!number> } data
   * @return {!Promise<{
        dataSize: !bigint,
   *  }>}
   */

  processLotsOfData(data) {}
  
  /**
   * @param { !bigint } dataSize
   * @return {!Promise<{
        data: !Array<!number>,
   *  }>}
   */

  getLotsOfData(dataSize) {}
};

/**
 * @export
 * @implements { mojo.test.remoteUnittest.mojom.LargeMessageTestInterface }
 */
mojo.test.remoteUnittest.mojom.LargeMessageTestRemote = class {
  /** @param {MojoHandle|mojo.internal.interfaceSupport.Endpoint=} handle */
  constructor(handle = undefined) {
    /**
     * @private {!mojo.internal.interfaceSupport.InterfaceRemoteBase<!mojo.test.remoteUnittest.mojom.LargeMessageTestPendingReceiver>}
     */
    this.proxy =
        new mojo.internal.interfaceSupport.InterfaceRemoteBase(
          mojo.test.remoteUnittest.mojom.LargeMessageTestPendingReceiver,
          handle);

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceRemoteBaseWrapper<!mojo.test.remoteUnittest.mojom.LargeMessageTestPendingReceiver>}
     */
    this.$ = new mojo.internal.interfaceSupport.InterfaceRemoteBaseWrapper(this.proxy);

    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.proxy.getConnectionErrorEventRouter();
  }

  
  /**
   * @param { !Array<!number> } data
   * @return {!Promise<{
        dataSize: !bigint,
   *  }>}
   */

  processData(
      data) {
    return this.proxy.sendMessage(
        0,
        mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessData_ParamsSpec.$,
        mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessData_ResponseParamsSpec.$,
        [
          data
        ]);
  }

  
  /**
   * @param { !Array<!number> } data
   * @return {!Promise<{
        dataSize: !bigint,
   *  }>}
   */

  processLotsOfData(
      data) {
    return this.proxy.sendMessage(
        1,
        mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessLotsOfData_ParamsSpec.$,
        mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessLotsOfData_ResponseParamsSpec.$,
        [
          data
        ]);
  }

  
  /**
   * @param { !bigint } dataSize
   * @return {!Promise<{
        data: !Array<!number>,
   *  }>}
   */

  getLotsOfData(
      dataSize) {
    return this.proxy.sendMessage(
        2,
        mojo.test.remoteUnittest.mojom.LargeMessageTest_GetLotsOfData_ParamsSpec.$,
        mojo.test.remoteUnittest.mojom.LargeMessageTest_GetLotsOfData_ResponseParamsSpec.$,
        [
          dataSize
        ]);
  }
};

/**
 * An object which receives request messages for the LargeMessageTest
 * mojom interface. Must be constructed over an object which implements that
 * interface.
 *
 * @export
 */
mojo.test.remoteUnittest.mojom.LargeMessageTestReceiver = class {
  /**
   * @param {!mojo.test.remoteUnittest.mojom.LargeMessageTestInterface } impl
   */
  constructor(impl) {
    /** @private {!mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal<!mojo.test.remoteUnittest.mojom.LargeMessageTestRemote>} */
    this.helper_internal_ = new mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal(
        mojo.test.remoteUnittest.mojom.LargeMessageTestRemote);

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceReceiverHelper<!mojo.test.remoteUnittest.mojom.LargeMessageTestRemote>}
     */
    this.$ = new mojo.internal.interfaceSupport.InterfaceReceiverHelper(this.helper_internal_);


    this.helper_internal_.registerHandler(
        0,
        mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessData_ParamsSpec.$,
        mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessData_ResponseParamsSpec.$,
        impl.processData.bind(impl));
    this.helper_internal_.registerHandler(
        1,
        mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessLotsOfData_ParamsSpec.$,
        mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessLotsOfData_ResponseParamsSpec.$,
        impl.processLotsOfData.bind(impl));
    this.helper_internal_.registerHandler(
        2,
        mojo.test.remoteUnittest.mojom.LargeMessageTest_GetLotsOfData_ParamsSpec.$,
        mojo.test.remoteUnittest.mojom.LargeMessageTest_GetLotsOfData_ResponseParamsSpec.$,
        impl.getLotsOfData.bind(impl));
    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.helper_internal_.getConnectionErrorEventRouter();
  }
};

/**
 *  @export
 */
mojo.test.remoteUnittest.mojom.LargeMessageTest = class {
  /**
   * @return {!string}
   */
  static get $interfaceName() {
    return "mojo.test.remote_unittest.mojom.LargeMessageTest";
  }

  /**
   * Returns a remote for this interface which sends messages to the browser.
   * The browser must have an interface request binder registered for this
   * interface and accessible to the calling document's frame.
   *
   * @return {!mojo.test.remoteUnittest.mojom.LargeMessageTestRemote}
   * @export
   */
  static getRemote() {
    let remote = new mojo.test.remoteUnittest.mojom.LargeMessageTestRemote;
    remote.$.bindNewPipeAndPassReceiver().bindInBrowser();
    return remote;
  }
};


/**
 * An object which receives request messages for the LargeMessageTest
 * mojom interface and dispatches them as callbacks. One callback receiver exists
 * on this object for each message defined in the mojom interface, and each
 * receiver can have any number of listeners added to it.
 *
 * @export
 */
mojo.test.remoteUnittest.mojom.LargeMessageTestCallbackRouter = class {
  constructor() {
    this.helper_internal_ = new mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal(
      mojo.test.remoteUnittest.mojom.LargeMessageTestRemote);

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceReceiverHelper<!mojo.test.remoteUnittest.mojom.LargeMessageTestRemote>}
     */
    this.$ = new mojo.internal.interfaceSupport.InterfaceReceiverHelper(this.helper_internal_);

    this.router_ = new mojo.internal.interfaceSupport.CallbackRouter;

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.processData =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        0,
        mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessData_ParamsSpec.$,
        mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessData_ResponseParamsSpec.$,
        this.processData.createReceiverHandler(true /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.processLotsOfData =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1,
        mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessLotsOfData_ParamsSpec.$,
        mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessLotsOfData_ResponseParamsSpec.$,
        this.processLotsOfData.createReceiverHandler(true /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.getLotsOfData =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        2,
        mojo.test.remoteUnittest.mojom.LargeMessageTest_GetLotsOfData_ParamsSpec.$,
        mojo.test.remoteUnittest.mojom.LargeMessageTest_GetLotsOfData_ResponseParamsSpec.$,
        this.getLotsOfData.createReceiverHandler(true /* expectsResponse */));
    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.helper_internal_.getConnectionErrorEventRouter();
  }

  /**
   * @param {number} id An ID returned by a prior call to addListener.
   * @return {boolean} True iff the identified listener was found and removed.
   * @export
   */
  removeListener(id) {
    return this.router_.removeListener(id);
  }
};


goog.provide('mojo.test.remoteUnittest.mojom.SequenceChecker');
goog.provide('mojo.test.remoteUnittest.mojom.SequenceCheckerReceiver');
goog.provide('mojo.test.remoteUnittest.mojom.SequenceCheckerCallbackRouter');
goog.provide('mojo.test.remoteUnittest.mojom.SequenceCheckerInterface');
goog.provide('mojo.test.remoteUnittest.mojom.SequenceCheckerRemote');
goog.provide('mojo.test.remoteUnittest.mojom.SequenceCheckerPendingReceiver');


/**
 * @implements {mojo.internal.interfaceSupport.PendingReceiver}
 * @export
 */
mojo.test.remoteUnittest.mojom.SequenceCheckerPendingReceiver = class {
  /**
   * @param {!MojoHandle|!mojo.internal.interfaceSupport.Endpoint} handle
   */
  constructor(handle) {
    /** @public {!mojo.internal.interfaceSupport.Endpoint} */
    this.handle = mojo.internal.interfaceSupport.getEndpointForReceiver(handle);
  }

  /** @param {string=} scope */
  bindInBrowser(scope = 'context') {
    mojo.internal.interfaceSupport.bind(
        this.handle,
        mojo.test.remoteUnittest.mojom.SequenceChecker.$interfaceName,
        scope);
  }
};

/** @interface */
mojo.test.remoteUnittest.mojom.SequenceCheckerInterface = class {
  
  /**
   * @param { !Object } receiver
   */

  bind(receiver) {}
  
  /**
   * @param { !Object } client
   */

  addClient(client) {}
  
  /**
   * @param { !number } n
   */

  check(n) {}
  
  /**
   * @return {!Promise<{
        n: !number,
   *  }>}
   */

  getNextExpectedValue() {}
  
  /**
   * @return {!Promise}
   */

  quit() {}
};

/**
 * @export
 * @implements { mojo.test.remoteUnittest.mojom.SequenceCheckerInterface }
 */
mojo.test.remoteUnittest.mojom.SequenceCheckerRemote = class {
  /** @param {MojoHandle|mojo.internal.interfaceSupport.Endpoint=} handle */
  constructor(handle = undefined) {
    /**
     * @private {!mojo.internal.interfaceSupport.InterfaceRemoteBase<!mojo.test.remoteUnittest.mojom.SequenceCheckerPendingReceiver>}
     */
    this.proxy =
        new mojo.internal.interfaceSupport.InterfaceRemoteBase(
          mojo.test.remoteUnittest.mojom.SequenceCheckerPendingReceiver,
          handle);

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceRemoteBaseWrapper<!mojo.test.remoteUnittest.mojom.SequenceCheckerPendingReceiver>}
     */
    this.$ = new mojo.internal.interfaceSupport.InterfaceRemoteBaseWrapper(this.proxy);

    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.proxy.getConnectionErrorEventRouter();
  }

  
  /**
   * @param { !Object } receiver
   */

  bind(
      receiver) {
    this.proxy.sendMessage(
        0,
        mojo.test.remoteUnittest.mojom.SequenceChecker_Bind_ParamsSpec.$,
        null,
        [
          receiver
        ]);
  }

  
  /**
   * @param { !Object } client
   */

  addClient(
      client) {
    this.proxy.sendMessage(
        1,
        mojo.test.remoteUnittest.mojom.SequenceChecker_AddClient_ParamsSpec.$,
        null,
        [
          client
        ]);
  }

  
  /**
   * @param { !number } n
   */

  check(
      n) {
    this.proxy.sendMessage(
        2,
        mojo.test.remoteUnittest.mojom.SequenceChecker_Check_ParamsSpec.$,
        null,
        [
          n
        ]);
  }

  
  /**
   * @return {!Promise<{
        n: !number,
   *  }>}
   */

  getNextExpectedValue() {
    return this.proxy.sendMessage(
        3,
        mojo.test.remoteUnittest.mojom.SequenceChecker_GetNextExpectedValue_ParamsSpec.$,
        mojo.test.remoteUnittest.mojom.SequenceChecker_GetNextExpectedValue_ResponseParamsSpec.$,
        [
        ]);
  }

  
  /**
   * @return {!Promise}
   */

  quit() {
    return this.proxy.sendMessage(
        4,
        mojo.test.remoteUnittest.mojom.SequenceChecker_Quit_ParamsSpec.$,
        mojo.test.remoteUnittest.mojom.SequenceChecker_Quit_ResponseParamsSpec.$,
        [
        ]);
  }
};

/**
 * An object which receives request messages for the SequenceChecker
 * mojom interface. Must be constructed over an object which implements that
 * interface.
 *
 * @export
 */
mojo.test.remoteUnittest.mojom.SequenceCheckerReceiver = class {
  /**
   * @param {!mojo.test.remoteUnittest.mojom.SequenceCheckerInterface } impl
   */
  constructor(impl) {
    /** @private {!mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal<!mojo.test.remoteUnittest.mojom.SequenceCheckerRemote>} */
    this.helper_internal_ = new mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal(
        mojo.test.remoteUnittest.mojom.SequenceCheckerRemote);

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceReceiverHelper<!mojo.test.remoteUnittest.mojom.SequenceCheckerRemote>}
     */
    this.$ = new mojo.internal.interfaceSupport.InterfaceReceiverHelper(this.helper_internal_);


    this.helper_internal_.registerHandler(
        0,
        mojo.test.remoteUnittest.mojom.SequenceChecker_Bind_ParamsSpec.$,
        null,
        impl.bind.bind(impl));
    this.helper_internal_.registerHandler(
        1,
        mojo.test.remoteUnittest.mojom.SequenceChecker_AddClient_ParamsSpec.$,
        null,
        impl.addClient.bind(impl));
    this.helper_internal_.registerHandler(
        2,
        mojo.test.remoteUnittest.mojom.SequenceChecker_Check_ParamsSpec.$,
        null,
        impl.check.bind(impl));
    this.helper_internal_.registerHandler(
        3,
        mojo.test.remoteUnittest.mojom.SequenceChecker_GetNextExpectedValue_ParamsSpec.$,
        mojo.test.remoteUnittest.mojom.SequenceChecker_GetNextExpectedValue_ResponseParamsSpec.$,
        impl.getNextExpectedValue.bind(impl));
    this.helper_internal_.registerHandler(
        4,
        mojo.test.remoteUnittest.mojom.SequenceChecker_Quit_ParamsSpec.$,
        mojo.test.remoteUnittest.mojom.SequenceChecker_Quit_ResponseParamsSpec.$,
        impl.quit.bind(impl));
    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.helper_internal_.getConnectionErrorEventRouter();
  }
};

/**
 *  @export
 */
mojo.test.remoteUnittest.mojom.SequenceChecker = class {
  /**
   * @return {!string}
   */
  static get $interfaceName() {
    return "mojo.test.remote_unittest.mojom.SequenceChecker";
  }

  /**
   * Returns a remote for this interface which sends messages to the browser.
   * The browser must have an interface request binder registered for this
   * interface and accessible to the calling document's frame.
   *
   * @return {!mojo.test.remoteUnittest.mojom.SequenceCheckerRemote}
   * @export
   */
  static getRemote() {
    let remote = new mojo.test.remoteUnittest.mojom.SequenceCheckerRemote;
    remote.$.bindNewPipeAndPassReceiver().bindInBrowser();
    return remote;
  }
};


/**
 * An object which receives request messages for the SequenceChecker
 * mojom interface and dispatches them as callbacks. One callback receiver exists
 * on this object for each message defined in the mojom interface, and each
 * receiver can have any number of listeners added to it.
 *
 * @export
 */
mojo.test.remoteUnittest.mojom.SequenceCheckerCallbackRouter = class {
  constructor() {
    this.helper_internal_ = new mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal(
      mojo.test.remoteUnittest.mojom.SequenceCheckerRemote);

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceReceiverHelper<!mojo.test.remoteUnittest.mojom.SequenceCheckerRemote>}
     */
    this.$ = new mojo.internal.interfaceSupport.InterfaceReceiverHelper(this.helper_internal_);

    this.router_ = new mojo.internal.interfaceSupport.CallbackRouter;

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.bind =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        0,
        mojo.test.remoteUnittest.mojom.SequenceChecker_Bind_ParamsSpec.$,
        null,
        this.bind.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.addClient =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1,
        mojo.test.remoteUnittest.mojom.SequenceChecker_AddClient_ParamsSpec.$,
        null,
        this.addClient.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.check =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        2,
        mojo.test.remoteUnittest.mojom.SequenceChecker_Check_ParamsSpec.$,
        null,
        this.check.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.getNextExpectedValue =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        3,
        mojo.test.remoteUnittest.mojom.SequenceChecker_GetNextExpectedValue_ParamsSpec.$,
        mojo.test.remoteUnittest.mojom.SequenceChecker_GetNextExpectedValue_ResponseParamsSpec.$,
        this.getNextExpectedValue.createReceiverHandler(true /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.quit =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        4,
        mojo.test.remoteUnittest.mojom.SequenceChecker_Quit_ParamsSpec.$,
        mojo.test.remoteUnittest.mojom.SequenceChecker_Quit_ResponseParamsSpec.$,
        this.quit.createReceiverHandler(true /* expectsResponse */));
    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.helper_internal_.getConnectionErrorEventRouter();
  }

  /**
   * @param {number} id An ID returned by a prior call to addListener.
   * @return {boolean} True iff the identified listener was found and removed.
   * @export
   */
  removeListener(id) {
    return this.router_.removeListener(id);
  }
};


goog.provide('mojo.test.remoteUnittest.mojom.SequenceCheckerClient');
goog.provide('mojo.test.remoteUnittest.mojom.SequenceCheckerClientReceiver');
goog.provide('mojo.test.remoteUnittest.mojom.SequenceCheckerClientCallbackRouter');
goog.provide('mojo.test.remoteUnittest.mojom.SequenceCheckerClientInterface');
goog.provide('mojo.test.remoteUnittest.mojom.SequenceCheckerClientRemote');
goog.provide('mojo.test.remoteUnittest.mojom.SequenceCheckerClientPendingReceiver');


/**
 * @implements {mojo.internal.interfaceSupport.PendingReceiver}
 * @export
 */
mojo.test.remoteUnittest.mojom.SequenceCheckerClientPendingReceiver = class {
  /**
   * @param {!MojoHandle|!mojo.internal.interfaceSupport.Endpoint} handle
   */
  constructor(handle) {
    /** @public {!mojo.internal.interfaceSupport.Endpoint} */
    this.handle = mojo.internal.interfaceSupport.getEndpointForReceiver(handle);
  }

  /** @param {string=} scope */
  bindInBrowser(scope = 'context') {
    mojo.internal.interfaceSupport.bind(
        this.handle,
        mojo.test.remoteUnittest.mojom.SequenceCheckerClient.$interfaceName,
        scope);
  }
};

/** @interface */
mojo.test.remoteUnittest.mojom.SequenceCheckerClientInterface = class {
  
  /**
   * @param { !number } n
   */

  onNextExpectedValueQueried(n) {}
  
  /**
   */

  onQuit() {}
};

/**
 * @export
 * @implements { mojo.test.remoteUnittest.mojom.SequenceCheckerClientInterface }
 */
mojo.test.remoteUnittest.mojom.SequenceCheckerClientRemote = class {
  /** @param {MojoHandle|mojo.internal.interfaceSupport.Endpoint=} handle */
  constructor(handle = undefined) {
    /**
     * @private {!mojo.internal.interfaceSupport.InterfaceRemoteBase<!mojo.test.remoteUnittest.mojom.SequenceCheckerClientPendingReceiver>}
     */
    this.proxy =
        new mojo.internal.interfaceSupport.InterfaceRemoteBase(
          mojo.test.remoteUnittest.mojom.SequenceCheckerClientPendingReceiver,
          handle);

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceRemoteBaseWrapper<!mojo.test.remoteUnittest.mojom.SequenceCheckerClientPendingReceiver>}
     */
    this.$ = new mojo.internal.interfaceSupport.InterfaceRemoteBaseWrapper(this.proxy);

    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.proxy.getConnectionErrorEventRouter();
  }

  
  /**
   * @param { !number } n
   */

  onNextExpectedValueQueried(
      n) {
    this.proxy.sendMessage(
        0,
        mojo.test.remoteUnittest.mojom.SequenceCheckerClient_OnNextExpectedValueQueried_ParamsSpec.$,
        null,
        [
          n
        ]);
  }

  
  /**
   */

  onQuit() {
    this.proxy.sendMessage(
        1,
        mojo.test.remoteUnittest.mojom.SequenceCheckerClient_OnQuit_ParamsSpec.$,
        null,
        [
        ]);
  }
};

/**
 * An object which receives request messages for the SequenceCheckerClient
 * mojom interface. Must be constructed over an object which implements that
 * interface.
 *
 * @export
 */
mojo.test.remoteUnittest.mojom.SequenceCheckerClientReceiver = class {
  /**
   * @param {!mojo.test.remoteUnittest.mojom.SequenceCheckerClientInterface } impl
   */
  constructor(impl) {
    /** @private {!mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal<!mojo.test.remoteUnittest.mojom.SequenceCheckerClientRemote>} */
    this.helper_internal_ = new mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal(
        mojo.test.remoteUnittest.mojom.SequenceCheckerClientRemote);

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceReceiverHelper<!mojo.test.remoteUnittest.mojom.SequenceCheckerClientRemote>}
     */
    this.$ = new mojo.internal.interfaceSupport.InterfaceReceiverHelper(this.helper_internal_);


    this.helper_internal_.registerHandler(
        0,
        mojo.test.remoteUnittest.mojom.SequenceCheckerClient_OnNextExpectedValueQueried_ParamsSpec.$,
        null,
        impl.onNextExpectedValueQueried.bind(impl));
    this.helper_internal_.registerHandler(
        1,
        mojo.test.remoteUnittest.mojom.SequenceCheckerClient_OnQuit_ParamsSpec.$,
        null,
        impl.onQuit.bind(impl));
    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.helper_internal_.getConnectionErrorEventRouter();
  }
};

/**
 *  @export
 */
mojo.test.remoteUnittest.mojom.SequenceCheckerClient = class {
  /**
   * @return {!string}
   */
  static get $interfaceName() {
    return "mojo.test.remote_unittest.mojom.SequenceCheckerClient";
  }

  /**
   * Returns a remote for this interface which sends messages to the browser.
   * The browser must have an interface request binder registered for this
   * interface and accessible to the calling document's frame.
   *
   * @return {!mojo.test.remoteUnittest.mojom.SequenceCheckerClientRemote}
   * @export
   */
  static getRemote() {
    let remote = new mojo.test.remoteUnittest.mojom.SequenceCheckerClientRemote;
    remote.$.bindNewPipeAndPassReceiver().bindInBrowser();
    return remote;
  }
};


/**
 * An object which receives request messages for the SequenceCheckerClient
 * mojom interface and dispatches them as callbacks. One callback receiver exists
 * on this object for each message defined in the mojom interface, and each
 * receiver can have any number of listeners added to it.
 *
 * @export
 */
mojo.test.remoteUnittest.mojom.SequenceCheckerClientCallbackRouter = class {
  constructor() {
    this.helper_internal_ = new mojo.internal.interfaceSupport.InterfaceReceiverHelperInternal(
      mojo.test.remoteUnittest.mojom.SequenceCheckerClientRemote);

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceReceiverHelper<!mojo.test.remoteUnittest.mojom.SequenceCheckerClientRemote>}
     */
    this.$ = new mojo.internal.interfaceSupport.InterfaceReceiverHelper(this.helper_internal_);

    this.router_ = new mojo.internal.interfaceSupport.CallbackRouter;

    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.onNextExpectedValueQueried =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        0,
        mojo.test.remoteUnittest.mojom.SequenceCheckerClient_OnNextExpectedValueQueried_ParamsSpec.$,
        null,
        this.onNextExpectedValueQueried.createReceiverHandler(false /* expectsResponse */));
    /**
     * @public {!mojo.internal.interfaceSupport.InterfaceCallbackReceiver}
     */
    this.onQuit =
        new mojo.internal.interfaceSupport.InterfaceCallbackReceiver(
            this.router_);

    this.helper_internal_.registerHandler(
        1,
        mojo.test.remoteUnittest.mojom.SequenceCheckerClient_OnQuit_ParamsSpec.$,
        null,
        this.onQuit.createReceiverHandler(false /* expectsResponse */));
    /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */
    this.onConnectionError = this.helper_internal_.getConnectionErrorEventRouter();
  }

  /**
   * @param {number} id An ID returned by a prior call to addListener.
   * @return {boolean} True iff the identified listener was found and removed.
   * @export
   */
  removeListener(id) {
    return this.router_.removeListener(id);
  }
};


goog.provide('mojo.test.remoteUnittest.mojom.SharedRemoteSyncTest_Fetch_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
mojo.test.remoteUnittest.mojom.SharedRemoteSyncTest_Fetch_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('mojo.test.remoteUnittest.mojom.SharedRemoteSyncTest_Fetch_ResponseParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
mojo.test.remoteUnittest.mojom.SharedRemoteSyncTest_Fetch_ResponseParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessData_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessData_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessData_ResponseParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessData_ResponseParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessLotsOfData_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessLotsOfData_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessLotsOfData_ResponseParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessLotsOfData_ResponseParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('mojo.test.remoteUnittest.mojom.LargeMessageTest_GetLotsOfData_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
mojo.test.remoteUnittest.mojom.LargeMessageTest_GetLotsOfData_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('mojo.test.remoteUnittest.mojom.LargeMessageTest_GetLotsOfData_ResponseParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
mojo.test.remoteUnittest.mojom.LargeMessageTest_GetLotsOfData_ResponseParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('mojo.test.remoteUnittest.mojom.SequenceChecker_Bind_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
mojo.test.remoteUnittest.mojom.SequenceChecker_Bind_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('mojo.test.remoteUnittest.mojom.SequenceChecker_AddClient_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
mojo.test.remoteUnittest.mojom.SequenceChecker_AddClient_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('mojo.test.remoteUnittest.mojom.SequenceChecker_Check_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
mojo.test.remoteUnittest.mojom.SequenceChecker_Check_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('mojo.test.remoteUnittest.mojom.SequenceChecker_GetNextExpectedValue_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
mojo.test.remoteUnittest.mojom.SequenceChecker_GetNextExpectedValue_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('mojo.test.remoteUnittest.mojom.SequenceChecker_GetNextExpectedValue_ResponseParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
mojo.test.remoteUnittest.mojom.SequenceChecker_GetNextExpectedValue_ResponseParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('mojo.test.remoteUnittest.mojom.SequenceChecker_Quit_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
mojo.test.remoteUnittest.mojom.SequenceChecker_Quit_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('mojo.test.remoteUnittest.mojom.SequenceChecker_Quit_ResponseParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
mojo.test.remoteUnittest.mojom.SequenceChecker_Quit_ResponseParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('mojo.test.remoteUnittest.mojom.SequenceCheckerClient_OnNextExpectedValueQueried_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
mojo.test.remoteUnittest.mojom.SequenceCheckerClient_OnNextExpectedValueQueried_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };

goog.provide('mojo.test.remoteUnittest.mojom.SequenceCheckerClient_OnQuit_ParamsSpec');
/**
 * @const { {$:!mojo.internal.MojomType}}
 * @export
 */
mojo.test.remoteUnittest.mojom.SequenceCheckerClient_OnQuit_ParamsSpec =
    { $: /** @type {!mojo.internal.MojomType} */ ({}) };




mojo.internal.Struct(
    mojo.test.remoteUnittest.mojom.SharedRemoteSyncTest_Fetch_ParamsSpec.$,
    'SharedRemoteSyncTest_Fetch_Params',
    [
    ],
    [[0, 8],]);



goog.provide('mojo.test.remoteUnittest.mojom.SharedRemoteSyncTest_Fetch_Params');

/** @record */
mojo.test.remoteUnittest.mojom.SharedRemoteSyncTest_Fetch_Params = class {
  constructor() {
  }
};



mojo.internal.Struct(
    mojo.test.remoteUnittest.mojom.SharedRemoteSyncTest_Fetch_ResponseParamsSpec.$,
    'SharedRemoteSyncTest_Fetch_ResponseParams',
    [
      mojo.internal.StructField(
        'value', 0,
        0,
        mojo.internal.Int32,
        0,
        false, /* nullable */
        0 /* minVersion */,
      ),
    ],
    [[0, 16],]);



goog.provide('mojo.test.remoteUnittest.mojom.SharedRemoteSyncTest_Fetch_ResponseParams');

/** @record */
mojo.test.remoteUnittest.mojom.SharedRemoteSyncTest_Fetch_ResponseParams = class {
  constructor() {
    /** @export { !number } */
    this.value;
  }
};



mojo.internal.Struct(
    mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessData_ParamsSpec.$,
    'LargeMessageTest_ProcessData_Params',
    [
      mojo.internal.StructField(
        'data', 0,
        0,
        mojo.internal.Array(mojo.internal.Uint8, false),
        null,
        false, /* nullable */
        0 /* minVersion */,
      ),
    ],
    [[0, 16],]);



goog.provide('mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessData_Params');

/** @record */
mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessData_Params = class {
  constructor() {
    /** @export { !Array<!number> } */
    this.data;
  }
};



mojo.internal.Struct(
    mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessData_ResponseParamsSpec.$,
    'LargeMessageTest_ProcessData_ResponseParams',
    [
      mojo.internal.StructField(
        'dataSize', 0,
        0,
        mojo.internal.Uint64,
        BigInt(0),
        false, /* nullable */
        0 /* minVersion */,
      ),
    ],
    [[0, 16],]);



goog.provide('mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessData_ResponseParams');

/** @record */
mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessData_ResponseParams = class {
  constructor() {
    /** @export { !bigint } */
    this.dataSize;
  }
};



mojo.internal.Struct(
    mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessLotsOfData_ParamsSpec.$,
    'LargeMessageTest_ProcessLotsOfData_Params',
    [
      mojo.internal.StructField(
        'data', 0,
        0,
        mojo.internal.Array(mojo.internal.Uint8, false),
        null,
        false, /* nullable */
        0 /* minVersion */,
      ),
    ],
    [[0, 16],]);



goog.provide('mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessLotsOfData_Params');

/** @record */
mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessLotsOfData_Params = class {
  constructor() {
    /** @export { !Array<!number> } */
    this.data;
  }
};



mojo.internal.Struct(
    mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessLotsOfData_ResponseParamsSpec.$,
    'LargeMessageTest_ProcessLotsOfData_ResponseParams',
    [
      mojo.internal.StructField(
        'dataSize', 0,
        0,
        mojo.internal.Uint64,
        BigInt(0),
        false, /* nullable */
        0 /* minVersion */,
      ),
    ],
    [[0, 16],]);



goog.provide('mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessLotsOfData_ResponseParams');

/** @record */
mojo.test.remoteUnittest.mojom.LargeMessageTest_ProcessLotsOfData_ResponseParams = class {
  constructor() {
    /** @export { !bigint } */
    this.dataSize;
  }
};



mojo.internal.Struct(
    mojo.test.remoteUnittest.mojom.LargeMessageTest_GetLotsOfData_ParamsSpec.$,
    'LargeMessageTest_GetLotsOfData_Params',
    [
      mojo.internal.StructField(
        'dataSize', 0,
        0,
        mojo.internal.Uint64,
        BigInt(0),
        false, /* nullable */
        0 /* minVersion */,
      ),
    ],
    [[0, 16],]);



goog.provide('mojo.test.remoteUnittest.mojom.LargeMessageTest_GetLotsOfData_Params');

/** @record */
mojo.test.remoteUnittest.mojom.LargeMessageTest_GetLotsOfData_Params = class {
  constructor() {
    /** @export { !bigint } */
    this.dataSize;
  }
};



mojo.internal.Struct(
    mojo.test.remoteUnittest.mojom.LargeMessageTest_GetLotsOfData_ResponseParamsSpec.$,
    'LargeMessageTest_GetLotsOfData_ResponseParams',
    [
      mojo.internal.StructField(
        'data', 0,
        0,
        mojo.internal.Array(mojo.internal.Uint8, false),
        null,
        false, /* nullable */
        0 /* minVersion */,
      ),
    ],
    [[0, 16],]);



goog.provide('mojo.test.remoteUnittest.mojom.LargeMessageTest_GetLotsOfData_ResponseParams');

/** @record */
mojo.test.remoteUnittest.mojom.LargeMessageTest_GetLotsOfData_ResponseParams = class {
  constructor() {
    /** @export { !Array<!number> } */
    this.data;
  }
};



mojo.internal.Struct(
    mojo.test.remoteUnittest.mojom.SequenceChecker_Bind_ParamsSpec.$,
    'SequenceChecker_Bind_Params',
    [
      mojo.internal.StructField(
        'receiver', 0,
        0,
        mojo.internal.AssociatedInterfaceRequest(mojo.test.remoteUnittest.mojom.SequenceCheckerPendingReceiver),
        null,
        false, /* nullable */
        0 /* minVersion */,
      ),
    ],
    [[0, 16],]);



goog.provide('mojo.test.remoteUnittest.mojom.SequenceChecker_Bind_Params');

/** @record */
mojo.test.remoteUnittest.mojom.SequenceChecker_Bind_Params = class {
  constructor() {
    /** @export { !Object } */
    this.receiver;
  }
};



mojo.internal.Struct(
    mojo.test.remoteUnittest.mojom.SequenceChecker_AddClient_ParamsSpec.$,
    'SequenceChecker_AddClient_Params',
    [
      mojo.internal.StructField(
        'client', 0,
        0,
        mojo.internal.AssociatedInterfaceProxy(mojo.test.remoteUnittest.mojom.SequenceCheckerClientRemote),
        null,
        false, /* nullable */
        0 /* minVersion */,
      ),
    ],
    [[0, 16],]);



goog.provide('mojo.test.remoteUnittest.mojom.SequenceChecker_AddClient_Params');

/** @record */
mojo.test.remoteUnittest.mojom.SequenceChecker_AddClient_Params = class {
  constructor() {
    /** @export { !Object } */
    this.client;
  }
};



mojo.internal.Struct(
    mojo.test.remoteUnittest.mojom.SequenceChecker_Check_ParamsSpec.$,
    'SequenceChecker_Check_Params',
    [
      mojo.internal.StructField(
        'n', 0,
        0,
        mojo.internal.Int32,
        0,
        false, /* nullable */
        0 /* minVersion */,
      ),
    ],
    [[0, 16],]);



goog.provide('mojo.test.remoteUnittest.mojom.SequenceChecker_Check_Params');

/** @record */
mojo.test.remoteUnittest.mojom.SequenceChecker_Check_Params = class {
  constructor() {
    /** @export { !number } */
    this.n;
  }
};



mojo.internal.Struct(
    mojo.test.remoteUnittest.mojom.SequenceChecker_GetNextExpectedValue_ParamsSpec.$,
    'SequenceChecker_GetNextExpectedValue_Params',
    [
    ],
    [[0, 8],]);



goog.provide('mojo.test.remoteUnittest.mojom.SequenceChecker_GetNextExpectedValue_Params');

/** @record */
mojo.test.remoteUnittest.mojom.SequenceChecker_GetNextExpectedValue_Params = class {
  constructor() {
  }
};



mojo.internal.Struct(
    mojo.test.remoteUnittest.mojom.SequenceChecker_GetNextExpectedValue_ResponseParamsSpec.$,
    'SequenceChecker_GetNextExpectedValue_ResponseParams',
    [
      mojo.internal.StructField(
        'n', 0,
        0,
        mojo.internal.Int32,
        0,
        false, /* nullable */
        0 /* minVersion */,
      ),
    ],
    [[0, 16],]);



goog.provide('mojo.test.remoteUnittest.mojom.SequenceChecker_GetNextExpectedValue_ResponseParams');

/** @record */
mojo.test.remoteUnittest.mojom.SequenceChecker_GetNextExpectedValue_ResponseParams = class {
  constructor() {
    /** @export { !number } */
    this.n;
  }
};



mojo.internal.Struct(
    mojo.test.remoteUnittest.mojom.SequenceChecker_Quit_ParamsSpec.$,
    'SequenceChecker_Quit_Params',
    [
    ],
    [[0, 8],]);



goog.provide('mojo.test.remoteUnittest.mojom.SequenceChecker_Quit_Params');

/** @record */
mojo.test.remoteUnittest.mojom.SequenceChecker_Quit_Params = class {
  constructor() {
  }
};



mojo.internal.Struct(
    mojo.test.remoteUnittest.mojom.SequenceChecker_Quit_ResponseParamsSpec.$,
    'SequenceChecker_Quit_ResponseParams',
    [
    ],
    [[0, 8],]);



goog.provide('mojo.test.remoteUnittest.mojom.SequenceChecker_Quit_ResponseParams');

/** @record */
mojo.test.remoteUnittest.mojom.SequenceChecker_Quit_ResponseParams = class {
  constructor() {
  }
};



mojo.internal.Struct(
    mojo.test.remoteUnittest.mojom.SequenceCheckerClient_OnNextExpectedValueQueried_ParamsSpec.$,
    'SequenceCheckerClient_OnNextExpectedValueQueried_Params',
    [
      mojo.internal.StructField(
        'n', 0,
        0,
        mojo.internal.Int32,
        0,
        false, /* nullable */
        0 /* minVersion */,
      ),
    ],
    [[0, 16],]);



goog.provide('mojo.test.remoteUnittest.mojom.SequenceCheckerClient_OnNextExpectedValueQueried_Params');

/** @record */
mojo.test.remoteUnittest.mojom.SequenceCheckerClient_OnNextExpectedValueQueried_Params = class {
  constructor() {
    /** @export { !number } */
    this.n;
  }
};



mojo.internal.Struct(
    mojo.test.remoteUnittest.mojom.SequenceCheckerClient_OnQuit_ParamsSpec.$,
    'SequenceCheckerClient_OnQuit_Params',
    [
    ],
    [[0, 8],]);



goog.provide('mojo.test.remoteUnittest.mojom.SequenceCheckerClient_OnQuit_Params');

/** @record */
mojo.test.remoteUnittest.mojom.SequenceCheckerClient_OnQuit_Params = class {
  constructor() {
  }
};

