// Mocks generated by Mockito 5.4.4 from annotations
// in coverage/test/collect_coverage_mock_test.dart.
// Do not manually edit this file.

// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'dart:async' as _i3;

import 'package:mockito/mockito.dart' as _i1;
import 'package:mockito/src/dummies.dart' as _i4;
import 'package:vm_service/src/vm_service.dart' as _i2;

// ignore_for_file: type=lint
// ignore_for_file: avoid_redundant_argument_values
// ignore_for_file: avoid_setters_without_getters
// ignore_for_file: comment_references
// ignore_for_file: deprecated_member_use
// ignore_for_file: deprecated_member_use_from_same_package
// ignore_for_file: implementation_imports
// ignore_for_file: invalid_use_of_visible_for_testing_member
// ignore_for_file: prefer_const_constructors
// ignore_for_file: unnecessary_parenthesis
// ignore_for_file: camel_case_types
// ignore_for_file: subtype_of_sealed_class

class _FakeBreakpoint_0 extends _i1.SmartFake implements _i2.Breakpoint {
  _FakeBreakpoint_0(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeSuccess_1 extends _i1.SmartFake implements _i2.Success {
  _FakeSuccess_1(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeIdZone_2 extends _i1.SmartFake implements _i2.IdZone {
  _FakeIdZone_2(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeResponse_3 extends _i1.SmartFake implements _i2.Response {
  _FakeResponse_3(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeAllocationProfile_4 extends _i1.SmartFake
    implements _i2.AllocationProfile {
  _FakeAllocationProfile_4(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeCpuSamples_5 extends _i1.SmartFake implements _i2.CpuSamples {
  _FakeCpuSamples_5(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeClassList_6 extends _i1.SmartFake implements _i2.ClassList {
  _FakeClassList_6(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeFlagList_7 extends _i1.SmartFake implements _i2.FlagList {
  _FakeFlagList_7(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeInboundReferences_8 extends _i1.SmartFake
    implements _i2.InboundReferences {
  _FakeInboundReferences_8(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeInstanceSet_9 extends _i1.SmartFake implements _i2.InstanceSet {
  _FakeInstanceSet_9(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeInstanceRef_10 extends _i1.SmartFake implements _i2.InstanceRef {
  _FakeInstanceRef_10(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeIsolate_11 extends _i1.SmartFake implements _i2.Isolate {
  _FakeIsolate_11(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeIsolateGroup_12 extends _i1.SmartFake implements _i2.IsolateGroup {
  _FakeIsolateGroup_12(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeEvent_13 extends _i1.SmartFake implements _i2.Event {
  _FakeEvent_13(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeMemoryUsage_14 extends _i1.SmartFake implements _i2.MemoryUsage {
  _FakeMemoryUsage_14(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeScriptList_15 extends _i1.SmartFake implements _i2.ScriptList {
  _FakeScriptList_15(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeObj_16 extends _i1.SmartFake implements _i2.Obj {
  _FakeObj_16(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePerfettoCpuSamples_17 extends _i1.SmartFake
    implements _i2.PerfettoCpuSamples {
  _FakePerfettoCpuSamples_17(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePerfettoTimeline_18 extends _i1.SmartFake
    implements _i2.PerfettoTimeline {
  _FakePerfettoTimeline_18(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakePortList_19 extends _i1.SmartFake implements _i2.PortList {
  _FakePortList_19(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeRetainingPath_20 extends _i1.SmartFake implements _i2.RetainingPath {
  _FakeRetainingPath_20(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeProcessMemoryUsage_21 extends _i1.SmartFake
    implements _i2.ProcessMemoryUsage {
  _FakeProcessMemoryUsage_21(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeStack_22 extends _i1.SmartFake implements _i2.Stack {
  _FakeStack_22(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeProtocolList_23 extends _i1.SmartFake implements _i2.ProtocolList {
  _FakeProtocolList_23(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeSourceReport_24 extends _i1.SmartFake implements _i2.SourceReport {
  _FakeSourceReport_24(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeVersion_25 extends _i1.SmartFake implements _i2.Version {
  _FakeVersion_25(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeVM_26 extends _i1.SmartFake implements _i2.VM {
  _FakeVM_26(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeTimeline_27 extends _i1.SmartFake implements _i2.Timeline {
  _FakeTimeline_27(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeTimelineFlags_28 extends _i1.SmartFake implements _i2.TimelineFlags {
  _FakeTimelineFlags_28(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeTimestamp_29 extends _i1.SmartFake implements _i2.Timestamp {
  _FakeTimestamp_29(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeUriList_30 extends _i1.SmartFake implements _i2.UriList {
  _FakeUriList_30(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeReloadReport_31 extends _i1.SmartFake implements _i2.ReloadReport {
  _FakeReloadReport_31(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

class _FakeFuture_32<T1> extends _i1.SmartFake implements _i3.Future<T1> {
  _FakeFuture_32(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

/// A class which mocks [VmService].
///
/// See the documentation for Mockito's code generation for more information.
class MockVmService extends _i1.Mock implements _i2.VmService {
  MockVmService() {
    _i1.throwOnMissingStub(this);
  }

  @override
  _i3.Stream<String> get onSend => (super.noSuchMethod(
        Invocation.getter(#onSend),
        returnValue: _i3.Stream<String>.empty(),
      ) as _i3.Stream<String>);

  @override
  _i3.Stream<String> get onReceive => (super.noSuchMethod(
        Invocation.getter(#onReceive),
        returnValue: _i3.Stream<String>.empty(),
      ) as _i3.Stream<String>);

  @override
  _i3.Future<void> get onDone => (super.noSuchMethod(
        Invocation.getter(#onDone),
        returnValue: _i3.Future<void>.value(),
      ) as _i3.Future<void>);

  @override
  _i3.Stream<_i2.Event> get onVMEvent => (super.noSuchMethod(
        Invocation.getter(#onVMEvent),
        returnValue: _i3.Stream<_i2.Event>.empty(),
      ) as _i3.Stream<_i2.Event>);

  @override
  _i3.Stream<_i2.Event> get onIsolateEvent => (super.noSuchMethod(
        Invocation.getter(#onIsolateEvent),
        returnValue: _i3.Stream<_i2.Event>.empty(),
      ) as _i3.Stream<_i2.Event>);

  @override
  _i3.Stream<_i2.Event> get onDebugEvent => (super.noSuchMethod(
        Invocation.getter(#onDebugEvent),
        returnValue: _i3.Stream<_i2.Event>.empty(),
      ) as _i3.Stream<_i2.Event>);

  @override
  _i3.Stream<_i2.Event> get onProfilerEvent => (super.noSuchMethod(
        Invocation.getter(#onProfilerEvent),
        returnValue: _i3.Stream<_i2.Event>.empty(),
      ) as _i3.Stream<_i2.Event>);

  @override
  _i3.Stream<_i2.Event> get onGCEvent => (super.noSuchMethod(
        Invocation.getter(#onGCEvent),
        returnValue: _i3.Stream<_i2.Event>.empty(),
      ) as _i3.Stream<_i2.Event>);

  @override
  _i3.Stream<_i2.Event> get onExtensionEvent => (super.noSuchMethod(
        Invocation.getter(#onExtensionEvent),
        returnValue: _i3.Stream<_i2.Event>.empty(),
      ) as _i3.Stream<_i2.Event>);

  @override
  _i3.Stream<_i2.Event> get onTimelineEvent => (super.noSuchMethod(
        Invocation.getter(#onTimelineEvent),
        returnValue: _i3.Stream<_i2.Event>.empty(),
      ) as _i3.Stream<_i2.Event>);

  @override
  _i3.Stream<_i2.Event> get onLoggingEvent => (super.noSuchMethod(
        Invocation.getter(#onLoggingEvent),
        returnValue: _i3.Stream<_i2.Event>.empty(),
      ) as _i3.Stream<_i2.Event>);

  @override
  _i3.Stream<_i2.Event> get onServiceEvent => (super.noSuchMethod(
        Invocation.getter(#onServiceEvent),
        returnValue: _i3.Stream<_i2.Event>.empty(),
      ) as _i3.Stream<_i2.Event>);

  @override
  _i3.Stream<_i2.Event> get onHeapSnapshotEvent => (super.noSuchMethod(
        Invocation.getter(#onHeapSnapshotEvent),
        returnValue: _i3.Stream<_i2.Event>.empty(),
      ) as _i3.Stream<_i2.Event>);

  @override
  _i3.Stream<_i2.Event> get onStdoutEvent => (super.noSuchMethod(
        Invocation.getter(#onStdoutEvent),
        returnValue: _i3.Stream<_i2.Event>.empty(),
      ) as _i3.Stream<_i2.Event>);

  @override
  _i3.Stream<_i2.Event> get onStderrEvent => (super.noSuchMethod(
        Invocation.getter(#onStderrEvent),
        returnValue: _i3.Stream<_i2.Event>.empty(),
      ) as _i3.Stream<_i2.Event>);

  @override
  _i3.Stream<_i2.Event> onEvent(String? streamId) => (super.noSuchMethod(
        Invocation.method(
          #onEvent,
          [streamId],
        ),
        returnValue: _i3.Stream<_i2.Event>.empty(),
      ) as _i3.Stream<_i2.Event>);

  @override
  _i3.Future<_i2.Breakpoint> addBreakpoint(
    String? isolateId,
    String? scriptId,
    int? line, {
    int? column,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #addBreakpoint,
          [
            isolateId,
            scriptId,
            line,
          ],
          {#column: column},
        ),
        returnValue: _i3.Future<_i2.Breakpoint>.value(_FakeBreakpoint_0(
          this,
          Invocation.method(
            #addBreakpoint,
            [
              isolateId,
              scriptId,
              line,
            ],
            {#column: column},
          ),
        )),
      ) as _i3.Future<_i2.Breakpoint>);

  @override
  _i3.Future<_i2.Breakpoint> addBreakpointWithScriptUri(
    String? isolateId,
    String? scriptUri,
    int? line, {
    int? column,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #addBreakpointWithScriptUri,
          [
            isolateId,
            scriptUri,
            line,
          ],
          {#column: column},
        ),
        returnValue: _i3.Future<_i2.Breakpoint>.value(_FakeBreakpoint_0(
          this,
          Invocation.method(
            #addBreakpointWithScriptUri,
            [
              isolateId,
              scriptUri,
              line,
            ],
            {#column: column},
          ),
        )),
      ) as _i3.Future<_i2.Breakpoint>);

  @override
  _i3.Future<_i2.Breakpoint> addBreakpointAtEntry(
    String? isolateId,
    String? functionId,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #addBreakpointAtEntry,
          [
            isolateId,
            functionId,
          ],
        ),
        returnValue: _i3.Future<_i2.Breakpoint>.value(_FakeBreakpoint_0(
          this,
          Invocation.method(
            #addBreakpointAtEntry,
            [
              isolateId,
              functionId,
            ],
          ),
        )),
      ) as _i3.Future<_i2.Breakpoint>);

  @override
  _i3.Future<_i2.Success> clearCpuSamples(String? isolateId) =>
      (super.noSuchMethod(
        Invocation.method(
          #clearCpuSamples,
          [isolateId],
        ),
        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
          this,
          Invocation.method(
            #clearCpuSamples,
            [isolateId],
          ),
        )),
      ) as _i3.Future<_i2.Success>);

  @override
  _i3.Future<_i2.Success> clearVMTimeline() => (super.noSuchMethod(
        Invocation.method(
          #clearVMTimeline,
          [],
        ),
        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
          this,
          Invocation.method(
            #clearVMTimeline,
            [],
          ),
        )),
      ) as _i3.Future<_i2.Success>);

  @override
  _i3.Future<_i2.IdZone> createIdZone(
    String? isolateId,
    String? backingBufferKind,
    String? idAssignmentPolicy, {
    int? capacity,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #createIdZone,
          [
            isolateId,
            backingBufferKind,
            idAssignmentPolicy,
          ],
          {#capacity: capacity},
        ),
        returnValue: _i3.Future<_i2.IdZone>.value(_FakeIdZone_2(
          this,
          Invocation.method(
            #createIdZone,
            [
              isolateId,
              backingBufferKind,
              idAssignmentPolicy,
            ],
            {#capacity: capacity},
          ),
        )),
      ) as _i3.Future<_i2.IdZone>);

  @override
  _i3.Future<_i2.Success> deleteIdZone(
    String? isolateId,
    String? idZoneId,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #deleteIdZone,
          [
            isolateId,
            idZoneId,
          ],
        ),
        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
          this,
          Invocation.method(
            #deleteIdZone,
            [
              isolateId,
              idZoneId,
            ],
          ),
        )),
      ) as _i3.Future<_i2.Success>);

  @override
  _i3.Future<_i2.Success> invalidateIdZone(
    String? isolateId,
    String? idZoneId,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #invalidateIdZone,
          [
            isolateId,
            idZoneId,
          ],
        ),
        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
          this,
          Invocation.method(
            #invalidateIdZone,
            [
              isolateId,
              idZoneId,
            ],
          ),
        )),
      ) as _i3.Future<_i2.Success>);

  @override
  _i3.Future<_i2.Response> invoke(
    String? isolateId,
    String? targetId,
    String? selector,
    List<String>? argumentIds, {
    bool? disableBreakpoints,
    String? idZoneId,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #invoke,
          [
            isolateId,
            targetId,
            selector,
            argumentIds,
          ],
          {
            #disableBreakpoints: disableBreakpoints,
            #idZoneId: idZoneId,
          },
        ),
        returnValue: _i3.Future<_i2.Response>.value(_FakeResponse_3(
          this,
          Invocation.method(
            #invoke,
            [
              isolateId,
              targetId,
              selector,
              argumentIds,
            ],
            {
              #disableBreakpoints: disableBreakpoints,
              #idZoneId: idZoneId,
            },
          ),
        )),
      ) as _i3.Future<_i2.Response>);

  @override
  _i3.Future<_i2.Response> evaluate(
    String? isolateId,
    String? targetId,
    String? expression, {
    Map<String, String>? scope,
    bool? disableBreakpoints,
    String? idZoneId,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #evaluate,
          [
            isolateId,
            targetId,
            expression,
          ],
          {
            #scope: scope,
            #disableBreakpoints: disableBreakpoints,
            #idZoneId: idZoneId,
          },
        ),
        returnValue: _i3.Future<_i2.Response>.value(_FakeResponse_3(
          this,
          Invocation.method(
            #evaluate,
            [
              isolateId,
              targetId,
              expression,
            ],
            {
              #scope: scope,
              #disableBreakpoints: disableBreakpoints,
              #idZoneId: idZoneId,
            },
          ),
        )),
      ) as _i3.Future<_i2.Response>);

  @override
  _i3.Future<_i2.Response> evaluateInFrame(
    String? isolateId,
    int? frameIndex,
    String? expression, {
    Map<String, String>? scope,
    bool? disableBreakpoints,
    String? idZoneId,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #evaluateInFrame,
          [
            isolateId,
            frameIndex,
            expression,
          ],
          {
            #scope: scope,
            #disableBreakpoints: disableBreakpoints,
            #idZoneId: idZoneId,
          },
        ),
        returnValue: _i3.Future<_i2.Response>.value(_FakeResponse_3(
          this,
          Invocation.method(
            #evaluateInFrame,
            [
              isolateId,
              frameIndex,
              expression,
            ],
            {
              #scope: scope,
              #disableBreakpoints: disableBreakpoints,
              #idZoneId: idZoneId,
            },
          ),
        )),
      ) as _i3.Future<_i2.Response>);

  @override
  _i3.Future<_i2.AllocationProfile> getAllocationProfile(
    String? isolateId, {
    bool? reset,
    bool? gc,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getAllocationProfile,
          [isolateId],
          {
            #reset: reset,
            #gc: gc,
          },
        ),
        returnValue:
            _i3.Future<_i2.AllocationProfile>.value(_FakeAllocationProfile_4(
          this,
          Invocation.method(
            #getAllocationProfile,
            [isolateId],
            {
              #reset: reset,
              #gc: gc,
            },
          ),
        )),
      ) as _i3.Future<_i2.AllocationProfile>);

  @override
  _i3.Future<_i2.CpuSamples> getAllocationTraces(
    String? isolateId, {
    int? timeOriginMicros,
    int? timeExtentMicros,
    String? classId,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getAllocationTraces,
          [isolateId],
          {
            #timeOriginMicros: timeOriginMicros,
            #timeExtentMicros: timeExtentMicros,
            #classId: classId,
          },
        ),
        returnValue: _i3.Future<_i2.CpuSamples>.value(_FakeCpuSamples_5(
          this,
          Invocation.method(
            #getAllocationTraces,
            [isolateId],
            {
              #timeOriginMicros: timeOriginMicros,
              #timeExtentMicros: timeExtentMicros,
              #classId: classId,
            },
          ),
        )),
      ) as _i3.Future<_i2.CpuSamples>);

  @override
  _i3.Future<_i2.ClassList> getClassList(String? isolateId) =>
      (super.noSuchMethod(
        Invocation.method(
          #getClassList,
          [isolateId],
        ),
        returnValue: _i3.Future<_i2.ClassList>.value(_FakeClassList_6(
          this,
          Invocation.method(
            #getClassList,
            [isolateId],
          ),
        )),
      ) as _i3.Future<_i2.ClassList>);

  @override
  _i3.Future<_i2.CpuSamples> getCpuSamples(
    String? isolateId,
    int? timeOriginMicros,
    int? timeExtentMicros,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #getCpuSamples,
          [
            isolateId,
            timeOriginMicros,
            timeExtentMicros,
          ],
        ),
        returnValue: _i3.Future<_i2.CpuSamples>.value(_FakeCpuSamples_5(
          this,
          Invocation.method(
            #getCpuSamples,
            [
              isolateId,
              timeOriginMicros,
              timeExtentMicros,
            ],
          ),
        )),
      ) as _i3.Future<_i2.CpuSamples>);

  @override
  _i3.Future<_i2.FlagList> getFlagList() => (super.noSuchMethod(
        Invocation.method(
          #getFlagList,
          [],
        ),
        returnValue: _i3.Future<_i2.FlagList>.value(_FakeFlagList_7(
          this,
          Invocation.method(
            #getFlagList,
            [],
          ),
        )),
      ) as _i3.Future<_i2.FlagList>);

  @override
  _i3.Future<_i2.InboundReferences> getInboundReferences(
    String? isolateId,
    String? targetId,
    int? limit, {
    String? idZoneId,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getInboundReferences,
          [
            isolateId,
            targetId,
            limit,
          ],
          {#idZoneId: idZoneId},
        ),
        returnValue:
            _i3.Future<_i2.InboundReferences>.value(_FakeInboundReferences_8(
          this,
          Invocation.method(
            #getInboundReferences,
            [
              isolateId,
              targetId,
              limit,
            ],
            {#idZoneId: idZoneId},
          ),
        )),
      ) as _i3.Future<_i2.InboundReferences>);

  @override
  _i3.Future<_i2.InstanceSet> getInstances(
    String? isolateId,
    String? objectId,
    int? limit, {
    bool? includeSubclasses,
    bool? includeImplementers,
    String? idZoneId,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getInstances,
          [
            isolateId,
            objectId,
            limit,
          ],
          {
            #includeSubclasses: includeSubclasses,
            #includeImplementers: includeImplementers,
            #idZoneId: idZoneId,
          },
        ),
        returnValue: _i3.Future<_i2.InstanceSet>.value(_FakeInstanceSet_9(
          this,
          Invocation.method(
            #getInstances,
            [
              isolateId,
              objectId,
              limit,
            ],
            {
              #includeSubclasses: includeSubclasses,
              #includeImplementers: includeImplementers,
              #idZoneId: idZoneId,
            },
          ),
        )),
      ) as _i3.Future<_i2.InstanceSet>);

  @override
  _i3.Future<_i2.InstanceRef> getInstancesAsList(
    String? isolateId,
    String? objectId, {
    bool? includeSubclasses,
    bool? includeImplementers,
    String? idZoneId,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getInstancesAsList,
          [
            isolateId,
            objectId,
          ],
          {
            #includeSubclasses: includeSubclasses,
            #includeImplementers: includeImplementers,
            #idZoneId: idZoneId,
          },
        ),
        returnValue: _i3.Future<_i2.InstanceRef>.value(_FakeInstanceRef_10(
          this,
          Invocation.method(
            #getInstancesAsList,
            [
              isolateId,
              objectId,
            ],
            {
              #includeSubclasses: includeSubclasses,
              #includeImplementers: includeImplementers,
              #idZoneId: idZoneId,
            },
          ),
        )),
      ) as _i3.Future<_i2.InstanceRef>);

  @override
  _i3.Future<_i2.Isolate> getIsolate(String? isolateId) => (super.noSuchMethod(
        Invocation.method(
          #getIsolate,
          [isolateId],
        ),
        returnValue: _i3.Future<_i2.Isolate>.value(_FakeIsolate_11(
          this,
          Invocation.method(
            #getIsolate,
            [isolateId],
          ),
        )),
      ) as _i3.Future<_i2.Isolate>);

  @override
  _i3.Future<_i2.IsolateGroup> getIsolateGroup(String? isolateGroupId) =>
      (super.noSuchMethod(
        Invocation.method(
          #getIsolateGroup,
          [isolateGroupId],
        ),
        returnValue: _i3.Future<_i2.IsolateGroup>.value(_FakeIsolateGroup_12(
          this,
          Invocation.method(
            #getIsolateGroup,
            [isolateGroupId],
          ),
        )),
      ) as _i3.Future<_i2.IsolateGroup>);

  @override
  _i3.Future<_i2.Event> getIsolatePauseEvent(String? isolateId) =>
      (super.noSuchMethod(
        Invocation.method(
          #getIsolatePauseEvent,
          [isolateId],
        ),
        returnValue: _i3.Future<_i2.Event>.value(_FakeEvent_13(
          this,
          Invocation.method(
            #getIsolatePauseEvent,
            [isolateId],
          ),
        )),
      ) as _i3.Future<_i2.Event>);

  @override
  _i3.Future<_i2.MemoryUsage> getMemoryUsage(String? isolateId) =>
      (super.noSuchMethod(
        Invocation.method(
          #getMemoryUsage,
          [isolateId],
        ),
        returnValue: _i3.Future<_i2.MemoryUsage>.value(_FakeMemoryUsage_14(
          this,
          Invocation.method(
            #getMemoryUsage,
            [isolateId],
          ),
        )),
      ) as _i3.Future<_i2.MemoryUsage>);

  @override
  _i3.Future<_i2.MemoryUsage> getIsolateGroupMemoryUsage(
          String? isolateGroupId) =>
      (super.noSuchMethod(
        Invocation.method(
          #getIsolateGroupMemoryUsage,
          [isolateGroupId],
        ),
        returnValue: _i3.Future<_i2.MemoryUsage>.value(_FakeMemoryUsage_14(
          this,
          Invocation.method(
            #getIsolateGroupMemoryUsage,
            [isolateGroupId],
          ),
        )),
      ) as _i3.Future<_i2.MemoryUsage>);

  @override
  _i3.Future<_i2.ScriptList> getScripts(String? isolateId) =>
      (super.noSuchMethod(
        Invocation.method(
          #getScripts,
          [isolateId],
        ),
        returnValue: _i3.Future<_i2.ScriptList>.value(_FakeScriptList_15(
          this,
          Invocation.method(
            #getScripts,
            [isolateId],
          ),
        )),
      ) as _i3.Future<_i2.ScriptList>);

  @override
  _i3.Future<_i2.Obj> getObject(
    String? isolateId,
    String? objectId, {
    int? offset,
    int? count,
    String? idZoneId,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getObject,
          [
            isolateId,
            objectId,
          ],
          {
            #offset: offset,
            #count: count,
            #idZoneId: idZoneId,
          },
        ),
        returnValue: _i3.Future<_i2.Obj>.value(_FakeObj_16(
          this,
          Invocation.method(
            #getObject,
            [
              isolateId,
              objectId,
            ],
            {
              #offset: offset,
              #count: count,
              #idZoneId: idZoneId,
            },
          ),
        )),
      ) as _i3.Future<_i2.Obj>);

  @override
  _i3.Future<_i2.PerfettoCpuSamples> getPerfettoCpuSamples(
    String? isolateId, {
    int? timeOriginMicros,
    int? timeExtentMicros,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getPerfettoCpuSamples,
          [isolateId],
          {
            #timeOriginMicros: timeOriginMicros,
            #timeExtentMicros: timeExtentMicros,
          },
        ),
        returnValue:
            _i3.Future<_i2.PerfettoCpuSamples>.value(_FakePerfettoCpuSamples_17(
          this,
          Invocation.method(
            #getPerfettoCpuSamples,
            [isolateId],
            {
              #timeOriginMicros: timeOriginMicros,
              #timeExtentMicros: timeExtentMicros,
            },
          ),
        )),
      ) as _i3.Future<_i2.PerfettoCpuSamples>);

  @override
  _i3.Future<_i2.PerfettoTimeline> getPerfettoVMTimeline({
    int? timeOriginMicros,
    int? timeExtentMicros,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getPerfettoVMTimeline,
          [],
          {
            #timeOriginMicros: timeOriginMicros,
            #timeExtentMicros: timeExtentMicros,
          },
        ),
        returnValue:
            _i3.Future<_i2.PerfettoTimeline>.value(_FakePerfettoTimeline_18(
          this,
          Invocation.method(
            #getPerfettoVMTimeline,
            [],
            {
              #timeOriginMicros: timeOriginMicros,
              #timeExtentMicros: timeExtentMicros,
            },
          ),
        )),
      ) as _i3.Future<_i2.PerfettoTimeline>);

  @override
  _i3.Future<_i2.PortList> getPorts(String? isolateId) => (super.noSuchMethod(
        Invocation.method(
          #getPorts,
          [isolateId],
        ),
        returnValue: _i3.Future<_i2.PortList>.value(_FakePortList_19(
          this,
          Invocation.method(
            #getPorts,
            [isolateId],
          ),
        )),
      ) as _i3.Future<_i2.PortList>);

  @override
  _i3.Future<_i2.RetainingPath> getRetainingPath(
    String? isolateId,
    String? targetId,
    int? limit, {
    String? idZoneId,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getRetainingPath,
          [
            isolateId,
            targetId,
            limit,
          ],
          {#idZoneId: idZoneId},
        ),
        returnValue: _i3.Future<_i2.RetainingPath>.value(_FakeRetainingPath_20(
          this,
          Invocation.method(
            #getRetainingPath,
            [
              isolateId,
              targetId,
              limit,
            ],
            {#idZoneId: idZoneId},
          ),
        )),
      ) as _i3.Future<_i2.RetainingPath>);

  @override
  _i3.Future<_i2.ProcessMemoryUsage> getProcessMemoryUsage() =>
      (super.noSuchMethod(
        Invocation.method(
          #getProcessMemoryUsage,
          [],
        ),
        returnValue:
            _i3.Future<_i2.ProcessMemoryUsage>.value(_FakeProcessMemoryUsage_21(
          this,
          Invocation.method(
            #getProcessMemoryUsage,
            [],
          ),
        )),
      ) as _i3.Future<_i2.ProcessMemoryUsage>);

  @override
  _i3.Future<_i2.Stack> getStack(
    String? isolateId, {
    int? limit,
    String? idZoneId,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getStack,
          [isolateId],
          {
            #limit: limit,
            #idZoneId: idZoneId,
          },
        ),
        returnValue: _i3.Future<_i2.Stack>.value(_FakeStack_22(
          this,
          Invocation.method(
            #getStack,
            [isolateId],
            {
              #limit: limit,
              #idZoneId: idZoneId,
            },
          ),
        )),
      ) as _i3.Future<_i2.Stack>);

  @override
  _i3.Future<_i2.ProtocolList> getSupportedProtocols() => (super.noSuchMethod(
        Invocation.method(
          #getSupportedProtocols,
          [],
        ),
        returnValue: _i3.Future<_i2.ProtocolList>.value(_FakeProtocolList_23(
          this,
          Invocation.method(
            #getSupportedProtocols,
            [],
          ),
        )),
      ) as _i3.Future<_i2.ProtocolList>);

  @override
  _i3.Future<_i2.SourceReport> getSourceReport(
    String? isolateId,
    List<String>? reports, {
    String? scriptId,
    int? tokenPos,
    int? endTokenPos,
    bool? forceCompile,
    bool? reportLines,
    List<String>? libraryFilters,
    List<String>? librariesAlreadyCompiled,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getSourceReport,
          [
            isolateId,
            reports,
          ],
          {
            #scriptId: scriptId,
            #tokenPos: tokenPos,
            #endTokenPos: endTokenPos,
            #forceCompile: forceCompile,
            #reportLines: reportLines,
            #libraryFilters: libraryFilters,
            #librariesAlreadyCompiled: librariesAlreadyCompiled,
          },
        ),
        returnValue: _i3.Future<_i2.SourceReport>.value(_FakeSourceReport_24(
          this,
          Invocation.method(
            #getSourceReport,
            [
              isolateId,
              reports,
            ],
            {
              #scriptId: scriptId,
              #tokenPos: tokenPos,
              #endTokenPos: endTokenPos,
              #forceCompile: forceCompile,
              #reportLines: reportLines,
              #libraryFilters: libraryFilters,
              #librariesAlreadyCompiled: librariesAlreadyCompiled,
            },
          ),
        )),
      ) as _i3.Future<_i2.SourceReport>);

  @override
  _i3.Future<_i2.Version> getVersion() => (super.noSuchMethod(
        Invocation.method(
          #getVersion,
          [],
        ),
        returnValue: _i3.Future<_i2.Version>.value(_FakeVersion_25(
          this,
          Invocation.method(
            #getVersion,
            [],
          ),
        )),
      ) as _i3.Future<_i2.Version>);

  @override
  _i3.Future<_i2.VM> getVM() => (super.noSuchMethod(
        Invocation.method(
          #getVM,
          [],
        ),
        returnValue: _i3.Future<_i2.VM>.value(_FakeVM_26(
          this,
          Invocation.method(
            #getVM,
            [],
          ),
        )),
      ) as _i3.Future<_i2.VM>);

  @override
  _i3.Future<_i2.Timeline> getVMTimeline({
    int? timeOriginMicros,
    int? timeExtentMicros,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getVMTimeline,
          [],
          {
            #timeOriginMicros: timeOriginMicros,
            #timeExtentMicros: timeExtentMicros,
          },
        ),
        returnValue: _i3.Future<_i2.Timeline>.value(_FakeTimeline_27(
          this,
          Invocation.method(
            #getVMTimeline,
            [],
            {
              #timeOriginMicros: timeOriginMicros,
              #timeExtentMicros: timeExtentMicros,
            },
          ),
        )),
      ) as _i3.Future<_i2.Timeline>);

  @override
  _i3.Future<_i2.TimelineFlags> getVMTimelineFlags() => (super.noSuchMethod(
        Invocation.method(
          #getVMTimelineFlags,
          [],
        ),
        returnValue: _i3.Future<_i2.TimelineFlags>.value(_FakeTimelineFlags_28(
          this,
          Invocation.method(
            #getVMTimelineFlags,
            [],
          ),
        )),
      ) as _i3.Future<_i2.TimelineFlags>);

  @override
  _i3.Future<_i2.Timestamp> getVMTimelineMicros() => (super.noSuchMethod(
        Invocation.method(
          #getVMTimelineMicros,
          [],
        ),
        returnValue: _i3.Future<_i2.Timestamp>.value(_FakeTimestamp_29(
          this,
          Invocation.method(
            #getVMTimelineMicros,
            [],
          ),
        )),
      ) as _i3.Future<_i2.Timestamp>);

  @override
  _i3.Future<_i2.Success> pause(String? isolateId) => (super.noSuchMethod(
        Invocation.method(
          #pause,
          [isolateId],
        ),
        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
          this,
          Invocation.method(
            #pause,
            [isolateId],
          ),
        )),
      ) as _i3.Future<_i2.Success>);

  @override
  _i3.Future<_i2.Success> kill(String? isolateId) => (super.noSuchMethod(
        Invocation.method(
          #kill,
          [isolateId],
        ),
        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
          this,
          Invocation.method(
            #kill,
            [isolateId],
          ),
        )),
      ) as _i3.Future<_i2.Success>);

  @override
  _i3.Future<_i2.UriList> lookupResolvedPackageUris(
    String? isolateId,
    List<String>? uris, {
    bool? local,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #lookupResolvedPackageUris,
          [
            isolateId,
            uris,
          ],
          {#local: local},
        ),
        returnValue: _i3.Future<_i2.UriList>.value(_FakeUriList_30(
          this,
          Invocation.method(
            #lookupResolvedPackageUris,
            [
              isolateId,
              uris,
            ],
            {#local: local},
          ),
        )),
      ) as _i3.Future<_i2.UriList>);

  @override
  _i3.Future<_i2.UriList> lookupPackageUris(
    String? isolateId,
    List<String>? uris,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #lookupPackageUris,
          [
            isolateId,
            uris,
          ],
        ),
        returnValue: _i3.Future<_i2.UriList>.value(_FakeUriList_30(
          this,
          Invocation.method(
            #lookupPackageUris,
            [
              isolateId,
              uris,
            ],
          ),
        )),
      ) as _i3.Future<_i2.UriList>);

  @override
  _i3.Future<_i2.Success> registerService(
    String? service,
    String? alias,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #registerService,
          [
            service,
            alias,
          ],
        ),
        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
          this,
          Invocation.method(
            #registerService,
            [
              service,
              alias,
            ],
          ),
        )),
      ) as _i3.Future<_i2.Success>);

  @override
  _i3.Future<_i2.ReloadReport> reloadSources(
    String? isolateId, {
    bool? force,
    bool? pause,
    String? rootLibUri,
    String? packagesUri,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #reloadSources,
          [isolateId],
          {
            #force: force,
            #pause: pause,
            #rootLibUri: rootLibUri,
            #packagesUri: packagesUri,
          },
        ),
        returnValue: _i3.Future<_i2.ReloadReport>.value(_FakeReloadReport_31(
          this,
          Invocation.method(
            #reloadSources,
            [isolateId],
            {
              #force: force,
              #pause: pause,
              #rootLibUri: rootLibUri,
              #packagesUri: packagesUri,
            },
          ),
        )),
      ) as _i3.Future<_i2.ReloadReport>);

  @override
  _i3.Future<_i2.Success> removeBreakpoint(
    String? isolateId,
    String? breakpointId,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #removeBreakpoint,
          [
            isolateId,
            breakpointId,
          ],
        ),
        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
          this,
          Invocation.method(
            #removeBreakpoint,
            [
              isolateId,
              breakpointId,
            ],
          ),
        )),
      ) as _i3.Future<_i2.Success>);

  @override
  _i3.Future<_i2.Success> requestHeapSnapshot(String? isolateId) =>
      (super.noSuchMethod(
        Invocation.method(
          #requestHeapSnapshot,
          [isolateId],
        ),
        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
          this,
          Invocation.method(
            #requestHeapSnapshot,
            [isolateId],
          ),
        )),
      ) as _i3.Future<_i2.Success>);

  @override
  _i3.Future<_i2.Success> resume(
    String? isolateId, {
    String? step,
    int? frameIndex,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #resume,
          [isolateId],
          {
            #step: step,
            #frameIndex: frameIndex,
          },
        ),
        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
          this,
          Invocation.method(
            #resume,
            [isolateId],
            {
              #step: step,
              #frameIndex: frameIndex,
            },
          ),
        )),
      ) as _i3.Future<_i2.Success>);

  @override
  _i3.Future<_i2.Breakpoint> setBreakpointState(
    String? isolateId,
    String? breakpointId,
    bool? enable,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #setBreakpointState,
          [
            isolateId,
            breakpointId,
            enable,
          ],
        ),
        returnValue: _i3.Future<_i2.Breakpoint>.value(_FakeBreakpoint_0(
          this,
          Invocation.method(
            #setBreakpointState,
            [
              isolateId,
              breakpointId,
              enable,
            ],
          ),
        )),
      ) as _i3.Future<_i2.Breakpoint>);

  @override
  _i3.Future<_i2.Success> setExceptionPauseMode(
    String? isolateId,
    String? mode,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #setExceptionPauseMode,
          [
            isolateId,
            mode,
          ],
        ),
        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
          this,
          Invocation.method(
            #setExceptionPauseMode,
            [
              isolateId,
              mode,
            ],
          ),
        )),
      ) as _i3.Future<_i2.Success>);

  @override
  _i3.Future<_i2.Success> setIsolatePauseMode(
    String? isolateId, {
    String? exceptionPauseMode,
    bool? shouldPauseOnExit,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #setIsolatePauseMode,
          [isolateId],
          {
            #exceptionPauseMode: exceptionPauseMode,
            #shouldPauseOnExit: shouldPauseOnExit,
          },
        ),
        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
          this,
          Invocation.method(
            #setIsolatePauseMode,
            [isolateId],
            {
              #exceptionPauseMode: exceptionPauseMode,
              #shouldPauseOnExit: shouldPauseOnExit,
            },
          ),
        )),
      ) as _i3.Future<_i2.Success>);

  @override
  _i3.Future<_i2.Response> setFlag(
    String? name,
    String? value,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #setFlag,
          [
            name,
            value,
          ],
        ),
        returnValue: _i3.Future<_i2.Response>.value(_FakeResponse_3(
          this,
          Invocation.method(
            #setFlag,
            [
              name,
              value,
            ],
          ),
        )),
      ) as _i3.Future<_i2.Response>);

  @override
  _i3.Future<_i2.Success> setLibraryDebuggable(
    String? isolateId,
    String? libraryId,
    bool? isDebuggable,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #setLibraryDebuggable,
          [
            isolateId,
            libraryId,
            isDebuggable,
          ],
        ),
        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
          this,
          Invocation.method(
            #setLibraryDebuggable,
            [
              isolateId,
              libraryId,
              isDebuggable,
            ],
          ),
        )),
      ) as _i3.Future<_i2.Success>);

  @override
  _i3.Future<_i2.Success> setName(
    String? isolateId,
    String? name,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #setName,
          [
            isolateId,
            name,
          ],
        ),
        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
          this,
          Invocation.method(
            #setName,
            [
              isolateId,
              name,
            ],
          ),
        )),
      ) as _i3.Future<_i2.Success>);

  @override
  _i3.Future<_i2.Success> setTraceClassAllocation(
    String? isolateId,
    String? classId,
    bool? enable,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #setTraceClassAllocation,
          [
            isolateId,
            classId,
            enable,
          ],
        ),
        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
          this,
          Invocation.method(
            #setTraceClassAllocation,
            [
              isolateId,
              classId,
              enable,
            ],
          ),
        )),
      ) as _i3.Future<_i2.Success>);

  @override
  _i3.Future<_i2.Success> setVMName(String? name) => (super.noSuchMethod(
        Invocation.method(
          #setVMName,
          [name],
        ),
        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
          this,
          Invocation.method(
            #setVMName,
            [name],
          ),
        )),
      ) as _i3.Future<_i2.Success>);

  @override
  _i3.Future<_i2.Success> setVMTimelineFlags(List<String>? recordedStreams) =>
      (super.noSuchMethod(
        Invocation.method(
          #setVMTimelineFlags,
          [recordedStreams],
        ),
        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
          this,
          Invocation.method(
            #setVMTimelineFlags,
            [recordedStreams],
          ),
        )),
      ) as _i3.Future<_i2.Success>);

  @override
  _i3.Future<_i2.Success> streamCancel(String? streamId) => (super.noSuchMethod(
        Invocation.method(
          #streamCancel,
          [streamId],
        ),
        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
          this,
          Invocation.method(
            #streamCancel,
            [streamId],
          ),
        )),
      ) as _i3.Future<_i2.Success>);

  @override
  _i3.Future<_i2.Success> streamCpuSamplesWithUserTag(List<String>? userTags) =>
      (super.noSuchMethod(
        Invocation.method(
          #streamCpuSamplesWithUserTag,
          [userTags],
        ),
        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
          this,
          Invocation.method(
            #streamCpuSamplesWithUserTag,
            [userTags],
          ),
        )),
      ) as _i3.Future<_i2.Success>);

  @override
  _i3.Future<_i2.Success> streamListen(String? streamId) => (super.noSuchMethod(
        Invocation.method(
          #streamListen,
          [streamId],
        ),
        returnValue: _i3.Future<_i2.Success>.value(_FakeSuccess_1(
          this,
          Invocation.method(
            #streamListen,
            [streamId],
          ),
        )),
      ) as _i3.Future<_i2.Success>);

  @override
  _i3.Future<_i2.Response> callMethod(
    String? method, {
    String? isolateId,
    Map<String, dynamic>? args,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #callMethod,
          [method],
          {
            #isolateId: isolateId,
            #args: args,
          },
        ),
        returnValue: _i3.Future<_i2.Response>.value(_FakeResponse_3(
          this,
          Invocation.method(
            #callMethod,
            [method],
            {
              #isolateId: isolateId,
              #args: args,
            },
          ),
        )),
      ) as _i3.Future<_i2.Response>);

  @override
  _i3.Future<_i2.Response> callServiceExtension(
    String? method, {
    String? isolateId,
    Map<String, dynamic>? args,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #callServiceExtension,
          [method],
          {
            #isolateId: isolateId,
            #args: args,
          },
        ),
        returnValue: _i3.Future<_i2.Response>.value(_FakeResponse_3(
          this,
          Invocation.method(
            #callServiceExtension,
            [method],
            {
              #isolateId: isolateId,
              #args: args,
            },
          ),
        )),
      ) as _i3.Future<_i2.Response>);

  @override
  _i3.Future<void> dispose() => (super.noSuchMethod(
        Invocation.method(
          #dispose,
          [],
        ),
        returnValue: _i3.Future<void>.value(),
        returnValueForMissingStub: _i3.Future<void>.value(),
      ) as _i3.Future<void>);

  @override
  _i3.Future<T> wrapFuture<T>(
    String? name,
    _i3.Future<T>? future,
  ) =>
      (super.noSuchMethod(
        Invocation.method(
          #wrapFuture,
          [
            name,
            future,
          ],
        ),
        returnValue: _i4.ifNotNull(
              _i4.dummyValueOrNull<T>(
                this,
                Invocation.method(
                  #wrapFuture,
                  [
                    name,
                    future,
                  ],
                ),
              ),
              (T v) => _i3.Future<T>.value(v),
            ) ??
            _FakeFuture_32<T>(
              this,
              Invocation.method(
                #wrapFuture,
                [
                  name,
                  future,
                ],
              ),
            ),
      ) as _i3.Future<T>);

  @override
  void registerServiceCallback(
    String? service,
    _i2.ServiceCallback? cb,
  ) =>
      super.noSuchMethod(
        Invocation.method(
          #registerServiceCallback,
          [
            service,
            cb,
          ],
        ),
        returnValueForMissingStub: null,
      );
}
