// Mocks generated by Mockito 5.4.2 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: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: 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 _FakeResponse_2 extends _i1.SmartFake implements _i2.Response {
  _FakeResponse_2(
    Object parent,
    Invocation parentInvocation,
  ) : super(
          parent,
          parentInvocation,
        );
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

class _FakeReloadReport_30 extends _i1.SmartFake implements _i2.ReloadReport {
  _FakeReloadReport_30(
    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<_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<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<dynamic> get onDone => (super.noSuchMethod(
        Invocation.getter(#onDone),
        returnValue: _i3.Future<dynamic>.value(),
      ) as _i3.Future<dynamic>);

  @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.Response> invoke(
    String? isolateId,
    String? targetId,
    String? selector,
    List<String>? argumentIds, {
    bool? disableBreakpoints,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #invoke,
          [
            isolateId,
            targetId,
            selector,
            argumentIds,
          ],
          {#disableBreakpoints: disableBreakpoints},
        ),
        returnValue: _i3.Future<_i2.Response>.value(_FakeResponse_2(
          this,
          Invocation.method(
            #invoke,
            [
              isolateId,
              targetId,
              selector,
              argumentIds,
            ],
            {#disableBreakpoints: disableBreakpoints},
          ),
        )),
      ) as _i3.Future<_i2.Response>);

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

  @override
  _i3.Future<_i2.Response> evaluateInFrame(
    String? isolateId,
    int? frameIndex,
    String? expression, {
    Map<String, String>? scope,
    bool? disableBreakpoints,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #evaluateInFrame,
          [
            isolateId,
            frameIndex,
            expression,
          ],
          {
            #scope: scope,
            #disableBreakpoints: disableBreakpoints,
          },
        ),
        returnValue: _i3.Future<_i2.Response>.value(_FakeResponse_2(
          this,
          Invocation.method(
            #evaluateInFrame,
            [
              isolateId,
              frameIndex,
              expression,
            ],
            {
              #scope: scope,
              #disableBreakpoints: disableBreakpoints,
            },
          ),
        )),
      ) 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_3(
          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_4(
          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_5(
          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_4(
          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_6(
          this,
          Invocation.method(
            #getFlagList,
            [],
          ),
        )),
      ) as _i3.Future<_i2.FlagList>);

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

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

  @override
  _i3.Future<_i2.InstanceRef> getInstancesAsList(
    String? isolateId,
    String? objectId, {
    bool? includeSubclasses,
    bool? includeImplementers,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getInstancesAsList,
          [
            isolateId,
            objectId,
          ],
          {
            #includeSubclasses: includeSubclasses,
            #includeImplementers: includeImplementers,
          },
        ),
        returnValue: _i3.Future<_i2.InstanceRef>.value(_FakeInstanceRef_9(
          this,
          Invocation.method(
            #getInstancesAsList,
            [
              isolateId,
              objectId,
            ],
            {
              #includeSubclasses: includeSubclasses,
              #includeImplementers: includeImplementers,
            },
          ),
        )),
      ) 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_10(
          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_11(
          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_12(
          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_13(
          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_13(
          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_14(
          this,
          Invocation.method(
            #getScripts,
            [isolateId],
          ),
        )),
      ) as _i3.Future<_i2.ScriptList>);

  @override
  _i3.Future<_i2.Obj> getObject(
    String? isolateId,
    String? objectId, {
    int? offset,
    int? count,
  }) =>
      (super.noSuchMethod(
        Invocation.method(
          #getObject,
          [
            isolateId,
            objectId,
          ],
          {
            #offset: offset,
            #count: count,
          },
        ),
        returnValue: _i3.Future<_i2.Obj>.value(_FakeObj_15(
          this,
          Invocation.method(
            #getObject,
            [
              isolateId,
              objectId,
            ],
            {
              #offset: offset,
              #count: count,
            },
          ),
        )),
      ) 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_16(
          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_17(
          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_18(
          this,
          Invocation.method(
            #getPorts,
            [isolateId],
          ),
        )),
      ) as _i3.Future<_i2.PortList>);

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

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

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

  @override
  _i3.Future<_i2.ProtocolList> getSupportedProtocols() => (super.noSuchMethod(
        Invocation.method(
          #getSupportedProtocols,
          [],
        ),
        returnValue: _i3.Future<_i2.ProtocolList>.value(_FakeProtocolList_22(
          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_23(
          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_24(
          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_25(
          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_26(
          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_27(
          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_28(
          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_29(
          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_29(
          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_30(
          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_2(
          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_2(
          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_2(
          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
  void registerServiceCallback(
    String? service,
    _i2.ServiceCallback? cb,
  ) =>
      super.noSuchMethod(
        Invocation.method(
          #registerServiceCallback,
          [
            service,
            cb,
          ],
        ),
        returnValueForMissingStub: null,
      );
}
