From 1bb772cb428318eebe18494015a68c6acc1907e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denis=20Andra=C5=A1ec?= Date: Thu, 27 Jul 2023 08:05:09 +0000 Subject: [PATCH 01/36] Mark exceptions not handled by user as `handled: false` (#1535) --- .../workflows/flutter_integration_test.yml | 64 +++--- CHANGELOG.md | 14 +- dart/lib/sentry.dart | 2 + .../src/run_zoned_guarded_integration.dart | 4 +- dart/lib/src/sentry_isolate.dart | 5 +- dart/lib/src/sentry_options.dart | 1 - dart/lib/src/utils.dart | 5 +- dart/lib/src/version.dart | 2 +- dart/pubspec.yaml | 2 +- dart/test/protocol/breadcrumb_test.dart | 1 - dart/test/sentry_envelope_header_test.dart | 1 - dart/test/sentry_envelope_item_test.dart | 1 - dart/test/sentry_envelope_test.dart | 1 - dart/test/sentry_event_test.dart | 1 - dart/test/sentry_span_test.dart | 1 - dart/test/sentry_tracer_test.dart | 1 - dio/lib/src/dio_event_processor.dart | 72 ++++++- dio/lib/src/version.dart | 2 +- dio/pubspec.yaml | 4 +- dio/test/dio_event_processor_test.dart | 201 +++++++++++++++++- file/lib/src/version.dart | 2 +- file/pubspec.yaml | 4 +- flutter/example/lib/main.dart | 1 - flutter/example/pubspec.yaml | 2 +- .../Classes/SentryFlutterPluginApple.swift | 4 + .../flutter_error_integration.dart | 7 +- .../integrations/native_sdk_integration.dart | 2 + flutter/lib/src/sentry_flutter_options.dart | 10 +- flutter/lib/src/version.dart | 2 +- flutter/pubspec.yaml | 4 +- .../flutter_error_integration_test.dart | 6 +- .../init_native_sdk_integration_test.dart | 5 +- logging/lib/src/version.dart | 2 +- logging/pubspec.yaml | 4 +- sqflite/lib/src/version.dart | 2 +- sqflite/pubspec.yaml | 4 +- 36 files changed, 366 insertions(+), 80 deletions(-) diff --git a/.github/workflows/flutter_integration_test.yml b/.github/workflows/flutter_integration_test.yml index beb70244cd..761d2771e5 100644 --- a/.github/workflows/flutter_integration_test.yml +++ b/.github/workflows/flutter_integration_test.yml @@ -46,42 +46,42 @@ jobs: - name: flutter pub get run: flutter pub get - - name: Gradle cache - uses: gradle/gradle-build-action@v2 + - name: Gradle cache + uses: gradle/gradle-build-action@v2 - - name: AVD cache - uses: actions/cache@v3 - id: avd-cache - with: - path: | - ~/.android/avd/* - ~/.android/adb* + - name: AVD cache + uses: actions/cache@v3 + id: avd-cache + with: + path: | + ~/.android/avd/* + ~/.android/adb* key: avd-21 - - name: create AVD and generate snapshot for caching - if: steps.avd-cache.outputs.cache-hit != 'true' - uses: reactivecircus/android-emulator-runner@d94c3fbe4fe6a29e4a5ba47c12fb47677c73656b #pin@v2.28.0 - with: - working-directory: ./flutter/example - api-level: 21 - force-avd-creation: false - emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - disable-animations: false - arch: x86_64 - profile: Nexus 6 - script: echo "Generated AVD snapshot for caching." + - name: create AVD and generate snapshot for caching + if: steps.avd-cache.outputs.cache-hit != 'true' + uses: reactivecircus/android-emulator-runner@d94c3fbe4fe6a29e4a5ba47c12fb47677c73656b #pin@v2.28.0 + with: + working-directory: ./flutter/example + api-level: 21 + force-avd-creation: false + emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + disable-animations: false + arch: x86_64 + profile: Nexus 6 + script: echo "Generated AVD snapshot for caching." - - name: launch android emulator & run android integration test - uses: reactivecircus/android-emulator-runner@d94c3fbe4fe6a29e4a5ba47c12fb47677c73656b #pin@v2.28.0 - with: - working-directory: ./flutter/example - api-level: 21 - force-avd-creation: false - emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - disable-animations: true - arch: x86_64 - profile: Nexus 6 - script: flutter test integration_test/integration_test.dart --verbose + - name: launch android emulator & run android integration test + uses: reactivecircus/android-emulator-runner@d94c3fbe4fe6a29e4a5ba47c12fb47677c73656b #pin@v2.28.0 + with: + working-directory: ./flutter/example + api-level: 21 + force-avd-creation: false + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + disable-animations: true + arch: x86_64 + profile: Nexus 6 + script: flutter test integration_test/integration_test.dart --verbose test-ios: runs-on: macos-13 diff --git a/CHANGELOG.md b/CHANGELOG.md index e558039d62..48ec8862bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,25 @@ # Changelog -## Unreleased +## 8.0.0 +### Breaking Changes + +- Mark exceptions not handled by the user as `handled: false` ([#1535](https://github.com/getsentry/sentry-dart/pull/1535)) + - This will affect your release health data, and is therefore considered a breaking change. + +## 7.9.0 + ### Features - Send trace origin ([#1534](https://github.com/getsentry/sentry-dart/pull/1534)) [Trace origin](https://develop.sentry.dev/sdk/performance/trace-origin/) indicates what created a trace or a span. Not all transactions and spans contain enough information to tell whether the user or what precisely in the SDK created it. Origin solves this problem. The SDK now sends origin for transactions and spans. +- Add `appHangTimeoutInterval` to `SentryFlutterOptions` ([#1568](https://github.com/getsentry/sentry-dart/pull/1568)) +- DioEventProcessor: Append http response body ([#1557](https://github.com/getsentry/sentry-dart/pull/1557)) + - This is opt-in and depends on `maxResponseBodySize` + - Only for `dio` package + ### Dependencies - Bump Cocoa SDK from v8.8.0 to v8.9.1 ([#1553](https://github.com/getsentry/sentry-dart/pull/1553)) diff --git a/dart/lib/sentry.dart b/dart/lib/sentry.dart index f23525bfda..9d06bb7e2a 100644 --- a/dart/lib/sentry.dart +++ b/dart/lib/sentry.dart @@ -46,3 +46,5 @@ export 'src/utils/url_details.dart'; export 'src/utils/http_header_utils.dart'; // ignore: invalid_export_of_internal_element export 'src/sentry_trace_origins.dart'; +// ignore: invalid_export_of_internal_element +export 'src/utils.dart'; diff --git a/dart/lib/src/run_zoned_guarded_integration.dart b/dart/lib/src/run_zoned_guarded_integration.dart index ba70fc2472..623a9a5f54 100644 --- a/dart/lib/src/run_zoned_guarded_integration.dart +++ b/dart/lib/src/run_zoned_guarded_integration.dart @@ -44,8 +44,8 @@ class RunZonedGuardedIntegration extends Integration { stackTrace: stackTrace, ); - // runZonedGuarded doesn't crash the App. - final mechanism = Mechanism(type: 'runZonedGuarded', handled: true); + // runZonedGuarded doesn't crash the app, but is not handled by the user. + final mechanism = Mechanism(type: 'runZonedGuarded', handled: false); final throwableMechanism = ThrowableMechanism(mechanism, exception); final event = SentryEvent( diff --git a/dart/lib/src/sentry_isolate.dart b/dart/lib/src/sentry_isolate.dart index 898904cd27..8a6b71d48f 100644 --- a/dart/lib/src/sentry_isolate.dart +++ b/dart/lib/src/sentry_isolate.dart @@ -69,9 +69,10 @@ class SentryIsolate { stackTrace == null ? null : StackTrace.fromString(stackTrace), ); - // Isolate errors don't crash the App. - final mechanism = Mechanism(type: 'isolateError', handled: true); + // Isolate errors don't crash the app, but is not handled by the user. + final mechanism = Mechanism(type: 'isolateError', handled: false); final throwableMechanism = ThrowableMechanism(mechanism, throwable); + final event = SentryEvent( throwable: throwableMechanism, level: SentryLevel.fatal, diff --git a/dart/lib/src/sentry_options.dart b/dart/lib/src/sentry_options.dart index 34544076ba..55450be9dd 100644 --- a/dart/lib/src/sentry_options.dart +++ b/dart/lib/src/sentry_options.dart @@ -13,7 +13,6 @@ import 'diagnostic_logger.dart'; import 'environment/environment_variables.dart'; import 'noop_client.dart'; import 'transport/noop_transport.dart'; -import 'utils.dart'; import 'version.dart'; // TODO: shutdownTimeout, flushTimeoutMillis diff --git a/dart/lib/src/utils.dart b/dart/lib/src/utils.dart index f349635051..db5ca614c2 100644 --- a/dart/lib/src/utils.dart +++ b/dart/lib/src/utils.dart @@ -8,9 +8,11 @@ import 'package:meta/meta.dart'; /// Sentry does not take a timezone and instead expects the date-time to be /// submitted in UTC timezone. +@internal DateTime getUtcDateTime() => DateTime.now().toUtc(); /// Formats a Date as ISO8601 and UTC with millis precision +@internal String formatDateAsIso8601WithMillisPrecision(DateTime date) { var iso = date.toIso8601String(); final millisecondSeparatorIndex = iso.lastIndexOf('.'); @@ -22,9 +24,10 @@ String formatDateAsIso8601WithMillisPrecision(DateTime date) { return '${iso}Z'; } +@internal final utf8JsonEncoder = JsonUtf8Encoder(null, jsonSerializationFallback, null); -@visibleForTesting +@internal Object? jsonSerializationFallback(Object? nonEncodable) { if (nonEncodable == null) { return null; diff --git a/dart/lib/src/version.dart b/dart/lib/src/version.dart index eea097529a..6e9ff2059d 100644 --- a/dart/lib/src/version.dart +++ b/dart/lib/src/version.dart @@ -9,7 +9,7 @@ library version; /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '7.8.0'; +const String sdkVersion = '7.9.0'; String sdkName(bool isWeb) => isWeb ? _browserSdkName : _ioSdkName; diff --git a/dart/pubspec.yaml b/dart/pubspec.yaml index b73eaf94ac..330d6084e7 100644 --- a/dart/pubspec.yaml +++ b/dart/pubspec.yaml @@ -1,5 +1,5 @@ name: sentry -version: 7.8.0 +version: 7.9.0 description: > A crash reporting library for Dart that sends crash reports to Sentry.io. This library supports Dart VM and Web. For Flutter consider sentry_flutter instead. diff --git a/dart/test/protocol/breadcrumb_test.dart b/dart/test/protocol/breadcrumb_test.dart index 4062e1b895..ddd4008d98 100644 --- a/dart/test/protocol/breadcrumb_test.dart +++ b/dart/test/protocol/breadcrumb_test.dart @@ -1,7 +1,6 @@ import 'package:collection/collection.dart'; import 'package:sentry/sentry.dart'; import 'package:test/test.dart'; -import 'package:sentry/src/utils.dart'; void main() { final timestamp = DateTime.now(); diff --git a/dart/test/sentry_envelope_header_test.dart b/dart/test/sentry_envelope_header_test.dart index 5dff84aa87..cc10f97434 100644 --- a/dart/test/sentry_envelope_header_test.dart +++ b/dart/test/sentry_envelope_header_test.dart @@ -1,6 +1,5 @@ import 'package:sentry/sentry.dart'; import 'package:sentry/src/sentry_envelope_header.dart'; -import 'package:sentry/src/utils.dart'; import 'package:test/test.dart'; import 'mocks.dart'; diff --git a/dart/test/sentry_envelope_item_test.dart b/dart/test/sentry_envelope_item_test.dart index 4fe01e5a8e..673f679740 100644 --- a/dart/test/sentry_envelope_item_test.dart +++ b/dart/test/sentry_envelope_item_test.dart @@ -8,7 +8,6 @@ import 'package:sentry/src/sentry_envelope_item_header.dart'; import 'package:sentry/src/sentry_item_type.dart'; import 'package:sentry/src/sentry_tracer.dart'; import 'package:sentry/src/transport/data_category.dart'; -import 'package:sentry/src/utils.dart'; import 'package:test/test.dart'; import 'mocks/mock_hub.dart'; diff --git a/dart/test/sentry_envelope_test.dart b/dart/test/sentry_envelope_test.dart index 063be42ba9..375f62846e 100644 --- a/dart/test/sentry_envelope_test.dart +++ b/dart/test/sentry_envelope_test.dart @@ -6,7 +6,6 @@ import 'package:sentry/src/sentry_envelope_header.dart'; import 'package:sentry/src/sentry_envelope_item_header.dart'; import 'package:sentry/src/sentry_item_type.dart'; import 'package:sentry/src/sentry_tracer.dart'; -import 'package:sentry/src/utils.dart'; import 'package:test/test.dart'; import 'mocks.dart'; diff --git a/dart/test/sentry_event_test.dart b/dart/test/sentry_event_test.dart index 58fb946110..4e661638a8 100644 --- a/dart/test/sentry_event_test.dart +++ b/dart/test/sentry_event_test.dart @@ -5,7 +5,6 @@ import 'package:collection/collection.dart'; import 'package:sentry/sentry.dart'; import 'package:sentry/src/version.dart'; -import 'package:sentry/src/utils.dart'; import 'package:test/test.dart'; void main() { diff --git a/dart/test/sentry_span_test.dart b/dart/test/sentry_span_test.dart index 37a81309da..e878be5cf2 100644 --- a/dart/test/sentry_span_test.dart +++ b/dart/test/sentry_span_test.dart @@ -1,6 +1,5 @@ import 'package:sentry/sentry.dart'; import 'package:sentry/src/sentry_tracer.dart'; -import 'package:sentry/src/utils.dart'; import 'package:test/test.dart'; import 'mocks/mock_hub.dart'; diff --git a/dart/test/sentry_tracer_test.dart b/dart/test/sentry_tracer_test.dart index f2c0bcdf7c..cb9f72fdfc 100644 --- a/dart/test/sentry_tracer_test.dart +++ b/dart/test/sentry_tracer_test.dart @@ -1,6 +1,5 @@ import 'package:sentry/sentry.dart'; import 'package:sentry/src/sentry_tracer.dart'; -import 'package:sentry/src/utils.dart'; import 'package:test/test.dart'; import 'mocks.dart'; diff --git a/dio/lib/src/dio_event_processor.dart b/dio/lib/src/dio_event_processor.dart index 0e9eedd5eb..3a9603abd1 100644 --- a/dio/lib/src/dio_event_processor.dart +++ b/dio/lib/src/dio_event_processor.dart @@ -1,5 +1,7 @@ // ignore_for_file: deprecated_member_use +import 'dart:convert'; + import 'package:dio/dio.dart'; import 'package:sentry/sentry.dart'; @@ -62,7 +64,7 @@ class DioEventProcessor implements EventProcessor { } /// Returns the request data, if possible according to the users settings. - Object? _getRequestData(dynamic data) { + Object? _getRequestData(Object? data) { if (!_options.sendDefaultPii) { return null; } @@ -87,8 +89,74 @@ class DioEventProcessor implements EventProcessor { return SentryResponse( headers: _options.sendDefaultPii ? headers : null, - bodySize: dioError.response?.data?.length as int?, + bodySize: _getBodySize( + dioError.response?.data, + dioError.requestOptions.responseType, + ), statusCode: response?.statusCode, + data: _getResponseData( + dioError.response?.data, + dioError.requestOptions.responseType, + ), ); } + + /// Returns the response data, if possible according to the users settings. + Object? _getResponseData(Object? data, ResponseType responseType) { + if (!_options.sendDefaultPii || data == null) { + return null; + } + switch (responseType) { + case ResponseType.json: + // ignore: invalid_use_of_internal_member + final jsData = utf8JsonEncoder.convert(data); + if (_options.maxResponseBodySize.shouldAddBody(jsData.length)) { + return data; + } + break; + case ResponseType.stream: + break; // No support for logging stream body. + case ResponseType.plain: + if (data is String && + _options.maxResponseBodySize.shouldAddBody(data.codeUnits.length)) { + return data; + } + break; + case ResponseType.bytes: + if (data is List && + _options.maxResponseBodySize.shouldAddBody(data.length)) { + return data; + } + break; + } + return null; + } + + int? _getBodySize(Object? data, ResponseType responseType) { + if (data == null) { + return null; + } + switch (responseType) { + case ResponseType.json: + return json.encode(data).codeUnits.length; + case ResponseType.stream: + if (data is String) { + return data.length; + } else { + return null; + } + case ResponseType.plain: + if (data is String) { + return data.codeUnits.length; + } else { + return null; + } + case ResponseType.bytes: + if (data is List) { + return data.length; + } else { + return null; + } + } + } } diff --git a/dio/lib/src/version.dart b/dio/lib/src/version.dart index 6e137694e7..0efaa7daaa 100644 --- a/dio/lib/src/version.dart +++ b/dio/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '7.8.0'; +const String sdkVersion = '7.9.0'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_dio'; diff --git a/dio/pubspec.yaml b/dio/pubspec.yaml index 2f46b81ed4..1343b6127b 100644 --- a/dio/pubspec.yaml +++ b/dio/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_dio description: An integration which adds support for performance tracing for the Dio package. -version: 7.8.0 +version: 7.9.0 homepage: https://docs.sentry.io/platforms/dart/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues @@ -11,7 +11,7 @@ environment: dependencies: dio: ^5.0.0 - sentry: 7.8.0 + sentry: 7.9.0 dev_dependencies: meta: ^1.3.0 diff --git a/dio/test/dio_event_processor_test.dart b/dio/test/dio_event_processor_test.dart index 62520b6f44..af45d0c681 100644 --- a/dio/test/dio_event_processor_test.dart +++ b/dio/test/dio_event_processor_test.dart @@ -132,6 +132,64 @@ void main() { expect(processedEvent.request?.headers, {}); }); + + test('request body is included according to $MaxResponseBodySize', + () async { + final scenarios = [ + // never + MaxBodySizeTestConfig(MaxRequestBodySize.never, 0, false), + MaxBodySizeTestConfig(MaxRequestBodySize.never, 4001, false), + MaxBodySizeTestConfig(MaxRequestBodySize.never, 10001, false), + // always + MaxBodySizeTestConfig(MaxRequestBodySize.always, 0, true), + MaxBodySizeTestConfig(MaxRequestBodySize.always, 4001, true), + MaxBodySizeTestConfig(MaxRequestBodySize.always, 10001, true), + // small + MaxBodySizeTestConfig(MaxRequestBodySize.small, 0, true), + MaxBodySizeTestConfig(MaxRequestBodySize.small, 4000, true), + MaxBodySizeTestConfig(MaxRequestBodySize.small, 4001, false), + // medium + MaxBodySizeTestConfig(MaxRequestBodySize.medium, 0, true), + MaxBodySizeTestConfig(MaxRequestBodySize.medium, 4001, true), + MaxBodySizeTestConfig(MaxRequestBodySize.medium, 10000, true), + MaxBodySizeTestConfig(MaxRequestBodySize.medium, 10001, false), + ]; + + for (final scenario in scenarios) { + final sut = fixture.getSut( + sendDefaultPii: true, + captureFailedRequests: true, + maxRequestBodySize: scenario.maxBodySize, + ); + + final data = List.generate(scenario.contentLength, (index) => 0); + final request = requestOptions.copyWith(method: 'POST', data: data); + final throwable = Exception(); + final dioError = DioError( + requestOptions: request, + response: Response( + requestOptions: request, + statusCode: 401, + data: data, + ), + ); + final event = SentryEvent( + throwable: throwable, + exceptions: [ + fixture.sentryError(throwable), + fixture.sentryError(dioError) + ], + ); + final processedEvent = sut.apply(event) as SentryEvent; + final capturedRequest = processedEvent.request; + + expect(capturedRequest, isNotNull); + expect( + capturedRequest?.data, + scenario.shouldBeIncluded ? isNotNull : isNull, + ); + } + }); }); group('response', () { @@ -140,6 +198,7 @@ void main() { final request = requestOptions.copyWith( method: 'POST', + responseType: ResponseType.plain, ); final throwable = Exception(); final dioError = DioError( @@ -181,6 +240,7 @@ void main() { final request = requestOptions.copyWith( method: 'POST', + responseType: ResponseType.plain, ); final throwable = Exception(); final dioError = DioError( @@ -211,6 +271,121 @@ void main() { expect(processedEvent.contexts.response?.statusCode, 200); expect(processedEvent.contexts.response?.headers, {}); }); + + test('response body is included according to $MaxResponseBodySize', + () async { + final scenarios = [ + // never + MaxBodySizeTestConfig(MaxResponseBodySize.never, 0, false), + MaxBodySizeTestConfig(MaxResponseBodySize.never, 4001, false), + MaxBodySizeTestConfig(MaxResponseBodySize.never, 10001, false), + // always + MaxBodySizeTestConfig(MaxResponseBodySize.always, 0, true), + MaxBodySizeTestConfig(MaxResponseBodySize.always, 4001, true), + MaxBodySizeTestConfig(MaxResponseBodySize.always, 10001, true), + // small + MaxBodySizeTestConfig(MaxResponseBodySize.small, 0, true), + MaxBodySizeTestConfig(MaxResponseBodySize.small, 4000, true), + MaxBodySizeTestConfig(MaxResponseBodySize.small, 4001, false), + // medium + MaxBodySizeTestConfig(MaxResponseBodySize.medium, 0, true), + MaxBodySizeTestConfig(MaxResponseBodySize.medium, 4001, true), + MaxBodySizeTestConfig(MaxResponseBodySize.medium, 10000, true), + MaxBodySizeTestConfig(MaxResponseBodySize.medium, 10001, false), + ]; + + for (final scenario in scenarios) { + final sut = fixture.getSut( + sendDefaultPii: true, + captureFailedRequests: true, + maxResponseBodySize: scenario.maxBodySize, + ); + + final data = List.generate(scenario.contentLength, (index) => 0); + final request = requestOptions.copyWith( + method: 'POST', + data: data, + responseType: ResponseType.bytes, + ); + final throwable = Exception(); + final dioError = DioError( + requestOptions: request, + response: Response( + requestOptions: request, + statusCode: 401, + data: data, + ), + ); + final event = SentryEvent( + throwable: throwable, + exceptions: [ + fixture.sentryError(throwable), + fixture.sentryError(dioError) + ], + ); + final processedEvent = sut.apply(event) as SentryEvent; + final capturedResponse = processedEvent.contexts.response; + + expect(capturedResponse, isNotNull); + expect( + capturedResponse?.data, + scenario.shouldBeIncluded ? isNotNull : isNull, + ); + } + }); + + test('data supports all response body types', () async { + final dataByType = { + ResponseType.plain: ['plain'], + ResponseType.bytes: [ + [1337] + ], + ResponseType.json: [ + 9001, + null, + 'string', + true, + ['list'], + {'map-key': 'map-value'}, + ] + }; + + for (final entry in dataByType.entries) { + final responseType = entry.key; + + for (final data in entry.value) { + final request = requestOptions.copyWith( + method: 'POST', + data: data, + responseType: responseType, + ); + final throwable = Exception(); + final dioError = DioError( + requestOptions: request, + response: Response( + requestOptions: request, + statusCode: 401, + data: data, + ), + ); + + final sut = fixture.getSut(sendDefaultPii: true); + + final event = SentryEvent( + throwable: throwable, + exceptions: [ + fixture.sentryError(throwable), + fixture.sentryError(dioError) + ], + ); + final processedEvent = sut.apply(event) as SentryEvent; + final capturedResponse = processedEvent.contexts.response; + + expect(capturedResponse, isNotNull); + expect(capturedResponse?.data, data); + } + } + }); }); test('$DioEventProcessor adds chained stacktraces', () { @@ -266,12 +441,18 @@ class Fixture { // ignore: invalid_use_of_internal_member SentryExceptionFactory get exceptionFactory => options.exceptionFactory; - DioEventProcessor getSut({bool sendDefaultPii = false}) { + DioEventProcessor getSut({ + bool sendDefaultPii = false, + bool captureFailedRequests = true, + MaxRequestBodySize maxRequestBodySize = MaxRequestBodySize.always, + MaxResponseBodySize maxResponseBodySize = MaxResponseBodySize.always, + }) { return DioEventProcessor( options ..sendDefaultPii = sendDefaultPii - ..maxRequestBodySize = MaxRequestBodySize.always - ..maxResponseBodySize = MaxResponseBodySize.always, + ..captureFailedRequests = captureFailedRequests + ..maxRequestBodySize = maxRequestBodySize + ..maxResponseBodySize = maxResponseBodySize, ); } @@ -283,3 +464,17 @@ class Fixture { ); } } + +class MaxBodySizeTestConfig { + MaxBodySizeTestConfig( + this.maxBodySize, + this.contentLength, + this.shouldBeIncluded, + ); + + final T maxBodySize; + final int contentLength; + final bool shouldBeIncluded; + + Matcher get matcher => shouldBeIncluded ? isNotNull : isNull; +} diff --git a/file/lib/src/version.dart b/file/lib/src/version.dart index 4f79cf0c55..5b59773228 100644 --- a/file/lib/src/version.dart +++ b/file/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '7.8.0'; +const String sdkVersion = '7.9.0'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_file'; diff --git a/file/pubspec.yaml b/file/pubspec.yaml index e585c11379..d6fcad6e27 100644 --- a/file/pubspec.yaml +++ b/file/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_file description: An integration which adds support for performance tracing for dart.io.File. -version: 7.8.0 +version: 7.9.0 homepage: https://docs.sentry.io/platforms/dart/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues @@ -10,7 +10,7 @@ environment: sdk: '>=2.19.0 <4.0.0' dependencies: - sentry: 7.8.0 + sentry: 7.9.0 meta: ^1.3.0 dev_dependencies: diff --git a/flutter/example/lib/main.dart b/flutter/example/lib/main.dart index 9d02d1ecba..6d657a589e 100644 --- a/flutter/example/lib/main.dart +++ b/flutter/example/lib/main.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'dart:convert'; -import 'dart:io' show Platform; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; diff --git a/flutter/example/pubspec.yaml b/flutter/example/pubspec.yaml index 648b41dd44..7b523385d8 100644 --- a/flutter/example/pubspec.yaml +++ b/flutter/example/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_flutter_example description: Demonstrates how to use the sentry_flutter plugin. -version: 7.8.0 +version: 7.9.0 publish_to: 'none' # Remove this line if you wish to publish to pub.dev diff --git a/flutter/ios/Classes/SentryFlutterPluginApple.swift b/flutter/ios/Classes/SentryFlutterPluginApple.swift index 42f55d3f3b..e5ae1a6c13 100644 --- a/flutter/ios/Classes/SentryFlutterPluginApple.swift +++ b/flutter/ios/Classes/SentryFlutterPluginApple.swift @@ -384,6 +384,10 @@ public class SentryFlutterPluginApple: NSObject, FlutterPlugin { if let enableAppHangTracking = arguments["enableAppHangTracking"] as? Bool { options.enableAppHangTracking = enableAppHangTracking } + + if let appHangTimeoutIntervalMillis = arguments["appHangTimeoutIntervalMillis"] as? UInt { + options.appHangTimeoutInterval = TimeInterval(appHangTimeoutIntervalMillis) / 1000 + } } private func logLevelFrom(diagnosticLevel: String) -> SentryLevel { diff --git a/flutter/lib/src/integrations/flutter_error_integration.dart b/flutter/lib/src/integrations/flutter_error_integration.dart index a9f10bcc09..03f8436bf9 100644 --- a/flutter/lib/src/integrations/flutter_error_integration.dart +++ b/flutter/lib/src/integrations/flutter_error_integration.dart @@ -54,11 +54,8 @@ class FlutterErrorIntegration implements Integration { stackTrace: errorDetails.stack, ); - // FlutterError doesn't crash the App. - final mechanism = Mechanism( - type: 'FlutterError', - handled: true, - ); + // FlutterError doesn't crash the app, but is not handled by the user. + final mechanism = Mechanism(type: 'FlutterError', handled: false); final throwableMechanism = ThrowableMechanism(mechanism, exception); var event = SentryEvent( diff --git a/flutter/lib/src/integrations/native_sdk_integration.dart b/flutter/lib/src/integrations/native_sdk_integration.dart index 89f0c5ada2..9c4a98379e 100644 --- a/flutter/lib/src/integrations/native_sdk_integration.dart +++ b/flutter/lib/src/integrations/native_sdk_integration.dart @@ -51,6 +51,8 @@ class NativeSdkIntegration implements Integration { 'enableAppHangTracking': options.enableAppHangTracking, 'connectionTimeoutMillis': options.connectionTimeout.inMilliseconds, 'readTimeoutMillis': options.readTimeout.inMilliseconds, + 'appHangTimeoutIntervalMillis': + options.appHangTimeoutInterval.inMilliseconds, }); options.sdk.addIntegration('nativeSdkIntegration'); diff --git a/flutter/lib/src/sentry_flutter_options.dart b/flutter/lib/src/sentry_flutter_options.dart index 2f5ccd96d1..a1d7755c3c 100644 --- a/flutter/lib/src/sentry_flutter_options.dart +++ b/flutter/lib/src/sentry_flutter_options.dart @@ -195,10 +195,18 @@ class SentryFlutterOptions extends SentryOptions { bool attachViewHierarchy = false; /// When enabled, the SDK tracks when the application stops responding for a - /// specific amount of time (default 2s). + /// specific amount of time, See [appHangTimeoutInterval]. /// Only available on iOS and macOS. bool enableAppHangTracking = true; + /// The minimum amount of time an app should be unresponsive to be classified + /// as an App Hanging. The actual amount may be a little longer. Avoid using + /// values lower than 100ms, which may cause a lot of app hangs events being + /// transmitted. + /// Default to 2s. + /// Only available on iOS and macOS. + Duration appHangTimeoutInterval = Duration(seconds: 2); + /// Connection timeout. This will only be synced to the Android native SDK. Duration connectionTimeout = Duration(seconds: 5); diff --git a/flutter/lib/src/version.dart b/flutter/lib/src/version.dart index 97bb83ee2e..0da840e5b1 100644 --- a/flutter/lib/src/version.dart +++ b/flutter/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '7.8.0'; +const String sdkVersion = '7.9.0'; /// The default SDK name reported to Sentry.io in the submitted events. const String sdkName = 'sentry.dart.flutter'; diff --git a/flutter/pubspec.yaml b/flutter/pubspec.yaml index 110c60a8a3..f49fb9ca53 100644 --- a/flutter/pubspec.yaml +++ b/flutter/pubspec.yaml @@ -1,5 +1,5 @@ name: sentry_flutter -version: 7.8.0 +version: 7.9.0 description: Sentry SDK for Flutter. This package aims to support different Flutter targets by relying on the many platforms supported by Sentry with native SDKs. homepage: https://docs.sentry.io/platforms/flutter/ repository: https://github.com/getsentry/sentry-dart @@ -15,7 +15,7 @@ dependencies: sdk: flutter flutter_web_plugins: sdk: flutter - sentry: 7.8.0 + sentry: 7.9.0 package_info_plus: '>=1.0.0 <5.0.0' meta: ^1.3.0 diff --git a/flutter/test/integrations/flutter_error_integration_test.dart b/flutter/test/integrations/flutter_error_integration_test.dart index 53446caeda..43df8de278 100644 --- a/flutter/test/integrations/flutter_error_integration_test.dart +++ b/flutter/test/integrations/flutter_error_integration_test.dart @@ -70,7 +70,7 @@ void main() { final throwableMechanism = event.throwableMechanism as ThrowableMechanism; expect(throwableMechanism.mechanism.type, 'FlutterError'); - expect(throwableMechanism.mechanism.handled, true); + expect(throwableMechanism.mechanism.handled, false); expect(throwableMechanism.throwable, exception); expect(event.contexts['flutter_error_details']['library'], 'sentry'); @@ -102,7 +102,7 @@ void main() { final throwableMechanism = event.throwableMechanism as ThrowableMechanism; expect(throwableMechanism.mechanism.type, 'FlutterError'); - expect(throwableMechanism.mechanism.handled, true); + expect(throwableMechanism.mechanism.handled, false); expect(event.contexts['flutter_error_details']['library'], 'sentry'); expect(event.contexts['flutter_error_details']['context'], @@ -126,7 +126,7 @@ void main() { final throwableMechanism = event.throwableMechanism as ThrowableMechanism; expect(throwableMechanism.mechanism.type, 'FlutterError'); - expect(throwableMechanism.mechanism.handled, true); + expect(throwableMechanism.mechanism.handled, false); expect(throwableMechanism.mechanism.data['hint'], isNull); expect(event.contexts['flutter_error_details'], isNull); diff --git a/flutter/test/integrations/init_native_sdk_integration_test.dart b/flutter/test/integrations/init_native_sdk_integration_test.dart index ec1e59f94f..4ed6a3d3b9 100644 --- a/flutter/test/integrations/init_native_sdk_integration_test.dart +++ b/flutter/test/integrations/init_native_sdk_integration_test.dart @@ -62,6 +62,7 @@ void main() { 'enableAppHangTracking': true, 'connectionTimeoutMillis': 5000, 'readTimeoutMillis': 5000, + 'appHangTimeoutIntervalMillis': 2000, }); }); @@ -100,7 +101,8 @@ void main() { ..captureFailedRequests = false ..enableAppHangTracking = false ..connectionTimeout = Duration(milliseconds: 9001) - ..readTimeout = Duration(milliseconds: 9002); + ..readTimeout = Duration(milliseconds: 9002) + ..appHangTimeoutInterval = Duration(milliseconds: 9003); options.sdk.addIntegration('foo'); options.sdk.addPackage('bar', '1'); @@ -143,6 +145,7 @@ void main() { 'enableAppHangTracking': false, 'connectionTimeoutMillis': 9001, 'readTimeoutMillis': 9002, + 'appHangTimeoutIntervalMillis': 9003, }); }); diff --git a/logging/lib/src/version.dart b/logging/lib/src/version.dart index f507cad902..3905a5c4dc 100644 --- a/logging/lib/src/version.dart +++ b/logging/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '7.8.0'; +const String sdkVersion = '7.9.0'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_logging'; diff --git a/logging/pubspec.yaml b/logging/pubspec.yaml index c8150b1dce..b964b9d9fd 100644 --- a/logging/pubspec.yaml +++ b/logging/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_logging description: An integration which adds support for recording log from the logging package. -version: 7.8.0 +version: 7.9.0 homepage: https://docs.sentry.io/platforms/dart/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues @@ -11,7 +11,7 @@ environment: dependencies: logging: ^1.0.0 - sentry: 7.8.0 + sentry: 7.9.0 dev_dependencies: lints: ^2.0.0 diff --git a/sqflite/lib/src/version.dart b/sqflite/lib/src/version.dart index 328e77c6bd..67be6e3068 100644 --- a/sqflite/lib/src/version.dart +++ b/sqflite/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '7.8.0'; +const String sdkVersion = '7.9.0'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_sqflite'; diff --git a/sqflite/pubspec.yaml b/sqflite/pubspec.yaml index a04ca6344f..db60eec2a5 100644 --- a/sqflite/pubspec.yaml +++ b/sqflite/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_sqflite description: An integration which adds support for performance tracing for the sqflite package. -version: 7.8.0 +version: 7.9.0 homepage: https://docs.sentry.io/platforms/flutter/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues @@ -10,7 +10,7 @@ environment: flutter: '>=3.3.0' # matching sqflite dependencies: - sentry: 7.8.0 + sentry: 7.9.0 sqflite: ^2.0.0 sqflite_common: ^2.0.0 meta: ^1.3.0 From 3d1d35bc6a9b004918cdc8bbcb0f834721597799 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denis=20Andra=C5=A1ec?= Date: Tue, 22 Aug 2023 08:44:13 +0000 Subject: [PATCH 02/36] Refrain from overwriting the span status for unfinished spans (#1577) --- CHANGELOG.md | 5 ++++- dart/lib/src/sentry_tracer.dart | 9 --------- dart/test/sentry_tracer_test.dart | 22 +++------------------- 3 files changed, 7 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48ec8862bd..4a331f08f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,10 @@ - Mark exceptions not handled by the user as `handled: false` ([#1535](https://github.com/getsentry/sentry-dart/pull/1535)) - This will affect your release health data, and is therefore considered a breaking change. - +- Refrain from overwriting the span status for unfinished spans ([#1577](https://github.com/getsentry/sentry-dart/pull/1577)) + - Older self-hosted sentry instances will drop transactions containing unfinished spans. + - This change was introduced in [relay/#1690](https://github.com/getsentry/relay/pull/1690) and released with [22.12.0](https://github.com/getsentry/relay/releases/tag/22.12.0) + ## 7.9.0 ### Features diff --git a/dart/lib/src/sentry_tracer.dart b/dart/lib/src/sentry_tracer.dart index 2ca82a91ca..30a9eb27d3 100644 --- a/dart/lib/src/sentry_tracer.dart +++ b/dart/lib/src/sentry_tracer.dart @@ -85,15 +85,6 @@ class SentryTracer extends ISentrySpan { _children.removeWhere( (span) => !_hasSpanSuitableTimestamps(span, commonEndTimestamp)); - // finish unfinished spans otherwise transaction gets dropped - final spansToBeFinished = _children.where((span) => !span.finished); - for (final span in spansToBeFinished) { - await span.finish( - status: SpanStatus.deadlineExceeded(), - endTimestamp: commonEndTimestamp, - ); - } - var _rootEndTimestamp = commonEndTimestamp; if (_trimEnd && children.isNotEmpty) { final childEndTimestamps = children diff --git a/dart/test/sentry_tracer_test.dart b/dart/test/sentry_tracer_test.dart index cb9f72fdfc..24649e23b2 100644 --- a/dart/test/sentry_tracer_test.dart +++ b/dart/test/sentry_tracer_test.dart @@ -68,24 +68,7 @@ void main() { expect(sut.endTimestamp, endTimestamp); }); - test( - 'tracer finish sets given end timestamp to all children while finishing them', - () async { - final sut = fixture.getSut(); - - final childA = sut.startChild('operation-a', description: 'description'); - final childB = sut.startChild('operation-b', description: 'description'); - final endTimestamp = getUtcDateTime(); - - await sut.finish(endTimestamp: endTimestamp); - await childA.finish(); - await childB.finish(); - - expect(childA.endTimestamp, endTimestamp); - expect(childB.endTimestamp, endTimestamp); - }); - - test('tracer finishes unfinished spans', () async { + test('tracer does not finish unfinished spans', () async { final sut = fixture.getSut(); sut.startChild('child'); @@ -94,7 +77,8 @@ void main() { final tr = fixture.hub.captureTransactionCalls.first; final child = tr.transaction.spans.first; - expect(child.status.toString(), 'deadline_exceeded'); + expect(child.status, isNull); + expect(child.endTimestamp, isNull); }); test('tracer sets data to extra', () async { From 852a85e686a9a75f042cbf27d5c7c47ed7589213 Mon Sep 17 00:00:00 2001 From: Denis Andrasec Date: Tue, 29 Aug 2023 16:55:37 +0200 Subject: [PATCH 03/36] update changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a4614ef7ec..97c8fc88d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,8 @@ - Refrain from overwriting the span status for unfinished spans ([#1577](https://github.com/getsentry/sentry-dart/pull/1577)) - Older self-hosted sentry instances will drop transactions containing unfinished spans. - This change was introduced in [relay/#1690](https://github.com/getsentry/relay/pull/1690) and released with [22.12.0](https://github.com/getsentry/relay/releases/tag/22.12.0) - -## 7.9.0 + +## Unreleased ### Fixes From c59de474e74a39ae990c1f3eee4794b4488c3edf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denis=20Andra=C5=A1ec?= Date: Mon, 4 Sep 2023 07:52:32 +0000 Subject: [PATCH 04/36] Do not leak extensions of external classes (#1576) --- CHANGELOG.md | 1 + .../src/client_reports/discard_reason.dart | 21 -------- .../src/client_reports/discarded_event.dart | 48 ++++++++++++++++++- .../http_client/failed_request_client.dart | 4 +- dart/lib/src/protocol/sentry_request.dart | 9 ++-- dart/lib/src/protocol/sentry_response.dart | 10 ++-- dart/lib/src/transport/data_category.dart | 43 ----------------- dart/lib/src/transport/rate_limit_parser.dart | 25 +++++++++- dart/lib/src/utils/http_sanitizer.dart | 3 +- dart/lib/src/utils/isolate_utils.dart | 3 ++ dart/lib/src/utils/iterable_extension.dart | 8 ---- dart/lib/src/utils/iterable_utils.dart | 17 +++++++ dart/test/sentry_client_test.dart | 7 ++- dart/test/utils/http_sanitizer_test.dart | 2 +- dio/lib/src/failed_request_interceptor.dart | 4 +- .../sentry_user_interaction_widget.dart | 3 +- .../view_hierarchy/sentry_tree_walker.dart | 2 +- flutter/lib/src/widget_utils.dart | 10 ++-- 18 files changed, 124 insertions(+), 96 deletions(-) delete mode 100644 dart/lib/src/utils/iterable_extension.dart create mode 100644 dart/lib/src/utils/iterable_utils.dart diff --git a/CHANGELOG.md b/CHANGELOG.md index 97c8fc88d7..18b276958e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ - Refrain from overwriting the span status for unfinished spans ([#1577](https://github.com/getsentry/sentry-dart/pull/1577)) - Older self-hosted sentry instances will drop transactions containing unfinished spans. - This change was introduced in [relay/#1690](https://github.com/getsentry/relay/pull/1690) and released with [22.12.0](https://github.com/getsentry/relay/releases/tag/22.12.0) +- Do not leak extensions of external classes ([#1576](https://github.com/getsentry/sentry-dart/pull/1576)) ## Unreleased diff --git a/dart/lib/src/client_reports/discard_reason.dart b/dart/lib/src/client_reports/discard_reason.dart index 1b990f8dd2..81c3a45dd0 100644 --- a/dart/lib/src/client_reports/discard_reason.dart +++ b/dart/lib/src/client_reports/discard_reason.dart @@ -12,24 +12,3 @@ enum DiscardReason { cacheOverflow, rateLimitBackoff, } - -extension OutcomeExtension on DiscardReason { - String toStringValue() { - switch (this) { - case DiscardReason.beforeSend: - return 'before_send'; - case DiscardReason.eventProcessor: - return 'event_processor'; - case DiscardReason.sampleRate: - return 'sample_rate'; - case DiscardReason.networkError: - return 'network_error'; - case DiscardReason.queueOverflow: - return 'queue_overflow'; - case DiscardReason.cacheOverflow: - return 'cache_overflow'; - case DiscardReason.rateLimitBackoff: - return 'ratelimit_backoff'; - } - } -} diff --git a/dart/lib/src/client_reports/discarded_event.dart b/dart/lib/src/client_reports/discarded_event.dart index 0b989aa4cf..1e216804c3 100644 --- a/dart/lib/src/client_reports/discarded_event.dart +++ b/dart/lib/src/client_reports/discarded_event.dart @@ -13,9 +13,53 @@ class DiscardedEvent { Map toJson() { return { - 'reason': reason.toStringValue(), - 'category': category.toStringValue(), + 'reason': reason._toStringValue(), + 'category': category._toStringValue(), 'quantity': quantity, }; } } + +extension _OutcomeExtension on DiscardReason { + String _toStringValue() { + switch (this) { + case DiscardReason.beforeSend: + return 'before_send'; + case DiscardReason.eventProcessor: + return 'event_processor'; + case DiscardReason.sampleRate: + return 'sample_rate'; + case DiscardReason.networkError: + return 'network_error'; + case DiscardReason.queueOverflow: + return 'queue_overflow'; + case DiscardReason.cacheOverflow: + return 'cache_overflow'; + case DiscardReason.rateLimitBackoff: + return 'ratelimit_backoff'; + } + } +} + +extension _DataCategoryExtension on DataCategory { + String _toStringValue() { + switch (this) { + case DataCategory.all: + return '__all__'; + case DataCategory.dataCategoryDefault: + return 'default'; + case DataCategory.error: + return 'error'; + case DataCategory.session: + return 'session'; + case DataCategory.transaction: + return 'transaction'; + case DataCategory.attachment: + return 'attachment'; + case DataCategory.security: + return 'security'; + case DataCategory.unknown: + return 'unknown'; + } + } +} diff --git a/dart/lib/src/http_client/failed_request_client.dart b/dart/lib/src/http_client/failed_request_client.dart index 98df59194f..d86be0328a 100644 --- a/dart/lib/src/http_client/failed_request_client.dart +++ b/dart/lib/src/http_client/failed_request_client.dart @@ -135,7 +135,7 @@ class FailedRequestClient extends BaseClient { // Only check `failedRequestStatusCodes` & `failedRequestTargets` if no exception was thrown. if (exception == null) { - if (!failedRequestStatusCodes.containsStatusCode(statusCode)) { + if (!failedRequestStatusCodes._containsStatusCode(statusCode)) { return; } if (!containsTargetOrMatchesRegExp( @@ -246,7 +246,7 @@ class FailedRequestClient extends BaseClient { } extension _ListX on List { - bool containsStatusCode(int? statusCode) { + bool _containsStatusCode(int? statusCode) { if (statusCode == null) { return false; } diff --git a/dart/lib/src/protocol/sentry_request.dart b/dart/lib/src/protocol/sentry_request.dart index 9689c8a974..b5ee7d003c 100644 --- a/dart/lib/src/protocol/sentry_request.dart +++ b/dart/lib/src/protocol/sentry_request.dart @@ -1,6 +1,6 @@ import 'package:meta/meta.dart'; -import '../utils/iterable_extension.dart'; +import '../utils/iterable_utils.dart'; import '../utils/http_sanitizer.dart'; /// The Request interface contains information on a HTTP request related to the event. @@ -85,9 +85,10 @@ class SentryRequest { _headers = headers != null ? Map.from(headers) : null, // Look for a 'Set-Cookie' header (case insensitive) if not given. cookies = cookies ?? - headers?.entries - .firstWhereOrNull((e) => e.key.toLowerCase() == 'cookie') - ?.value, + IterableUtils.firstWhereOrNull( + headers?.entries, + (MapEntry e) => e.key.toLowerCase() == 'cookie', + )?.value, _env = env != null ? Map.from(env) : null, _other = other != null ? Map.from(other) : null; diff --git a/dart/lib/src/protocol/sentry_response.dart b/dart/lib/src/protocol/sentry_response.dart index 91faaa37eb..6008ea8730 100644 --- a/dart/lib/src/protocol/sentry_response.dart +++ b/dart/lib/src/protocol/sentry_response.dart @@ -1,6 +1,6 @@ import 'package:meta/meta.dart'; import 'contexts.dart'; -import '../utils/iterable_extension.dart'; +import '../utils/iterable_utils.dart'; /// The response interface contains information on a HTTP request related to the event. @immutable @@ -53,9 +53,11 @@ class SentryResponse { _headers = headers != null ? Map.from(headers) : null, // Look for a 'Set-Cookie' header (case insensitive) if not given. cookies = cookies ?? - headers?.entries - .firstWhereOrNull((e) => e.key.toLowerCase() == 'set-cookie') - ?.value; + IterableUtils.firstWhereOrNull( + headers?.entries, + (MapEntry e) => + e.key.toLowerCase() == 'set-cookie', + )?.value; /// Deserializes a [SentryResponse] from JSON [Map]. factory SentryResponse.fromJson(Map json) { diff --git a/dart/lib/src/transport/data_category.dart b/dart/lib/src/transport/data_category.dart index 1843acfacb..38340e2630 100644 --- a/dart/lib/src/transport/data_category.dart +++ b/dart/lib/src/transport/data_category.dart @@ -9,46 +9,3 @@ enum DataCategory { security, unknown } - -extension DataCategoryExtension on DataCategory { - static DataCategory fromStringValue(String stringValue) { - switch (stringValue) { - case '__all__': - return DataCategory.all; - case 'default': - return DataCategory.dataCategoryDefault; - case 'error': - return DataCategory.error; - case 'session': - return DataCategory.session; - case 'transaction': - return DataCategory.transaction; - case 'attachment': - return DataCategory.attachment; - case 'security': - return DataCategory.security; - } - return DataCategory.unknown; - } - - String toStringValue() { - switch (this) { - case DataCategory.all: - return '__all__'; - case DataCategory.dataCategoryDefault: - return 'default'; - case DataCategory.error: - return 'error'; - case DataCategory.session: - return 'session'; - case DataCategory.transaction: - return 'transaction'; - case DataCategory.attachment: - return 'attachment'; - case DataCategory.security: - return 'security'; - case DataCategory.unknown: - return 'unknown'; - } - } -} diff --git a/dart/lib/src/transport/rate_limit_parser.dart b/dart/lib/src/transport/rate_limit_parser.dart index 63f4f179d1..a7ddadc52c 100644 --- a/dart/lib/src/transport/rate_limit_parser.dart +++ b/dart/lib/src/transport/rate_limit_parser.dart @@ -29,7 +29,8 @@ class RateLimitParser { if (allCategories.isNotEmpty) { final categoryValues = allCategories.split(';'); for (final categoryValue in categoryValues) { - final category = DataCategoryExtension.fromStringValue(categoryValue); + final category = + _DataCategoryExtension._fromStringValue(categoryValue); if (category != DataCategory.unknown) { rateLimits.add(RateLimit(category, duration)); } @@ -56,3 +57,25 @@ class RateLimitParser { } } } + +extension _DataCategoryExtension on DataCategory { + static DataCategory _fromStringValue(String stringValue) { + switch (stringValue) { + case '__all__': + return DataCategory.all; + case 'default': + return DataCategory.dataCategoryDefault; + case 'error': + return DataCategory.error; + case 'session': + return DataCategory.session; + case 'transaction': + return DataCategory.transaction; + case 'attachment': + return DataCategory.attachment; + case 'security': + return DataCategory.security; + } + return DataCategory.unknown; + } +} diff --git a/dart/lib/src/utils/http_sanitizer.dart b/dart/lib/src/utils/http_sanitizer.dart index c131cc0c4e..2e5de505a9 100644 --- a/dart/lib/src/utils/http_sanitizer.dart +++ b/dart/lib/src/utils/http_sanitizer.dart @@ -60,7 +60,7 @@ class HttpSanitizer { } } -extension UriPath on Uri { +extension _UriPath on Uri { String _urlWithRedactedAuth() { var buffer = ''; if (scheme.isNotEmpty) { @@ -78,6 +78,7 @@ extension UriPath on Uri { } } +@internal extension SanitizedSentryRequest on SentryRequest { SentryRequest sanitized() { final urlDetails = HttpSanitizer.sanitizeUrl(url) ?? UrlDetails(); diff --git a/dart/lib/src/utils/isolate_utils.dart b/dart/lib/src/utils/isolate_utils.dart index ce523b0d63..3e9c4b20bc 100644 --- a/dart/lib/src/utils/isolate_utils.dart +++ b/dart/lib/src/utils/isolate_utils.dart @@ -1,4 +1,7 @@ +import 'package:meta/meta.dart'; + import '_io_get_isolate_name.dart' if (dart.library.html) '_web_get_isolate_name.dart' as isolate_getter; +@internal String? getIsolateName() => isolate_getter.getIsolateName(); diff --git a/dart/lib/src/utils/iterable_extension.dart b/dart/lib/src/utils/iterable_extension.dart deleted file mode 100644 index 34c2c60943..0000000000 --- a/dart/lib/src/utils/iterable_extension.dart +++ /dev/null @@ -1,8 +0,0 @@ -extension IterableExtension on Iterable { - T? firstWhereOrNull(bool Function(T item) predicate) { - for (var item in this) { - if (predicate(item)) return item; - } - return null; - } -} diff --git a/dart/lib/src/utils/iterable_utils.dart b/dart/lib/src/utils/iterable_utils.dart new file mode 100644 index 0000000000..c2fb5e5c69 --- /dev/null +++ b/dart/lib/src/utils/iterable_utils.dart @@ -0,0 +1,17 @@ +import 'package:meta/meta.dart'; + +@internal +class IterableUtils { + static T? firstWhereOrNull( + Iterable? iterable, + bool Function(T item) test, + ) { + if (iterable == null) { + return null; + } + for (var item in iterable) { + if (test(item)) return item; + } + return null; + } +} diff --git a/dart/test/sentry_client_test.dart b/dart/test/sentry_client_test.dart index 484dd009a5..5d1c543c00 100644 --- a/dart/test/sentry_client_test.dart +++ b/dart/test/sentry_client_test.dart @@ -12,6 +12,7 @@ import 'package:sentry/src/sentry_item_type.dart'; import 'package:sentry/src/sentry_stack_trace_factory.dart'; import 'package:sentry/src/sentry_tracer.dart'; import 'package:sentry/src/transport/data_category.dart'; +import 'package:sentry/src/utils/iterable_utils.dart'; import 'package:test/test.dart'; import 'mocks.dart'; @@ -1426,8 +1427,10 @@ void main() { await sut.captureEvent(fakeEvent, hint: hint); final capturedEnvelope = (fixture.transport).envelopes.first; - final attachmentItem = capturedEnvelope.items.firstWhereOrNull( - (element) => element.header.type == SentryItemType.attachment); + final attachmentItem = IterableUtils.firstWhereOrNull( + capturedEnvelope.items, + (SentryEnvelopeItem e) => e.header.type == SentryItemType.attachment, + ); expect(attachmentItem?.header.attachmentType, SentryAttachment.typeAttachmentDefault); }); diff --git a/dart/test/utils/http_sanitizer_test.dart b/dart/test/utils/http_sanitizer_test.dart index f9967c2778..2a4e0a58be 100644 --- a/dart/test/utils/http_sanitizer_test.dart +++ b/dart/test/utils/http_sanitizer_test.dart @@ -182,7 +182,7 @@ void main() { }); } -extension StringExtension on String { +extension _StringExtension on String { String _capitalize() { return "${this[0].toUpperCase()}${substring(1).toLowerCase()}"; } diff --git a/dio/lib/src/failed_request_interceptor.dart b/dio/lib/src/failed_request_interceptor.dart index 60ea4a0133..ecdd8ab2fa 100644 --- a/dio/lib/src/failed_request_interceptor.dart +++ b/dio/lib/src/failed_request_interceptor.dart @@ -27,7 +27,7 @@ class FailedRequestInterceptor extends Interceptor { final captureFailedRequests = _hub.options.captureFailedRequests; final containsStatusCode = - _failedRequestStatusCodes.containsStatusCode(err.response?.statusCode); + _failedRequestStatusCodes._containsStatusCode(err.response?.statusCode); final containsRequestTarget = containsTargetOrMatchesRegExp( _failedRequestTargets, err.requestOptions.path, @@ -46,7 +46,7 @@ class FailedRequestInterceptor extends Interceptor { } extension _ListX on List { - bool containsStatusCode(int? statusCode) { + bool _containsStatusCode(int? statusCode) { if (statusCode == null) { return false; } diff --git a/flutter/lib/src/user_interaction/sentry_user_interaction_widget.dart b/flutter/lib/src/user_interaction/sentry_user_interaction_widget.dart index f98a919065..46b25e5cb3 100644 --- a/flutter/lib/src/user_interaction/sentry_user_interaction_widget.dart +++ b/flutter/lib/src/user_interaction/sentry_user_interaction_widget.dart @@ -313,7 +313,8 @@ class _SentryUserInteractionWidgetState void _onTappedAt(Offset position) { final tappedWidget = _getElementAt(position); - final keyValue = tappedWidget?.element.widget.key?.toStringValue(); + final keyValue = + WidgetUtils.toStringValue(tappedWidget?.element.widget.key); if (tappedWidget == null || keyValue == null) { return; } diff --git a/flutter/lib/src/view_hierarchy/sentry_tree_walker.dart b/flutter/lib/src/view_hierarchy/sentry_tree_walker.dart index 2a85bf49be..41b03f4808 100644 --- a/flutter/lib/src/view_hierarchy/sentry_tree_walker.dart +++ b/flutter/lib/src/view_hierarchy/sentry_tree_walker.dart @@ -281,7 +281,7 @@ class _TreeWalker { return SentryViewHierarchyElement( element.widget.runtimeType.toString(), depth: element.depth, - identifier: element.widget.key?.toStringValue(), + identifier: WidgetUtils.toStringValue(element.widget.key), width: width, height: height, x: x, diff --git a/flutter/lib/src/widget_utils.dart b/flutter/lib/src/widget_utils.dart index 9d63b8d5a3..97d51a990a 100644 --- a/flutter/lib/src/widget_utils.dart +++ b/flutter/lib/src/widget_utils.dart @@ -1,8 +1,12 @@ import 'package:flutter/widgets.dart'; +import 'package:meta/meta.dart'; -extension WidgetExtension on Key { - String? toStringValue() { - final key = this; +@internal +class WidgetUtils { + static String? toStringValue(Key? key) { + if (key == null) { + return null; + } if (key is ValueKey) { return key.value; } else if (key is ValueKey) { From 052a368019662005faa1b81e57a693428e714308 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denis=20Andra=C5=A1ec?= Date: Mon, 4 Sep 2023 08:21:38 +0000 Subject: [PATCH 05/36] Make `hint` non-nullable in `BeforeSendCallback`, `BeforeBreadcrumbCall` and `EventProcessor` (#1574) --- CHANGELOG.md | 4 +- dart/example/bin/example.dart | 2 +- dart/example_web/web/main.dart | 2 +- dart/lib/src/event_processor.dart | 6 +- .../deduplication_event_processor.dart | 2 +- .../enricher/io_enricher_event_processor.dart | 2 +- .../web_enricher_event_processor.dart | 2 +- .../io_exception_event_processor.dart | 2 +- .../web_exception_event_processor.dart | 2 +- dart/lib/src/hint.dart | 8 +-- dart/lib/src/scope.dart | 16 ++--- dart/lib/src/sentry_client.dart | 29 ++++---- dart/lib/src/sentry_options.dart | 12 ++-- .../deduplication_event_processor_test.dart | 24 +++---- .../enricher/io_enricher_test.dart | 20 +++--- .../enricher/web_enricher_test.dart | 22 +++--- .../io_exception_event_processor_test.dart | 4 ++ .../failed_request_client_test.dart | 2 +- dart/test/mocks.dart | 10 +-- dart/test/scope_test.dart | 68 ++++++++++++------- dart/test/sentry_client_test.dart | 29 ++++---- dio/lib/src/dio_event_processor.dart | 2 +- dio/test/dio_event_processor_test.dart | 46 ++++++------- dio/test/failed_request_interceptor_test.dart | 2 +- dio/test/mocks.dart | 16 ++--- .../integration_test/integration_test.dart | 2 +- ...id_platform_exception_event_processor.dart | 2 +- .../flutter_enricher_event_processor.dart | 6 +- .../flutter_exception_event_processor.dart | 2 +- .../native_app_start_event_processor.dart | 2 +- .../platform_exception_event_processor.dart | 2 +- .../screenshot_event_processor.dart | 4 +- .../load_contexts_integration.dart | 2 +- .../load_image_list_integration.dart | 2 +- .../view_hierarchy_event_processor.dart | 6 +- ...atform_exception_event_processor_test.dart | 23 ++++--- ...flutter_enricher_event_processor_test.dart | 28 ++++---- ...lutter_exception_event_processor_test.dart | 1 + ...atform_exception_event_processor_test.dart | 4 +- .../screenshot_event_processor_test.dart | 2 +- .../load_contexts_integration_test.dart | 6 +- .../load_contexts_integrations_test.dart | 49 +++++++------ .../integrations/load_image_list_test.dart | 4 +- .../native_app_start_integration_test.dart | 18 +++-- flutter/test/load_image_list_test.dart | 4 +- .../view_hierarchy_event_processor_test.dart | 8 +-- sqflite/test/mocks/mocks.dart | 2 +- 47 files changed, 279 insertions(+), 234 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 18b276958e..c38892c7c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,9 @@ - Older self-hosted sentry instances will drop transactions containing unfinished spans. - This change was introduced in [relay/#1690](https://github.com/getsentry/relay/pull/1690) and released with [22.12.0](https://github.com/getsentry/relay/releases/tag/22.12.0) - Do not leak extensions of external classes ([#1576](https://github.com/getsentry/sentry-dart/pull/1576)) - +- Make `hint` non-nullable in `BeforeSendCallback`, `BeforeBreadcrumbCall` and `EventProcessor` ([#1574](https://github.com/getsentry/sentry-dart/pull/1574)) + - This will affect your callbacks, making this a breaking change. + ## Unreleased ### Fixes diff --git a/dart/example/bin/example.dart b/dart/example/bin/example.dart index 5163f341f7..d7530f5874 100644 --- a/dart/example/bin/example.dart +++ b/dart/example/bin/example.dart @@ -104,7 +104,7 @@ Future decode() async { class TagEventProcessor implements EventProcessor { @override - SentryEvent? apply(SentryEvent event, {hint}) { + SentryEvent? apply(SentryEvent event, hint) { return event..tags?.addAll({'page-locale': 'en-us'}); } } diff --git a/dart/example_web/web/main.dart b/dart/example_web/web/main.dart index c396be5e83..3034effe9b 100644 --- a/dart/example_web/web/main.dart +++ b/dart/example_web/web/main.dart @@ -129,7 +129,7 @@ Future parseData() async { class TagEventProcessor implements EventProcessor { @override - SentryEvent? apply(SentryEvent event, {hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { return event..tags?.addAll({'page-locale': 'en-us'}); } } diff --git a/dart/lib/src/event_processor.dart b/dart/lib/src/event_processor.dart index 94fcd77fd8..45005d7b0e 100644 --- a/dart/lib/src/event_processor.dart +++ b/dart/lib/src/event_processor.dart @@ -8,7 +8,7 @@ import 'protocol.dart'; /// null in case the event will be dropped and not sent. abstract class EventProcessor { FutureOr apply( - SentryEvent event, { - Hint? hint, - }); + SentryEvent event, + Hint hint, + ); } diff --git a/dart/lib/src/event_processor/deduplication_event_processor.dart b/dart/lib/src/event_processor/deduplication_event_processor.dart index 5c3bd4606e..8706082cf5 100644 --- a/dart/lib/src/event_processor/deduplication_event_processor.dart +++ b/dart/lib/src/event_processor/deduplication_event_processor.dart @@ -26,7 +26,7 @@ class DeduplicationEventProcessor implements EventProcessor { final SentryOptions _options; @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { if (event is SentryTransaction) { return event; } diff --git a/dart/lib/src/event_processor/enricher/io_enricher_event_processor.dart b/dart/lib/src/event_processor/enricher/io_enricher_event_processor.dart index 03623d7f0b..93d2514bfa 100644 --- a/dart/lib/src/event_processor/enricher/io_enricher_event_processor.dart +++ b/dart/lib/src/event_processor/enricher/io_enricher_event_processor.dart @@ -18,7 +18,7 @@ class IoEnricherEventProcessor implements EnricherEventProcessor { final SentryOptions _options; @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { // If there's a native integration available, it probably has better // information available than Flutter. diff --git a/dart/lib/src/event_processor/enricher/web_enricher_event_processor.dart b/dart/lib/src/event_processor/enricher/web_enricher_event_processor.dart index fe2684d593..4c992b966d 100644 --- a/dart/lib/src/event_processor/enricher/web_enricher_event_processor.dart +++ b/dart/lib/src/event_processor/enricher/web_enricher_event_processor.dart @@ -21,7 +21,7 @@ class WebEnricherEventProcessor implements EnricherEventProcessor { final SentryOptions _options; @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { // Web has no native integration, so no need to check for it final contexts = event.contexts.copyWith( diff --git a/dart/lib/src/event_processor/exception/io_exception_event_processor.dart b/dart/lib/src/event_processor/exception/io_exception_event_processor.dart index 0f7763f35e..bb4049c00e 100644 --- a/dart/lib/src/event_processor/exception/io_exception_event_processor.dart +++ b/dart/lib/src/event_processor/exception/io_exception_event_processor.dart @@ -14,7 +14,7 @@ class IoExceptionEventProcessor implements ExceptionEventProcessor { final SentryOptions _options; @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { final throwable = event.throwable; if (throwable is HttpException) { return _applyHttpException(throwable, event); diff --git a/dart/lib/src/event_processor/exception/web_exception_event_processor.dart b/dart/lib/src/event_processor/exception/web_exception_event_processor.dart index ad57c9f5c2..6ce3be0fe0 100644 --- a/dart/lib/src/event_processor/exception/web_exception_event_processor.dart +++ b/dart/lib/src/event_processor/exception/web_exception_event_processor.dart @@ -8,5 +8,5 @@ ExceptionEventProcessor exceptionEventProcessor(SentryOptions _) => class WebExcptionEventProcessor implements ExceptionEventProcessor { @override - SentryEvent apply(SentryEvent event, {Hint? hint}) => event; + SentryEvent apply(SentryEvent event, Hint hint) => event; } diff --git a/dart/lib/src/hint.dart b/dart/lib/src/hint.dart index 87620d7ba1..f14f69d5dc 100644 --- a/dart/lib/src/hint.dart +++ b/dart/lib/src/hint.dart @@ -11,8 +11,8 @@ import 'sentry_attachment/sentry_attachment.dart'; /// Example: /// /// ```dart -/// options.beforeSend = (event, {hint}) { -/// final syntheticException = hint?.get(TypeCheckHint.syntheticException); +/// options.beforeSend = (event, hint) { +/// final syntheticException = hint.get(TypeCheckHint.syntheticException); /// if (syntheticException is FlutterErrorDetails) { /// // Do something with hint data /// } @@ -28,14 +28,14 @@ import 'sentry_attachment/sentry_attachment.dart'; /// ```dart /// import 'dart:convert'; /// -/// options.beforeSend = (event, {hint}) { +/// options.beforeSend = (event, hint) { /// final text = 'This event should not be sent happen in prod. Investigate.'; /// final textAttachment = SentryAttachment.fromIntList( /// utf8.encode(text), /// 'event_info.txt', /// contentType: 'text/plain', /// ); -/// hint?.attachments.add(textAttachment); +/// hint.attachments.add(textAttachment); /// return event; /// }; /// ``` diff --git a/dart/lib/src/scope.dart b/dart/lib/src/scope.dart index f9cb3796aa..bbe8bb54d5 100644 --- a/dart/lib/src/scope.dart +++ b/dart/lib/src/scope.dart @@ -143,7 +143,7 @@ class Scope { Scope(this._options); - Breadcrumb? _addBreadCrumbSync(Breadcrumb breadcrumb, {Hint? hint}) { + Breadcrumb? _addBreadCrumbSync(Breadcrumb breadcrumb, Hint hint) { // bail out if maxBreadcrumbs is zero if (_options.maxBreadcrumbs == 0) { return null; @@ -155,7 +155,7 @@ class Scope { try { processedBreadcrumb = _options.beforeBreadcrumb!( processedBreadcrumb, - hint: hint, + hint, ); if (processedBreadcrumb == null) { _options.logger( @@ -189,7 +189,7 @@ class Scope { /// Adds a breadcrumb to the breadcrumbs queue Future addBreadcrumb(Breadcrumb breadcrumb, {Hint? hint}) async { - final addedBreadcrumb = _addBreadCrumbSync(breadcrumb, hint: hint); + final addedBreadcrumb = _addBreadCrumbSync(breadcrumb, hint ?? Hint()); if (addedBreadcrumb != null) { await _callScopeObservers((scopeObserver) async => await scopeObserver.addBreadcrumb(addedBreadcrumb)); @@ -275,9 +275,9 @@ class Scope { } Future applyToEvent( - SentryEvent event, { - Hint? hint, - }) async { + SentryEvent event, + Hint hint, + ) async { event = event.copyWith( transaction: event.transaction ?? transaction, user: _mergeUsers(user, event.user), @@ -320,7 +320,7 @@ class Scope { SentryEvent? processedEvent = event; for (final processor in _eventProcessors) { try { - final e = processor.apply(processedEvent!, hint: hint); + final e = processor.apply(processedEvent!, hint); if (e is Future) { processedEvent = await e; } else { @@ -429,7 +429,7 @@ class Scope { } for (final breadcrumb in List.from(_breadcrumbs)) { - clone._addBreadCrumbSync(breadcrumb); + clone._addBreadCrumbSync(breadcrumb, Hint()); } for (final eventProcessor in List.from(_eventProcessors)) { diff --git a/dart/lib/src/sentry_client.dart b/dart/lib/src/sentry_client.dart index 09f98e4d02..5821ae6f63 100644 --- a/dart/lib/src/sentry_client.dart +++ b/dart/lib/src/sentry_client.dart @@ -76,7 +76,7 @@ class SentryClient { hint ??= Hint(); if (scope != null) { - preparedEvent = await scope.applyToEvent(preparedEvent, hint: hint); + preparedEvent = await scope.applyToEvent(preparedEvent, hint); } else { _options.logger( SentryLevel.debug, 'No scope to apply on event was provided'); @@ -89,8 +89,8 @@ class SentryClient { preparedEvent = await _runEventProcessors( preparedEvent, + hint, eventProcessors: _options.eventProcessors, - hint: hint, ); // dropped by event processors @@ -100,7 +100,7 @@ class SentryClient { preparedEvent = await _runBeforeSend( preparedEvent, - hint: hint, + hint, ); // dropped by beforeSend @@ -288,9 +288,11 @@ class SentryClient { SentryTransaction? preparedTransaction = _prepareEvent(transaction) as SentryTransaction; + final hint = Hint(); + if (scope != null) { - preparedTransaction = - await scope.applyToEvent(preparedTransaction) as SentryTransaction?; + preparedTransaction = await scope.applyToEvent(preparedTransaction, hint) + as SentryTransaction?; } else { _options.logger( SentryLevel.debug, 'No scope to apply on transaction was provided'); @@ -303,6 +305,7 @@ class SentryClient { preparedTransaction = await _runEventProcessors( preparedTransaction, + hint, eventProcessors: _options.eventProcessors, ) as SentryTransaction?; @@ -312,7 +315,7 @@ class SentryClient { } preparedTransaction = - await _runBeforeSend(preparedTransaction) as SentryTransaction?; + await _runBeforeSend(preparedTransaction, hint) as SentryTransaction?; // dropped by beforeSendTransaction if (preparedTransaction == null) { @@ -354,9 +357,9 @@ class SentryClient { void close() => _options.httpClient.close(); Future _runBeforeSend( - SentryEvent event, { - Hint? hint, - }) async { + SentryEvent event, + Hint hint, + ) async { SentryEvent? eventOrTransaction = event; final beforeSend = _options.beforeSend; @@ -373,7 +376,7 @@ class SentryClient { eventOrTransaction = e; } } else if (beforeSend != null) { - final e = beforeSend(event, hint: hint); + final e = beforeSend(event, hint); if (e is Future) { eventOrTransaction = await e; } else { @@ -404,14 +407,14 @@ class SentryClient { } Future _runEventProcessors( - SentryEvent event, { - Hint? hint, + SentryEvent event, + Hint hint, { required List eventProcessors, }) async { SentryEvent? processedEvent = event; for (final processor in eventProcessors) { try { - final e = processor.apply(processedEvent!, hint: hint); + final e = processor.apply(processedEvent!, hint); if (e is Future) { processedEvent = await e; } else { diff --git a/dart/lib/src/sentry_options.dart b/dart/lib/src/sentry_options.dart index 55450be9dd..37f7dc01e9 100644 --- a/dart/lib/src/sentry_options.dart +++ b/dart/lib/src/sentry_options.dart @@ -444,9 +444,9 @@ class SentryOptions { /// This function is called with an SDK specific event object and can return a modified event /// object or nothing to skip reporting the event typedef BeforeSendCallback = FutureOr Function( - SentryEvent event, { - Hint? hint, -}); + SentryEvent event, + Hint hint, +); /// This function is called with an SDK specific transaction object and can return a modified transaction /// object or nothing to skip reporting the transaction @@ -457,9 +457,9 @@ typedef BeforeSendTransactionCallback = FutureOr Function( /// This function is called with an SDK specific breadcrumb object before the breadcrumb is added /// to the scope. When nothing is returned from the function, the breadcrumb is dropped typedef BeforeBreadcrumbCallback = Breadcrumb? Function( - Breadcrumb? breadcrumb, { - Hint? hint, -}); + Breadcrumb? breadcrumb, + Hint hint, +); /// Used to provide timestamp for logging. typedef ClockProvider = DateTime Function(); diff --git a/dart/test/event_processor/deduplication_event_processor_test.dart b/dart/test/event_processor/deduplication_event_processor_test.dart index 47540cf035..4ced85c113 100644 --- a/dart/test/event_processor/deduplication_event_processor_test.dart +++ b/dart/test/event_processor/deduplication_event_processor_test.dart @@ -15,16 +15,16 @@ void main() { final sut = fixture.getSut(true); var ogEvent = _createEvent('foo'); - expect(sut.apply(ogEvent), isNotNull); - expect(sut.apply(ogEvent), isNull); + expect(sut.apply(ogEvent, Hint()), isNotNull); + expect(sut.apply(ogEvent, Hint()), isNull); }); test('does not deduplicate if disabled', () { final sut = fixture.getSut(false); var ogEvent = _createEvent('foo'); - expect(sut.apply(ogEvent), isNotNull); - expect(sut.apply(ogEvent), isNotNull); + expect(sut.apply(ogEvent, Hint()), isNotNull); + expect(sut.apply(ogEvent, Hint()), isNotNull); }); test('does not deduplicate if different events', () { @@ -32,16 +32,16 @@ void main() { var fooEvent = _createEvent('foo'); var barEvent = _createEvent('bar'); - expect(sut.apply(fooEvent), isNotNull); - expect(sut.apply(barEvent), isNotNull); + expect(sut.apply(fooEvent, Hint()), isNotNull); + expect(sut.apply(barEvent, Hint()), isNotNull); }); test('does not deduplicate transaction', () { final sut = fixture.getSut(true); final transaction = _createTransaction(fixture.hub); - expect(sut.apply(transaction), isNotNull); - expect(sut.apply(transaction), isNotNull); + expect(sut.apply(transaction, Hint()), isNotNull); + expect(sut.apply(transaction, Hint()), isNotNull); }); test('exceptions to keep for deduplication', () { @@ -51,10 +51,10 @@ void main() { var barEvent = _createEvent('bar'); var fooBarEvent = _createEvent('foo bar'); - expect(sut.apply(fooEvent), isNotNull); - expect(sut.apply(barEvent), isNotNull); - expect(sut.apply(fooBarEvent), isNotNull); - expect(sut.apply(fooEvent), isNotNull); + expect(sut.apply(fooEvent, Hint()), isNotNull); + expect(sut.apply(barEvent, Hint()), isNotNull); + expect(sut.apply(fooBarEvent, Hint()), isNotNull); + expect(sut.apply(fooEvent, Hint()), isNotNull); }); test('integration test', () async { diff --git a/dart/test/event_processor/enricher/io_enricher_test.dart b/dart/test/event_processor/enricher/io_enricher_test.dart index eb4a821de7..fcf37f958e 100644 --- a/dart/test/event_processor/enricher/io_enricher_test.dart +++ b/dart/test/event_processor/enricher/io_enricher_test.dart @@ -17,7 +17,7 @@ void main() { test('adds dart runtime', () { final enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.runtimes, isNotEmpty); final dartRuntime = event?.contexts.runtimes @@ -31,7 +31,7 @@ void main() { var event = SentryEvent(contexts: Contexts(runtimes: [runtime])); final enricher = fixture.getSut(); - event = enricher.apply(event)!; + event = enricher.apply(event, Hint())!; expect(event.contexts.runtimes.contains(runtime), true); // second runtime is Dart runtime @@ -42,7 +42,7 @@ void main() { 'does not add device, os and culture if native integration is available', () { final enricher = fixture.getSut(hasNativeIntegration: true); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.device, isNull); expect(event?.contexts.operatingSystem, isNull); @@ -52,7 +52,7 @@ void main() { test('adds device, os and culture if no native integration is available', () { final enricher = fixture.getSut(hasNativeIntegration: false); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.device, isNotNull); expect(event?.contexts.operatingSystem, isNotNull); @@ -61,14 +61,14 @@ void main() { test('device has name', () { final enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.device?.name, isNotNull); }); test('culture has locale and timezone', () { final enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.culture?.locale, isNotNull); expect(event?.contexts.culture?.timezone, isNotNull); @@ -76,7 +76,7 @@ void main() { test('os has name and version', () { final enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.operatingSystem?.name, isNotNull); expect(event?.contexts.operatingSystem?.version, isNotNull); @@ -84,7 +84,7 @@ void main() { test('adds Dart context with PII', () { final enricher = fixture.getSut(includePii: true); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); final dartContext = event?.contexts['dart_context']; expect(dartContext, isNotNull); @@ -97,7 +97,7 @@ void main() { test('adds Dart context without PII', () { final enricher = fixture.getSut(includePii: false); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); final dartContext = event?.contexts['dart_context']; expect(dartContext, isNotNull); @@ -131,7 +131,7 @@ void main() { hasNativeIntegration: false, ); - final event = enricher.apply(fakeEvent); + final event = enricher.apply(fakeEvent, Hint()); // contexts.device expect( diff --git a/dart/test/event_processor/enricher/web_enricher_test.dart b/dart/test/event_processor/enricher/web_enricher_test.dart index 60076e506a..e5d5b2efec 100644 --- a/dart/test/event_processor/enricher/web_enricher_test.dart +++ b/dart/test/event_processor/enricher/web_enricher_test.dart @@ -20,21 +20,21 @@ void main() { test('add path as transaction if transaction is null', () { var enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.transaction, isNotNull); }); test("don't overwrite transaction", () { var enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent(transaction: 'foobar')); + final event = enricher.apply(SentryEvent(transaction: 'foobar'), Hint()); expect(event?.transaction, 'foobar'); }); test('add request with user-agent header', () { var enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.request?.headers['User-Agent'], isNotNull); expect(event?.request?.url, isNotNull); @@ -50,7 +50,7 @@ void main() { ), ); var enricher = fixture.getSut(); - event = enricher.apply(event)!; + event = enricher.apply(event, Hint())!; expect(event.request?.headers['User-Agent'], isNotNull); expect(event.request?.headers['foo'], 'bar'); @@ -68,7 +68,7 @@ void main() { ), ); var enricher = fixture.getSut(); - event = enricher.apply(event)!; + event = enricher.apply(event, Hint())!; expect(event.request?.headers['Authorization'], isNull); expect(event.request?.headers['authorization'], isNull); @@ -84,7 +84,7 @@ void main() { ), ); var enricher = fixture.getSut(); - event = enricher.apply(event)!; + event = enricher.apply(event, Hint())!; expect(event.request?.headers['User-Agent'], 'best browser agent'); expect(event.request?.url, 'foo.bar'); @@ -92,14 +92,14 @@ void main() { test('adds device and os', () { var enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.device, isNotNull); }); test('adds Dart context', () { final enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); final dartContext = event?.contexts['dart_context']; expect(dartContext, isNotNull); @@ -108,14 +108,14 @@ void main() { test('device has screendensity', () { var enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.device?.screenDensity, isNotNull); }); test('culture has timezone', () { var enricher = fixture.getSut(); - final event = enricher.apply(SentryEvent()); + final event = enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.culture?.timezone, isNotNull); }); @@ -142,7 +142,7 @@ void main() { final enricher = fixture.getSut(); - final event = enricher.apply(fakeEvent); + final event = enricher.apply(fakeEvent, Hint()); // contexts.device expect( diff --git a/dart/test/event_processor/exception/io_exception_event_processor_test.dart b/dart/test/event_processor/exception/io_exception_event_processor_test.dart index 14d2720df2..5d4d771a08 100644 --- a/dart/test/event_processor/exception/io_exception_event_processor_test.dart +++ b/dart/test/event_processor/exception/io_exception_event_processor_test.dart @@ -23,6 +23,7 @@ void main() { uri: Uri.parse('https://example.org/foo/bar?foo=bar'), ), ), + Hint(), ); expect(event?.request, isNotNull); @@ -36,6 +37,7 @@ void main() { SentryEvent( throwable: HttpException(''), ), + Hint(), ); expect(event?.request, isNull); @@ -55,6 +57,7 @@ void main() { ), ), ), + Hint(), ); expect(event?.request, isNotNull); @@ -81,6 +84,7 @@ void main() { OSError('Oh no :(', 42), ), ), + Hint(), ); // Due to the test setup, there's no SentryException for the FileSystemException. diff --git a/dart/test/http_client/failed_request_client_test.dart b/dart/test/http_client/failed_request_client_test.dart index 4e6cac15b1..2d017c177d 100644 --- a/dart/test/http_client/failed_request_client_test.dart +++ b/dart/test/http_client/failed_request_client_test.dart @@ -295,7 +295,7 @@ void main() { final sut = fixture.getSut(client: client); Hint? eventHint; - fixture.options.addEventProcessor(FunctionEventProcessor((event, {hint}) { + fixture.options.addEventProcessor(FunctionEventProcessor((event, hint) { eventHint = hint; return event; })); diff --git a/dart/test/mocks.dart b/dart/test/mocks.dart index 82430d96e8..08058d3b32 100644 --- a/dart/test/mocks.dart +++ b/dart/test/mocks.dart @@ -98,7 +98,7 @@ final fakeEvent = SentryEvent( /// Always returns null and thus drops all events class DropAllEventProcessor implements EventProcessor { @override - SentryEvent? apply(SentryEvent event, {hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { return null; } } @@ -109,13 +109,13 @@ class FunctionEventProcessor implements EventProcessor { final EventProcessorFunction applyFunction; @override - SentryEvent? apply(SentryEvent event, {hint}) { - return applyFunction(event, hint: hint); + SentryEvent? apply(SentryEvent event, Hint hint) { + return applyFunction(event, hint); } } -typedef EventProcessorFunction = SentryEvent? Function(SentryEvent event, - {Hint? hint}); +typedef EventProcessorFunction = SentryEvent? Function( + SentryEvent event, Hint hint); var fakeEnvelope = SentryEnvelope.fromEvent( fakeEvent, diff --git a/dart/test/scope_test.dart b/dart/test/scope_test.dart index e8d2e08bf9..d93b1cf112 100644 --- a/dart/test/scope_test.dart +++ b/dart/test/scope_test.dart @@ -98,6 +98,26 @@ void main() { expect(sut.breadcrumbs.last, breadcrumb); }); + test('beforeBreadcrumb called with user provided hint', () { + Hint? actual; + BeforeBreadcrumbCallback bb = (_, hint) { + actual = hint; + return null; + }; + final sut = fixture.getSut( + beforeBreadcrumbCallback: bb, + ); + + final breadcrumb = Breadcrumb( + message: 'test log', + timestamp: DateTime.utc(2019), + ); + final hint = Hint.withMap({'user-name': 'joe dirt'}); + sut.addBreadcrumb(breadcrumb, hint: hint); + + expect(actual?.get('user-name'), 'joe dirt'); + }); + test('Executes and drops $Breadcrumb', () { final sut = fixture.getSut( beforeBreadcrumbCallback: fixture.beforeBreadcrumbCallback, @@ -404,7 +424,7 @@ void main() { await scope.setContexts('theme', 'material'); await scope.setUser(scopeUser); - final updatedEvent = await scope.applyToEvent(event); + final updatedEvent = await scope.applyToEvent(event, Hint()); expect(updatedEvent?.user, scopeUser); expect(updatedEvent?.transaction, '/example/app'); @@ -425,7 +445,7 @@ void main() { final scope = Scope(SentryOptions(dsn: fakeDsn)) ..span = fixture.sentryTracer; - final updatedEvent = await scope.applyToEvent(event); + final updatedEvent = await scope.applyToEvent(event, Hint()); expect(updatedEvent?.contexts['trace'] is SentryTraceContext, true); }); @@ -448,7 +468,7 @@ void main() { await scope.addBreadcrumb(breadcrumb); await scope.setUser(scopeUser); - final updatedEvent = await scope.applyToEvent(event); + final updatedEvent = await scope.applyToEvent(event, Hint()); expect(updatedEvent?.user, isNotNull); expect(updatedEvent?.user?.id, eventUser.id); @@ -496,7 +516,7 @@ void main() { SentryOperatingSystem(name: 'context-os'), ); - final updatedEvent = await scope.applyToEvent(event); + final updatedEvent = await scope.applyToEvent(event, Hint()); expect(updatedEvent?.contexts[SentryDevice.type].name, 'event-device'); expect(updatedEvent?.contexts[SentryApp.type].name, 'event-app'); @@ -526,7 +546,7 @@ void main() { await scope.setContexts('location', {'city': 'London'}); await scope.setContexts('items', [1, 2, 3]); - final updatedEvent = await scope.applyToEvent(event); + final updatedEvent = await scope.applyToEvent(event, Hint()); expect(updatedEvent?.contexts[SentryDevice.type].name, 'context-device'); expect(updatedEvent?.contexts[SentryApp.type].name, 'context-app'); @@ -551,7 +571,7 @@ void main() { final scope = Scope(SentryOptions(dsn: fakeDsn)) ..level = SentryLevel.error; - final updatedEvent = await scope.applyToEvent(event); + final updatedEvent = await scope.applyToEvent(event, Hint()); expect(updatedEvent?.level, SentryLevel.error); }); @@ -561,7 +581,7 @@ void main() { final scope = Scope(SentryOptions(dsn: fakeDsn)) ..span = fixture.sentryTracer; - final updatedEvent = await scope.applyToEvent(event); + final updatedEvent = await scope.applyToEvent(event, Hint()); expect(updatedEvent?.transaction, 'name'); }); @@ -573,7 +593,7 @@ void main() { sut.addEventProcessor(fixture.processor); final event = SentryEvent(); - var newEvent = await sut.applyToEvent(event); + var newEvent = await sut.applyToEvent(event, Hint()); expect(newEvent, isNull); }); @@ -582,7 +602,7 @@ void main() { var tr = SentryTransaction(fixture.sentryTracer); final scope = Scope(SentryOptions(dsn: fakeDsn))..fingerprint = ['test']; - final updatedTr = await scope.applyToEvent(tr); + final updatedTr = await scope.applyToEvent(tr, Hint()); expect(updatedTr?.fingerprint, isNull); }); @@ -591,7 +611,7 @@ void main() { var tr = SentryTransaction(fixture.sentryTracer); final scope = Scope(SentryOptions(dsn: fakeDsn))..level = SentryLevel.error; - final updatedTr = await scope.applyToEvent(tr); + final updatedTr = await scope.applyToEvent(tr, Hint()); expect(updatedTr?.level, isNull); }); @@ -600,7 +620,7 @@ void main() { var tr = SentryTransaction(fixture.sentryTracer); final scope = Scope(SentryOptions(dsn: fakeDsn))..level = SentryLevel.error; - final updatedTr = await scope.applyToEvent(tr); + final updatedTr = await scope.applyToEvent(tr, Hint()); expect(updatedTr?.contexts.trace?.sampled, isTrue); }); @@ -617,9 +637,9 @@ void main() { final sut = fixture.getSut( scopeObserver: fixture.mockScopeObserver, beforeBreadcrumbCallback: ( - Breadcrumb? breadcrumb, { - Hint? hint, - }) { + Breadcrumb? breadcrumb, + Hint hint, + ) { return breadcrumb?.copyWith(message: "modified"); }, ); @@ -690,9 +710,9 @@ void main() { final sut = fixture.getSut( beforeBreadcrumbCallback: ( - Breadcrumb? breadcrumb, { - Hint? hint, - }) { + Breadcrumb? breadcrumb, + Hint hint, + ) { throw exception; }, debug: true); @@ -714,9 +734,9 @@ void main() { final sut = fixture.getSut( beforeBreadcrumbCallback: ( - Breadcrumb? breadcrumb, { - Hint? hint, - }) { + Breadcrumb? breadcrumb, + Hint hint, + ) { if (numberOfBeforeBreadcrumbCalls > 0) { throw exception; } @@ -777,11 +797,11 @@ class Fixture { EventProcessor get processor => DropAllEventProcessor(); - Breadcrumb? beforeBreadcrumbCallback(Breadcrumb? breadcrumb, {Hint? hint}) => + Breadcrumb? beforeBreadcrumbCallback(Breadcrumb? breadcrumb, Hint hint) => null; - Breadcrumb? beforeBreadcrumbMutateCallback(Breadcrumb? breadcrumb, - {Hint? hint}) => + Breadcrumb? beforeBreadcrumbMutateCallback( + Breadcrumb? breadcrumb, Hint hint) => breadcrumb?.copyWith(message: 'new message'); void mockLogger( @@ -802,7 +822,7 @@ class AddTagsEventProcessor implements EventProcessor { AddTagsEventProcessor(this.tags); @override - SentryEvent? apply(SentryEvent event, {hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { return event..tags?.addAll(tags); } } diff --git a/dart/test/sentry_client_test.dart b/dart/test/sentry_client_test.dart index 5d1c543c00..f62c310b5d 100644 --- a/dart/test/sentry_client_test.dart +++ b/dart/test/sentry_client_test.dart @@ -1039,7 +1039,7 @@ void main() { test('thrown error is handled', () async { final exception = Exception("before send exception"); - final beforeSendCallback = (SentryEvent event, {Hint? hint}) { + final beforeSendCallback = (SentryEvent event, Hint hint) { throw exception; }; @@ -1059,7 +1059,7 @@ void main() { setUp(() { fixture = Fixture(); fixture.options.addEventProcessor(FunctionEventProcessor( - (event, {hint}) => event + (event, hint) => event ..tags!.addAll({'theme': 'material'}) // ignore: deprecated_member_use_from_same_package ..extra!['host'] = '0.0.0.1' @@ -1101,8 +1101,8 @@ void main() { var executed = false; - final client = fixture.getSut( - eventProcessor: FunctionEventProcessor((event, {hint}) { + final client = + fixture.getSut(eventProcessor: FunctionEventProcessor((event, hint) { expect(myHint, hint); executed = true; return event; @@ -1116,8 +1116,8 @@ void main() { test('should create hint when none was provided', () async { var executed = false; - final client = fixture.getSut( - eventProcessor: FunctionEventProcessor((event, {hint}) { + final client = + fixture.getSut(eventProcessor: FunctionEventProcessor((event, hint) { expect(hint, isNotNull); executed = true; return event; @@ -1601,9 +1601,9 @@ Future> transactionFromEnvelope( } SentryEvent? beforeSendCallbackDropEvent( - SentryEvent event, { - Hint? hint, -}) => + SentryEvent event, + Hint hint, +) => null; SentryTransaction? beforeSendTransactionCallbackDropEvent( @@ -1612,9 +1612,9 @@ SentryTransaction? beforeSendTransactionCallbackDropEvent( null; Future asyncBeforeSendCallbackDropEvent( - SentryEvent event, { - Hint? hint, -}) async { + SentryEvent event, + Hint hint, +) async { await Future.delayed(Duration(milliseconds: 200)); return null; } @@ -1625,7 +1625,7 @@ Future asyncBeforeSendTransactionCallbackDropEvent( return null; } -SentryEvent? beforeSendCallback(SentryEvent event, {Hint? hint}) { +SentryEvent? beforeSendCallback(SentryEvent event, Hint hint) { return event ..tags!.addAll({'theme': 'material'}) // ignore: deprecated_member_use_from_same_package @@ -1701,8 +1701,7 @@ class Fixture { return client; } - Future droppingBeforeSend(SentryEvent event, - {Hint? hint}) async { + Future droppingBeforeSend(SentryEvent event, Hint hint) async { return null; } diff --git a/dio/lib/src/dio_event_processor.dart b/dio/lib/src/dio_event_processor.dart index 3a9603abd1..afeb692be4 100644 --- a/dio/lib/src/dio_event_processor.dart +++ b/dio/lib/src/dio_event_processor.dart @@ -15,7 +15,7 @@ class DioEventProcessor implements EventProcessor { final SentryOptions _options; @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { if (event is SentryTransaction) { return event; } diff --git a/dio/test/dio_event_processor_test.dart b/dio/test/dio_event_processor_test.dart index af45d0c681..af4a94ab8d 100644 --- a/dio/test/dio_event_processor_test.dart +++ b/dio/test/dio_event_processor_test.dart @@ -24,7 +24,7 @@ void main() { throwable: Exception(), exceptions: [fixture.sentryError(throwable)], ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; expect(event, processedEvent); }); @@ -42,7 +42,7 @@ void main() { request: SentryRequest(), exceptions: [fixture.sentryError(dioError)], ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; expect(event.throwable, processedEvent.throwable); expect(event.request, processedEvent.request); @@ -67,10 +67,10 @@ void main() { throwable: throwable, exceptions: [ fixture.sentryError(throwable), - fixture.sentryError(dioError) + fixture.sentryError(dioError), ], ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; expect(processedEvent.throwable, event.throwable); expect(processedEvent.request?.method, 'POST'); @@ -96,10 +96,10 @@ void main() { throwable: throwable, exceptions: [ fixture.sentryError(throwable), - fixture.sentryError(dioError) + fixture.sentryError(dioError), ], ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; expect(processedEvent.throwable, event.throwable); expect(processedEvent.request?.method, 'GET'); @@ -125,10 +125,10 @@ void main() { throwable: throwable, exceptions: [ fixture.sentryError(throwable), - fixture.sentryError(dioError) + fixture.sentryError(dioError), ], ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; expect(processedEvent.request?.headers, {}); }); @@ -177,10 +177,10 @@ void main() { throwable: throwable, exceptions: [ fixture.sentryError(throwable), - fixture.sentryError(dioError) + fixture.sentryError(dioError), ], ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; final capturedRequest = processedEvent.request; expect(capturedRequest, isNotNull); @@ -207,7 +207,7 @@ void main() { data: 'foobar', headers: Headers.fromMap(>{ 'foo': ['bar'], - 'set-cookie': ['foo=bar'] + 'set-cookie': ['foo=bar'], }), requestOptions: request, isRedirect: true, @@ -219,10 +219,10 @@ void main() { throwable: throwable, exceptions: [ fixture.sentryError(throwable), - fixture.sentryError(dioError) + fixture.sentryError(dioError), ], ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; expect(processedEvent.throwable, event.throwable); expect(processedEvent.contexts.response, isNotNull); @@ -248,7 +248,7 @@ void main() { response: Response( data: 'foobar', headers: Headers.fromMap(>{ - 'foo': ['bar'] + 'foo': ['bar'], }), requestOptions: request, isRedirect: true, @@ -260,10 +260,10 @@ void main() { throwable: throwable, exceptions: [ fixture.sentryError(throwable), - fixture.sentryError(dioError) + fixture.sentryError(dioError), ], ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; expect(processedEvent.throwable, event.throwable); expect(processedEvent.contexts.response, isNotNull); @@ -320,10 +320,10 @@ void main() { throwable: throwable, exceptions: [ fixture.sentryError(throwable), - fixture.sentryError(dioError) + fixture.sentryError(dioError), ], ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; final capturedResponse = processedEvent.contexts.response; expect(capturedResponse, isNotNull); @@ -338,7 +338,7 @@ void main() { final dataByType = { ResponseType.plain: ['plain'], ResponseType.bytes: [ - [1337] + [1337], ], ResponseType.json: [ 9001, @@ -347,7 +347,7 @@ void main() { true, ['list'], {'map-key': 'map-value'}, - ] + ], }; for (final entry in dataByType.entries) { @@ -375,10 +375,10 @@ void main() { throwable: throwable, exceptions: [ fixture.sentryError(throwable), - fixture.sentryError(dioError) + fixture.sentryError(dioError), ], ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; final capturedResponse = processedEvent.contexts.response; expect(capturedResponse, isNotNull); @@ -413,7 +413,7 @@ void main() { exceptions: exceptions, ); - final processedEvent = sut.apply(event) as SentryEvent; + final processedEvent = sut.apply(event, Hint()) as SentryEvent; expect(processedEvent.exceptions?.length, 2); diff --git a/dio/test/failed_request_interceptor_test.dart b/dio/test/failed_request_interceptor_test.dart index 80eede8803..e7fb5a63e1 100644 --- a/dio/test/failed_request_interceptor_test.dart +++ b/dio/test/failed_request_interceptor_test.dart @@ -113,7 +113,7 @@ class Fixture { FailedRequestInterceptor getSut({ List failedRequestStatusCodes = const [ - SentryStatusCode.defaultRange() + SentryStatusCode.defaultRange(), ], List failedRequestTargets = const ['.*'], }) { diff --git a/dio/test/mocks.dart b/dio/test/mocks.dart index 83454cbfb3..30e53c5772 100644 --- a/dio/test/mocks.dart +++ b/dio/test/mocks.dart @@ -42,7 +42,7 @@ final fakeEvent = SentryEvent( type: 'navigation', data: {'screen': 'MainActivity', 'state': 'created'}, level: SentryLevel.info, - ) + ), ], contexts: Contexts( operatingSystem: const SentryOperatingSystem( @@ -98,7 +98,7 @@ final fakeEvent = SentryEvent( /// Doesn't do anything with the events class NoOpEventProcessor implements EventProcessor { @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { return event; } } @@ -106,7 +106,7 @@ class NoOpEventProcessor implements EventProcessor { /// Always returns null and thus drops all events class DropAllEventProcessor implements EventProcessor { @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { return null; } } @@ -117,15 +117,15 @@ class FunctionEventProcessor implements EventProcessor { final EventProcessorFunction applyFunction; @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { - return applyFunction(event, hint: hint); + SentryEvent? apply(SentryEvent event, Hint hint) { + return applyFunction(event, hint); } } typedef EventProcessorFunction = SentryEvent? Function( - SentryEvent event, { - Hint? hint, -}); + SentryEvent event, + Hint hint, +); var fakeEnvelope = SentryEnvelope.fromEvent( fakeEvent, diff --git a/flutter/example/integration_test/integration_test.dart b/flutter/example/integration_test/integration_test.dart index ae42ae3945..9dc182111a 100644 --- a/flutter/example/integration_test/integration_test.dart +++ b/flutter/example/integration_test/integration_test.dart @@ -199,7 +199,7 @@ void main() { class Fixture { SentryEvent? sentEvent; - FutureOr beforeSend(SentryEvent event, {Hint? hint}) async { + FutureOr beforeSend(SentryEvent event, Hint hint) async { sentEvent = event; return event; } diff --git a/flutter/lib/src/event_processor/android_platform_exception_event_processor.dart b/flutter/lib/src/event_processor/android_platform_exception_event_processor.dart index 377af31d25..ce77150c40 100644 --- a/flutter/lib/src/event_processor/android_platform_exception_event_processor.dart +++ b/flutter/lib/src/event_processor/android_platform_exception_event_processor.dart @@ -19,7 +19,7 @@ class AndroidPlatformExceptionEventProcessor implements EventProcessor { static final _platformExceptionType = (PlatformException).toString(); @override - Future apply(SentryEvent event, {Hint? hint}) async { + Future apply(SentryEvent event, Hint hint) async { if (event is SentryTransaction) { return event; } diff --git a/flutter/lib/src/event_processor/flutter_enricher_event_processor.dart b/flutter/lib/src/event_processor/flutter_enricher_event_processor.dart index f72eb2470b..0df522c379 100644 --- a/flutter/lib/src/event_processor/flutter_enricher_event_processor.dart +++ b/flutter/lib/src/event_processor/flutter_enricher_event_processor.dart @@ -31,9 +31,9 @@ class FlutterEnricherEventProcessor implements EventProcessor { @override Future apply( - SentryEvent event, { - Hint? hint, - }) async { + SentryEvent event, + Hint hint, + ) async { // If there's a native integration available, it probably has better // information available than Flutter. final device = diff --git a/flutter/lib/src/event_processor/flutter_exception_event_processor.dart b/flutter/lib/src/event_processor/flutter_exception_event_processor.dart index e0f4b6af14..05f9fd6595 100644 --- a/flutter/lib/src/event_processor/flutter_exception_event_processor.dart +++ b/flutter/lib/src/event_processor/flutter_exception_event_processor.dart @@ -3,7 +3,7 @@ import 'package:sentry/sentry.dart'; class FlutterExceptionEventProcessor implements EventProcessor { @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { if (event is SentryTransaction) { return event; } diff --git a/flutter/lib/src/event_processor/native_app_start_event_processor.dart b/flutter/lib/src/event_processor/native_app_start_event_processor.dart index 2187204299..0127f36d5a 100644 --- a/flutter/lib/src/event_processor/native_app_start_event_processor.dart +++ b/flutter/lib/src/event_processor/native_app_start_event_processor.dart @@ -18,7 +18,7 @@ class NativeAppStartEventProcessor implements EventProcessor { final SentryNative _native; @override - Future apply(SentryEvent event, {Hint? hint}) async { + Future apply(SentryEvent event, Hint hint) async { final appStartEnd = _native.appStartEnd; if (appStartEnd != null && diff --git a/flutter/lib/src/event_processor/platform_exception_event_processor.dart b/flutter/lib/src/event_processor/platform_exception_event_processor.dart index d403509ae9..2bf33e60f9 100644 --- a/flutter/lib/src/event_processor/platform_exception_event_processor.dart +++ b/flutter/lib/src/event_processor/platform_exception_event_processor.dart @@ -4,7 +4,7 @@ import 'package:sentry/sentry.dart'; /// Add code & message from [PlatformException] to [SentryException] class PlatformExceptionEventProcessor implements EventProcessor { @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { if (event is SentryTransaction) { return event; } diff --git a/flutter/lib/src/event_processor/screenshot_event_processor.dart b/flutter/lib/src/event_processor/screenshot_event_processor.dart index b60f4faefa..8a68fed1c1 100644 --- a/flutter/lib/src/event_processor/screenshot_event_processor.dart +++ b/flutter/lib/src/event_processor/screenshot_event_processor.dart @@ -19,7 +19,7 @@ class ScreenshotEventProcessor implements EventProcessor { sentryScreenshotWidgetGlobalKey.currentContext != null; @override - Future apply(SentryEvent event, {Hint? hint}) async { + Future apply(SentryEvent event, Hint hint) async { if (event is SentryTransaction) { return event; } @@ -40,7 +40,7 @@ class ScreenshotEventProcessor implements EventProcessor { final bytes = await _createScreenshot(); if (bytes != null) { - hint?.screenshot = SentryAttachment.fromScreenshotData(bytes); + hint.screenshot = SentryAttachment.fromScreenshotData(bytes); } return event; } diff --git a/flutter/lib/src/integrations/load_contexts_integration.dart b/flutter/lib/src/integrations/load_contexts_integration.dart index 710d7d0924..f0aa565da3 100644 --- a/flutter/lib/src/integrations/load_contexts_integration.dart +++ b/flutter/lib/src/integrations/load_contexts_integration.dart @@ -40,7 +40,7 @@ class _LoadContextsIntegrationEventProcessor implements EventProcessor { final SentryFlutterOptions _options; @override - Future apply(SentryEvent event, {Hint? hint}) async { + Future apply(SentryEvent event, Hint hint) async { try { final loadContexts = await _channel.invokeMethod('loadContexts'); diff --git a/flutter/lib/src/integrations/load_image_list_integration.dart b/flutter/lib/src/integrations/load_image_list_integration.dart index c2a0c98848..a06d60d839 100644 --- a/flutter/lib/src/integrations/load_image_list_integration.dart +++ b/flutter/lib/src/integrations/load_image_list_integration.dart @@ -43,7 +43,7 @@ class _LoadImageListIntegrationEventProcessor implements EventProcessor { final SentryFlutterOptions _options; @override - Future apply(SentryEvent event, {Hint? hint}) async { + Future apply(SentryEvent event, Hint hint) async { if (event.needsSymbolication()) { try { // we call on every event because the loaded image list is cached diff --git a/flutter/lib/src/view_hierarchy/view_hierarchy_event_processor.dart b/flutter/lib/src/view_hierarchy/view_hierarchy_event_processor.dart index 99d43ad982..c3fefe52f5 100644 --- a/flutter/lib/src/view_hierarchy/view_hierarchy_event_processor.dart +++ b/flutter/lib/src/view_hierarchy/view_hierarchy_event_processor.dart @@ -1,7 +1,7 @@ import '../../sentry_flutter.dart'; import 'sentry_tree_walker.dart'; -/// A [EventProcessor] that renders an ASCII represention of the entire view +/// A [EventProcessor] that renders an ASCII representation of the entire view /// hierarchy of the application when an error happens and includes it as an /// attachment to the [Hint]. class SentryViewHierarchyEventProcessor implements EventProcessor { @@ -10,7 +10,7 @@ class SentryViewHierarchyEventProcessor implements EventProcessor { final SentryFlutterOptions _options; @override - SentryEvent? apply(SentryEvent event, {Hint? hint}) { + SentryEvent? apply(SentryEvent event, Hint hint) { if (event is SentryTransaction) { return event; } @@ -31,7 +31,7 @@ class SentryViewHierarchyEventProcessor implements EventProcessor { final viewHierarchy = SentryAttachment.fromViewHierarchy(sentryViewHierarchy); - hint?.viewHierarchy = viewHierarchy; + hint.viewHierarchy = viewHierarchy; return event; } } diff --git a/flutter/test/android_platform_exception_event_processor_test.dart b/flutter/test/android_platform_exception_event_processor_test.dart index bfd8e2b4ce..0ac142922a 100644 --- a/flutter/test/android_platform_exception_event_processor_test.dart +++ b/flutter/test/android_platform_exception_event_processor_test.dart @@ -26,8 +26,8 @@ void main() { group(AndroidPlatformExceptionEventProcessor, () { test('exception is correctly parsed', () async { - final platformExceptionEvent = - await fixture.processor.apply(fixture.eventWithPlatformStackTrace); + final platformExceptionEvent = await fixture.processor + .apply(fixture.eventWithPlatformStackTrace, Hint()); final exceptions = platformExceptionEvent!.exceptions!; expect(exceptions.length, 2); @@ -45,8 +45,8 @@ void main() { test( 'Dart thread is current and not crashed if Android exception is present', () async { - final platformExceptionEvent = - await fixture.processor.apply(fixture.eventWithPlatformStackTrace); + final platformExceptionEvent = await fixture.processor + .apply(fixture.eventWithPlatformStackTrace, Hint()); final exceptions = platformExceptionEvent!.exceptions!; expect(exceptions.length, 2); @@ -56,8 +56,8 @@ void main() { }); test('platformexception has Android thread attached', () async { - final platformExceptionEvent = - await fixture.processor.apply(fixture.eventWithPlatformStackTrace); + final platformExceptionEvent = await fixture.processor + .apply(fixture.eventWithPlatformStackTrace, Hint()); final exceptions = platformExceptionEvent!.exceptions!; expect(exceptions.length, 2); @@ -76,8 +76,8 @@ void main() { fixture.options.attachThreads = false; final threadCount = fixture.eventWithPlatformStackTrace.threads?.length; - final platformExceptionEvent = - await fixture.processor.apply(fixture.eventWithPlatformStackTrace); + final platformExceptionEvent = await fixture.processor + .apply(fixture.eventWithPlatformStackTrace, Hint()); final exceptions = platformExceptionEvent!.exceptions!; expect(exceptions.length, 2); @@ -94,14 +94,15 @@ void main() { throwable: null, ); - final platformExceptionEvent = await fixture.processor.apply(event); + final platformExceptionEvent = + await fixture.processor.apply(event, Hint()); expect(event, platformExceptionEvent); }); test('does nothing if PlatformException has no stackTrace', () async { - final platformExceptionEvent = - await fixture.processor.apply(fixture.eventWithoutPlatformStackTrace); + final platformExceptionEvent = await fixture.processor + .apply(fixture.eventWithoutPlatformStackTrace, Hint()); expect(fixture.eventWithoutPlatformStackTrace, platformExceptionEvent); }); diff --git a/flutter/test/event_processor/flutter_enricher_event_processor_test.dart b/flutter/test/event_processor/flutter_enricher_event_processor_test.dart index bfccb8c773..72ff0fc1cb 100644 --- a/flutter/test/event_processor/flutter_enricher_event_processor_test.dart +++ b/flutter/test/event_processor/flutter_enricher_event_processor_test.dart @@ -32,7 +32,7 @@ void main() { binding: () => tester.binding, ); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); debugBrightnessOverride = null; debugDefaultTargetPlatformOverride = null; @@ -48,7 +48,7 @@ void main() { binding: () => tester.binding, ); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); final accessibility = event?.contexts['accessibility']; @@ -65,7 +65,7 @@ void main() { binding: () => tester.binding, ); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); final culture = event?.contexts.culture; @@ -79,7 +79,7 @@ void main() { ); tester.binding.handleAppLifecycleStateChanged(AppLifecycleState.resumed); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); final app = event?.contexts.app; @@ -92,7 +92,7 @@ void main() { ); tester.binding.handleAppLifecycleStateChanged(AppLifecycleState.inactive); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); final app = event?.contexts.app; @@ -110,7 +110,7 @@ void main() { final event = SentryEvent(); event.contexts.app = SentryApp(name: appName); - final mutatedEvent = await enricher.apply(event); + final mutatedEvent = await enricher.apply(event, Hint()); final app = mutatedEvent?.contexts.app; @@ -125,7 +125,7 @@ void main() { hasNativeIntegration: true, ); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.device, isNull); }); @@ -137,7 +137,7 @@ void main() { hasNativeIntegration: false, ); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); expect(event?.contexts.device, isNotNull); }); @@ -147,7 +147,7 @@ void main() { binding: () => tester.binding, ); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); final flutterRuntime = event?.contexts.runtimes .firstWhere((element) => element.name == 'Flutter'); @@ -171,7 +171,7 @@ void main() { checker: pair.key, ); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); final flutterRuntime = event?.contexts.runtimes .firstWhere((element) => element.name == 'Flutter'); @@ -199,7 +199,7 @@ void main() { ), ); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); expect(event?.modules, { 'foo_package': 'unknown', @@ -227,7 +227,7 @@ void main() { ), ); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); expect(event?.modules, null); }); @@ -251,7 +251,7 @@ void main() { ), ); - final event = await enricher.apply(SentryEvent()); + final event = await enricher.apply(SentryEvent(), Hint()); expect(event?.modules, {'foo_package': 'unknown'}); }); @@ -276,7 +276,7 @@ void main() { hasNativeIntegration: false, ); - final event = await enricher.apply(fakeEvent); + final event = await enricher.apply(fakeEvent, Hint()); // contexts.device expect( diff --git a/flutter/test/event_processor/flutter_exception_event_processor_test.dart b/flutter/test/event_processor/flutter_exception_event_processor_test.dart index aaca15e2af..8dc4f5c528 100644 --- a/flutter/test/event_processor/flutter_exception_event_processor_test.dart +++ b/flutter/test/event_processor/flutter_exception_event_processor_test.dart @@ -20,6 +20,7 @@ void main() { uri: Uri.parse('https://example.org/foo/bar?foo=bar'), ), ), + Hint(), ); expect(event?.request, isNotNull); diff --git a/flutter/test/event_processor/platform_exception_event_processor_test.dart b/flutter/test/event_processor/platform_exception_event_processor_test.dart index d4bf2d9c99..ecc3d7130b 100644 --- a/flutter/test/event_processor/platform_exception_event_processor_test.dart +++ b/flutter/test/event_processor/platform_exception_event_processor_test.dart @@ -26,7 +26,7 @@ void main() { var event = SentryEvent(exceptions: [sentryException]); final sut = fixture.getSut(); - event = (sut.apply(event))!; + event = (sut.apply(event, Hint()))!; expect(event.exceptions?.first.mechanism?.data["code"], "fixture-code"); expect(event.exceptions?.first.mechanism?.data["message"], @@ -46,7 +46,7 @@ void main() { var event = SentryEvent(exceptions: [sentryException]); final sut = fixture.getSut(); - event = (sut.apply(event))!; + event = (sut.apply(event, Hint()))!; expect(event.exceptions?.first.mechanism?.type, "platformException"); }); diff --git a/flutter/test/event_processor/screenshot_event_processor_test.dart b/flutter/test/event_processor/screenshot_event_processor_test.dart index da063e776c..6101217a04 100644 --- a/flutter/test/event_processor/screenshot_event_processor_test.dart +++ b/flutter/test/event_processor/screenshot_event_processor_test.dart @@ -32,7 +32,7 @@ void main() { final throwable = Exception(); final event = SentryEvent(throwable: throwable); final hint = Hint(); - await sut.apply(event, hint: hint); + await sut.apply(event, hint); expect(hint.screenshot != null, added); if (expectedMaxWidthOrHeight != null) { diff --git a/flutter/test/integrations/load_contexts_integration_test.dart b/flutter/test/integrations/load_contexts_integration_test.dart index a97b35db77..bf93f6da46 100644 --- a/flutter/test/integrations/load_contexts_integration_test.dart +++ b/flutter/test/integrations/load_contexts_integration_test.dart @@ -58,7 +58,8 @@ void main() { final integration = LoadContextsIntegration(fixture.methodChannel); integration.call(fixture.hub, fixture.options); - event = (await fixture.options.eventProcessors.first.apply(event))!; + event = + (await fixture.options.eventProcessors.first.apply(event, Hint()))!; expect(event.breadcrumbs!.length, 1); expect(event.breadcrumbs!.first.message, 'native'); @@ -83,7 +84,8 @@ void main() { final integration = LoadContextsIntegration(fixture.methodChannel); integration.call(fixture.hub, fixture.options); - event = (await fixture.options.eventProcessors.first.apply(event))!; + event = + (await fixture.options.eventProcessors.first.apply(event, Hint()))!; expect(event.breadcrumbs!.length, 1); expect(event.breadcrumbs!.first.message, 'event'); diff --git a/flutter/test/integrations/load_contexts_integrations_test.dart b/flutter/test/integrations/load_contexts_integrations_test.dart index c6bb98f0b7..6de2d32e8d 100644 --- a/flutter/test/integrations/load_contexts_integrations_test.dart +++ b/flutter/test/integrations/load_contexts_integrations_test.dart @@ -81,7 +81,7 @@ void main() { e.contexts.operatingSystem = SentryOperatingSystem(theme: 'theme1'); e.contexts.app = SentryApp(inForeground: true); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(fixture.called, true); expect(event?.contexts.device?.name, 'Device1'); @@ -121,7 +121,7 @@ void main() { final e = SentryEvent(contexts: eventContexts, user: SentryUser(id: 'myId')); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(fixture.called, true); expect(event?.contexts.device?.name, 'eDevice'); @@ -145,7 +145,8 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = + await fixture.options.eventProcessors.first.apply(e, Hint()); expect( event?.sdk?.packages.any((element) => element.name == 'native-package'), @@ -169,7 +170,8 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = + await fixture.options.eventProcessors.first.apply(e, Hint()); expect( event?.sdk?.integrations @@ -189,7 +191,8 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = + await fixture.options.eventProcessors.first.apply(e, Hint()); expect( event?.sdk?.packages @@ -210,7 +213,8 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = + await fixture.options.eventProcessors.first.apply(e, Hint()); expect( event?.sdk?.packages @@ -239,7 +243,7 @@ void main() { integration(fixture.hub, fixture.options); final e = SentryEvent(); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event, isNotNull); }); @@ -252,7 +256,8 @@ void main() { final eventSdk = getSdkVersion(name: 'sentry.dart.flutter'); final e = getEvent(sdk: eventSdk); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = + await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.tags?['event.origin'], 'flutter'); expect(event?.tags?['event.environment'], 'dart'); @@ -270,7 +275,8 @@ void main() { sdk: eventSdk, tags: {'a': 'b'}, ); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = + await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.tags?['event.origin'], 'flutter'); expect(event?.tags?['event.environment'], 'dart'); @@ -285,7 +291,8 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(tags: {}); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = + await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.tags?.containsKey('event.origin'), false); expect(event?.tags?.containsKey('event.environment'), false); @@ -298,7 +305,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(tags: {'key': 'flutter', 'key-a': 'flutter'}); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.tags?['key'], 'flutter'); expect(event?.tags?['key-a'], 'flutter'); @@ -311,7 +318,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(extra: {'key': 'flutter', 'key-a': 'flutter'}); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); // ignore: deprecated_member_use expect(event?.extra?['key'], 'flutter'); @@ -326,7 +333,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.user?.id, '196E065A-AAF7-409A-9A6C-A81F40274CB9'); expect(event?.user?.username, 'fixture-username'); @@ -340,7 +347,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(user: SentryUser(id: 'abc')); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.user?.id, 'abc'); }); @@ -350,7 +357,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.dist, 'fixture-dist'); }); @@ -360,7 +367,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(dist: 'abc'); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.dist, 'abc'); }); @@ -370,7 +377,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.environment, 'fixture-environment'); }); @@ -380,7 +387,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(environment: 'abc'); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.environment, 'abc'); }); @@ -391,7 +398,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(fingerprint: ['fingerprint-a', 'fingerprint-b']); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.fingerprint, ['fingerprint-a', 'fingerprint-b']); }); @@ -401,7 +408,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.level, SentryLevel.error); }); @@ -411,7 +418,7 @@ void main() { integration(fixture.hub, fixture.options); final e = getEvent(level: SentryLevel.fatal); - final event = await fixture.options.eventProcessors.first.apply(e); + final event = await fixture.options.eventProcessors.first.apply(e, Hint()); expect(event?.level, SentryLevel.fatal); }); diff --git a/flutter/test/integrations/load_image_list_test.dart b/flutter/test/integrations/load_image_list_test.dart index bb78561dae..1b82a3332e 100644 --- a/flutter/test/integrations/load_image_list_test.dart +++ b/flutter/test/integrations/load_image_list_test.dart @@ -135,7 +135,7 @@ void main() { final ep = fixture.options.eventProcessors.first; SentryEvent? event = _getEvent(); - event = await ep.apply(event); + event = await ep.apply(event, Hint()); expect(1, event!.debugMeta!.images.length); }); @@ -146,7 +146,7 @@ void main() { sut.call(fixture.hub, fixture.options); final ep = fixture.options.eventProcessors.first; SentryEvent? event = _getEvent(); - event = await ep.apply(event); + event = await ep.apply(event, Hint()); final image = event!.debugMeta!.images.first; diff --git a/flutter/test/integrations/native_app_start_integration_test.dart b/flutter/test/integrations/native_app_start_integration_test.dart index b2ef832705..467ac9bb55 100644 --- a/flutter/test/integrations/native_app_start_integration_test.dart +++ b/flutter/test/integrations/native_app_start_integration_test.dart @@ -32,7 +32,8 @@ void main() { final transaction = SentryTransaction(tracer); final processor = fixture.options.eventProcessors.first; - final enriched = await processor.apply(transaction) as SentryTransaction; + final enriched = + await processor.apply(transaction, Hint()) as SentryTransaction; final measurement = enriched.measurements['app_start_cold']!; expect(measurement.value, 10); @@ -52,8 +53,10 @@ void main() { final processor = fixture.options.eventProcessors.first; - var enriched = await processor.apply(transaction) as SentryTransaction; - var secondEnriched = await processor.apply(enriched) as SentryTransaction; + var enriched = + await processor.apply(transaction, Hint()) as SentryTransaction; + var secondEnriched = + await processor.apply(enriched, Hint()) as SentryTransaction; expect(secondEnriched.measurements.length, 1); }); @@ -72,8 +75,10 @@ void main() { final processor = fixture.options.eventProcessors.first; - var enriched = await processor.apply(transaction) as SentryTransaction; - var secondEnriched = await processor.apply(enriched) as SentryTransaction; + var enriched = + await processor.apply(transaction, Hint()) as SentryTransaction; + var secondEnriched = + await processor.apply(enriched, Hint()) as SentryTransaction; expect(secondEnriched.measurements.length, 2); expect(secondEnriched.measurements.containsKey(measurement.name), true); @@ -90,7 +95,8 @@ void main() { final transaction = SentryTransaction(tracer); final processor = fixture.options.eventProcessors.first; - final enriched = await processor.apply(transaction) as SentryTransaction; + final enriched = + await processor.apply(transaction, Hint()) as SentryTransaction; expect(enriched.measurements.isEmpty, true); }); diff --git a/flutter/test/load_image_list_test.dart b/flutter/test/load_image_list_test.dart index 0afff01b97..345d913887 100644 --- a/flutter/test/load_image_list_test.dart +++ b/flutter/test/load_image_list_test.dart @@ -127,7 +127,7 @@ void main() { final ep = fixture.options.eventProcessors.first; SentryEvent? event = _getEvent(); - event = await ep.apply(event); + event = await ep.apply(event, Hint()); expect(1, event!.debugMeta!.images.length); }); @@ -138,7 +138,7 @@ void main() { sut.call(fixture.hub, fixture.options); final ep = fixture.options.eventProcessors.first; SentryEvent? event = _getEvent(); - event = await ep.apply(event); + event = await ep.apply(event, Hint()); final image = event!.debugMeta!.images.first; diff --git a/flutter/test/view_hierarchy/view_hierarchy_event_processor_test.dart b/flutter/test/view_hierarchy/view_hierarchy_event_processor_test.dart index 537b2cd9c4..a409d1a293 100644 --- a/flutter/test/view_hierarchy/view_hierarchy_event_processor_test.dart +++ b/flutter/test/view_hierarchy/view_hierarchy_event_processor_test.dart @@ -26,7 +26,7 @@ void main() { exceptions: [SentryException(type: 'type', value: 'value')]); final hint = Hint(); - sut.apply(event, hint: hint); + sut.apply(event, hint); expect(hint.viewHierarchy, isNotNull); }); @@ -42,7 +42,7 @@ void main() { final event = SentryEvent(throwable: StateError('error')); final hint = Hint(); - sut.apply(event, hint: hint); + sut.apply(event, hint); expect(hint.viewHierarchy, isNotNull); }); @@ -58,7 +58,7 @@ void main() { final event = SentryEvent(); final hint = Hint(); - sut.apply(event, hint: hint); + sut.apply(event, hint); expect(hint.viewHierarchy, isNull); }); @@ -74,7 +74,7 @@ void main() { final event = SentryEvent(); final hint = Hint(); - sut.apply(event, hint: hint); + sut.apply(event, hint); expect(hint.viewHierarchy, isNull); }); diff --git a/sqflite/test/mocks/mocks.dart b/sqflite/test/mocks/mocks.dart index 0a3115df74..5ecd57ce50 100644 --- a/sqflite/test/mocks/mocks.dart +++ b/sqflite/test/mocks/mocks.dart @@ -33,7 +33,7 @@ ISentrySpan startTransactionShim( DatabaseExecutor, ], customMocks: [ - MockSpec(fallbackGenerators: {#startTransaction: startTransactionShim}) + MockSpec(fallbackGenerators: {#startTransaction: startTransactionShim}), ], ) void main() {} From a37a79355f5592d9ec64a77b5e51763fabdf2c27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denis=20Andra=C5=A1ec?= Date: Mon, 11 Sep 2023 09:47:54 +0000 Subject: [PATCH 06/36] Load Device Contexts from Sentry Java (#1616) --- CHANGELOG.md | 4 +- dart/lib/src/sentry_client.dart | 38 ---- dart/test/sentry_client_test.dart | 195 ------------------ .../io/sentry/flutter/SentryFlutterPlugin.kt | 42 ++-- .../load_contexts_integration.dart | 17 +- flutter/lib/src/sentry_flutter.dart | 2 +- flutter/test/sentry_flutter_test.dart | 3 +- sqflite/test/mocks/mocks.dart | 4 +- 8 files changed, 38 insertions(+), 267 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c38892c7c2..ee955dac28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,9 @@ - Do not leak extensions of external classes ([#1576](https://github.com/getsentry/sentry-dart/pull/1576)) - Make `hint` non-nullable in `BeforeSendCallback`, `BeforeBreadcrumbCall` and `EventProcessor` ([#1574](https://github.com/getsentry/sentry-dart/pull/1574)) - This will affect your callbacks, making this a breaking change. - +- Load Device Contexts from Sentry Java ([#1616](https://github.com/getsentry/sentry-dart/pull/1616)) + - Now the device context from Android is available in `BeforeSendCallback` + ## Unreleased ### Fixes diff --git a/dart/lib/src/sentry_client.dart b/dart/lib/src/sentry_client.dart index 5821ae6f63..d83207f1bd 100644 --- a/dart/lib/src/sentry_client.dart +++ b/dart/lib/src/sentry_client.dart @@ -108,8 +108,6 @@ class SentryClient { return _sentryId; } - preparedEvent = _eventWithoutBreadcrumbsIfNeeded(preparedEvent); - var attachments = List.from(scope?.attachments ?? []); attachments.addAll(hint.attachments); var screenshot = hint.screenshot; @@ -322,8 +320,6 @@ class SentryClient { return _sentryId; } - preparedTransaction = _eventWithoutBreadcrumbsIfNeeded(preparedTransaction); - final attachments = scope?.attachments .where((element) => element.addToTransactions) .toList(); @@ -457,40 +453,6 @@ class SentryClient { _options.recorder.recordLostEvent(reason, category); } - T _eventWithoutBreadcrumbsIfNeeded(T event) { - if (_shouldRemoveBreadcrumbs(event)) { - return event.copyWith(breadcrumbs: []) as T; - } else { - return event; - } - } - - /// We do this to avoid duplicate breadcrumbs on Android as sentry-android applies the breadcrumbs - /// from the native scope onto every envelope sent through it. This scope will contain the breadcrumbs - /// sent through the scope sync feature. This causes duplicate breadcrumbs. - /// We then remove the breadcrumbs in all cases but if it is handled == false, - /// this is a signal that the app would crash and android would lose the breadcrumbs by the time the app is restarted to read - /// the envelope. - bool _shouldRemoveBreadcrumbs(SentryEvent event) { - if (_options.platformChecker.isWeb) { - return false; - } - - final isAndroid = _options.platformChecker.platform.isAndroid; - final enableScopeSync = _options.enableScopeSync; - - if (!isAndroid || !enableScopeSync) { - return false; - } - - final mechanisms = - (event.exceptions ?? []).map((e) => e.mechanism).whereType(); - final hasNoMechanism = mechanisms.isEmpty; - final hasOnlyHandledMechanism = - mechanisms.every((e) => (e.handled ?? true)); - return hasNoMechanism || hasOnlyHandledMechanism; - } - Future _attachClientReportsAndSend(SentryEnvelope envelope) { final clientReport = _options.recorder.flush(); envelope.addClientReport(clientReport); diff --git a/dart/test/sentry_client_test.dart b/dart/test/sentry_client_test.dart index f62c310b5d..15f91cdebe 100644 --- a/dart/test/sentry_client_test.dart +++ b/dart/test/sentry_client_test.dart @@ -1153,201 +1153,6 @@ void main() { }); }); - group('Breadcrumbs', () { - late Fixture fixture; - - setUp(() { - fixture = Fixture(); - }); - - test('Clears breadcrumbs on Android for transaction', () async { - fixture.options.enableScopeSync = true; - fixture.options.platformChecker = - MockPlatformChecker(platform: MockPlatform.android()); - - final client = fixture.getSut(); - final transaction = SentryTransaction( - fixture.tracer, - breadcrumbs: [ - Breadcrumb(), - ], - ); - await client.captureTransaction(transaction); - - final capturedEnvelope = (fixture.transport).envelopes.first; - final capturedTransaction = - await transactionFromEnvelope(capturedEnvelope); - - expect((capturedTransaction['breadcrumbs'] ?? []).isEmpty, true); - }); - - test('Clears breadcrumbs on Android if mechanism.handled is true for event', - () async { - fixture.options.enableScopeSync = true; - fixture.options.platformChecker = - MockPlatformChecker(platform: MockPlatform.android()); - - final client = fixture.getSut(); - final event = SentryEvent(exceptions: [ - SentryException( - type: "type", - value: "value", - mechanism: Mechanism( - type: 'type', - handled: true, - ), - ) - ], breadcrumbs: [ - Breadcrumb() - ]); - await client.captureEvent(event); - - final capturedEnvelope = (fixture.transport).envelopes.first; - final capturedEvent = await eventFromEnvelope(capturedEnvelope); - - expect((capturedEvent.breadcrumbs ?? []).isEmpty, true); - }); - - test('Clears breadcrumbs on Android if mechanism.handled is null for event', - () async { - fixture.options.enableScopeSync = true; - fixture.options.platformChecker = - MockPlatformChecker(platform: MockPlatform.android()); - - final client = fixture.getSut(); - final event = SentryEvent(exceptions: [ - SentryException( - type: "type", - value: "value", - mechanism: Mechanism(type: 'type'), - ) - ], breadcrumbs: [ - Breadcrumb() - ]); - await client.captureEvent(event); - - final capturedEnvelope = (fixture.transport).envelopes.first; - final capturedEvent = await eventFromEnvelope(capturedEnvelope); - - expect((capturedEvent.breadcrumbs ?? []).isEmpty, true); - }); - - test('Clears breadcrumbs on Android if theres no mechanism for event', - () async { - fixture.options.enableScopeSync = true; - fixture.options.platformChecker = - MockPlatformChecker(platform: MockPlatform.android()); - - final client = fixture.getSut(); - final event = SentryEvent(exceptions: [ - SentryException( - type: "type", - value: "value", - ) - ], breadcrumbs: [ - Breadcrumb() - ]); - await client.captureEvent(event); - - final capturedEnvelope = (fixture.transport).envelopes.first; - final capturedEvent = await eventFromEnvelope(capturedEnvelope); - - expect((capturedEvent.breadcrumbs ?? []).isEmpty, true); - }); - - test( - 'Does not clear breadcrumbs on Android if mechanism.handled is false for event', - () async { - fixture.options.enableScopeSync = true; - fixture.options.platformChecker = - MockPlatformChecker(platform: MockPlatform.android()); - - final client = fixture.getSut(); - final event = SentryEvent(exceptions: [ - SentryException( - type: "type", - value: "value", - mechanism: Mechanism( - type: 'type', - handled: false, - ), - ) - ], breadcrumbs: [ - Breadcrumb() - ]); - await client.captureEvent(event); - - final capturedEnvelope = (fixture.transport).envelopes.first; - final capturedEvent = await eventFromEnvelope(capturedEnvelope); - - expect((capturedEvent.breadcrumbs ?? []).isNotEmpty, true); - }); - - test( - 'Does not clear breadcrumbs on Android if any mechanism.handled is false for event', - () async { - fixture.options.enableScopeSync = true; - fixture.options.platformChecker = - MockPlatformChecker(platform: MockPlatform.android()); - - final client = fixture.getSut(); - final event = SentryEvent(exceptions: [ - SentryException( - type: "type", - value: "value", - mechanism: Mechanism( - type: 'type', - handled: true, - ), - ), - SentryException( - type: "type", - value: "value", - mechanism: Mechanism( - type: 'type', - handled: false, - ), - ) - ], breadcrumbs: [ - Breadcrumb() - ]); - await client.captureEvent(event); - - final capturedEnvelope = (fixture.transport).envelopes.first; - final capturedEvent = await eventFromEnvelope(capturedEnvelope); - - expect((capturedEvent.breadcrumbs ?? []).isNotEmpty, true); - }); - - test('web breadcrumbs exist on web Android devices', () async { - fixture.options.enableScopeSync = true; - fixture.options.platformChecker = MockPlatformChecker( - platform: MockPlatform.android(), - isWebValue: true, - ); - - final client = fixture.getSut(); - final event = SentryEvent(exceptions: [ - SentryException( - type: "type", - value: "value", - mechanism: Mechanism( - type: 'type', - handled: true, - ), - ), - ], breadcrumbs: [ - Breadcrumb(), - ]); - await client.captureEvent(event); - - final capturedEnvelope = (fixture.transport).envelopes.first; - final capturedEvent = await eventFromEnvelope(capturedEnvelope); - - expect((capturedEvent.breadcrumbs ?? []).isNotEmpty, true); - }); - }); - group('ClientReportRecorder', () { late Fixture fixture; diff --git a/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt b/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt index cc864f7333..58423b91fa 100644 --- a/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt +++ b/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt @@ -21,6 +21,7 @@ import io.sentry.SentryOptions import io.sentry.android.core.ActivityFramesTracker import io.sentry.android.core.AppStartState import io.sentry.android.core.BuildConfig.VERSION_NAME +import io.sentry.android.core.InternalSentrySdk import io.sentry.android.core.LoadClass import io.sentry.android.core.SentryAndroid import io.sentry.android.core.SentryAndroidOptions @@ -65,6 +66,7 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { "removeExtra" -> removeExtra(call.argument("key"), result) "setTag" -> setTag(call.argument("key"), call.argument("value"), result) "removeTag" -> removeTag(call.argument("key"), result) + "loadContexts" -> loadContexts(result) else -> result.notImplemented() } } @@ -94,18 +96,6 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { // Stub } - private fun writeEnvelope(envelope: ByteArray): Boolean { - val options = HubAdapter.getInstance().options - if (options.outboxPath.isNullOrEmpty()) { - return false - } - - val file = File(options.outboxPath, UUID.randomUUID().toString()) - file.writeBytes(envelope) - - return true - } - private fun initNativeSdk(call: MethodCall, result: Result) { if (!this::context.isInitialized) { result.error("1", "Context is null", null) @@ -356,20 +346,19 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { result.error("1", "The Sentry Android SDK is disabled", null) return } - - val args = call.arguments() as List? ?: listOf() + val args = call.arguments() as List? ?: listOf() if (args.isNotEmpty()) { val event = args.first() as ByteArray? - if (event != null && event.isNotEmpty()) { - if (!writeEnvelope(event)) { - result.error("2", "SentryOptions or outboxPath are null or empty", null) + val id = InternalSentrySdk.captureEnvelope(event) + if (id != null) { + result.success("") + } else { + result.error("2", "Failed to capture envelope", null) } - result.success("") return } } - result.error("3", "Envelope is null or empty", null) } @@ -454,6 +443,21 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { } } } + + private fun loadContexts(result: Result) { + val options = HubAdapter.getInstance().options + if (options !is SentryAndroidOptions) { + result.success(null) + return + } + val currentScope = InternalSentrySdk.getCurrentScope() + val serializedScope = InternalSentrySdk.serializeScope( + context, + options, + currentScope + ) + result.success(serializedScope) + } } // Call the `completion` closure if cast to map value with `key` and type `T` is successful. diff --git a/flutter/lib/src/integrations/load_contexts_integration.dart b/flutter/lib/src/integrations/load_contexts_integration.dart index f0aa565da3..6395e134cf 100644 --- a/flutter/lib/src/integrations/load_contexts_integration.dart +++ b/flutter/lib/src/integrations/load_contexts_integration.dart @@ -4,21 +4,16 @@ import 'package:flutter/services.dart'; import 'package:sentry/sentry.dart'; import '../sentry_flutter_options.dart'; -/// Load Device's Contexts from the iOS SDK. +/// Load Device's Contexts from the iOS & Android SDKs. /// -/// This integration calls the iOS SDK via Message channel to load the -/// Device's contexts before sending the event back to the iOS SDK via +/// This integration calls the iOS & Android SDKs via Message channel to load +/// the Device's contexts before sending the event back to the SDK via /// Message channel (already enriched with all the information). /// /// The Device's contexts are: /// App, Device and OS. /// -/// ps. This integration won't be run on Android because the Device's Contexts -/// is set on Android when the event is sent to the Android SDK via -/// the Message channel. -/// We intend to unify this behaviour in the future. -/// -/// This integration is only executed on iOS & MacOS Apps. +/// This integration is only executed on iOS, macOS & Android Apps. class LoadContextsIntegration extends Integration { final MethodChannel _channel; @@ -194,8 +189,8 @@ class _LoadContextsIntegrationEventProcessor implements EventProcessor { event = event.copyWith(sdk: sdk); } - // on iOS, captureEnvelope does not call the beforeSend callback, - // hence we need to add these tags here. + // captureEnvelope does not call the beforeSend callback, hence we need to + // add these tags here. if (event.sdk?.name == 'sentry.dart.flutter') { final tags = event.tags ?? {}; tags['event.origin'] = 'flutter'; diff --git a/flutter/lib/src/sentry_flutter.dart b/flutter/lib/src/sentry_flutter.dart index 13aa7cc552..860990b213 100644 --- a/flutter/lib/src/sentry_flutter.dart +++ b/flutter/lib/src/sentry_flutter.dart @@ -154,7 +154,7 @@ mixin SentryFlutter { // Will enrich events with device context, native packages and integrations if (platformChecker.hasNativeIntegration && !platformChecker.isWeb && - (platform.isIOS || platform.isMacOS)) { + (platform.isIOS || platform.isMacOS || platform.isAndroid)) { integrations.add(LoadContextsIntegration(channel)); } diff --git a/flutter/test/sentry_flutter_test.dart b/flutter/test/sentry_flutter_test.dart index 56f6f250a6..9a7df7d063 100644 --- a/flutter/test/sentry_flutter_test.dart +++ b/flutter/test/sentry_flutter_test.dart @@ -27,9 +27,10 @@ final nonWebIntegrations = [ OnErrorIntegration, ]; -// These should only be added to Android +// These should be added to Android final androidIntegrations = [ LoadImageListIntegration, + LoadContextsIntegration, ]; // These should be added to iOS and macOS diff --git a/sqflite/test/mocks/mocks.dart b/sqflite/test/mocks/mocks.dart index 5ecd57ce50..bcafb94302 100644 --- a/sqflite/test/mocks/mocks.dart +++ b/sqflite/test/mocks/mocks.dart @@ -33,7 +33,9 @@ ISentrySpan startTransactionShim( DatabaseExecutor, ], customMocks: [ - MockSpec(fallbackGenerators: {#startTransaction: startTransactionShim}), + MockSpec( + fallbackGenerators: {#startTransaction: startTransactionShim}, + ), ], ) void main() {} From 9b28718d7246f46c9c51ee4369c6b6508781a975 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denis=20Andra=C5=A1ec?= Date: Mon, 9 Oct 2023 14:54:48 +0000 Subject: [PATCH 07/36] Set ip_address to {{auto}} by default, even if sendDefaultPII is disabled (#1665) --- CHANGELOG.md | 4 +++- dart/lib/src/sentry_client.dart | 16 ++++------------ dart/test/sentry_client_test.dart | 19 ++++--------------- 3 files changed, 11 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee955dac28..323f9c563e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,9 @@ - This will affect your callbacks, making this a breaking change. - Load Device Contexts from Sentry Java ([#1616](https://github.com/getsentry/sentry-dart/pull/1616)) - Now the device context from Android is available in `BeforeSendCallback` - +- Set ip_address to {{auto}} by default, even if sendDefaultPII is disabled ([#1665](https://github.com/getsentry/sentry-dart/pull/1665)) + - Instead use the "Prevent Storing of IP Addresses" option in the "Security & Privacy" project settings on sentry.io + ## Unreleased ### Fixes diff --git a/dart/lib/src/sentry_client.dart b/dart/lib/src/sentry_client.dart index d83207f1bd..d354e4a449 100644 --- a/dart/lib/src/sentry_client.dart +++ b/dart/lib/src/sentry_client.dart @@ -23,8 +23,7 @@ import 'client_reports/discard_reason.dart'; import 'transport/data_category.dart'; /// Default value for [User.ipAddress]. It gets set when an event does not have -/// a user and IP address. Only applies if [SentryOptions.sendDefaultPii] is set -/// to true. +/// a user and IP address. const _defaultIpAddress = '{{auto}}'; /// Logs crash reports and events to the Sentry.io service. @@ -142,7 +141,7 @@ class SentryClient { platform: event.platform ?? sdkPlatform(_options.platformChecker.isWeb), ); - event = _applyDefaultPii(event); + event = _createUserOrSetDefaultIpAddress(event); if (event is SentryTransaction) { return event; @@ -222,20 +221,13 @@ class SentryClient { return event; } - /// This modifies the users IP address according - /// to [SentryOptions.sendDefaultPii]. - SentryEvent _applyDefaultPii(SentryEvent event) { - if (!_options.sendDefaultPii) { - return event; - } + SentryEvent _createUserOrSetDefaultIpAddress(SentryEvent event) { var user = event.user; if (user == null) { - user = SentryUser(ipAddress: _defaultIpAddress); - return event.copyWith(user: user); + return event.copyWith(user: SentryUser(ipAddress: _defaultIpAddress)); } else if (event.user?.ipAddress == null) { return event.copyWith(user: user.copyWith(ipAddress: _defaultIpAddress)); } - return event; } diff --git a/dart/test/sentry_client_test.dart b/dart/test/sentry_client_test.dart index 15f91cdebe..522bfcae73 100644 --- a/dart/test/sentry_client_test.dart +++ b/dart/test/sentry_client_test.dart @@ -826,25 +826,14 @@ void main() { }); }); - group('SentryClient: apply default pii', () { + group('SentryClient: sets user & user ip', () { late Fixture fixture; setUp(() { fixture = Fixture(); }); - test('sendDefaultPii is disabled', () async { - final client = fixture.getSut(sendDefaultPii: false); - - await client.captureEvent(fakeEvent); - - final capturedEnvelope = fixture.transport.envelopes.first; - final capturedEvent = await eventFromEnvelope(capturedEnvelope); - - expect(capturedEvent.user?.toJson(), fakeEvent.user?.toJson()); - }); - - test('sendDefaultPii is enabled and event has no user', () async { + test('event has no user', () async { final client = fixture.getSut(sendDefaultPii: true); var fakeEvent = SentryEvent(); @@ -858,7 +847,7 @@ void main() { expect(capturedEvent.user?.ipAddress, '{{auto}}'); }); - test('sendDefaultPii is enabled and event has a user with IP address', + test('event has a user with IP address', () async { final client = fixture.getSut(sendDefaultPii: true); @@ -875,7 +864,7 @@ void main() { expect(capturedEvent.user?.email, fakeEvent.user!.email); }); - test('sendDefaultPii is enabled and event has a user without IP address', + test('event has a user without IP address', () async { final client = fixture.getSut(sendDefaultPii: true); From d99a1e4a322f2242cedbabd47a324461f70c6a15 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Wed, 31 Jan 2024 12:17:37 +0100 Subject: [PATCH 08/36] chore: merge main into v8 branch (#1841) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ci: update actions (#1617) * Add tests for the Android and iOS plugin (#1587) * Normalize `data` properties of `SentryUser` and `Breadcrumb` before sending over method channel (#1591) * chore(deps): update Cocoa SDK to v8.11.0 (#1626) Co-authored-by: GitHub * Tracing without performance (#1621) * implement propagationContext * remove sampled and parentSpanId for now * update changelog * fix build error * create new propagation context on startTransaction if tracing is disabled * remove print * propagate trace for http requests * add tracing client test * fix tests * format * fix compile * tests * fix analysis score * fix analysis score * fix compilation * fix score * fix score * fix score * fix score * update tests * [starfish] add attributes to db spans data (#1629) * add db attibutes to spans * change variable names * update changelog * update changelog * update tests * update imports * update tests * remove unused import * couple dbName to db instance * format * use path pub * don't set dbName to null when db close() is called * [starfish] add http.request.method attribute to http spans (#1633) * add http.request.method to http spans * update changelog * Fix Android & iOS CI issues (#1627) * Disable scope sync for cloned scopes (#1628) * chore: update flutter/scripts/update-android.sh to 6.29.0 (#1630) Co-authored-by: GitHub * Discard empty stack frames (#1625) * Introduce workflow dispatch action for`format` & `fix --apply` (#1575) * feat/refactor: add cocoa FFI binding (#1631) * refactor: move native code to its own directory (#1638) * Log SDK errors to the console if the log level is `fatal` even if `debug` is disabled (#1635) * Fix autoPerformanceTracingEnabled flag in andorid plugin (#1640) * Add Sampling Decision to Trace Envelope Header (#1639) * add sampled flag * fmt * update changelog * redo fmt * fix tests * chore: update metrics/flutter.properties to 3.13.3 (#1632) Co-authored-by: GitHub * fix: add missing FFI depdendency (#1642) * release: 7.10.1 * ci: macos integration test (#1645) * fix: generated cocoa bindings (#1648) * Update uuid (#1647) Co-authored-by: Ivan Dlugos <6349682+vaind@users.noreply.github.com> * chore(deps): update Cocoa SDK to v8.12.0 (#1650) Co-authored-by: GitHub * Breadcrumbs for file I/O operations (#1649) * ci: don't run CI on markdown updates (#1651) * chore(deps): update Flutter SDK (metrics) to v3.13.6 (#1659) * chore: update metrics/flutter.properties to 3.13.6 * Update flutter.properties --------- Co-authored-by: GitHub Co-authored-by: Stefano * chore: update flutter/scripts/update-android.sh to 6.30.0 (#1660) * chore: update flutter/scripts/update-cocoa.sh to 8.13.0 (#1655) * Generate class diagrams (#1646) * Rename `options.devMode` to `options.automatedTestMode` (#1664) * chore: update flutter/scripts/update-cocoa.sh to 8.13.1 (#1677) Co-authored-by: GitHub * chore: update flutter/scripts/update-android.sh to 6.31.0 (#1676) * chore: update metrics/flutter.properties to 3.13.7 (#1674) Co-authored-by: GitHub * Add dependabot (#1670) * Bump codecov/codecov-action from 3.1.1 to 3.1.4 (#1680) * chore: update flutter/scripts/update-android.sh to 6.32.0 (#1688) Co-authored-by: GitHub * chore(deps): update Cocoa SDK to v8.14.2 (#1691) * chore: update flutter/scripts/update-cocoa.sh to 8.14.2 --------- Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor * chore: update changelog (#1699) * Update changelog * release: 7.11.0 * Bump lints from 2.1.1 to 3.0.0 in /sqflite (#1697) Bumps [lints](https://github.com/dart-lang/lints) from 2.1.1 to 3.0.0. - [Release notes](https://github.com/dart-lang/lints/releases) - [Changelog](https://github.com/dart-lang/lints/blob/main/CHANGELOG.md) - [Commits](https://github.com/dart-lang/lints/compare/v2.1.1...v3.0.0) --- updated-dependencies: - dependency-name: lints dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump lints from 2.1.1 to 3.0.0 in /logging (#1696) Bumps [lints](https://github.com/dart-lang/lints) from 2.1.1 to 3.0.0. - [Release notes](https://github.com/dart-lang/lints/releases) - [Changelog](https://github.com/dart-lang/lints/blob/main/CHANGELOG.md) - [Commits](https://github.com/dart-lang/lints/compare/v2.1.1...v3.0.0) --- updated-dependencies: - dependency-name: lints dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump lints from 2.1.1 to 3.0.0 in /file (#1694) Bumps [lints](https://github.com/dart-lang/lints) from 2.1.1 to 3.0.0. - [Release notes](https://github.com/dart-lang/lints/releases) - [Changelog](https://github.com/dart-lang/lints/blob/main/CHANGELOG.md) - [Commits](https://github.com/dart-lang/lints/compare/v2.1.1...v3.0.0) --- updated-dependencies: - dependency-name: lints dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump lints from 2.1.1 to 3.0.0 in /dio (#1693) Bumps [lints](https://github.com/dart-lang/lints) from 2.1.1 to 3.0.0. - [Release notes](https://github.com/dart-lang/lints/releases) - [Changelog](https://github.com/dart-lang/lints/blob/main/CHANGELOG.md) - [Commits](https://github.com/dart-lang/lints/compare/v2.1.1...v3.0.0) --- updated-dependencies: - dependency-name: lints dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat: profiling for iOS/macOS (#1611) Co-authored-by: Bruno Garcia Co-authored-by: Denis Andrašec Co-authored-by: Stefano * chore: update metrics/flutter.properties to 3.13.9 (#1702) * chore: log warning if both tracesSampleRate and tracesSampler are set (#1701) * Log warning if both tracesSampleRate and tracesSampler are set * Update CHANGELOG * Update log * Update CHANGELOG * chore: flutter symbol collector CLI tool (#1673) * release: 7.12.0 * Add `SentryNavigatorObserver` current route to `event.app.contexts.viewNames` (#1545) * fix: coverage not ignoring generated binding.dart (#1707) * Remove coverage for binding.dart * Breadcrumbs for database operations (#1656) * Bump actions/checkout from 3 to 4 (#1683) Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump ScaCap/action-ktlint from 1.7.1 to 1.8.0 (#1681) Bumps [ScaCap/action-ktlint](https://github.com/scacap/action-ktlint) from 1.7.1 to 1.8.0. - [Release notes](https://github.com/scacap/action-ktlint/releases) - [Commits](https://github.com/scacap/action-ktlint/compare/2cf245b99bc91f73bc4c96a3d9d57bb5da3533ae...0ff81efa49425bd0df46caabd8005aafdc8f2cf2) --- updated-dependencies: - dependency-name: ScaCap/action-ktlint dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump styfle/cancel-workflow-action from 0.11.0 to 0.12.0 (#1682) Bumps [styfle/cancel-workflow-action](https://github.com/styfle/cancel-workflow-action) from 0.11.0 to 0.12.0. - [Release notes](https://github.com/styfle/cancel-workflow-action/releases) - [Commits](https://github.com/styfle/cancel-workflow-action/compare/b173b6ec0100793626c2d9e6b90435061f4fc3e5...01ce38bf961b4e243a6342cbade0dbc8ba3f0432) --- updated-dependencies: - dependency-name: styfle/cancel-workflow-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Co-authored-by: Giancarlo Buenaflor * Bump dart-lang/setup-dart from 1.3.0 to 1.6.0 (#1692) Bumps [dart-lang/setup-dart](https://github.com/dart-lang/setup-dart) from 1.3.0 to 1.6.0. - [Release notes](https://github.com/dart-lang/setup-dart/releases) - [Changelog](https://github.com/dart-lang/setup-dart/blob/main/CHANGELOG.md) - [Commits](https://github.com/dart-lang/setup-dart/compare/6a218f2413a3e78e9087f638a238f6b40893203d...b64355ae6ca0b5d484f0106a033dd1388965d06d) --- updated-dependencies: - dependency-name: dart-lang/setup-dart dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * chore: update flutter/scripts/update-android.sh to 6.33.0 (#1710) Co-authored-by: GitHub * build(deps): bump subosito/flutter-action from 2.10.0 to 2.12.0 (#1711) Bumps [subosito/flutter-action](https://github.com/subosito/flutter-action) from 2.10.0 to 2.12.0. - [Release notes](https://github.com/subosito/flutter-action/releases) - [Commits](https://github.com/subosito/flutter-action/compare/48cafc24713cca54bbe03cdc3a423187d413aafa...2783a3f08e1baf891508463f8c6653c258246225) --- updated-dependencies: - dependency-name: subosito/flutter-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Add `attachScreenshotOnlyWhenResumed` to options (#1700) * chore: update flutter/scripts/update-android.sh to 6.33.1 (#1713) Co-authored-by: GitHub * chore: update flutter/scripts/update-cocoa.sh to 8.15.0 (#1712) Co-authored-by: GitHub * chore: update flutter/scripts/update-cocoa.sh to 8.15.1 (#1714) Co-authored-by: GitHub * fix: unsupported types with expando (#1690) * Support string, int, double and bool as throwable for expando * Rename the test file and move it to utils folder{ * Remvoe ffi import * Update changelog * Try other url for dio pubspec doc url * Change doc url of logging pubspec * Remove unnecessary code * Update naming * Rename * chore: update flutter/scripts/update-cocoa.sh to 8.15.2 (#1717) Co-authored-by: GitHub * Parse message field in `PlatformException.message` (#1716) * Parse message field * changelog * Update CHANGELOG.md * Bump natiginfo/action-detekt-all from 1.21.0 to 1.23.1 (#1684) * Bump natiginfo/action-detekt-all from 1.21.0 to 1.23.1 Bumps [natiginfo/action-detekt-all](https://github.com/natiginfo/action-detekt-all) from 1.21.0 to 1.23.1. - [Release notes](https://github.com/natiginfo/action-detekt-all/releases) - [Commits](https://github.com/natiginfo/action-detekt-all/compare/e01de6ff0eef7c24131e8a133bf598cfac6ceeab...be3c18799c7c392b2f41a674beed9ced7ae2f21b) --- updated-dependencies: - dependency-name: natiginfo/action-detekt-all dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * fix braces * Add missing trailing comma --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * build(deps): bump natiginfo/action-detekt-all from 1.23.1 to 1.23.3 (#1722) Bumps [natiginfo/action-detekt-all](https://github.com/natiginfo/action-detekt-all) from 1.23.1 to 1.23.3. - [Release notes](https://github.com/natiginfo/action-detekt-all/releases) - [Commits](https://github.com/natiginfo/action-detekt-all/compare/be3c18799c7c392b2f41a674beed9ced7ae2f21b...68eb02dd9f2c2686d5026f5957756064424261a9) --- updated-dependencies: - dependency-name: natiginfo/action-detekt-all dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Remove renderer on Dart:io platforms (#1723) * Remove renderer on dart:io platforms * Tests + changelog * Update CHANGELOG.md * Fix tests * fix more tests * feat: drift apm (#1709) * draft impl * improve code * Add open span * Refactor to extend lazy database * Update * SentryTransactionExecutor * Implement tracing batch and transactions * Update tests * update changelog * Formatting * Update workflows * Update deps * Fix analyze issues * Format * Add example * Update descriptions * Fix deps * Update run commands * Update workflow * Update example * Update workflow * Format * Fix dart analyze * Try changing deps * Add to craft * Change to flutter test * Revert flutter test mock * change dir manually * download and extract sqlite.dll for windows * Try downloading sqlite3 * set up dart * fix path to file * use pub get * Use flutter pub get * fix * skip windows test * fix analyze * fix drift.yml * format * Remove redundant test * Remove debug print * update trace origin * Improvements * Improvements * Add to flutter example * fix: setting the correct locale to contexts with navigatorKey (#1724) * Add localization with navigatorKey * Update CHANGELOG * Update tests * Update tests * Format * Remove unused import * Apply review improvements * Update CHANGELOG * APM for hive (#1672) * setup sentry hive library * Add SentryBox with first test * test added spans * Add sentry hive impl * introduce base box to avoid duplication * implement lazy box test * expose sentry hive and updata documentation * add hive to flutter example app * test throwing in base_box, cleanup * test lazy box error cases * test sentry hive impl failures * run fix & format * fix test failure race condition * add hive workflow, update other workflows * add changelog entry * remove path+provider from dev_dependencies * add coverage dev dependency * fix deprecation warnings * fix changelog * move span wrapping on own class to avoid duplication * add sentry box collection * test added spans, fix imports * test throwing code * fix changelog * change dbSystem value * change db system * remove unneccessary async & await * Fix analyze * Formatting * Add changelog symlink * Ignore hive coverage * Create symlink for dartdoc_options --------- Co-authored-by: Giancarlo Buenaflor * release: 7.13.0 * Fixes release of drift & hive (#1729) * Add integrations * Readd changelog * Add drift and hive to bump versions * Formatting and analyze * Update CHANGELOG and fix test * Update changelog * fix analyze issue * release: 7.13.1 * Fix formatting and analyze ci issues (#1733) * Fix analysis * Update readme * run format * Add drift and hive as craft registry target (#1731) * Add drift and hive as registry target * build(deps): bump dart-lang/setup-dart from 1.3.0 to 1.6.0 (#1743) Bumps [dart-lang/setup-dart](https://github.com/dart-lang/setup-dart) from 1.3.0 to 1.6.0. - [Release notes](https://github.com/dart-lang/setup-dart/releases) - [Changelog](https://github.com/dart-lang/setup-dart/blob/main/CHANGELOG.md) - [Commits](https://github.com/dart-lang/setup-dart/compare/v1.3...b64355ae6ca0b5d484f0106a033dd1388965d06d) --- updated-dependencies: - dependency-name: dart-lang/setup-dart dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): update Android SDK to v6.34.0 (#1746) * chore: update flutter/scripts/update-android.sh to 6.34.0 * Update CHANGELOG --------- Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor * deps: update `package_info_plus` constraints (#1749) * Update constraints * Update CHANGELOG * release: 7.13.2 * build(deps): bump codecov/codecov-action from 3.1.1 to 3.1.4 (#1742) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 3.1.1 to 3.1.4. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v3.1.1...eaaf4bedf32dbdc6b720b63067d99c4d77d6047d) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * build(deps): bump styfle/cancel-workflow-action from 0.11.0 to 0.12.0 (#1741) Bumps [styfle/cancel-workflow-action](https://github.com/styfle/cancel-workflow-action) from 0.11.0 to 0.12.0. - [Release notes](https://github.com/styfle/cancel-workflow-action/releases) - [Commits](https://github.com/styfle/cancel-workflow-action/compare/0.11.0...01ce38bf961b4e243a6342cbade0dbc8ba3f0432) --- updated-dependencies: - dependency-name: styfle/cancel-workflow-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * build(deps): bump actions/checkout from 3 to 4 (#1740) Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * build(deps): bump VeryGoodOpenSource/very_good_coverage (#1739) Bumps [VeryGoodOpenSource/very_good_coverage](https://github.com/verygoodopensource/very_good_coverage) from 2.1.0 to 2.2.0. - [Release notes](https://github.com/verygoodopensource/very_good_coverage/releases) - [Changelog](https://github.com/VeryGoodOpenSource/very_good_coverage/blob/main/CHANGELOG.md) - [Commits](https://github.com/verygoodopensource/very_good_coverage/compare/e5c91bc7ce9843e87c800b3bcafdfb86fbe28491...3b475421464c564c0714d92ce02742bd81fa9eda) --- updated-dependencies: - dependency-name: VeryGoodOpenSource/very_good_coverage dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * chore: update scripts/update-symbol-collector.sh to 1.13.0 (#1737) Co-authored-by: GitHub * chore: update scripts/update-symbol-collector.sh to 1.13.0 (#1754) Co-authored-by: GitHub * Add option to opt out of fatal level for automatically collected errors (#1738) * build(deps): bump natiginfo/action-detekt-all from 1.23.3 to 1.23.4 (#1758) Bumps [natiginfo/action-detekt-all](https://github.com/natiginfo/action-detekt-all) from 1.23.3 to 1.23.4. - [Release notes](https://github.com/natiginfo/action-detekt-all/releases) - [Commits](https://github.com/natiginfo/action-detekt-all/compare/68eb02dd9f2c2686d5026f5957756064424261a9...1349d3d957cba64d7b6b2752ef874d1e03e402a2) --- updated-dependencies: - dependency-name: natiginfo/action-detekt-all dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): update Cocoa SDK to v8.17.0 (#1761) * chore: update flutter/scripts/update-cocoa.sh to 8.17.0 * Apply format --------- Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor * build(deps): bump subosito/flutter-action from 2.10.0 to 2.12.0 (#1759) Bumps [subosito/flutter-action](https://github.com/subosito/flutter-action) from 2.10.0 to 2.12.0. - [Release notes](https://github.com/subosito/flutter-action/releases) - [Commits](https://github.com/subosito/flutter-action/compare/v2.10.0...2783a3f08e1baf891508463f8c6653c258246225) --- updated-dependencies: - dependency-name: subosito/flutter-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * chore: update metrics/flutter.properties to 3.16.1 (#1760) Co-authored-by: GitHub * fix(example): web obfuscation not working (#1766) * Add debug_meta to all events (#1756) * load_image_list_integration now appends debug_meta info to all non-transaction events with a stacktrace, instead of checking for Exception existence * chore: Update README to include drift and hive (#1735) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor Co-authored-by: Giancarlo Buenaflor Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: getsentry-bot Co-authored-by: Denis Andrašec * chore: update metrics/flutter.properties to 3.16.2 (#1769) Co-authored-by: GitHub * chore(deps): update Cocoa SDK to v8.17.1 (#1771) * chore: update flutter/scripts/update-cocoa.sh to 8.17.1 * Formatting --------- Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor * Add `Hive` breadcrumbs (#1773) * improvements(example): fix router navigation issue and add improvements (#1767) * Change http url and add route navigation observer example * Remove comment * Improve sample * Format * Add padding * Fix analyze issues * build(deps): bump actions/setup-java from 3 to 4 (#1772) Bumps [actions/setup-java](https://github.com/actions/setup-java) from 3 to 4. - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/setup-java dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * docs: add new package release process (#1734) * add docs * Add flutter example step * Add analyze info * Update * Update new-package-release-checklist.md * fix(ci): compile error in example using flutter beta channel (#1783) * fix ci * chore(deps): update Cocoa SDK to v8.17.2 (#1787) * chore: update flutter/scripts/update-cocoa.sh to 8.17.2 --------- Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor * chore: update flutter/scripts/update-android.sh to 7.0.0 (#1768) Co-authored-by: GitHub Co-authored-by: Giancarlo Buenaflor * release: 7.14.0 * Add `ConnectivityIntegration` for web (#1765) * Fix changelog (#1791) * build(deps): bump actions/upload-artifact from 3 to 4 (#1789) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * APM for isar (#1726) * Bump flutter_lints from 2.0.3 to 3.0.0 in /flutter (#1698) * Bump flutter_lints from 2.0.3 to 3.0.0 in /flutter Bumps [flutter_lints](https://github.com/flutter/packages/tree/main/packages) from 2.0.3 to 3.0.0. - [Release notes](https://github.com/flutter/packages/releases) - [Commits](https://github.com/flutter/packages/commits/pigeon-v3.0.0/packages) --- updated-dependencies: - dependency-name: flutter_lints dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Satisfy analyzer * Satisfy dart analyzer --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * chore: update metrics/flutter.properties to 3.16.5 (#1793) Co-authored-by: GitHub * Bump lints from 2.1.1 to 3.0.0 in /dart (#1695) * Bump lints from 2.1.1 to 3.0.0 in /dart Bumps [lints](https://github.com/dart-lang/lints) from 2.1.1 to 3.0.0. - [Release notes](https://github.com/dart-lang/lints/releases) - [Changelog](https://github.com/dart-lang/lints/blob/main/CHANGELOG.md) - [Commits](https://github.com/dart-lang/lints/compare/v2.1.1...v3.0.0) --- updated-dependencies: - dependency-name: lints dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * update --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: GIancarlo Buenaflor * build(deps): bump reactivecircus/android-emulator-runner (#1779) Bumps [reactivecircus/android-emulator-runner](https://github.com/reactivecircus/android-emulator-runner) from 2.28.0 to 2.29.0. - [Release notes](https://github.com/reactivecircus/android-emulator-runner/releases) - [Changelog](https://github.com/ReactiveCircus/android-emulator-runner/blob/main/CHANGELOG.md) - [Commits](https://github.com/reactivecircus/android-emulator-runner/compare/d94c3fbe4fe6a29e4a5ba47c12fb47677c73656b...99a4aac18b4df9b3af66c4a1f04c1f23fa10c270) --- updated-dependencies: - dependency-name: reactivecircus/android-emulator-runner dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * build(deps): bump subosito/flutter-action from 2.10.0 to 2.12.0 (#1796) Bumps [subosito/flutter-action](https://github.com/subosito/flutter-action) from 2.10.0 to 2.12.0. - [Release notes](https://github.com/subosito/flutter-action/releases) - [Commits](https://github.com/subosito/flutter-action/compare/v2.10.0...2783a3f08e1baf891508463f8c6653c258246225) --- updated-dependencies: - dependency-name: subosito/flutter-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat: spotlight support (#1786) * Implement spotlight support (screenshots are currently disabled and removed from the envelope) * build(deps): bump VeryGoodOpenSource/very_good_coverage (#1795) Bumps [VeryGoodOpenSource/very_good_coverage](https://github.com/verygoodopensource/very_good_coverage) from 2.1.0 to 2.2.0. - [Release notes](https://github.com/verygoodopensource/very_good_coverage/releases) - [Changelog](https://github.com/VeryGoodOpenSource/very_good_coverage/blob/main/CHANGELOG.md) - [Commits](https://github.com/verygoodopensource/very_good_coverage/compare/v2.1.0...3b475421464c564c0714d92ce02742bd81fa9eda) --- updated-dependencies: - dependency-name: VeryGoodOpenSource/very_good_coverage dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump actions/setup-java from 3 to 4 (#1797) Bumps [actions/setup-java](https://github.com/actions/setup-java) from 3 to 4. - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/setup-java dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update Path Filters (#1763) * Add app flavor to `flutter_context` (#1799) * Add app flavor * fix changelog * chore(deps): update Android SDK to v7.1.0 (#1788) * chore: update flutter/scripts/update-android.sh to 7.1.0 * Fix app start * format --------- Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor * Add isar breadcrumbs (#1800) * chore: update flutter/scripts/update-cocoa.sh to 8.18.0 (#1803) Co-authored-by: GitHub * Add `beforeScreenshotCallback` to `SentryFlutterOptions` (#1805) * fix typo in docs (#1816) * chore: update metrics/flutter.properties to 3.16.7 (#1814) Co-authored-by: GitHub * Add support for `readTransaction` in `sqflite` (#1819) * ci: disable some tests temporarily (#1835) * release: 7.15.0 * Accept `Map` in `Hint` class (#1807) * build(deps): bump actions/cache from 3 to 4 (#1833) Bumps [actions/cache](https://github.com/actions/cache) from 3 to 4. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * proper changelog * fix * pin version * format ktlint * fix ktlint * fix ktlint * fix ktlint * update detekt baseline * build(deps): bump dart-lang/setup-dart from 1.6.0 to 1.6.1 (#1817) Bumps [dart-lang/setup-dart](https://github.com/dart-lang/setup-dart) from 1.6.0 to 1.6.1. - [Release notes](https://github.com/dart-lang/setup-dart/releases) - [Changelog](https://github.com/dart-lang/setup-dart/blob/main/CHANGELOG.md) - [Commits](https://github.com/dart-lang/setup-dart/compare/b64355ae6ca0b5d484f0106a033dd1388965d06d...ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b) --- updated-dependencies: - dependency-name: dart-lang/setup-dart dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * chore(deps): update Flutter SDK (metrics) to v3.16.8 (#1825) * chore: update metrics/flutter.properties to 3.16.8 * update path --------- Co-authored-by: GitHub Co-authored-by: Giancarlo Buenaflor * feat: tracing without performance for dio (#1837) * feat: tracing without performance for dio * chore: update CHANGELOG.md * chore: reenable testing sentry-dart on windows (#1838) * enable windows again * test with chrome * test with chrome * reenable windows test * chore: add isar to craft (#1843) * add isar * Update Changelog * chore(deps): update Cocoa SDK to v8.19.0 (#1844) * chore: update flutter/scripts/update-cocoa.sh to 8.19.0 --------- Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor * feat: Add sentry widget that includes other sentry widgets (#1846) * add sentry widget * Update CHANGELOG.md * Update CHANGELOG.md * build(deps): bump styfle/cancel-workflow-action from 0.12.0 to 0.12.1 (#1849) Bumps [styfle/cancel-workflow-action](https://github.com/styfle/cancel-workflow-action) from 0.12.0 to 0.12.1. - [Release notes](https://github.com/styfle/cancel-workflow-action/releases) - [Commits](https://github.com/styfle/cancel-workflow-action/compare/01ce38bf961b4e243a6342cbade0dbc8ba3f0432...85880fa0301c86cca9da44039ee3bb12d3bedbfa) --- updated-dependencies: - dependency-name: styfle/cancel-workflow-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump reactivecircus/android-emulator-runner (#1848) Bumps [reactivecircus/android-emulator-runner](https://github.com/reactivecircus/android-emulator-runner) from 2.29.0 to 2.30.1. - [Release notes](https://github.com/reactivecircus/android-emulator-runner/releases) - [Changelog](https://github.com/ReactiveCircus/android-emulator-runner/blob/main/CHANGELOG.md) - [Commits](https://github.com/reactivecircus/android-emulator-runner/compare/99a4aac18b4df9b3af66c4a1f04c1f23fa10c270...6b0df4b0efb23bb0ec63d881db79aefbc976e4b2) --- updated-dependencies: - dependency-name: reactivecircus/android-emulator-runner dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump codecov/codecov-action from 3.1.4 to 3.1.5 (#1850) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 3.1.4 to 3.1.5. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/eaaf4bedf32dbdc6b720b63067d99c4d77d6047d...4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * chore(deps): update Android SDK to v7.2.0 (#1815) * chore: update flutter/scripts/update-android.sh to 7.2.0 * Update podfile * Update podfile * Update deployment target * update * update --------- Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor * chore(deps): update Flutter SDK (metrics) to v3.16.9 (#1847) * chore: update metrics/flutter.properties to 3.16.9 * update * update --------- Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor * chore(deps): update Symbol collector CLI to v1.14.0 (#1827) * chore: update scripts/update-symbol-collector.sh to 1.14.0 * update --------- Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor * Update CHANGELOG.md (#1845) * chore: update flutter/scripts/update-android.sh to 7.3.0 (#1852) Co-authored-by: GitHub * release: 7.16.0 * Update CHANGELOG.md * Update .craft.yml * Update resources in readme --------- Signed-off-by: dependabot[bot] Co-authored-by: Ivan Dlugos <6349682+vaind@users.noreply.github.com> Co-authored-by: Denis Andrašec Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: GitHub Co-authored-by: getsentry-bot Co-authored-by: getsentry-bot Co-authored-by: Jonas Uekötter Co-authored-by: Stefano Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Bruno Garcia Co-authored-by: Stefano Co-authored-by: Oleg Magomedov <69794332+smart7even@users.noreply.github.com> Co-authored-by: Igor Khramtsov --- .craft.yml | 6 + .github/dependabot.yml | 48 + .github/workflows/analyze.yml | 31 +- .github/workflows/dart.yml | 22 +- .github/workflows/diagrams.yml | 64 + .github/workflows/dio.yml | 25 +- .github/workflows/drift.yml | 113 + .github/workflows/e2e_dart.yml | 20 +- .github/workflows/file.yml | 26 +- .github/workflows/flutter-symbols.yml | 58 + .github/workflows/flutter.yml | 54 +- .../workflows/flutter_integration_test.yml | 48 +- .github/workflows/flutter_test.yml | 169 + .github/workflows/format-and-fix.yml | 54 + .github/workflows/hive.yml | 70 + .github/workflows/isar.yml | 113 + .github/workflows/logging.yml | 25 +- .github/workflows/metrics.yml | 17 +- .github/workflows/min_version_test.yml | 36 +- .github/workflows/release.yml | 2 +- .github/workflows/sqflite.yml | 37 +- .github/workflows/update-deps.yml | 12 +- .github/workflows/web-example-ghpages.yml | 4 +- .gitignore | 3 + CHANGELOG.md | 177 +- README.md | 19 +- dart/README.md | 11 +- dart/analysis_options.yaml | 1 + dart/class-diagram.svg | 3364 + dart/lib/sentry.dart | 4 + dart/lib/src/diagnostic_logger.dart | 4 +- dart/lib/src/hint.dart | 18 +- dart/lib/src/http_client/tracing_client.dart | 25 +- dart/lib/src/hub.dart | 76 +- dart/lib/src/hub_adapter.dart | 15 + dart/lib/src/noop_hub.dart | 13 + dart/lib/src/profiling.dart | 22 + dart/lib/src/propagation_context.dart | 12 + dart/lib/src/protocol/sentry_app.dart | 40 +- dart/lib/src/protocol/sentry_event.dart | 2 +- .../src/protocol/sentry_trace_context.dart | 12 + dart/lib/src/protocol/sentry_transaction.dart | 64 +- .../src/run_zoned_guarded_integration.dart | 4 +- dart/lib/src/scope.dart | 29 +- dart/lib/src/sentry.dart | 2 +- .../io_sentry_attachment.dart | 6 +- dart/lib/src/sentry_baggage.dart | 30 +- dart/lib/src/sentry_client.dart | 29 +- dart/lib/src/sentry_envelope_item.dart | 2 + dart/lib/src/sentry_isolate.dart | 4 +- dart/lib/src/sentry_item_type.dart | 1 + dart/lib/src/sentry_options.dart | 27 +- dart/lib/src/sentry_trace_context_header.dart | 17 +- dart/lib/src/sentry_trace_origins.dart | 9 + dart/lib/src/sentry_tracer.dart | 26 +- dart/lib/src/sentry_traces_sampler.dart | 17 +- dart/lib/src/sentry_transaction_context.dart | 15 +- dart/lib/src/spotlight.dart | 21 + dart/lib/src/transport/http_transport.dart | 135 +- .../http_transport_request_handler.dart | 98 + .../transport/spotlight_http_transport.dart | 52 + dart/lib/src/utils/sample_rate_format.dart | 1 + dart/lib/src/utils/tracing_utils.dart | 57 +- dart/lib/src/utils/transport_utils.dart | 30 + dart/lib/src/version.dart | 2 +- dart/pubspec.yaml | 7 +- dart/test/diagnostic_logger_test.dart | 64 + dart/test/environment_test.dart | 8 +- .../deduplication_event_processor_test.dart | 2 +- .../enricher/io_enricher_test.dart | 2 +- dart/test/hint_test.dart | 17 + .../test/http_client/tracing_client_test.dart | 48 +- dart/test/hub_test.dart | 72 +- dart/test/initialization_test.dart | 4 +- dart/test/mocks.dart | 9 + dart/test/mocks.mocks.dart | 101 + dart/test/mocks/mock_hub.dart | 3 + dart/test/protocol/sentry_app_test.dart | 30 +- .../protocol/sentry_baggage_header_test.dart | 3 +- .../run_zoned_guarded_integration_test.dart | 17 + dart/test/scope_test.dart | 8 + dart/test/sentry_client_test.dart | 146 +- dart/test/sentry_isolate_test.dart | 18 + dart/test/sentry_options_test.dart | 6 + dart/test/sentry_test.dart | 40 +- .../sentry_trace_context_header_test.dart | 4 +- dart/test/sentry_tracer_test.dart | 2 + .../spotlight_http_transport_test.dart | 70 + dart/test/unsupported_throwables_test.dart | 92 + dart/test/utils/tracing_utils_test.dart | 34 +- dio/README.md | 9 +- dio/class-diagram.svg | 159 + dio/lib/src/sentry_transformer.dart | 4 +- dio/lib/src/tracing_client_adapter.dart | 37 +- dio/lib/src/version.dart | 2 +- dio/pubspec.yaml | 8 +- dio/test/sentry_transformer_test.dart | 8 +- dio/test/tracing_client_adapter_test.dart | 39 +- docs/new-package-release-checklist.md | 57 + drift/.gitignore | 14 + drift/CHANGELOG.md | 1 + drift/LICENSE | 21 + drift/README.md | 82 + drift/analysis_options.yaml | 33 + drift/dartdoc_options.yaml | 1 + drift/example/database.dart | 21 + drift/example/database.g.dart | 269 + drift/example/example.dart | 44 + drift/lib/sentry_drift.dart | 3 + drift/lib/src/sentry_query_executor.dart | 183 + drift/lib/src/sentry_span_helper.dart | 155 + .../lib/src/sentry_transaction_executor.dart | 155 + drift/lib/src/version.dart | 5 + drift/pubspec.yaml | 28 + drift/pubspec_overrides.yaml | 3 + drift/test/mocks/mocks.dart | 10 + drift/test/mocks/mocks.mocks.dart | 769 + drift/test/sentry_database_test.dart | 683 + drift/test/sqlite3.dll | Bin 0 -> 3123712 bytes drift/test/test_database.dart | 18 + drift/test/test_database.g.dart | 269 + drift/test/utils/windows_helper.dart | 8 + e2e_test/bin/e2e_test.dart | 2 +- file/class-diagram.svg | 111 + file/lib/src/sentry_file.dart | 32 +- file/lib/src/version.dart | 2 +- file/pubspec.yaml | 6 +- file/test/mock_sentry_client.dart | 5 +- file/test/sentry_file_test.dart | 109 + flutter/.gitignore | 1 + flutter/README.md | 9 +- flutter/analysis_options.yaml | 2 + flutter/android/build.gradle | 5 +- .../kotlin/io/sentry/flutter/SentryFlutter.kt | 134 + .../io/sentry/flutter/SentryFlutterPlugin.kt | 125 +- .../io/sentry/flutter/SentryFlutterTest.kt | 138 + flutter/class-diagram.svg | 869 + flutter/config/detekt-bl.xml | 5 +- .../io/sentry/samples/flutter/MainActivity.kt | 38 +- flutter/example/android/build.gradle | 2 + flutter/example/integration_test/all.dart | 8 + .../integration_test/integration_test.dart | 112 +- .../integration_test/profiling_test.dart | 66 + flutter/example/ios/Podfile | 9 + .../ios/Runner.xcodeproj/project.pbxproj | 210 +- .../xcshareddata/xcschemes/Runner.xcscheme | 13 +- .../ios/RunnerTests/SentryFlutterTests.swift | 83 + flutter/example/lib/auto_close_screen.dart | 47 + .../lib/drift/connection/connection.dart | 1 + .../example/lib/drift/connection/native.dart | 7 + .../lib/drift/connection/unsupported.dart | 17 + flutter/example/lib/drift/database.dart | 18 + flutter/example/lib/drift/database.g.dart | 269 + flutter/example/lib/isar/user.dart | 12 + flutter/example/lib/isar/user.g.dart | 553 + flutter/example/lib/main.dart | 406 +- flutter/example/macos/Podfile | 5 +- .../macos/Runner.xcodeproj/project.pbxproj | 10 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- flutter/example/pubspec.yaml | 11 +- flutter/example/pubspec_overrides.yaml | 6 + flutter/example/run.sh | 7 +- flutter/ffi-cocoa.yaml | 18 + flutter/ios/Classes/SentryFlutter.swift | 88 + .../Classes/SentryFlutterPluginApple.swift | 156 +- flutter/ios/sentry_flutter.podspec | 2 +- flutter/lib/sentry_flutter.dart | 5 +- ...id_platform_exception_event_processor.dart | 135 +- .../flutter_enricher_event_processor.dart | 48 +- .../native_app_start_event_processor.dart | 3 +- .../screenshot_event_processor.dart | 42 +- .../lib/src/flutter_sentry_attachment.dart | 6 +- .../connectivity_integration.dart | 36 + .../connectivity/connectivity_provider.dart | 9 + .../noop_connectivity_provider.dart | 17 + .../web_connectivity_provider.dart | 32 + .../flutter_error_integration.dart | 4 +- .../load_image_list_integration.dart | 21 +- .../native_app_start_integration.dart | 2 +- flutter/lib/src/jvm/jvm_exception.dart | 8 +- flutter/lib/src/native/cocoa/binding.dart | 71894 ++++++++++++++++ .../src/native/cocoa/sentry_native_cocoa.dart | 23 + flutter/lib/src/native/factory.dart | 1 + flutter/lib/src/native/factory_real.dart | 14 + flutter/lib/src/native/factory_web.dart | 9 + .../lib/src/native/method_channel_helper.dart | 38 + .../{ => native}/native_scope_observer.dart | 0 flutter/lib/src/native/sentry_native.dart | 156 + .../lib/src/native/sentry_native_binding.dart | 43 + .../lib/src/native/sentry_native_channel.dart | 107 + .../navigation/sentry_navigator_observer.dart | 44 +- flutter/lib/src/profiling.dart | 117 + flutter/lib/src/renderer/html_renderer.dart | 2 +- flutter/lib/src/renderer/io_renderer.dart | 4 +- flutter/lib/src/renderer/renderer.dart | 10 +- .../screenshot/sentry_screenshot_widget.dart | 32 +- flutter/lib/src/sentry_flutter.dart | 45 +- flutter/lib/src/sentry_flutter_options.dart | 46 +- flutter/lib/src/sentry_native.dart | 100 - flutter/lib/src/sentry_native_channel.dart | 161 - flutter/lib/src/sentry_widget.dart | 23 + .../sentry_user_interaction_widget.dart | 20 +- flutter/lib/src/version.dart | 2 +- flutter/macos/Classes/SentryFlutter.swift | 1 + flutter/pubspec.yaml | 13 +- flutter/scripts/generate-cocoa-bindings.sh | 38 + flutter/scripts/update-cocoa.sh | 1 + ...atform_exception_event_processor_test.dart | 43 +- ...flutter_enricher_event_processor_test.dart | 95 +- .../screenshot_event_processor_test.dart | 136 +- flutter/test/initialization_test.dart | 8 +- .../connectivity_integration_test.dart | 56 + .../flutter_error_integration_test.dart | 14 + .../integrations/load_image_list_test.dart | 7 +- .../native_app_start_integration_test.dart | 16 +- flutter/test/jvm/jvm_exception_test.dart | 30 +- flutter/test/method_channel_helper_test.dart | 159 + flutter/test/mocks.dart | 72 +- flutter/test/mocks.mocks.dart | 661 +- flutter/test/native_scope_observer_test.dart | 2 +- flutter/test/profiling_test.dart | 95 + .../sentry_screenshot_widget_test.dart | 79 + flutter/test/sentry_flutter_options_test.dart | 2 +- flutter/test/sentry_flutter_test.dart | 165 +- flutter/test/sentry_flutter_util.dart | 2 +- flutter/test/sentry_native_channel_test.dart | 94 +- flutter/test/sentry_native_test.dart | 93 +- .../test/sentry_navigator_observer_test.dart | 101 +- flutter/test/sentry_widget_test.dart | 37 + .../sentry_user_interaction_widget_test.dart | 75 +- .../sentry_tree_walker_test.dart | 2 +- .../view_hierarchy_event_processor_test.dart | 2 +- hive/.gitignore | 14 + hive/CHANGELOG.md | 1 + hive/LICENSE | 21 + hive/README.md | 86 + hive/analysis_options.yaml | 34 + hive/boxes_bad_keys.hive | 0 hive/dartdoc_options.yaml | 1 + hive/example/example.dart | 54 + hive/lib/sentry_hive.dart | 15 + hive/lib/src/default_compaction_strategy.dart | 9 + hive/lib/src/default_key_comparator.dart | 20 + hive/lib/src/sentry_box.dart | 37 + hive/lib/src/sentry_box_base.dart | 203 + hive/lib/src/sentry_box_collection.dart | 125 + hive/lib/src/sentry_hive_impl.dart | 208 + hive/lib/src/sentry_hive_interface.dart | 11 + hive/lib/src/sentry_lazy_box.dart | 45 + hive/lib/src/sentry_span_helper.dart | 78 + hive/lib/src/version.dart | 5 + hive/people-box-collection_bad_keys.hive | 0 hive/pubspec.yaml | 22 + hive/pubspec_overrides.yaml | 3 + hive/test/mocks/mocks.dart | 18 + hive/test/mocks/mocks.mocks.dart | 1307 + hive/test/person.dart | 24 + hive/test/sentry_box_base_test.dart | 569 + hive/test/sentry_box_collection_test.dart | 398 + hive/test/sentry_hive_impl_test.dart | 625 + hive/test/sentry_lazy_box_test.dart | 291 + isar/.gitignore | 17 + isar/.metadata | 10 + isar/CHANGELOG.md | 1 + isar/LICENSE | 21 + isar/README.md | 84 + isar/analysis_options.yaml | 33 + isar/dartdoc_options.yaml | 1 + isar/example/main.dart | 47 + isar/example/user.dart | 12 + isar/example/user.g.dart | 553 + isar/lib/sentry_isar.dart | 4 + isar/lib/src/sentry_isar.dart | 253 + isar/lib/src/sentry_isar_collection.dart | 433 + isar/lib/src/sentry_span_helper.dart | 83 + isar/lib/src/version.dart | 5 + isar/pubspec.yaml | 28 + isar/pubspec_overrides.yaml | 3 + isar/test/mocks/mocks.dart | 10 + isar/test/mocks/mocks.mocks.dart | 1340 + isar/test/person.dart | 11 + isar/test/person.g.dart | 518 + isar/test/sentry_isar_collection_test.dart | 928 + isar/test/sentry_isar_test.dart | 476 + logging/README.md | 9 +- logging/class-diagram.svg | 69 + logging/example/sentry_logging_example.dart | 2 +- logging/lib/src/version.dart | 2 +- logging/pubspec.yaml | 8 +- metrics/flutter.properties | 2 +- scripts/bump-version.sh | 2 +- ...ommit-formatted-code.sh => commit-code.sh} | 7 +- scripts/flutter_symbol_collector/.gitignore | 6 + scripts/flutter_symbol_collector/README.md | 4 + .../analysis_options.yaml | 7 + .../bin/flutter_symbol_collector.dart | 96 + .../lib/flutter_symbol_collector.dart | 5 + .../lib/src/flutter_symbol_resolver.dart | 73 + .../lib/src/flutter_symbol_source.dart | 156 + .../lib/src/flutter_version.dart | 16 + .../lib/src/status_cache.dart | 61 + .../lib/src/symbol_archive.dart | 10 + .../lib/src/symbol_collector_cli.dart | 147 + scripts/flutter_symbol_collector/pubspec.yaml | 24 + .../flutter_symbol_collector/test/common.dart | 9 + .../test/flutter_symbol_source_test.dart | 81 + .../test/flutter_version_test.dart | 11 + .../test/status_cache_test.dart | 43 + .../test/symbol_collector_cli_test.dart | 72 + scripts/update-symbol-collector.sh | 28 + sqflite/README.md | 9 +- sqflite/class-diagram.svg | 194 + sqflite/lib/src/sentry_batch.dart | 40 +- sqflite/lib/src/sentry_database.dart | 159 +- sqflite/lib/src/sentry_database_executor.dart | 185 +- sqflite/lib/src/sentry_sqflite.dart | 17 +- .../src/sentry_sqflite_database_factory.dart | 18 +- .../lib/src/sentry_sqflite_transaction.dart | 7 +- .../sentry_database_span_attributes.dart | 21 + sqflite/lib/src/version.dart | 2 +- sqflite/pubspec.yaml | 7 +- sqflite/test/mocks/mocks.mocks.dart | 129 +- sqflite/test/sentry_batch_test.dart | 332 + sqflite/test/sentry_database_test.dart | 562 + ...ry_sqflite_database_factory_dart_test.dart | 20 +- sqflite/test/sentry_sqflite_test.dart | 16 + 326 files changed, 98367 insertions(+), 1940 deletions(-) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/diagrams.yml create mode 100644 .github/workflows/drift.yml create mode 100644 .github/workflows/flutter-symbols.yml create mode 100644 .github/workflows/flutter_test.yml create mode 100644 .github/workflows/format-and-fix.yml create mode 100644 .github/workflows/hive.yml create mode 100644 .github/workflows/isar.yml create mode 100644 dart/class-diagram.svg create mode 100644 dart/lib/src/profiling.dart create mode 100644 dart/lib/src/propagation_context.dart create mode 100644 dart/lib/src/spotlight.dart create mode 100644 dart/lib/src/transport/http_transport_request_handler.dart create mode 100644 dart/lib/src/transport/spotlight_http_transport.dart create mode 100644 dart/lib/src/utils/transport_utils.dart create mode 100644 dart/test/diagnostic_logger_test.dart create mode 100644 dart/test/mocks.mocks.dart create mode 100644 dart/test/transport/spotlight_http_transport_test.dart create mode 100644 dart/test/unsupported_throwables_test.dart create mode 100644 dio/class-diagram.svg create mode 100644 docs/new-package-release-checklist.md create mode 100644 drift/.gitignore create mode 120000 drift/CHANGELOG.md create mode 100644 drift/LICENSE create mode 100644 drift/README.md create mode 100644 drift/analysis_options.yaml create mode 120000 drift/dartdoc_options.yaml create mode 100644 drift/example/database.dart create mode 100644 drift/example/database.g.dart create mode 100644 drift/example/example.dart create mode 100644 drift/lib/sentry_drift.dart create mode 100644 drift/lib/src/sentry_query_executor.dart create mode 100644 drift/lib/src/sentry_span_helper.dart create mode 100644 drift/lib/src/sentry_transaction_executor.dart create mode 100644 drift/lib/src/version.dart create mode 100644 drift/pubspec.yaml create mode 100644 drift/pubspec_overrides.yaml create mode 100644 drift/test/mocks/mocks.dart create mode 100644 drift/test/mocks/mocks.mocks.dart create mode 100644 drift/test/sentry_database_test.dart create mode 100644 drift/test/sqlite3.dll create mode 100644 drift/test/test_database.dart create mode 100644 drift/test/test_database.g.dart create mode 100644 drift/test/utils/windows_helper.dart create mode 100644 file/class-diagram.svg create mode 100644 flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutter.kt create mode 100644 flutter/android/src/test/kotlin/io/sentry/flutter/SentryFlutterTest.kt create mode 100644 flutter/class-diagram.svg create mode 100644 flutter/example/integration_test/all.dart create mode 100644 flutter/example/integration_test/profiling_test.dart create mode 100644 flutter/example/ios/RunnerTests/SentryFlutterTests.swift create mode 100644 flutter/example/lib/auto_close_screen.dart create mode 100644 flutter/example/lib/drift/connection/connection.dart create mode 100644 flutter/example/lib/drift/connection/native.dart create mode 100644 flutter/example/lib/drift/connection/unsupported.dart create mode 100644 flutter/example/lib/drift/database.dart create mode 100644 flutter/example/lib/drift/database.g.dart create mode 100644 flutter/example/lib/isar/user.dart create mode 100644 flutter/example/lib/isar/user.g.dart create mode 100644 flutter/ffi-cocoa.yaml create mode 100644 flutter/ios/Classes/SentryFlutter.swift create mode 100644 flutter/lib/src/integrations/connectivity/connectivity_integration.dart create mode 100644 flutter/lib/src/integrations/connectivity/connectivity_provider.dart create mode 100644 flutter/lib/src/integrations/connectivity/noop_connectivity_provider.dart create mode 100644 flutter/lib/src/integrations/connectivity/web_connectivity_provider.dart create mode 100644 flutter/lib/src/native/cocoa/binding.dart create mode 100644 flutter/lib/src/native/cocoa/sentry_native_cocoa.dart create mode 100644 flutter/lib/src/native/factory.dart create mode 100644 flutter/lib/src/native/factory_real.dart create mode 100644 flutter/lib/src/native/factory_web.dart create mode 100644 flutter/lib/src/native/method_channel_helper.dart rename flutter/lib/src/{ => native}/native_scope_observer.dart (100%) create mode 100644 flutter/lib/src/native/sentry_native.dart create mode 100644 flutter/lib/src/native/sentry_native_binding.dart create mode 100644 flutter/lib/src/native/sentry_native_channel.dart create mode 100644 flutter/lib/src/profiling.dart delete mode 100644 flutter/lib/src/sentry_native.dart delete mode 100644 flutter/lib/src/sentry_native_channel.dart create mode 100644 flutter/lib/src/sentry_widget.dart create mode 120000 flutter/macos/Classes/SentryFlutter.swift create mode 100755 flutter/scripts/generate-cocoa-bindings.sh create mode 100644 flutter/test/integrations/connectivity_integration_test.dart create mode 100644 flutter/test/method_channel_helper_test.dart create mode 100644 flutter/test/profiling_test.dart create mode 100644 flutter/test/screenshot/sentry_screenshot_widget_test.dart create mode 100644 flutter/test/sentry_widget_test.dart create mode 100644 hive/.gitignore create mode 120000 hive/CHANGELOG.md create mode 100644 hive/LICENSE create mode 100644 hive/README.md create mode 100644 hive/analysis_options.yaml create mode 100644 hive/boxes_bad_keys.hive create mode 120000 hive/dartdoc_options.yaml create mode 100644 hive/example/example.dart create mode 100644 hive/lib/sentry_hive.dart create mode 100644 hive/lib/src/default_compaction_strategy.dart create mode 100644 hive/lib/src/default_key_comparator.dart create mode 100644 hive/lib/src/sentry_box.dart create mode 100644 hive/lib/src/sentry_box_base.dart create mode 100644 hive/lib/src/sentry_box_collection.dart create mode 100644 hive/lib/src/sentry_hive_impl.dart create mode 100644 hive/lib/src/sentry_hive_interface.dart create mode 100644 hive/lib/src/sentry_lazy_box.dart create mode 100644 hive/lib/src/sentry_span_helper.dart create mode 100644 hive/lib/src/version.dart create mode 100644 hive/people-box-collection_bad_keys.hive create mode 100644 hive/pubspec.yaml create mode 100644 hive/pubspec_overrides.yaml create mode 100644 hive/test/mocks/mocks.dart create mode 100644 hive/test/mocks/mocks.mocks.dart create mode 100644 hive/test/person.dart create mode 100644 hive/test/sentry_box_base_test.dart create mode 100644 hive/test/sentry_box_collection_test.dart create mode 100644 hive/test/sentry_hive_impl_test.dart create mode 100644 hive/test/sentry_lazy_box_test.dart create mode 100644 isar/.gitignore create mode 100644 isar/.metadata create mode 120000 isar/CHANGELOG.md create mode 100644 isar/LICENSE create mode 100644 isar/README.md create mode 100644 isar/analysis_options.yaml create mode 120000 isar/dartdoc_options.yaml create mode 100644 isar/example/main.dart create mode 100644 isar/example/user.dart create mode 100644 isar/example/user.g.dart create mode 100644 isar/lib/sentry_isar.dart create mode 100644 isar/lib/src/sentry_isar.dart create mode 100644 isar/lib/src/sentry_isar_collection.dart create mode 100644 isar/lib/src/sentry_span_helper.dart create mode 100644 isar/lib/src/version.dart create mode 100644 isar/pubspec.yaml create mode 100644 isar/pubspec_overrides.yaml create mode 100644 isar/test/mocks/mocks.dart create mode 100644 isar/test/mocks/mocks.mocks.dart create mode 100644 isar/test/person.dart create mode 100644 isar/test/person.g.dart create mode 100644 isar/test/sentry_isar_collection_test.dart create mode 100644 isar/test/sentry_isar_test.dart create mode 100644 logging/class-diagram.svg rename scripts/{commit-formatted-code.sh => commit-code.sh} (67%) create mode 100644 scripts/flutter_symbol_collector/.gitignore create mode 100644 scripts/flutter_symbol_collector/README.md create mode 100644 scripts/flutter_symbol_collector/analysis_options.yaml create mode 100644 scripts/flutter_symbol_collector/bin/flutter_symbol_collector.dart create mode 100644 scripts/flutter_symbol_collector/lib/flutter_symbol_collector.dart create mode 100644 scripts/flutter_symbol_collector/lib/src/flutter_symbol_resolver.dart create mode 100644 scripts/flutter_symbol_collector/lib/src/flutter_symbol_source.dart create mode 100644 scripts/flutter_symbol_collector/lib/src/flutter_version.dart create mode 100644 scripts/flutter_symbol_collector/lib/src/status_cache.dart create mode 100644 scripts/flutter_symbol_collector/lib/src/symbol_archive.dart create mode 100644 scripts/flutter_symbol_collector/lib/src/symbol_collector_cli.dart create mode 100644 scripts/flutter_symbol_collector/pubspec.yaml create mode 100644 scripts/flutter_symbol_collector/test/common.dart create mode 100644 scripts/flutter_symbol_collector/test/flutter_symbol_source_test.dart create mode 100644 scripts/flutter_symbol_collector/test/flutter_version_test.dart create mode 100644 scripts/flutter_symbol_collector/test/status_cache_test.dart create mode 100644 scripts/flutter_symbol_collector/test/symbol_collector_cli_test.dart create mode 100755 scripts/update-symbol-collector.sh create mode 100644 sqflite/class-diagram.svg create mode 100644 sqflite/lib/src/utils/sentry_database_span_attributes.dart diff --git a/.craft.yml b/.craft.yml index 94d538b336..5ff7ad5d33 100644 --- a/.craft.yml +++ b/.craft.yml @@ -11,6 +11,9 @@ targets: dio: file: sqflite: + hive: + drift: + isar: - name: github - name: registry sdks: @@ -20,3 +23,6 @@ targets: pub:sentry_dio: pub:sentry_file: pub:sentry_sqflite: + pub:sentry_drift: + pub:sentry_hive: + pub:sentry_isar: diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..adc2cfb3a7 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,48 @@ +version: 2 +updates: + - package-ecosystem: pub + directory: /dart + schedule: + interval: weekly + open-pull-requests-limit: 2 + versioning-strategy: increase-if-necessary + + - package-ecosystem: pub + directory: /flutter + schedule: + interval: weekly + open-pull-requests-limit: 2 + versioning-strategy: increase-if-necessary + + - package-ecosystem: pub + directory: /dio + schedule: + interval: weekly + open-pull-requests-limit: 2 + versioning-strategy: increase-if-necessary + + - package-ecosystem: pub + directory: /file + schedule: + interval: weekly + open-pull-requests-limit: 2 + versioning-strategy: increase-if-necessary + + - package-ecosystem: pub + directory: /logging + schedule: + interval: weekly + open-pull-requests-limit: 2 + versioning-strategy: increase-if-necessary + + - package-ecosystem: pub + directory: /sqflite + schedule: + interval: weekly + open-pull-requests-limit: 2 + versioning-strategy: increase-if-necessary + + - package-ecosystem: github-actions + directory: / + schedule: + interval: weekly diff --git a/.github/workflows/analyze.yml b/.github/workflows/analyze.yml index 60d8b32b21..2db1a28642 100644 --- a/.github/workflows/analyze.yml +++ b/.github/workflows/analyze.yml @@ -19,12 +19,11 @@ jobs: runs-on: ubuntu-latest steps: - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@b173b6ec0100793626c2d9e6b90435061f4fc3e5 # pin@0.11.0 + uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # pin@0.12.1 with: access_token: ${{ github.token }} analyze: - name: Format, fix & analyze Code if: ${{ !startsWith(github.ref, 'refs/heads/release/') }} runs-on: ubuntu-latest timeout-minutes: 20 @@ -32,26 +31,17 @@ jobs: run: working-directory: ${{ inputs.package }} steps: - - uses: actions/checkout@v3 - - uses: dart-lang/setup-dart@6a218f2413a3e78e9087f638a238f6b40893203d # pin@v1 + - uses: actions/checkout@v4 + - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 if: ${{ inputs.sdk == 'dart' }} - - uses: subosito/flutter-action@48cafc24713cca54bbe03cdc3a423187d413aafa # pin@v2.10.0 + - uses: subosito/flutter-action@2783a3f08e1baf891508463f8c6653c258246225 # pin@v2.12.0 if: ${{ inputs.sdk == 'flutter' }} - run: ${{ inputs.sdk }} pub get - - - run: dart format . - - - run: dart fix --apply - - # actions/checkout fetches only a single commit in a detached HEAD state. Therefore - # we need to pass the current branch, otherwise we can't commit the changes. - # GITHUB_HEAD_REF is the name of the head branch. GitHub Actions only sets this for PRs. - - run: ../scripts/commit-formatted-code.sh $GITHUB_HEAD_REF - if: env.GITHUB_HEAD_REF != null - + - run: dart format --set-exit-if-changed ./ + - name: dart analyze - uses: invertase/github-action-dart-analyzer@cdd8652b05bf7ed08ffce30f425436780f869f13 # pin@v1 + uses: invertase/github-action-dart-analyzer@1cda5922c6369263b1c7e2fbe281f69704f4d63e # pin@v2.0.0 with: annotate: true fatal-infos: true @@ -69,7 +59,12 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 20 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 + - name: Apply dependency override + if: ${{ inputs.package == 'flutter' }} + working-directory: ${{ inputs.package }} + run: | + sed -i.bak 's|sentry:.*|sentry:\n path: /github/workspace/dart|g' pubspec.yaml - uses: axel-op/dart-package-analyzer@7a6c3c66bce78d82b729a1ffef2d9458fde6c8d2 # pin@v3 id: analysis with: diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 312a573806..a8bccd8d82 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -5,18 +5,18 @@ on: - main - release/** pull_request: - paths-ignore: - - 'logging/**' - - 'dio/**' - - 'file/**' - - 'sqflite/**' + paths: + - "!**/*.md" + - "!**/class-diagram.svg" + - ".github/workflows/dart.yml" + - "dart/**" jobs: cancel-previous-workflow: runs-on: ubuntu-latest steps: - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@b173b6ec0100793626c2d9e6b90435061f4fc3e5 # pin@0.11.0 + uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # pin@0.12.1 with: access_token: ${{ github.token }} @@ -39,10 +39,10 @@ jobs: - os: macos-latest sdk: beta steps: - - uses: dart-lang/setup-dart@6a218f2413a3e78e9087f638a238f6b40893203d # pin@v1 + - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 with: sdk: ${{ matrix.sdk }} - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Test (VM and browser) run: | @@ -68,16 +68,16 @@ jobs: dart pub get webdev build - - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 # pin@v3 + - uses: codecov/codecov-action@4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0 # pin@v3 if: runner.os == 'Linux' && matrix.sdk == 'stable' with: name: sentry files: ./dart/coverage/lcov.info - - uses: VeryGoodOpenSource/very_good_coverage@84e5b54ab888644554e5573dca87d7f76dec9fb3 # pin@v2.0.0 + - uses: VeryGoodOpenSource/very_good_coverage@3b475421464c564c0714d92ce02742bd81fa9eda # pin@v2.2.0 if: runner.os == 'Linux' && matrix.sdk == 'stable' with: - path: './dart/coverage/lcov.info' + path: "./dart/coverage/lcov.info" min_coverage: 85 analyze: diff --git a/.github/workflows/diagrams.yml b/.github/workflows/diagrams.yml new file mode 100644 index 0000000000..8b8cee500e --- /dev/null +++ b/.github/workflows/diagrams.yml @@ -0,0 +1,64 @@ +name: diagrams +on: + workflow_dispatch: + +jobs: + diagrams: + runs-on: ubuntu-latest + name: "Create class diagrams of all packages" + steps: + - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 + with: + sdk: stable + + - uses: actions/checkout@v4 + + - name: dependencies + run: | + dart pub global activate lakos + sudo apt update + sudo apt install graphviz + + - name: dart + working-directory: ./dart + run: lakos . -i "{test/**,example/**,example_web/**}" | dot -Tsvg -o class-diagram.svg + + - name: flutter + working-directory: ./flutter + run: lakos . -i "{test/**,example/**}" | dot -Tsvg -o class-diagram.svg + + - name: dio + working-directory: ./dio + run: lakos . -i "{test/**,example/**}" | dot -Tsvg -o class-diagram.svg + + - name: file + working-directory: ./file + run: lakos . -i "{test/**,example/**}" | dot -Tsvg -o class-diagram.svg + + - name: sqflite + working-directory: ./sqflite + run: lakos . -i "{test/**,example/**}" | dot -Tsvg -o class-diagram.svg + + - name: logging + working-directory: ./logging + run: lakos . -i "{test/**,example/**}" | dot -Tsvg -o class-diagram.svg + + - name: hive + working-directory: ./hive + run: lakos . -i "{test/**,example/**}" | dot -Tsvg -o class-diagram.svg + + - name: isar + working-directory: ./isar + run: lakos . -i "{test/**,example/**}" | dot -Tsvg -o class-diagram.svg + + # Source: https://stackoverflow.com/a/58035262 + - name: Extract branch name + shell: bash + run: echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> $GITHUB_OUTPUT + id: extract_branch + + # actions/checkout fetches only a single commit in a detached HEAD state. Therefore + # we need to pass the current branch, otherwise we can't commit the changes. + # GITHUB_HEAD_REF is the name of the head branch. GitHub Actions only sets this for PRs. + - name: Commit & push + run: ./scripts/commit-code.sh ${{ steps.extract_branch.outputs.branch }} "Update class diagrams" diff --git a/.github/workflows/dio.yml b/.github/workflows/dio.yml index 6bae44d19c..f92f029d98 100644 --- a/.github/workflows/dio.yml +++ b/.github/workflows/dio.yml @@ -5,18 +5,19 @@ on: - main - release/** pull_request: - paths-ignore: - - 'logging/**' - - 'flutter/**' - - 'file/**' - - 'sqflite/**' + paths: + - "!**/*.md" + - "!**/class-diagram.svg" + - ".github/workflows/dio.yml" + - "dart/**" + - "dio/**" jobs: cancel-previous-workflow: runs-on: ubuntu-latest steps: - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@b173b6ec0100793626c2d9e6b90435061f4fc3e5 # pin@0.11.0 + uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # pin@0.12.1 with: access_token: ${{ github.token }} @@ -34,15 +35,15 @@ jobs: os: [ubuntu-latest, windows-latest, macos-latest] sdk: [stable, beta] exclude: - - os: windows-latest + - os: windows-latest sdk: beta - os: macos-latest sdk: beta steps: - - uses: dart-lang/setup-dart@6a218f2413a3e78e9087f638a238f6b40893203d # pin@v1 + - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 with: sdk: ${{ matrix.sdk }} - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Test (VM and browser) run: | @@ -51,16 +52,16 @@ jobs: dart test -p vm --coverage=coverage --test-randomize-ordering-seed=random --chain-stack-traces dart pub run coverage:format_coverage --lcov --in=coverage --out=coverage/lcov.info --packages=.dart_tool/package_config.json --report-on=lib - - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 # pin@v3 + - uses: codecov/codecov-action@4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0 # pin@v3 if: runner.os == 'Linux' && matrix.sdk == 'stable' with: name: sentry_dio files: ./dio/coverage/lcov.info - - uses: VeryGoodOpenSource/very_good_coverage@84e5b54ab888644554e5573dca87d7f76dec9fb3 # pin@v2.0.0 + - uses: VeryGoodOpenSource/very_good_coverage@3b475421464c564c0714d92ce02742bd81fa9eda # pin@v2.2.0 if: runner.os == 'Linux' && matrix.sdk == 'stable' with: - path: './dio/coverage/lcov.info' + path: "./dio/coverage/lcov.info" min_coverage: 81 analyze: diff --git a/.github/workflows/drift.yml b/.github/workflows/drift.yml new file mode 100644 index 0000000000..bbd07f905b --- /dev/null +++ b/.github/workflows/drift.yml @@ -0,0 +1,113 @@ +name: sentry-drift +on: + push: + branches: + - main + - release/** + pull_request: + paths: + - "!**/*.md" + - "!**/class-diagram.svg" + - ".github/workflows/drift.yml" + - "dart/**" + - "drift/**" + +jobs: + cancel-previous-workflow: + runs-on: ubuntu-latest + steps: + - name: Cancel Previous Runs + uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # pin@0.12.1 + with: + access_token: ${{ github.token }} + + build: + name: ${{ matrix.target }} | ${{ matrix.os }} | ${{ matrix.sdk }} + runs-on: ${{ matrix.os }} + timeout-minutes: 30 + defaults: + run: + shell: bash + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + target: ["ios", "android", "macos", "linux", "windows"] + sdk: ["stable", "beta"] + exclude: + - os: ubuntu-latest + target: ios + - os: ubuntu-latest + target: macos + - os: ubuntu-latest + target: windows + - os: windows-latest + target: ios + - os: windows-latest + target: android + - os: windows-latest + target: macos + - os: windows-latest + target: linux + # macos-latest is taking hours due to limited resources + - os: macos-latest + target: android + - os: macos-latest + target: linux + - os: macos-latest + target: windows + # Bad CPU type in executable + - os: macos-latest + sdk: beta + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-java@v4 + if: ${{ matrix.target == 'android' }} + with: + java-version: "11" + distribution: "adopt" + + # Install required dependencies for Flutter on Linux on Ubuntu + - name: "Setup Linux" + run: | + sudo apt update + sudo apt install -y cmake dbus libblkid-dev libgtk-3-dev liblzma-dev ninja-build pkg-config xvfb + sudo apt install -y network-manager upower + if: matrix.os == 'ubuntu-latest' && matrix.target == 'linux' + + - uses: subosito/flutter-action@2783a3f08e1baf891508463f8c6653c258246225 # pin@v2.12.0 + with: + channel: ${{ matrix.sdk }} + + - run: flutter upgrade + + - name: Pub Get + run: | + cd drift + flutter pub get + + - name: Test VM with coverage + run: | + cd drift + flutter test --coverage --test-randomize-ordering-seed=random + + - uses: codecov/codecov-action@4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0 # pin@v3 + if: runner.os == 'Linux' && matrix.sdk == 'stable' && matrix.target == 'linux' + with: + name: sentry_drift + file: ./drift/coverage/lcov.info + functionalities: "search" # remove after https://github.com/codecov/codecov-action/issues/600 + + - uses: VeryGoodOpenSource/very_good_coverage@3b475421464c564c0714d92ce02742bd81fa9eda # pin@v2.2.0 + if: runner.os == 'Linux' && matrix.sdk == 'stable' && matrix.target == 'linux' + with: + path: "./drift/coverage/lcov.info" + min_coverage: 80 + + analyze: + uses: ./.github/workflows/analyze.yml + with: + package: drift + sdk: flutter \ No newline at end of file diff --git a/.github/workflows/e2e_dart.yml b/.github/workflows/e2e_dart.yml index 06d4eaae17..bec5e47c95 100644 --- a/.github/workflows/e2e_dart.yml +++ b/.github/workflows/e2e_dart.yml @@ -5,12 +5,12 @@ on: - main - release/** pull_request: - paths-ignore: - - 'logging/**' - - 'dio/**' - - 'flutter/**' - - 'file/**' - - 'sqflite/**' + paths: + - "!**/*.md" + - "!**/class-diagram.svg" + - ".github/workflows/e2e_dart.yml" + - "dart/**" + - "e2e_test/**" env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} @@ -21,13 +21,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@b173b6ec0100793626c2d9e6b90435061f4fc3e5 # pin@0.11.0 + uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # pin@0.12.1 with: access_token: ${{ github.token }} build: name: E2E - runs-on: 'ubuntu-latest' + runs-on: "ubuntu-latest" timeout-minutes: 30 defaults: run: @@ -37,10 +37,10 @@ jobs: matrix: sdk: [stable, beta] steps: - - uses: dart-lang/setup-dart@6a218f2413a3e78e9087f638a238f6b40893203d # pin@v1 + - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 with: sdk: ${{ matrix.sdk }} - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Run if: env.SENTRY_AUTH_TOKEN != null run: | diff --git a/.github/workflows/file.yml b/.github/workflows/file.yml index 1cf2b4d40d..d981a7cac5 100644 --- a/.github/workflows/file.yml +++ b/.github/workflows/file.yml @@ -5,18 +5,20 @@ on: - main - release/** pull_request: - paths-ignore: - - 'logging/**' - - 'flutter/**' - - 'dio/**' - - 'sqflite/**' + paths: + - "!**/*.md" + - "!**/class-diagram.svg" + - ".github/workflows/file.yml" + - "dart/**" + - "flutter/**" + - "file/**" jobs: cancel-previous-workflow: runs-on: ubuntu-latest steps: - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@b173b6ec0100793626c2d9e6b90435061f4fc3e5 # pin@0.11.0 + uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # pin@0.12.1 with: access_token: ${{ github.token }} @@ -34,15 +36,15 @@ jobs: os: [ubuntu-latest, windows-latest, macos-latest] sdk: [stable, beta] exclude: - - os: windows-latest + - os: windows-latest sdk: beta - os: macos-latest sdk: beta steps: - - uses: dart-lang/setup-dart@6a218f2413a3e78e9087f638a238f6b40893203d # pin@v1 + - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 with: sdk: ${{ matrix.sdk }} - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Test VM run: | @@ -50,16 +52,16 @@ jobs: dart test -p vm --coverage=coverage --test-randomize-ordering-seed=random --chain-stack-traces dart pub run coverage:format_coverage --lcov --in=coverage --out=coverage/lcov.info --packages=.dart_tool/package_config.json --report-on=lib - - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 # pin@v3 + - uses: codecov/codecov-action@4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0 # pin@v3 if: runner.os == 'Linux' && matrix.sdk == 'stable' with: name: sentry_file files: ./file/coverage/lcov.info - - uses: VeryGoodOpenSource/very_good_coverage@84e5b54ab888644554e5573dca87d7f76dec9fb3 # pin@v2.0.0 + - uses: VeryGoodOpenSource/very_good_coverage@3b475421464c564c0714d92ce02742bd81fa9eda # pin@v2.2.0 if: runner.os == 'Linux' && matrix.sdk == 'stable' with: - path: './file/coverage/lcov.info' + path: "./file/coverage/lcov.info" min_coverage: 55 analyze: diff --git a/.github/workflows/flutter-symbols.yml b/.github/workflows/flutter-symbols.yml new file mode 100644 index 0000000000..4462ccccc8 --- /dev/null +++ b/.github/workflows/flutter-symbols.yml @@ -0,0 +1,58 @@ +name: Flutter symbols collection +on: + schedule: + # Run once an hour. It takes just a couple of minutes because of status caching. + - cron: "10 * * * *" + workflow_dispatch: + inputs: + flutter_version: + description: Flutter version, can be either a specific version (3.17.0) or a wildcard (3.2.*) + required: false + type: string + default: "3.*.*" + +defaults: + run: + working-directory: scripts/flutter_symbol_collector + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 + + - run: dart pub get + + - run: dart test + + run: + needs: [test] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 + + - run: dart pub get + + - name: Download status cache of previously processed files + run: | + gh run download --name 'flutter-symbol-collector-database' --dir .cache + grep -r "" .cache + continue-on-error: true + env: + GITHUB_TOKEN: ${{ github.token }} + + - run: dart run bin/flutter_symbol_collector.dart --version=${{ inputs.flutter_version || '3.*.*' }} + timeout-minutes: 300 + env: + GITHUB_TOKEN: ${{ github.token }} + + - name: Upload updated status cache of processed files + uses: actions/upload-artifact@v4 + if: always() + with: + name: flutter-symbol-collector-database + path: scripts/flutter_symbol_collector/.cache diff --git a/.github/workflows/flutter.yml b/.github/workflows/flutter.yml index e5c682efa9..4443f84e05 100644 --- a/.github/workflows/flutter.yml +++ b/.github/workflows/flutter.yml @@ -5,23 +5,25 @@ on: - main - release/** pull_request: - paths-ignore: - - 'logging/**' - - 'dio/**' - - 'file/**' - - 'sqflite/**' + paths: + - ".github/workflows/flutter.yml" + - "!**/*.md" + - "!**/class-diagram.svg" + - "dart/**" + - "flutter/**" + - "metrics/flutter.properties" jobs: cancel-previous-workflow: runs-on: ubuntu-latest steps: - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@b173b6ec0100793626c2d9e6b90435061f4fc3e5 # pin@0.11.0 + uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # pin@0.12.1 with: access_token: ${{ github.token }} build: - name: ${{ matrix.target }} | ${{ matrix.os }} | ${{ matrix.sdk }} + name: "${{ matrix.target }} | ${{ matrix.os }} | ${{ matrix.sdk }}" runs-on: ${{ matrix.os }} timeout-minutes: 30 defaults: @@ -31,8 +33,8 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] - target: ['ios', 'android', 'web', 'macos', 'linux', 'windows'] - sdk: ['stable', 'beta'] + target: ["ios", "android", "web", "macos", "linux", "windows"] + sdk: ["stable", "beta"] exclude: - os: ubuntu-latest target: ios @@ -64,23 +66,23 @@ jobs: sdk: beta steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/setup-java@v3 + - uses: actions/setup-java@v4 if: ${{ matrix.target == 'android' }} with: - java-version: '11' - distribution: 'adopt' + java-version: "11" + distribution: "adopt" # Install required dependencies for Flutter on Linux on Ubuntu - - name: 'Setup Linux' + - name: "Setup Linux" run: | sudo apt update sudo apt install -y cmake dbus libblkid-dev libgtk-3-dev liblzma-dev ninja-build pkg-config xvfb sudo apt install -y network-manager upower if: matrix.os == 'ubuntu-latest' && matrix.target == 'linux' - - uses: subosito/flutter-action@48cafc24713cca54bbe03cdc3a423187d413aafa # pin@v2.10.0 + - uses: subosito/flutter-action@2783a3f08e1baf891508463f8c6653c258246225 # pin@v2.12.0 with: channel: ${{ matrix.sdk }} @@ -102,19 +104,21 @@ jobs: run: | cd flutter flutter test --coverage --test-randomize-ordering-seed=random + dart run remove_from_coverage -f coverage/lcov.info -r 'binding.dart' - - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 # pin@v3 + - uses: codecov/codecov-action@4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0 # pin@v3 if: runner.os == 'Linux' && matrix.sdk == 'stable' && matrix.target == 'linux' with: name: sentry_flutter file: ./flutter/coverage/lcov.info - functionalities: 'search' # remove after https://github.com/codecov/codecov-action/issues/600 + functionalities: "search" # remove after https://github.com/codecov/codecov-action/issues/600 - - uses: VeryGoodOpenSource/very_good_coverage@84e5b54ab888644554e5573dca87d7f76dec9fb3 # pin@v2.0.0 + - uses: VeryGoodOpenSource/very_good_coverage@3b475421464c564c0714d92ce02742bd81fa9eda # pin@v2.2.0 if: runner.os == 'Linux' && matrix.sdk == 'stable' && matrix.target == 'linux' with: - path: './flutter/coverage/lcov.info' + path: "./flutter/coverage/lcov.info" min_coverage: 90 + exclude: "lib/src/native/cocoa/binding.dart" - name: Build ${{ matrix.target }} run: | @@ -158,7 +162,7 @@ jobs: run: working-directory: ./flutter steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # https://github.com/CocoaPods/CocoaPods/issues/5275#issuecomment-315461879 - run: pod lib lint ios/sentry_flutter.podspec --configuration=Debug --skip-import-validation --allow-warnings --verbose @@ -169,7 +173,7 @@ jobs: run: working-directory: ./flutter steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: norio-nomura/action-swiftlint@9f4dcd7fd46b4e75d7935cf2f4df406d5cae3684 # pin@3.2.1 with: args: --strict @@ -181,10 +185,10 @@ jobs: run: working-directory: ./flutter steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: ktlint - uses: ScaCap/action-ktlint@2cf245b99bc91f73bc4c96a3d9d57bb5da3533ae # pin@1.7.1 + uses: ScaCap/action-ktlint@0ff81efa49425bd0df46caabd8005aafdc8f2cf2 # pin@1.8.0 with: github_token: ${{ secrets.github_token }} reporter: github-pr-review @@ -195,8 +199,8 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 20 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # To recreate baseline run: detekt -i flutter/android,flutter/example/android -b flutter/config/detekt-bl.xml -cb - - uses: natiginfo/action-detekt-all@e01de6ff0eef7c24131e8a133bf598cfac6ceeab # pin@1.21.0 + - uses: natiginfo/action-detekt-all@1349d3d957cba64d7b6b2752ef874d1e03e402a2 # pin@1.23.4 with: args: -i flutter/android,flutter/example/android --baseline flutter/config/detekt-bl.xml --jvm-target 1.8 --build-upon-default-config --all-rules diff --git a/.github/workflows/flutter_integration_test.yml b/.github/workflows/flutter_integration_test.yml index 9a78828164..86bcb2e2dd 100644 --- a/.github/workflows/flutter_integration_test.yml +++ b/.github/workflows/flutter_integration_test.yml @@ -8,7 +8,7 @@ on: # - release/** # pull_request: # paths-ignore: - # - 'file/**' +# - 'file/**' jobs: cancel-previous-workflow: @@ -28,7 +28,7 @@ jobs: strategy: fail-fast: false matrix: - sdk: ["stable", "beta"] + sdk: [ "stable", "beta" ] steps: - name: checkout uses: actions/checkout@v3 @@ -48,17 +48,17 @@ jobs: - name: flutter pub get run: flutter pub get - - name: Gradle cache - uses: gradle/gradle-build-action@v2 + - name: Gradle cache + uses: gradle/gradle-build-action@982da8e78c05368c70dac0351bb82647a9e9a5d2 # pin@v2.11.1 - - name: AVD cache - uses: actions/cache@v3 - id: avd-cache - with: - path: | - ~/.android/avd/* - ~/.android/adb* - key: avd-21 + - name: AVD cache + uses: actions/cache@v3 + id: avd-cache + with: + path: | + ~/.android/avd/* + ~/.android/adb* + key: avd-21 - name: create AVD and generate snapshot for caching if: steps.avd-cache.outputs.cache-hit != 'true' @@ -73,17 +73,17 @@ jobs: profile: Nexus 6 script: echo 'Generated AVD snapshot for caching.' - - name: launch android emulator & run android integration test - uses: reactivecircus/android-emulator-runner@d94c3fbe4fe6a29e4a5ba47c12fb47677c73656b #pin@v2.28.0 - with: - working-directory: ./flutter/example - api-level: 21 - force-avd-creation: false - emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none - disable-animations: true - arch: x86_64 - profile: Nexus 6 - script: flutter test integration_test/integration_test.dart --verbose + - name: launch android emulator & run android integration test + uses: reactivecircus/android-emulator-runner@d94c3fbe4fe6a29e4a5ba47c12fb47677c73656b #pin@v2.28.0 + with: + working-directory: ./flutter/example + api-level: 21 + force-avd-creation: false + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + disable-animations: true + arch: x86_64 + profile: Nexus 6 + script: flutter test integration_test/integration_test.dart --verbose test-ios: runs-on: macos-13 @@ -95,7 +95,7 @@ jobs: fail-fast: false matrix: # 'beta' is flaky because of https://github.com/flutter/flutter/issues/124340 - sdk: ["stable"] + sdk: [ "stable" ] steps: - name: checkout uses: actions/checkout@v3 diff --git a/.github/workflows/flutter_test.yml b/.github/workflows/flutter_test.yml new file mode 100644 index 0000000000..66c8239fcd --- /dev/null +++ b/.github/workflows/flutter_test.yml @@ -0,0 +1,169 @@ +name: flutter native & integration test +on: + push: + branches: + - main + - release/** + pull_request: + paths: + - "!**/*.md" + - "!**/class-diagram.svg" + - ".github/workflows/flutter_test.yml" + - "dart/**" + - "flutter/**" + +env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + +jobs: + cancel-previous-workflow: + runs-on: ubuntu-latest + steps: + - name: Cancel Previous Runs + uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # pin@0.12.1 + with: + access_token: ${{ github.token }} + + test-android: + runs-on: macos-latest + timeout-minutes: 30 + defaults: + run: + working-directory: ./flutter/example + strategy: + fail-fast: false + matrix: + sdk: ["stable", "beta"] + steps: + - name: checkout + uses: actions/checkout@v4 + + - uses: actions/setup-java@v4 + with: + distribution: "adopt" + java-version: "11" + + - uses: subosito/flutter-action@2783a3f08e1baf891508463f8c6653c258246225 # pin@v2.12.0 + with: + channel: ${{ matrix.sdk }} + + - name: flutter upgrade + run: flutter upgrade + + - name: flutter pub get + run: flutter pub get + + - name: Gradle cache + uses: gradle/gradle-build-action@982da8e78c05368c70dac0351bb82647a9e9a5d2 # pin@v2.11.1 + + - name: AVD cache + uses: actions/cache@v4 + id: avd-cache + with: + path: | + ~/.android/avd/* + ~/.android/adb* + key: avd-31 + + - name: create AVD and generate snapshot for caching + if: steps.avd-cache.outputs.cache-hit != 'true' + uses: reactivecircus/android-emulator-runner@6b0df4b0efb23bb0ec63d881db79aefbc976e4b2 #pin@v2.30.1 + with: + working-directory: ./flutter/example + api-level: 31 + profile: Nexus 6 + arch: x86_64 + force-avd-creation: false + avd-name: macOS-avd-x86_64-31 + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + disable-animations: true + script: echo 'Generated AVD snapshot for caching.' + + - name: build apk + working-directory: ./flutter/example/android + run: flutter build apk --debug + + - name: launch android emulator & run android native test + uses: reactivecircus/android-emulator-runner@6b0df4b0efb23bb0ec63d881db79aefbc976e4b2 #pin@v2.30.1 + with: + working-directory: ./flutter/example/android + api-level: 31 + profile: Nexus 6 + arch: x86_64 + force-avd-creation: false + avd-name: macOS-avd-x86_64-31 + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + disable-animations: true + script: ./gradlew testDebugUnitTest + + - name: launch android emulator & run android integration test + uses: reactivecircus/android-emulator-runner@6b0df4b0efb23bb0ec63d881db79aefbc976e4b2 #pin@v2.30.1 + with: + working-directory: ./flutter/example + api-level: 31 + profile: Nexus 6 + arch: x86_64 + force-avd-creation: false + avd-name: macOS-avd-x86_64-31 + emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none + disable-animations: true + script: flutter test integration_test/all.dart --verbose + + cocoa: + name: "${{ matrix.target }} | ${{ matrix.sdk }}" + runs-on: macos-13 + timeout-minutes: 30 + defaults: + run: + working-directory: ./flutter/example + strategy: + fail-fast: false + matrix: + sdk: ["stable", "beta"] + # TODO: remove ios for now, will be fixed in v8 + target: ["macos"] + steps: + - name: checkout + uses: actions/checkout@v4 + + - uses: subosito/flutter-action@2783a3f08e1baf891508463f8c6653c258246225 # pin@v2.12.0 + with: + channel: ${{ matrix.sdk }} + + - name: flutter upgrade + run: flutter upgrade + + - name: flutter pub get + run: flutter pub get + + - name: pod install + working-directory: ./flutter/example/${{ matrix.target }} + run: pod install + + - name: prepare test device + id: device + run: | + case "${{ matrix.target }}" in + ios) + device=$(xcrun simctl create sentryPhone com.apple.CoreSimulator.SimDeviceType.iPhone-14 com.apple.CoreSimulator.SimRuntime.iOS-17-0) + xcrun simctl boot ${device} + echo "platform=iOS Simulator,id=${device}" >> "$GITHUB_OUTPUT" + ;; + macos) + device="macos" + echo "platform=OS X" >> "$GITHUB_OUTPUT" + ;; + esac + echo "name=${device}" >> "$GITHUB_OUTPUT" + + - name: run integration test + # Disable flutter integration tests for iOS for now (https://github.com/getsentry/sentry-dart/issues/1605#issuecomment-1695809346) + if: ${{ matrix.target != 'ios' }} + run: flutter test -d "${{ steps.device.outputs.name }}" integration_test/all.dart --verbose + + - name: run native test + # We only have the native unit test package in the iOS xcodeproj at the moment. + # Should be OK because it will likely be removed after switching to FFI (see https://github.com/getsentry/sentry-dart/issues/1444). + if: ${{ matrix.target != 'macos' }} + working-directory: ./flutter/example/${{ matrix.target }} + run: xcodebuild test -workspace Runner.xcworkspace -scheme Runner -configuration Debug -destination "platform=${{ steps.device.outputs.platform }}" -allowProvisioningUpdates CODE_SIGNING_ALLOWED=NO diff --git a/.github/workflows/format-and-fix.yml b/.github/workflows/format-and-fix.yml new file mode 100644 index 0000000000..4f6d96f106 --- /dev/null +++ b/.github/workflows/format-and-fix.yml @@ -0,0 +1,54 @@ +on: + workflow_dispatch: + +jobs: + cancel-previous-workflow: + runs-on: ubuntu-latest + steps: + - name: Cancel Previous Runs + uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # pin@0.12.1 + with: + access_token: ${{ github.token }} + + format-and-fix: + name: Format & fix code + if: ${{ !startsWith(github.ref, 'refs/heads/release/') }} + runs-on: ubuntu-latest + timeout-minutes: 20 + strategy: + matrix: + package: [ + {name: dart, sdk: dart}, + {name: dio, sdk: dart}, + {name: file, sdk: dart}, + {name: flutter, sdk: flutter}, + {name: logging, sdk: dart}, + {name: sqflite, sdk: flutter}, + ] + defaults: + run: + working-directory: ${{ matrix.package.name }} + steps: + - uses: actions/checkout@v4 + - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 + if: ${{ matrix.package.sdk == 'dart' }} + - uses: subosito/flutter-action@2783a3f08e1baf891508463f8c6653c258246225 # pin@v2.12.0 + if: ${{ matrix.package.sdk == 'flutter' }} + + - run: ${{ matrix.package.sdk }} pub get + + - run: dart format . + + - run: dart fix --apply + + # Source: https://stackoverflow.com/a/58035262 + - name: Extract branch name + shell: bash + run: echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> $GITHUB_OUTPUT + id: extract_branch + + # actions/checkout fetches only a single commit in a detached HEAD state. Therefore + # we need to pass the current branch, otherwise we can't commit the changes. + # GITHUB_HEAD_REF is the name of the head branch. GitHub Actions only sets this for PRs. + - name: Commit & push + run: ./scripts/commit-code.sh ${{ steps.extract_branch.outputs.branch }} "Format & fix code" diff --git a/.github/workflows/hive.yml b/.github/workflows/hive.yml new file mode 100644 index 0000000000..5893673318 --- /dev/null +++ b/.github/workflows/hive.yml @@ -0,0 +1,70 @@ +name: sentry-hive +on: + push: + branches: + - main + - release/** + pull_request: + paths: + - "!**/*.md" + - "!**/class-diagram.svg" + - ".github/workflows/hive.yml" + - "dart/**" + - "hive/**" + +jobs: + cancel-previous-workflow: + runs-on: ubuntu-latest + steps: + - name: Cancel Previous Runs + uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # pin@0.12.1 + with: + access_token: ${{ github.token }} + + build: + name: Build ${{matrix.sdk}} on ${{matrix.os}} + runs-on: ${{ matrix.os }} + timeout-minutes: 30 + defaults: + run: + shell: bash + working-directory: ./hive + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + sdk: [stable, beta] + exclude: + - os: windows-latest + sdk: beta + - os: macos-latest + sdk: beta + steps: + - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 + with: + sdk: ${{ matrix.sdk }} + - uses: actions/checkout@v4 + + - name: Test VM + run: | + dart pub get + dart test -p vm --coverage=coverage --test-randomize-ordering-seed=random --chain-stack-traces + dart pub run coverage:format_coverage --lcov --in=coverage --out=coverage/lcov.info --packages=.dart_tool/package_config.json --report-on=lib + + - uses: codecov/codecov-action@4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0 # pin@v3 + if: runner.os == 'Linux' && matrix.sdk == 'stable' + with: + name: sentry_hive + files: ./hive/coverage/lcov.info + + - uses: VeryGoodOpenSource/very_good_coverage@3b475421464c564c0714d92ce02742bd81fa9eda # pin@v2.2.0 + if: runner.os == 'Linux' && matrix.sdk == 'stable' + with: + path: "./hive/coverage/lcov.info" + min_coverage: 55 + + analyze: + uses: ./.github/workflows/analyze.yml + with: + package: hive + panaThreshold: 90 diff --git a/.github/workflows/isar.yml b/.github/workflows/isar.yml new file mode 100644 index 0000000000..f4038421df --- /dev/null +++ b/.github/workflows/isar.yml @@ -0,0 +1,113 @@ +name: sentry-isar +on: + push: + branches: + - main + - release/** + pull_request: + paths: + - "!**/*.md" + - "!**/class-diagram.svg" + - ".github/workflows/isar.yml" + - "dart/**" + - "isar/**" + +jobs: + cancel-previous-workflow: + runs-on: ubuntu-latest + steps: + - name: Cancel Previous Runs + uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # pin@0.12.1 + with: + access_token: ${{ github.token }} + + build: + name: ${{ matrix.target }} | ${{ matrix.os }} | ${{ matrix.sdk }} + runs-on: ${{ matrix.os }} + timeout-minutes: 30 + defaults: + run: + shell: bash + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + target: ["ios", "android", "macos", "linux", "windows"] + sdk: ["stable", "beta"] + exclude: + - os: ubuntu-latest + target: ios + - os: ubuntu-latest + target: macos + - os: ubuntu-latest + target: windows + - os: windows-latest + target: ios + - os: windows-latest + target: android + - os: windows-latest + target: macos + - os: windows-latest + target: linux + # macos-latest is taking hours due to limited resources + - os: macos-latest + target: android + - os: macos-latest + target: linux + - os: macos-latest + target: windows + # Bad CPU type in executable + - os: macos-latest + sdk: beta + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-java@v4 + if: ${{ matrix.target == 'android' }} + with: + java-version: "11" + distribution: "adopt" + + # Install required dependencies for Flutter on Linux on Ubuntu + - name: "Setup Linux" + run: | + sudo apt update + sudo apt install -y cmake dbus libblkid-dev libgtk-3-dev liblzma-dev ninja-build pkg-config xvfb + sudo apt install -y network-manager upower + if: matrix.os == 'ubuntu-latest' && matrix.target == 'linux' + + - uses: subosito/flutter-action@2783a3f08e1baf891508463f8c6653c258246225 # pin@v2.12.0 + with: + channel: ${{ matrix.sdk }} + + - run: flutter upgrade + + - name: Pub Get + run: | + cd isar + flutter pub get + + - name: Test VM with coverage + run: | + cd isar + flutter test -j 1 --coverage --test-randomize-ordering-seed=random + + - uses: codecov/codecov-action@4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0 # pin@v3 + if: runner.os == 'Linux' && matrix.sdk == 'stable' && matrix.target == 'linux' + with: + name: sentry_isar + file: ./isar/coverage/lcov.info + functionalities: "search" # remove after https://github.com/codecov/codecov-action/issues/600 + + - uses: VeryGoodOpenSource/very_good_coverage@3b475421464c564c0714d92ce02742bd81fa9eda # pin@v2.2.0 + if: runner.os == 'Linux' && matrix.sdk == 'stable' && matrix.target == 'linux' + with: + path: "./isar/coverage/lcov.info" + min_coverage: 55 + + analyze: + uses: ./.github/workflows/analyze.yml + with: + package: isar + sdk: flutter diff --git a/.github/workflows/logging.yml b/.github/workflows/logging.yml index 88cc91d110..9a3fead839 100644 --- a/.github/workflows/logging.yml +++ b/.github/workflows/logging.yml @@ -5,18 +5,19 @@ on: - main - release/** pull_request: - paths-ignore: - - 'dio/**' - - 'flutter/**' - - 'file/**' - - 'sqflite/**' + paths: + - "!**/*.md" + - "!**/class-diagram.svg" + - ".github/workflows/logging.yml" + - "dart/**" + - "logging/**" jobs: cancel-previous-workflow: runs-on: ubuntu-latest steps: - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@b173b6ec0100793626c2d9e6b90435061f4fc3e5 # pin@0.11.0 + uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # pin@0.12.1 with: access_token: ${{ github.token }} @@ -34,15 +35,15 @@ jobs: os: [ubuntu-latest, windows-latest, macos-latest] sdk: [stable, beta] exclude: - - os: windows-latest + - os: windows-latest sdk: beta - os: macos-latest sdk: beta steps: - - uses: dart-lang/setup-dart@6a218f2413a3e78e9087f638a238f6b40893203d # pin@v1 + - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 with: sdk: ${{ matrix.sdk }} - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Test (VM and browser) run: | @@ -51,15 +52,15 @@ jobs: dart test -p vm --coverage=coverage --test-randomize-ordering-seed=random --chain-stack-traces dart pub run coverage:format_coverage --lcov --in=coverage --out=coverage/lcov.info --packages=.dart_tool/package_config.json --report-on=lib - - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 # pin@v3 + - uses: codecov/codecov-action@4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0 # pin@v3 if: runner.os == 'Linux' && matrix.sdk == 'stable' with: name: sentry_logging files: ./logging/coverage/lcov.info - - uses: VeryGoodOpenSource/very_good_coverage@84e5b54ab888644554e5573dca87d7f76dec9fb3 # pin@v2.0.0 if: runner.os == 'Linux' && matrix.sdk == 'stable' + - uses: VeryGoodOpenSource/very_good_coverage@3b475421464c564c0714d92ce02742bd81fa9eda # pin@v2.1.0 if: runner.os == 'Linux' && matrix.sdk == 'stable' with: - path: './logging/coverage/lcov.info' + path: "./logging/coverage/lcov.info" min_coverage: 90 analyze: diff --git a/.github/workflows/metrics.yml b/.github/workflows/metrics.yml index 9603300200..94278a167c 100644 --- a/.github/workflows/metrics.yml +++ b/.github/workflows/metrics.yml @@ -7,17 +7,18 @@ on: - dart/** - flutter/** - metrics/** + - "!**/*.md" branches-ignore: - deps/** - dependabot/** - tags-ignore: ['**'] + tags-ignore: ["**"] jobs: cancel-previous-workflow: runs-on: ubuntu-latest steps: - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@b173b6ec0100793626c2d9e6b90435061f4fc3e5 # pin@0.11.0 + uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # pin@0.12.1 with: access_token: ${{ github.token }} @@ -40,7 +41,7 @@ jobs: host: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # Let's stick to an explicit version and update manually because a version change may affect results. # If it would update implicitly it could confuse people to think the change is actually caused by the PR. @@ -52,19 +53,19 @@ jobs: echo "flutter=$version" >> "$GITHUB_OUTPUT" - name: Install Flutter v${{ steps.conf.outputs.flutter }} - uses: subosito/flutter-action@48cafc24713cca54bbe03cdc3a423187d413aafa # pin@v2.10.0 + uses: subosito/flutter-action@2783a3f08e1baf891508463f8c6653c258246225 # pin@v2.12.0 with: flutter-version: ${{ steps.conf.outputs.flutter }} - - uses: actions/setup-java@v3 + - uses: actions/setup-java@v4 if: ${{ matrix.platform == 'android' }} with: - java-version: '11' - distribution: 'adopt' + java-version: "11" + distribution: "adopt" - run: ./metrics/prepare.sh - - uses: actions/cache@v3 + - uses: actions/cache@v4 id: app-plain-cache with: path: ${{ matrix.appPlain }} diff --git a/.github/workflows/min_version_test.yml b/.github/workflows/min_version_test.yml index 86287d14ed..c20f06489d 100644 --- a/.github/workflows/min_version_test.yml +++ b/.github/workflows/min_version_test.yml @@ -5,16 +5,20 @@ on: - main - release/** pull_request: - paths-ignore: - - 'file/**' - - 'sqflite/**' + paths: + - "!**/*.md" + - "!**/class-diagram.svg" + - ".github/workflows/min_version_test.yml" + - "dart/**" + - "flutter/**" + - "min_version_test/**" jobs: cancel-previous-workflow: runs-on: ubuntu-latest steps: - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@b173b6ec0100793626c2d9e6b90435061f4fc3e5 # pin@0.11.0 + uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # pin@0.12.1 with: access_token: ${{ github.token }} @@ -23,16 +27,16 @@ jobs: timeout-minutes: 30 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/setup-java@v3 + - uses: actions/setup-java@v4 with: - distribution: 'adopt' - java-version: '11' + distribution: "adopt" + java-version: "11" - - uses: subosito/flutter-action@48cafc24713cca54bbe03cdc3a423187d413aafa # pin@v2.10.0 + - uses: subosito/flutter-action@2783a3f08e1baf891508463f8c6653c258246225 # pin@v2.12.0 with: - flutter-version: '3.0.0' + flutter-version: "3.0.0" - name: Build Android run: | @@ -45,11 +49,11 @@ jobs: timeout-minutes: 30 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: subosito/flutter-action@48cafc24713cca54bbe03cdc3a423187d413aafa # pin@v2.10.0 + - uses: subosito/flutter-action@2783a3f08e1baf891508463f8c6653c258246225 # pin@v2.12.0 with: - flutter-version: '3.0.0' + flutter-version: "3.0.0" - name: Build iOS run: | @@ -62,11 +66,11 @@ jobs: timeout-minutes: 30 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: subosito/flutter-action@48cafc24713cca54bbe03cdc3a423187d413aafa # pin@v2.10.0 + - uses: subosito/flutter-action@2783a3f08e1baf891508463f8c6653c258246225 # pin@v2.12.0 with: - flutter-version: '3.0.0' + flutter-version: "3.0.0" - name: Build web run: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1209884c7d..1642223bcd 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,7 @@ jobs: name: "Release a new version" steps: - name: Check out current commit (${{ github.sha }}) - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: token: ${{ secrets.GH_RELEASE_PAT }} fetch-depth: 0 diff --git a/.github/workflows/sqflite.yml b/.github/workflows/sqflite.yml index 9c0696065b..a94c31475f 100644 --- a/.github/workflows/sqflite.yml +++ b/.github/workflows/sqflite.yml @@ -5,18 +5,19 @@ on: - main - release/** pull_request: - paths-ignore: - - 'logging/**' - - 'flutter/**' - - 'dio/**' - - 'file/**' + paths: + - "!**/*.md" + - "!**/class-diagram.svg" + - ".github/workflows/logging.yml" + - "dart/**" + - "sqflite/**" jobs: cancel-previous-workflow: runs-on: ubuntu-latest steps: - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@b173b6ec0100793626c2d9e6b90435061f4fc3e5 # pin@0.11.0 + uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # pin@0.12.1 with: access_token: ${{ github.token }} @@ -31,8 +32,8 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] - target: ['ios', 'android', 'macos', 'linux', 'windows'] - sdk: ['stable', 'beta'] + target: ["ios", "android", "macos", "linux", "windows"] + sdk: ["stable", "beta"] exclude: - os: ubuntu-latest target: ios @@ -60,23 +61,23 @@ jobs: sdk: beta steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/setup-java@v3 + - uses: actions/setup-java@v4 if: ${{ matrix.target == 'android' }} with: - java-version: '11' - distribution: 'adopt' + java-version: "11" + distribution: "adopt" # Install required dependencies for Flutter on Linux on Ubuntu - - name: 'Setup Linux' + - name: "Setup Linux" run: | sudo apt update sudo apt install -y cmake dbus libblkid-dev libgtk-3-dev liblzma-dev ninja-build pkg-config xvfb sudo apt install -y network-manager upower if: matrix.os == 'ubuntu-latest' && matrix.target == 'linux' - - uses: subosito/flutter-action@48cafc24713cca54bbe03cdc3a423187d413aafa # pin@v2.10.0 + - uses: subosito/flutter-action@2783a3f08e1baf891508463f8c6653c258246225 # pin@v2.12.0 with: channel: ${{ matrix.sdk }} @@ -92,17 +93,17 @@ jobs: cd sqflite flutter test --coverage --test-randomize-ordering-seed=random - - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 # pin@v3 + - uses: codecov/codecov-action@4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0 # pin@v3 if: runner.os == 'Linux' && matrix.sdk == 'stable' && matrix.target == 'linux' with: name: sentry_sqflite file: ./sqflite/coverage/lcov.info - functionalities: 'search' # remove after https://github.com/codecov/codecov-action/issues/600 + functionalities: "search" # remove after https://github.com/codecov/codecov-action/issues/600 - - uses: VeryGoodOpenSource/very_good_coverage@84e5b54ab888644554e5573dca87d7f76dec9fb3 # pin@v2.0.0 + - uses: VeryGoodOpenSource/very_good_coverage@3b475421464c564c0714d92ce02742bd81fa9eda # pin@v2.2.0 if: runner.os == 'Linux' && matrix.sdk == 'stable' && matrix.target == 'linux' with: - path: './sqflite/coverage/lcov.info' + path: "./sqflite/coverage/lcov.info" min_coverage: 80 analyze: diff --git a/.github/workflows/update-deps.yml b/.github/workflows/update-deps.yml index 233afc3d69..d7eaf21a58 100644 --- a/.github/workflows/update-deps.yml +++ b/.github/workflows/update-deps.yml @@ -3,7 +3,7 @@ name: Update Dependencies on: # Run every day. schedule: - - cron: '0 3 * * *' + - cron: "0 3 * * *" # And on on every PR merge so we get the updated dependencies ASAP, and to make sure the changelog doesn't conflict. push: branches: @@ -23,6 +23,7 @@ jobs: with: path: flutter/scripts/update-cocoa.sh name: Cocoa SDK + runs-on: macos-latest secrets: api-token: ${{ secrets.CI_DEPLOY_KEY }} @@ -34,3 +35,12 @@ jobs: changelog-entry: false secrets: api-token: ${{ secrets.CI_DEPLOY_KEY }} + + symbol-collector: + uses: getsentry/github-workflows/.github/workflows/updater.yml@v2 + with: + path: scripts/update-symbol-collector.sh + name: Symbol collector CLI + changelog-entry: false + secrets: + api-token: ${{ secrets.CI_DEPLOY_KEY }} diff --git a/.github/workflows/web-example-ghpages.yml b/.github/workflows/web-example-ghpages.yml index 1e5adc9456..106c52615d 100644 --- a/.github/workflows/web-example-ghpages.yml +++ b/.github/workflows/web-example-ghpages.yml @@ -13,8 +13,8 @@ jobs: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} steps: - - uses: actions/checkout@v3 - - uses: subosito/flutter-action@48cafc24713cca54bbe03cdc3a423187d413aafa # pin@v2.10.0 + - uses: actions/checkout@v4 + - uses: subosito/flutter-action@2783a3f08e1baf891508463f8c6653c258246225 # pin@v2.12.0 - uses: bluefireteam/flutter-gh-pages@57815b17b371455ec1a98f075b71b4c6ba0a938c # pin@v8 with: workingDir: flutter/example diff --git a/.gitignore b/.gitignore index 558e422972..1f40d0ebb1 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,9 @@ dio/coverage/* file/coverage/* flutter/coverage/* sqflite/coverage/* +drift/coverage/* +hive/coverage/* +isar/coverage/* pubspec.lock Podfile.lock diff --git a/CHANGELOG.md b/CHANGELOG.md index 323f9c563e..6c1e59ae8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,21 +16,182 @@ - Now the device context from Android is available in `BeforeSendCallback` - Set ip_address to {{auto}} by default, even if sendDefaultPII is disabled ([#1665](https://github.com/getsentry/sentry-dart/pull/1665)) - Instead use the "Prevent Storing of IP Addresses" option in the "Security & Privacy" project settings on sentry.io + +## 7.16.0 + +### Features + +- Add `SentryWidget` ([#1846](https://github.com/getsentry/sentry-dart/pull/1846)) + - Prefer to use `SentryWidget` now instead of `SentryScreenshotWidget` and `SentryUserInteractionWidget` directly +- Performance monitoring support for Isar ([#1726](https://github.com/getsentry/sentry-dart/pull/1726)) +- Tracing without performance for Dio integration ([#1837](https://github.com/getsentry/sentry-dart/pull/1837)) +- Accept `Map` in `Hint` class ([#1807](https://github.com/getsentry/sentry-dart/pull/1807)) + - Please check if everything works as expected when using `Hint` + - Factory constructor `Hint.withMap(Map map)` now takes `Map` instead of `Map` + - Method `hint.addAll(Map keysAndValues)` now takes `Map` instead of `Map` + - Method `set(String key, dynamic value)` now takes value of `dynamic` instead of `Object` + - Method `hint.get(String key)` now returns `dynamic` instead of `Object?` + +### Dependencies + +- Bump Cocoa SDK from v8.18.0 to v8.19.0 ([#1803](https://github.com/getsentry/sentry-dart/pull/1844)) + - [changelog](https://github.com/getsentry/sentry-cocoa/blob/main/CHANGELOG.md#8190) + - [diff](https://github.com/getsentry/sentry-cocoa/compare/8.18.0...8.19.0) +- Bump Android SDK from v7.2.0 to v7.3.0 ([#1852](https://github.com/getsentry/sentry-dart/pull/1852)) + - [changelog](https://github.com/getsentry/sentry-java/blob/main/CHANGELOG.md#730) + - [diff](https://github.com/getsentry/sentry-java/compare/7.2.0...7.3.0) + +## 7.15.0 + +### Features + +- Add [Spotlight](https://spotlightjs.com/about/) support ([#1786](https://github.com/getsentry/sentry-dart/pull/1786)) + - Set `options.spotlight = Spotlight(enabled: true)` to enable Spotlight +- Add `ConnectivityIntegration` for web ([#1765](https://github.com/getsentry/sentry-dart/pull/1765)) + - We only get the info if online/offline on web platform. The added breadcrumb is set to either `wifi` or `none`. +- Add isar breadcrumbs ([#1800](https://github.com/getsentry/sentry-dart/pull/1800)) +- Starting with Flutter 3.16, Sentry adds the [`appFlavor`](https://api.flutter.dev/flutter/services/appFlavor-constant.html) to the `flutter_context` ([#1799](https://github.com/getsentry/sentry-dart/pull/1799)) +- Add beforeScreenshotCallback to SentryFlutterOptions ([#1805](https://github.com/getsentry/sentry-dart/pull/1805)) +- Add support for `readTransaction` in `sqflite` ([#1819](https://github.com/getsentry/sentry-dart/pull/1819)) -## Unreleased - +### Dependencies + +- Bump Android SDK from v7.0.0 to v7.2.0 ([#1788](https://github.com/getsentry/sentry-dart/pull/1788), [#1815](https://github.com/getsentry/sentry-dart/pull/1815)) + - [changelog](https://github.com/getsentry/sentry-java/blob/main/CHANGELOG.md#720) + - [diff](https://github.com/getsentry/sentry-java/compare/7.0.0...7.2.0) +- Bump Cocoa SDK from v8.17.2 to v8.18.0 ([#1803](https://github.com/getsentry/sentry-dart/pull/1803)) + - [changelog](https://github.com/getsentry/sentry-cocoa/blob/main/CHANGELOG.md#8180) + - [diff](https://github.com/getsentry/sentry-cocoa/compare/8.17.2...8.18.0) + +## 7.14.0 + +- Add option to opt out of fatal level for automatically collected errors ([#1738](https://github.com/getsentry/sentry-dart/pull/1738)) + +### Fixes + +- Add debug_meta to all events ([#1756](https://github.com/getsentry/sentry-dart/pull/1756)) + - Fixes obfuscated stacktraces when `captureMessage` or `captureEvent` is called with `attachStacktrace` option + +### Features + +- Add option to opt out of fatal level for automatically collected errors ([#1738](https://github.com/getsentry/sentry-dart/pull/1738)) +- Add `Hive` breadcrumbs ([#1773](https://github.com/getsentry/sentry-dart/pull/1773)) + +### Dependencies + +- Bump Android SDK from v6.34.0 to v7.0.0 ([#1768](https://github.com/getsentry/sentry-dart/pull/1768)) + - [changelog](https://github.com/getsentry/sentry-java/blob/main/CHANGELOG.md#700) + - [diff](https://github.com/getsentry/sentry-java/compare/6.34.0...7.0.0) +- Bump Cocoa SDK from v8.15.2 to v8.17.2 ([#1761](https://github.com/getsentry/sentry-dart/pull/1761), [#1771](https://github.com/getsentry/sentry-dart/pull/1771), [#1787](https://github.com/getsentry/sentry-dart/pull/1787)) + - [changelog](https://github.com/getsentry/sentry-cocoa/blob/main/CHANGELOG.md#8172) + - [diff](https://github.com/getsentry/sentry-cocoa/compare/8.15.2...8.17.2) + +## 7.13.2 + +### Fixes + +- Fix SIGSEV, SIGABRT and SIGBUS crashes happening after/around the August Google Play System update, see [#2955](https://github-redirect.dependabot.com/getsentry/sentry-java/issues/2955) for more details (fix provided by Native SDK bump) + +### Dependencies + +- Update package-info-plus constraint to include 5.0.1 ([#1749](https://github.com/getsentry/sentry-dart/pull/1749)) +- Bump Android SDK from v6.33.1 to v6.34.0 ([#1746](https://github.com/getsentry/sentry-dart/pull/1746)) + - [changelog](https://github.com/getsentry/sentry-java/blob/main/CHANGELOG.md#6340) + - [diff](https://github.com/getsentry/sentry-java/compare/6.33.1...6.34.0) + +## 7.13.1 + +### Fixes + +- Fixes release of drift & hive and adds missing integration & sdk version information in the hub options ([#1729](https://github.com/getsentry/sentry-dart/pull/1729)) + +## 7.13.0 + +### Fixes + +- Fixes setting the correct locale to contexts with navigatorKey ([#1724](https://github.com/getsentry/sentry-dart/pull/1724)) + - If you have a selected locale in e.g MaterialApp, this fix will retrieve the correct locale for the event context. +- Flutter renderer information was removed on dart:io platforms since it didn't add the correct value ([#1723](https://github.com/getsentry/sentry-dart/pull/1723)) +- Unsupported types with Expando ([#1690](https://github.com/getsentry/sentry-dart/pull/1690)) + +### Features + +- Add APM integration for Drift ([#1709](https://github.com/getsentry/sentry-dart/pull/1709)) +- StackTraces in `PlatformException.message` will get nicely formatted too when present ([#1716](https://github.com/getsentry/sentry-dart/pull/1716)) +- Breadcrumbs for database operations ([#1656](https://github.com/getsentry/sentry-dart/pull/1656)) +- APM for hive ([#1672](https://github.com/getsentry/sentry-dart/pull/1672)) +- Add `attachScreenshotOnlyWhenResumed` to options ([#1700](https://github.com/getsentry/sentry-dart/pull/1700)) + +### Dependencies + +- Bump Android SDK from v6.32.0 to v6.33.1 ([#1710](https://github.com/getsentry/sentry-dart/pull/1710), [#1713](https://github.com/getsentry/sentry-dart/pull/1713)) + - [changelog](https://github.com/getsentry/sentry-java/blob/main/CHANGELOG.md#6331) + - [diff](https://github.com/getsentry/sentry-java/compare/6.32.0...6.33.1) +- Bump Cocoa SDK from v8.14.2 to v8.15.2 ([#1712](https://github.com/getsentry/sentry-dart/pull/1712), [#1714](https://github.com/getsentry/sentry-dart/pull/1714), [#1717](https://github.com/getsentry/sentry-dart/pull/1717)) + - [changelog](https://github.com/getsentry/sentry-cocoa/blob/main/CHANGELOG.md#8152) + - [diff](https://github.com/getsentry/sentry-cocoa/compare/8.14.2...8.15.2) + +## 7.12.0 + +### Enhancements + +- Log warning if both tracesSampleRate and tracesSampler are set ([#1701](https://github.com/getsentry/sentry-dart/pull/1701)) +- Better Flutter framework stack traces - we now collect Flutter framework debug symbols for iOS, macOS and Android automatically on the Sentry server ([#1673](https://github.com/getsentry/sentry-dart/pull/1673)) + +### Features + +- Initial (alpha) support for profiling on iOS and macOS ([#1611](https://github.com/getsentry/sentry-dart/pull/1611)) +- Add `SentryNavigatorObserver` current route to `event.app.contexts.viewNames` ([#1545](https://github.com/getsentry/sentry-dart/pull/1545)) + - Requires relay version [23.9.0](https://github.com/getsentry/relay/blob/master/CHANGELOG.md#2390) for self-hosted instances + +## 7.11.0 + +### Fixes + +- Session: missing mechanism.handled is considered crash ([#3353](https://github.com/getsentry/sentry-cocoa/pull/3353)) + +### Features + +- Breadcrumbs for file I/O operations ([#1649](https://github.com/getsentry/sentry-dart/pull/1649)) + +### Dependencies + +- Enable compatibility with uuid v4 ([#1647](https://github.com/getsentry/sentry-dart/pull/1647)) +- Bump Android SDK from v6.29.0 to v6.32.0 ([#1660](https://github.com/getsentry/sentry-dart/pull/1660), [#1676](https://github.com/getsentry/sentry-dart/pull/1676), [#1688](https://github.com/getsentry/sentry-dart/pull/1688)) + - [changelog](https://github.com/getsentry/sentry-java/blob/main/CHANGELOG.md#6320) + - [diff](https://github.com/getsentry/sentry-java/compare/6.29.0...6.32.0) +- Bump Cocoa SDK from v8.11.0 to v8.14.2 ([#1650](https://github.com/getsentry/sentry-dart/pull/1650), [#1655](https://github.com/getsentry/sentry-dart/pull/1655), [#1677](https://github.com/getsentry/sentry-dart/pull/1677), [#1691](https://github.com/getsentry/sentry-dart/pull/1691)) + - [changelog](https://github.com/getsentry/sentry-cocoa/blob/main/CHANGELOG.md#8142) + - [diff](https://github.com/getsentry/sentry-cocoa/compare/8.11.0...8.14.2) + +## 7.10.1 + +### Enhancements + +- Add Sampling Decision to Trace Envelope Header ([#1639](https://github.com/getsentry/sentry-dart/pull/1639)) +- Add http.request.method attribute to http spans data ([#1633](https://github.com/getsentry/sentry-dart/pull/1633)) +- Add db.system and db.name attributes to db spans data ([#1629](https://github.com/getsentry/sentry-dart/pull/1629)) +- Log SDK errors to the console if the log level is `fatal` even if `debug` is disabled ([#1635](https://github.com/getsentry/sentry-dart/pull/1635)) + +### Features + +- Tracing without performance ([#1621](https://github.com/getsentry/sentry-dart/pull/1621)) + ### Fixes +- Normalize data properties of `SentryUser` and `Breadcrumb` before sending over method channel ([#1591](https://github.com/getsentry/sentry-dart/pull/1591)) - Fixing memory leak issue in SentryFlutterPlugin (Android Plugin) ([#1588](https://github.com/getsentry/sentry-dart/pull/1588)) +- Discard empty stack frames ([#1625](https://github.com/getsentry/sentry-dart/pull/1625)) +- Disable scope sync for cloned scopes ([#1628](https://github.com/getsentry/sentry-dart/pull/1628)) ### Dependencies -- Bump Android SDK from v6.25.2 to v6.28.0 ([#1586](https://github.com/getsentry/sentry-dart/pull/1586)) - - [changelog](https://github.com/getsentry/sentry-java/blob/main/CHANGELOG.md#6280) - - [diff](https://github.com/getsentry/sentry-java/compare/6.25.2...6.28.0) -- Bump Cocoa SDK from v8.9.1 to v8.10.0 ([#1584](https://github.com/getsentry/sentry-dart/pull/1584), [#1606](https://github.com/getsentry/sentry-dart/pull/1606)) - - [changelog](https://github.com/getsentry/sentry-cocoa/blob/main/CHANGELOG.md#8100) - - [diff](https://github.com/getsentry/sentry-cocoa/compare/8.9.1...8.10.0) +- Bump Android SDK from v6.25.2 to v6.29.0 ([#1586](https://github.com/getsentry/sentry-dart/pull/1586), [#1630](https://github.com/getsentry/sentry-dart/pull/1630)) + - [changelog](https://github.com/getsentry/sentry-java/blob/main/CHANGELOG.md#6290) + - [diff](https://github.com/getsentry/sentry-java/compare/6.25.2...6.29.0) +- Bump Cocoa SDK from v8.9.1 to v8.11.0 ([#1584](https://github.com/getsentry/sentry-dart/pull/1584), [#1606](https://github.com/getsentry/sentry-dart/pull/1606), [#1626](https://github.com/getsentry/sentry-dart/pull/1626)) + - [changelog](https://github.com/getsentry/sentry-cocoa/blob/main/CHANGELOG.md#8110) + - [diff](https://github.com/getsentry/sentry-cocoa/compare/8.9.1...8.11.0) ## 7.9.0 diff --git a/README.md b/README.md index 8ab372fc5a..6159941c4c 100644 --- a/README.md +++ b/README.md @@ -14,18 +14,21 @@ Sentry SDK for Dart and Flutter [![codecov](https://codecov.io/gh/getsentry/sentry-dart/branch/main/graph/badge.svg?token=J0QX0LPmwy)](https://codecov.io/gh/getsentry/sentry-dart) -| package | build | pub | likes | popularity | pub points | -| ------- | ------- | ------- | ------- | ------- | ------- | -| sentry | [![build](https://github.com/getsentry/sentry-dart/workflows/sentry-dart/badge.svg?branch=main)](https://github.com/getsentry/sentry-dart/actions?query=workflow%3Asentry-dart) | [![pub package](https://img.shields.io/pub/v/sentry.svg)](https://pub.dev/packages/sentry) | [![likes](https://img.shields.io/pub/likes/sentry?logo=dart)](https://pub.dev/packages/sentry/score) | [![popularity](https://img.shields.io/pub/popularity/sentry?logo=dart)](https://pub.dev/packages/sentry/score) | [![pub points](https://img.shields.io/pub/points/sentry?logo=dart)](https://pub.dev/packages/sentry/score) +| package | build | pub | likes | popularity | pub points | +|----------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------| ------- | ------- | +| sentry | [![build](https://github.com/getsentry/sentry-dart/actions/workflows/dart.yml/badge.svg?branch=main)](https://github.com/getsentry/sentry-dart/actions?query=workflow%3Asentry-dart) | [![pub package](https://img.shields.io/pub/v/sentry.svg)](https://pub.dev/packages/sentry) | [![likes](https://img.shields.io/pub/likes/sentry?logo=dart)](https://pub.dev/packages/sentry/score) | [![popularity](https://img.shields.io/pub/popularity/sentry?logo=dart)](https://pub.dev/packages/sentry/score) | [![pub points](https://img.shields.io/pub/points/sentry?logo=dart)](https://pub.dev/packages/sentry/score) | sentry_flutter | [![build](https://github.com/getsentry/sentry-dart/workflows/sentry-flutter/badge.svg?branch=main)](https://github.com/getsentry/sentry-dart/actions?query=workflow%3Asentry-flutter) | [![pub package](https://img.shields.io/pub/v/sentry_flutter.svg)](https://pub.dev/packages/sentry_flutter) | [![likes](https://img.shields.io/pub/likes/sentry_flutter?logo=dart)](https://pub.dev/packages/sentry_flutter/score) | [![popularity](https://img.shields.io/pub/popularity/sentry_flutter?logo=dart)](https://pub.dev/packages/sentry_flutter/score) | [![pub points](https://img.shields.io/pub/points/sentry_flutter?logo=dart)](https://pub.dev/packages/sentry_flutter/score) -| sentry_logging | [![build](https://github.com/getsentry/sentry-dart/workflows/sentry-logging/badge.svg?branch=main)](https://github.com/getsentry/sentry-dart/actions?query=workflow%3Alogging) | [![pub package](https://img.shields.io/pub/v/sentry_logging.svg)](https://pub.dev/packages/sentry_logging) | [![likes](https://img.shields.io/pub/likes/sentry_logging?logo=dart)](https://pub.dev/packages/sentry_logging/score) | [![popularity](https://img.shields.io/pub/popularity/sentry_logging?logo=dart)](https://pub.dev/packages/sentry_logging/score) | [![pub points](https://img.shields.io/pub/points/sentry_logging?logo=dart)](https://pub.dev/packages/sentry_logging/score) -| sentry_dio | [![build](https://github.com/getsentry/sentry-dart/workflows/sentry-dio/badge.svg?branch=main)](https://github.com/getsentry/sentry-dart/actions?query=workflow%3Asentry-dio) | [![pub package](https://img.shields.io/pub/v/sentry_dio.svg)](https://pub.dev/packages/sentry_dio) | [![likes](https://img.shields.io/pub/likes/sentry_dio?logo=dart)](https://pub.dev/packages/sentry_dio/score) | [![popularity](https://img.shields.io/pub/popularity/sentry_dio?logo=dart)](https://pub.dev/packages/sentry_dio/score) | [![pub points](https://img.shields.io/pub/points/sentry_dio?logo=dart)](https://pub.dev/packages/sentry_dio/score) -| sentry_file | [![build](https://github.com/getsentry/sentry-dart/workflows/sentry-file/badge.svg?branch=main)](https://github.com/getsentry/sentry-dart/actions?query=workflow%3Asentry-file) | [![pub package](https://img.shields.io/pub/v/sentry_file.svg)](https://pub.dev/packages/sentry_file) | [![likes](https://img.shields.io/pub/likes/sentry_file?logo=dart)](https://pub.dev/packages/sentry_file/score) | [![popularity](https://img.shields.io/pub/popularity/sentry_file?logo=dart)](https://pub.dev/packages/sentry_file/score) | [![pub points](https://img.shields.io/pub/points/sentry_file?logo=dart)](https://pub.dev/packages/sentry_file/score) -| sentry_sqflite | [![build](https://github.com/getsentry/sentry-dart/workflows/sentry-sqflite/badge.svg?branch=main)](https://github.com/getsentry/sentry-dart/actions?query=workflow%3Asentry-sqflite) | [![pub package](https://img.shields.io/pub/v/sentry_sqflite.svg)](https://pub.dev/packages/sentry_sqflite) | [![likes](https://img.shields.io/pub/likes/sentry_sqflite)](https://pub.dev/packages/sentry_sqflite/score) | [![popularity](https://img.shields.io/pub/popularity/sentry_sqflite)](https://pub.dev/packages/sentry_sqflite/score) | [![pub points](https://img.shields.io/pub/points/sentry_sqflite)](https://pub.dev/packages/sentry_sqflite/score) +| sentry_logging | [![build](https://github.com/getsentry/sentry-dart/workflows/sentry-logging/badge.svg?branch=main)](https://github.com/getsentry/sentry-dart/actions?query=workflow%3Alogging) | [![pub package](https://img.shields.io/pub/v/sentry_logging.svg)](https://pub.dev/packages/sentry_logging) | [![likes](https://img.shields.io/pub/likes/sentry_logging?logo=dart)](https://pub.dev/packages/sentry_logging/score) | [![popularity](https://img.shields.io/pub/popularity/sentry_logging?logo=dart)](https://pub.dev/packages/sentry_logging/score) | [![pub points](https://img.shields.io/pub/points/sentry_logging?logo=dart)](https://pub.dev/packages/sentry_logging/score) +| sentry_dio | [![build](https://github.com/getsentry/sentry-dart/workflows/sentry-dio/badge.svg?branch=main)](https://github.com/getsentry/sentry-dart/actions?query=workflow%3Asentry-dio) | [![pub package](https://img.shields.io/pub/v/sentry_dio.svg)](https://pub.dev/packages/sentry_dio) | [![likes](https://img.shields.io/pub/likes/sentry_dio?logo=dart)](https://pub.dev/packages/sentry_dio/score) | [![popularity](https://img.shields.io/pub/popularity/sentry_dio?logo=dart)](https://pub.dev/packages/sentry_dio/score) | [![pub points](https://img.shields.io/pub/points/sentry_dio?logo=dart)](https://pub.dev/packages/sentry_dio/score) +| sentry_file | [![build](https://github.com/getsentry/sentry-dart/workflows/sentry-file/badge.svg?branch=main)](https://github.com/getsentry/sentry-dart/actions?query=workflow%3Asentry-file) | [![pub package](https://img.shields.io/pub/v/sentry_file.svg)](https://pub.dev/packages/sentry_file) | [![likes](https://img.shields.io/pub/likes/sentry_file?logo=dart)](https://pub.dev/packages/sentry_file/score) | [![popularity](https://img.shields.io/pub/popularity/sentry_file?logo=dart)](https://pub.dev/packages/sentry_file/score) | [![pub points](https://img.shields.io/pub/points/sentry_file?logo=dart)](https://pub.dev/packages/sentry_file/score) +| sentry_sqflite | [![build](https://github.com/getsentry/sentry-dart/workflows/sentry-sqflite/badge.svg?branch=main)](https://github.com/getsentry/sentry-dart/actions?query=workflow%3Asentry-sqflite) | [![pub package](https://img.shields.io/pub/v/sentry_sqflite.svg)](https://pub.dev/packages/sentry_sqflite) | [![likes](https://img.shields.io/pub/likes/sentry_sqflite)](https://pub.dev/packages/sentry_sqflite/score) | [![popularity](https://img.shields.io/pub/popularity/sentry_sqflite)](https://pub.dev/packages/sentry_sqflite/score) | [![pub points](https://img.shields.io/pub/points/sentry_sqflite)](https://pub.dev/packages/sentry_sqflite/score) +| sentry_drift | [![build](https://github.com/getsentry/sentry-dart/actions/workflows/drift.yml/badge.svg?branch=main)](https://github.com/getsentry/sentry-dart/actions?query=workflow%3Asentry-drift) | [![pub package](https://img.shields.io/pub/v/sentry_drift.svg)](https://pub.dev/packages/sentry_drift) | [![likes](https://img.shields.io/pub/likes/sentry_drift)](https://pub.dev/packages/sentry_drift/score) | [![popularity](https://img.shields.io/pub/popularity/sentry_drift)](https://pub.dev/packages/sentry_drift/score) | [![pub points](https://img.shields.io/pub/points/sentry_drift)](https://pub.dev/packages/sentry_drift/score) +| sentry_hive | [![build](https://github.com/getsentry/sentry-dart/actions/workflows/hive.yml/badge.svg?branch=main)](https://github.com/getsentry/sentry-dart/actions?query=workflow%3Asentry-hive) | [![pub package](https://img.shields.io/pub/v/sentry_hive.svg)](https://pub.dev/packages/sentry_hive) | [![likes](https://img.shields.io/pub/likes/sentry_hive)](https://pub.dev/packages/sentry_hive/score) | [![popularity](https://img.shields.io/pub/popularity/sentry_hive)](https://pub.dev/packages/sentry_hive/score) | [![pub points](https://img.shields.io/pub/points/sentry_hive)](https://pub.dev/packages/sentry_hive/score) +| sentry_isar | [![build](https://github.com/getsentry/sentry-dart/actions/workflows/isar.yml/badge.svg?branch=main)](https://github.com/getsentry/sentry-dart/actions?query=workflow%3Asentry-isar) | [![pub package](https://img.shields.io/pub/v/sentry_isar.svg)](https://pub.dev/packages/sentry_isar) | [![likes](https://img.shields.io/pub/likes/sentry_isar)](https://pub.dev/packages/sentry_isar/score) | [![popularity](https://img.shields.io/pub/popularity/sentry_isar)](https://pub.dev/packages/sentry_isar/score) | [![pub points](https://img.shields.io/pub/points/sentry_isar)](https://pub.dev/packages/sentry_isar/score) ##### Usage -For detailed usage, check out the inner [dart](https://github.com/getsentry/sentry-dart/tree/main/dart), [flutter](https://github.com/getsentry/sentry-dart/tree/main/flutter), [logging](https://github.com/getsentry/sentry-dart/tree/main/logging), [dio](https://github.com/getsentry/sentry-dart/tree/main/dio), [file](https://github.com/getsentry/sentry-dart/tree/main/file) and [sqflite](https://github.com/getsentry/sentry-dart/tree/main/sqflite) `README's` or our `Resources` section below. +For detailed usage, check out the inner [dart](https://github.com/getsentry/sentry-dart/tree/main/dart), [flutter](https://github.com/getsentry/sentry-dart/tree/main/flutter), [logging](https://github.com/getsentry/sentry-dart/tree/main/logging), [dio](https://github.com/getsentry/sentry-dart/tree/main/dio), [file](https://github.com/getsentry/sentry-dart/tree/main/file), [sqflite](https://github.com/getsentry/sentry-dart/tree/main/sqflite), [drift](https://github.com/getsentry/sentry-dart/tree/main/drift), [hive](https://github.com/getsentry/sentry-dart/tree/main/hive) and [isar](https://github.com/getsentry/sentry-dart/tree/main/isar) `README's` or our `Resources` section below. #### Blog posts diff --git a/dart/README.md b/dart/README.md index e3cf3b6bb6..a6582faa16 100644 --- a/dart/README.md +++ b/dart/README.md @@ -184,8 +184,11 @@ Read more about [Automatic Instrumentation](https://docs.sentry.io/platforms/dar #### Resources -* [![Documentation](https://img.shields.io/badge/documentation-sentry.io-green.svg)](https://docs.sentry.io/platforms/dart/) -* [![Forum](https://img.shields.io/badge/forum-sentry-green.svg)](https://forum.sentry.io/c/sdks) -* [![Discord](https://img.shields.io/discord/621778831602221064)](https://discord.gg/Ww9hbqr) +#### Resources + +* [![Flutter docs](https://img.shields.io/badge/documentation-sentry.io-green.svg?label=flutter%20docs)](https://docs.sentry.io/platforms/flutter/) +* [![Dart docs](https://img.shields.io/badge/documentation-sentry.io-green.svg?label=dart%20docs)](https://docs.sentry.io/platforms/dart/) +* [![Discussions](https://img.shields.io/github/discussions/getsentry/sentry-dart.svg)](https://github.com/getsentry/sentry-dart/discussions) +* [![Discord Chat](https://img.shields.io/discord/621778831602221064?logo=discord&logoColor=ffffff&color=7389D8)](https://discord.gg/PXa5Apfe7K) * [![Stack Overflow](https://img.shields.io/badge/stack%20overflow-sentry-green.svg)](https://stackoverflow.com/questions/tagged/sentry) -* [![Twitter Follow](https://img.shields.io/twitter/follow/getsentry?label=getsentry&style=social)](https://twitter.com/intent/follow?screen_name=getsentry) +* [![Twitter Follow](https://img.shields.io/twitter/follow/getsentry?label=getsentry&style=social)](https://twitter.com/intent/follow?screen_name=getsentry) \ No newline at end of file diff --git a/dart/analysis_options.yaml b/dart/analysis_options.yaml index c5924fcb20..74ed00b114 100644 --- a/dart/analysis_options.yaml +++ b/dart/analysis_options.yaml @@ -3,6 +3,7 @@ include: package:lints/recommended.yaml analyzer: exclude: - example/** # the example has its own 'analysis_options.yaml' + - test/*.mocks.dart errors: # treat missing required parameters as a warning (not a hint) missing_required_param: error diff --git a/dart/class-diagram.svg b/dart/class-diagram.svg new file mode 100644 index 0000000000..db98a9ad63 --- /dev/null +++ b/dart/class-diagram.svg @@ -0,0 +1,3364 @@ + + + + + + + + +cluster~ + +dart + + +cluster~/lib + +lib + + +cluster~/lib/src + +src + + +cluster~/lib/src/environment + +environment + + +cluster~/lib/src/protocol + +protocol + + +cluster~/lib/src/event_processor + +event_processor + + +cluster~/lib/src/event_processor/exception + +exception + + +cluster~/lib/src/event_processor/enricher + +enricher + + +cluster~/lib/src/platform + +platform + + +cluster~/lib/src/sentry_attachment + +sentry_attachment + + +cluster~/lib/src/http_client + +http_client + + +cluster~/lib/src/transport + +transport + + +cluster~/lib/src/utils + +utils + + +cluster~/lib/src/client_reports + +client_reports + + + +/lib/src/noop_hub.dart + +noop_hub + + + +/lib/src/sentry_client.dart + +sentry_client + + + +/lib/src/noop_hub.dart->/lib/src/sentry_client.dart + + + + + +/lib/src/sentry_options.dart + +sentry_options + + + +/lib/src/noop_hub.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/hint.dart + +hint + + + +/lib/src/noop_hub.dart->/lib/src/hint.dart + + + + + +/lib/src/tracing.dart + +tracing + + + +/lib/src/noop_hub.dart->/lib/src/tracing.dart + + + + + +/lib/src/protocol.dart + +protocol + + + +/lib/src/noop_hub.dart->/lib/src/protocol.dart + + + + + +/lib/src/sentry_user_feedback.dart + +sentry_user_feedback + + + +/lib/src/noop_hub.dart->/lib/src/sentry_user_feedback.dart + + + + + +/lib/src/scope.dart + +scope + + + +/lib/src/noop_hub.dart->/lib/src/scope.dart + + + + + +/lib/src/hub.dart + +hub + + + +/lib/src/noop_hub.dart->/lib/src/hub.dart + + + + + +/lib/src/sentry_event_like.dart + +sentry_event_like + + + +/lib/src/sentry_event_like.dart->/lib/src/protocol.dart + + + + + +/lib/src/version.dart + +version + + + +/lib/src/utils.dart + +utils + + + +/lib/src/sentry_span_context.dart + +sentry_span_context + + + +/lib/sentry.dart + +sentry + + + +/lib/src/sentry_span_context.dart->/lib/sentry.dart + + + + + +/lib/src/environment/_web_environment_variables.dart + +_web_environment_variables + + + +/lib/src/environment/keys.dart + +keys + + + +/lib/src/environment/_web_environment_variables.dart->/lib/src/environment/keys.dart + + + + + +/lib/src/environment/environment_variables.dart + +environment_variables + + + +/lib/src/environment/_web_environment_variables.dart->/lib/src/environment/environment_variables.dart + + + + + +/lib/src/environment/_io_environment_variables.dart + +_io_environment_variables + + + +/lib/src/environment/_io_environment_variables.dart->/lib/src/environment/_web_environment_variables.dart + + + + + +/lib/src/environment/_io_environment_variables.dart->/lib/src/environment/keys.dart + + + + + +/lib/src/environment/_io_environment_variables.dart->/lib/src/environment/environment_variables.dart + + + + + +/lib/src/platform_checker.dart + +platform_checker + + + +/lib/src/environment/environment_variables.dart->/lib/src/platform_checker.dart + + + + + +/lib/src/propagation_context.dart + +propagation_context + + + +/lib/src/sentry_baggage.dart + +sentry_baggage + + + +/lib/src/propagation_context.dart->/lib/src/sentry_baggage.dart + + + + + +/lib/src/propagation_context.dart->/lib/src/protocol.dart + + + + + +/lib/src/sentry_trace_origins.dart + +sentry_trace_origins + + + +/lib/src/sentry_isolate_extension.dart + +sentry_isolate_extension + + + +/lib/src/hub_adapter.dart + +hub_adapter + + + +/lib/src/sentry_isolate_extension.dart->/lib/src/hub_adapter.dart + + + + + +/lib/src/sentry_isolate.dart + +sentry_isolate + + + +/lib/src/sentry_isolate_extension.dart->/lib/src/sentry_isolate.dart + + + + + +/lib/src/sentry_isolate_extension.dart->/lib/src/hub.dart + + + + + +/lib/src/sentry_item_type.dart + +sentry_item_type + + + +/lib/src/diagnostic_logger.dart + +diagnostic_logger + + + +/lib/src/diagnostic_logger.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/diagnostic_logger.dart->/lib/src/protocol.dart + + + + + +/lib/src/sentry_traces_sampler.dart + +sentry_traces_sampler + + + +/lib/src/sentry_traces_sampler.dart->/lib/sentry.dart + + + + + +/lib/src/invalid_sentry_trace_header_exception.dart + +invalid_sentry_trace_header_exception + + + +/lib/src/sentry.dart + +sentry + + + +/lib/src/sentry.dart->/lib/src/noop_hub.dart + + + + + +/lib/src/sentry.dart->/lib/src/environment/environment_variables.dart + + + + + +/lib/src/sentry.dart->/lib/src/sentry_client.dart + + + + + +/lib/src/sentry.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/event_processor/deduplication_event_processor.dart + +deduplication_event_processor + + + +/lib/src/sentry.dart->/lib/src/event_processor/deduplication_event_processor.dart + + + + + +/lib/src/event_processor/exception/exception_event_processor.dart + +exception_event_processor + + + +/lib/src/sentry.dart->/lib/src/event_processor/exception/exception_event_processor.dart + + + + + +/lib/src/event_processor/enricher/enricher_event_processor.dart + +enricher_event_processor + + + +/lib/src/sentry.dart->/lib/src/event_processor/enricher/enricher_event_processor.dart + + + + + +/lib/src/sentry.dart->/lib/src/hint.dart + + + + + +/lib/src/sentry.dart->/lib/src/tracing.dart + + + + + +/lib/src/integration.dart + +integration + + + +/lib/src/sentry.dart->/lib/src/integration.dart + + + + + +/lib/src/sentry.dart->/lib/src/protocol.dart + + + + + +/lib/src/sentry.dart->/lib/src/hub_adapter.dart + + + + + +/lib/src/sentry.dart->/lib/src/sentry_user_feedback.dart + + + + + +/lib/src/run_zoned_guarded_integration.dart + +run_zoned_guarded_integration + + + +/lib/src/sentry.dart->/lib/src/run_zoned_guarded_integration.dart + + + + + +/lib/src/sentry.dart->/lib/src/hub.dart + + + + + +/lib/src/sentry_envelope_item.dart + +sentry_envelope_item + + + +/lib/src/sentry_envelope_item.dart->/lib/src/utils.dart + + + + + +/lib/src/sentry_envelope_item.dart->/lib/src/sentry_item_type.dart + + + + + +/lib/src/sentry_envelope_item_header.dart + +sentry_envelope_item_header + + + +/lib/src/sentry_envelope_item.dart->/lib/src/sentry_envelope_item_header.dart + + + + + +/lib/src/sentry_envelope_item.dart->/lib/src/protocol.dart + + + + + +/lib/src/sentry_attachment/sentry_attachment.dart + +sentry_attachment + + + +/lib/src/sentry_envelope_item.dart->/lib/src/sentry_attachment/sentry_attachment.dart + + + + + +/lib/src/sentry_envelope_item.dart->/lib/src/sentry_user_feedback.dart + + + + + +/lib/src/client_reports/client_report.dart + +client_report + + + +/lib/src/sentry_envelope_item.dart->/lib/src/client_reports/client_report.dart + + + + + +/lib/src/sentry_client.dart->/lib/src/version.dart + + + + + +/lib/src/sentry_client.dart->/lib/src/sentry_baggage.dart + + + + + +/lib/src/sentry_client.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/sentry_client.dart->/lib/src/hint.dart + + + + + +/lib/src/sentry_trace_context_header.dart + +sentry_trace_context_header + + + +/lib/src/sentry_client.dart->/lib/src/sentry_trace_context_header.dart + + + + + +/lib/src/sentry_client.dart->/lib/src/protocol.dart + + + + + +/lib/src/sentry_client.dart->/lib/src/sentry_attachment/sentry_attachment.dart + + + + + +/lib/src/sentry_client.dart->/lib/src/sentry_user_feedback.dart + + + + + +/lib/src/transport/noop_transport.dart + +noop_transport + + + +/lib/src/sentry_client.dart->/lib/src/transport/noop_transport.dart + + + + + +/lib/src/transport/data_category.dart + +data_category + + + +/lib/src/sentry_client.dart->/lib/src/transport/data_category.dart + + + + + +/lib/src/transport/rate_limiter.dart + +rate_limiter + + + +/lib/src/sentry_client.dart->/lib/src/transport/rate_limiter.dart + + + + + +/lib/src/transport/http_transport.dart + +http_transport + + + +/lib/src/sentry_client.dart->/lib/src/transport/http_transport.dart + + + + + +/lib/src/sentry_client.dart->/lib/src/scope.dart + + + + + +/lib/src/event_processor.dart + +event_processor + + + +/lib/src/sentry_client.dart->/lib/src/event_processor.dart + + + + + +/lib/src/utils/isolate_utils.dart + +isolate_utils + + + +/lib/src/sentry_client.dart->/lib/src/utils/isolate_utils.dart + + + + + +/lib/src/client_reports/client_report_recorder.dart + +client_report_recorder + + + +/lib/src/sentry_client.dart->/lib/src/client_reports/client_report_recorder.dart + + + + + +/lib/src/client_reports/discard_reason.dart + +discard_reason + + + +/lib/src/sentry_client.dart->/lib/src/client_reports/discard_reason.dart + + + + + +/lib/src/sentry_stack_trace_factory.dart + +sentry_stack_trace_factory + + + +/lib/src/sentry_client.dart->/lib/src/sentry_stack_trace_factory.dart + + + + + +/lib/src/sentry_envelope.dart + +sentry_envelope + + + +/lib/src/sentry_client.dart->/lib/src/sentry_envelope.dart + + + + + +/lib/src/sentry_exception_factory.dart + +sentry_exception_factory + + + +/lib/src/sentry_client.dart->/lib/src/sentry_exception_factory.dart + + + + + +/lib/src/protocol/span_id.dart + +span_id + + + +/lib/src/protocol/sentry_response.dart + +sentry_response + + + +/lib/src/protocol/contexts.dart + +contexts + + + +/lib/src/protocol/sentry_response.dart->/lib/src/protocol/contexts.dart + + + + + +/lib/src/utils/iterable_extension.dart + +iterable_extension + + + +/lib/src/protocol/sentry_response.dart->/lib/src/utils/iterable_extension.dart + + + + + +/lib/src/protocol/sentry_thread.dart + +sentry_thread + + + +/lib/src/protocol/sentry_stack_trace.dart + +sentry_stack_trace + + + +/lib/src/protocol/sentry_thread.dart->/lib/src/protocol/sentry_stack_trace.dart + + + + + +/lib/src/protocol/sentry_stack_frame.dart + +sentry_stack_frame + + + +/lib/src/protocol/sentry_transaction_info.dart + +sentry_transaction_info + + + +/lib/src/protocol/sentry_span.dart + +sentry_span + + + +/lib/src/protocol/sentry_span.dart->/lib/src/utils.dart + + + + + +/lib/src/protocol/sentry_span.dart->/lib/src/tracing.dart + + + + + +/lib/src/protocol/sentry_span.dart->/lib/src/protocol.dart + + + + + +/lib/src/sentry_tracer.dart + +sentry_tracer + + + +/lib/src/protocol/sentry_span.dart->/lib/src/sentry_tracer.dart + + + + + +/lib/src/protocol/sentry_span.dart->/lib/src/hub.dart + + + + + +/lib/src/protocol/breadcrumb.dart + +breadcrumb + + + +/lib/src/protocol/breadcrumb.dart->/lib/src/utils.dart + + + + + +/lib/src/protocol/breadcrumb.dart->/lib/src/protocol.dart + + + + + +/lib/src/protocol/sentry_request.dart + +sentry_request + + + +/lib/src/utils/http_sanitizer.dart + +http_sanitizer + + + +/lib/src/protocol/sentry_request.dart->/lib/src/utils/http_sanitizer.dart + + + + + +/lib/src/protocol/sentry_request.dart->/lib/src/utils/iterable_extension.dart + + + + + +/lib/src/protocol/sentry_level.dart + +sentry_level + + + +/lib/src/protocol/sdk_version.dart + +sdk_version + + + +/lib/src/protocol/sentry_package.dart + +sentry_package + + + +/lib/src/protocol/sdk_version.dart->/lib/src/protocol/sentry_package.dart + + + + + +/lib/src/protocol/sentry_trace_header.dart + +sentry_trace_header + + + +/lib/src/protocol/sentry_trace_header.dart->/lib/src/invalid_sentry_trace_header_exception.dart + + + + + +/lib/src/protocol/sentry_trace_header.dart->/lib/src/protocol.dart + + + + + +/lib/src/protocol/sentry_transaction.dart + +sentry_transaction + + + +/lib/src/protocol/sentry_transaction.dart->/lib/src/utils.dart + + + + + +/lib/src/protocol/sentry_transaction.dart->/lib/src/protocol.dart + + + + + +/lib/src/protocol/sentry_transaction.dart->/lib/src/sentry_tracer.dart + + + + + +/lib/src/sentry_measurement.dart + +sentry_measurement + + + +/lib/src/protocol/sentry_transaction.dart->/lib/src/sentry_measurement.dart + + + + + +/lib/src/protocol/sentry_id.dart + +sentry_id + + + +/lib/src/protocol/sentry_view_hierarchy_element.dart + +sentry_view_hierarchy_element + + + +/lib/src/protocol/sentry_culture.dart + +sentry_culture + + + +/lib/src/protocol/sentry_geo.dart + +sentry_geo + + + +/lib/src/protocol/debug_meta.dart + +debug_meta + + + +/lib/src/protocol/debug_meta.dart->/lib/src/protocol.dart + + + + + +/lib/src/protocol/mechanism.dart + +mechanism + + + +/lib/src/protocol/sentry_app.dart + +sentry_app + + + +/lib/src/protocol/sentry_gpu.dart + +sentry_gpu + + + +/lib/src/protocol/sentry_trace_context.dart + +sentry_trace_context + + + +/lib/src/protocol/sentry_trace_context.dart->/lib/src/propagation_context.dart + + + + + +/lib/src/protocol/sentry_trace_context.dart->/lib/src/protocol.dart + + + + + +/lib/src/protocol/sentry_trace_context.dart->/lib/sentry.dart + + + + + +/lib/src/protocol/contexts.dart->/lib/src/protocol.dart + + + + + +/lib/src/protocol/debug_image.dart + +debug_image + + + +/lib/src/protocol/sentry_baggage_header.dart + +sentry_baggage_header + + + +/lib/src/protocol/sentry_baggage_header.dart->/lib/src/sentry_baggage.dart + + + + + +/lib/src/protocol/sentry_stack_trace.dart->/lib/src/protocol/sentry_stack_frame.dart + + + + + +/lib/src/protocol/sentry_runtime.dart + +sentry_runtime + + + +/lib/src/protocol/sentry_device.dart + +sentry_device + + + +/lib/src/protocol/sentry_device.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/protocol/sentry_message.dart + +sentry_message + + + +/lib/src/protocol/sdk_info.dart + +sdk_info + + + +/lib/src/protocol/max_body_size.dart + +max_body_size + + + +/lib/src/protocol/sentry_event.dart + +sentry_event + + + +/lib/src/protocol/sentry_event.dart->/lib/src/utils.dart + + + + + +/lib/src/throwable_mechanism.dart + +throwable_mechanism + + + +/lib/src/protocol/sentry_event.dart->/lib/src/throwable_mechanism.dart + + + + + +/lib/src/protocol/sentry_event.dart->/lib/src/protocol.dart + + + + + +/lib/src/protocol/sentry_operating_system.dart + +sentry_operating_system + + + +/lib/src/protocol/sentry_user.dart + +sentry_user + + + +/lib/src/protocol/sentry_user.dart->/lib/sentry.dart + + + + + +/lib/src/protocol/sentry_exception.dart + +sentry_exception + + + +/lib/src/protocol/sentry_exception.dart->/lib/src/protocol.dart + + + + + +/lib/src/protocol/span_status.dart + +span_status + + + +/lib/src/protocol/sentry_transaction_name_source.dart + +sentry_transaction_name_source + + + +/lib/src/protocol/sentry_view_hierarchy.dart + +sentry_view_hierarchy + + + +/lib/src/protocol/sentry_view_hierarchy.dart->/lib/src/protocol/sentry_view_hierarchy_element.dart + + + + + +/lib/src/protocol/sentry_browser.dart + +sentry_browser + + + +/lib/src/protocol/dsn.dart + +dsn + + + +/lib/src/sentry_baggage.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/sentry_baggage.dart->/lib/src/protocol.dart + + + + + +/lib/src/sentry_baggage.dart->/lib/src/scope.dart + + + + + +/lib/src/exception_stacktrace_extractor.dart + +exception_stacktrace_extractor + + + +/lib/src/exception_stacktrace_extractor.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/exception_stacktrace_extractor.dart->/lib/src/protocol.dart + + + + + +/lib/src/isolate_error_integration.dart + +isolate_error_integration + + + +/lib/src/isolate_error_integration.dart->/lib/src/sentry_isolate_extension.dart + + + + + +/lib/src/isolate_error_integration.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/isolate_error_integration.dart->/lib/src/integration.dart + + + + + +/lib/src/isolate_error_integration.dart->/lib/src/hub.dart + + + + + +/lib/src/throwable_mechanism.dart->/lib/src/protocol/mechanism.dart + + + + + +/lib/src/type_check_hint.dart + +type_check_hint + + + +/lib/src/http_client/failed_request_client.dart + +failed_request_client + + + +/lib/src/type_check_hint.dart->/lib/src/http_client/failed_request_client.dart + + + + + +/lib/src/sentry_client_stub.dart + +sentry_client_stub + + + +/lib/src/sentry_client_stub.dart->/lib/src/sentry_client.dart + + + + + +/lib/src/sentry_client_stub.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/sentry_options.dart->/lib/src/version.dart + + + + + +/lib/src/sentry_options.dart->/lib/src/environment/environment_variables.dart + + + + + +/lib/src/sentry_options.dart->/lib/src/diagnostic_logger.dart + + + + + +/lib/src/noop_client.dart + +noop_client + + + +/lib/src/sentry_options.dart->/lib/src/noop_client.dart + + + + + +/lib/src/sentry_options.dart->/lib/src/transport/noop_transport.dart + + + + + +/lib/src/client_reports/noop_client_report_recorder.dart + +noop_client_report_recorder + + + +/lib/src/sentry_options.dart->/lib/src/client_reports/noop_client_report_recorder.dart + + + + + +/lib/src/sentry_options.dart->/lib/src/client_reports/client_report_recorder.dart + + + + + +/lib/src/sentry_options.dart->/lib/src/sentry_stack_trace_factory.dart + + + + + +/lib/src/sentry_options.dart->/lib/src/sentry_exception_factory.dart + + + + + +/lib/src/sentry_options.dart->/lib/sentry.dart + + + + + +/lib/src/event_processor/deduplication_event_processor.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/event_processor/deduplication_event_processor.dart->/lib/src/hint.dart + + + + + +/lib/src/event_processor/deduplication_event_processor.dart->/lib/src/protocol.dart + + + + + +/lib/src/event_processor/deduplication_event_processor.dart->/lib/src/event_processor.dart + + + + + +/lib/src/event_processor/exception/exception_event_processor.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/event_processor/exception/exception_event_processor.dart->/lib/src/event_processor.dart + + + + + +/lib/src/event_processor/exception/web_exception_event_processor.dart + +web_exception_event_processor + + + +/lib/src/event_processor/exception/web_exception_event_processor.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/event_processor/exception/web_exception_event_processor.dart->/lib/src/event_processor/exception/exception_event_processor.dart + + + + + +/lib/src/event_processor/exception/web_exception_event_processor.dart->/lib/src/hint.dart + + + + + +/lib/src/event_processor/exception/web_exception_event_processor.dart->/lib/src/protocol.dart + + + + + +/lib/src/event_processor/exception/io_exception_event_processor.dart + +io_exception_event_processor + + + +/lib/src/event_processor/exception/io_exception_event_processor.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/event_processor/exception/io_exception_event_processor.dart->/lib/src/event_processor/exception/exception_event_processor.dart + + + + + +/lib/src/event_processor/exception/io_exception_event_processor.dart->/lib/src/hint.dart + + + + + +/lib/src/event_processor/exception/io_exception_event_processor.dart->/lib/src/protocol.dart + + + + + +/lib/src/event_processor/enricher/io_enricher_event_processor.dart + +io_enricher_event_processor + + + +/lib/src/event_processor/enricher/io_enricher_event_processor.dart->/lib/src/event_processor/enricher/enricher_event_processor.dart + + + + + +/lib/src/event_processor/enricher/io_enricher_event_processor.dart->/lib/sentry.dart + + + + + +/lib/src/event_processor/enricher/enricher_event_processor.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/event_processor/enricher/enricher_event_processor.dart->/lib/src/event_processor.dart + + + + + +/lib/src/event_processor/enricher/web_enricher_event_processor.dart + +web_enricher_event_processor + + + +/lib/src/event_processor/enricher/web_enricher_event_processor.dart->/lib/src/event_processor/enricher/enricher_event_processor.dart + + + + + +/lib/src/event_processor/enricher/web_enricher_event_processor.dart->/lib/sentry.dart + + + + + +/lib/src/platform/platform.dart + +platform + + + +/lib/src/platform/_web_platform.dart + +_web_platform + + + +/lib/src/platform/_web_platform.dart->/lib/src/platform/platform.dart + + + + + +/lib/src/platform/_io_platform.dart + +_io_platform + + + +/lib/src/platform/_io_platform.dart->/lib/src/platform/platform.dart + + + + + +/lib/src/hint.dart->/lib/src/sentry_attachment/sentry_attachment.dart + + + + + +/lib/src/platform_checker.dart->/lib/src/platform/platform.dart + + + + + +/lib/src/tracing.dart->/lib/src/sentry_span_context.dart + + + + + +/lib/src/tracing.dart->/lib/src/invalid_sentry_trace_header_exception.dart + + + + + +/lib/src/tracing.dart->/lib/src/sentry_trace_context_header.dart + + + + + +/lib/src/sentry_measurement_unit.dart + +sentry_measurement_unit + + + +/lib/src/tracing.dart->/lib/src/sentry_measurement_unit.dart + + + + + +/lib/src/sentry_transaction_context.dart + +sentry_transaction_context + + + +/lib/src/tracing.dart->/lib/src/sentry_transaction_context.dart + + + + + +/lib/src/sentry_span_interface.dart + +sentry_span_interface + + + +/lib/src/tracing.dart->/lib/src/sentry_span_interface.dart + + + + + +/lib/src/sentry_traces_sampling_decision.dart + +sentry_traces_sampling_decision + + + +/lib/src/tracing.dart->/lib/src/sentry_traces_sampling_decision.dart + + + + + +/lib/src/noop_sentry_span.dart + +noop_sentry_span + + + +/lib/src/tracing.dart->/lib/src/noop_sentry_span.dart + + + + + +/lib/src/tracing.dart->/lib/src/sentry_measurement.dart + + + + + +/lib/src/sentry_sampling_context.dart + +sentry_sampling_context + + + +/lib/src/tracing.dart->/lib/src/sentry_sampling_context.dart + + + + + +/lib/src/exception_cause.dart + +exception_cause + + + +/lib/src/noop_isolate_error_integration.dart + +noop_isolate_error_integration + + + +/lib/src/noop_isolate_error_integration.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/noop_isolate_error_integration.dart->/lib/src/integration.dart + + + + + +/lib/src/noop_isolate_error_integration.dart->/lib/src/hub.dart + + + + + +/lib/src/sentry_trace_context_header.dart->/lib/src/protocol/sentry_id.dart + + + + + +/lib/src/sentry_trace_context_header.dart->/lib/src/sentry_baggage.dart + + + + + +/lib/src/sentry_trace_context_header.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/integration.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/integration.dart->/lib/src/hub.dart + + + + + +/lib/src/protocol.dart->/lib/src/sentry_event_like.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/span_id.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_response.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_thread.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_stack_frame.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_transaction_info.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_span.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/breadcrumb.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_request.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_level.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sdk_version.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_trace_header.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_transaction.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_id.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_view_hierarchy_element.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_culture.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_geo.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/debug_meta.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/mechanism.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_app.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_gpu.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_trace_context.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/contexts.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/debug_image.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_baggage_header.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_stack_trace.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_runtime.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_device.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_message.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sdk_info.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/max_body_size.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_package.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_event.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_operating_system.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_user.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_exception.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/span_status.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_transaction_name_source.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_view_hierarchy.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/sentry_browser.dart + + + + + +/lib/src/protocol.dart->/lib/src/protocol/dsn.dart + + + + + +/lib/src/sentry_attachment/io_sentry_attachment.dart + +io_sentry_attachment + + + +/lib/src/sentry_attachment/io_sentry_attachment.dart->/lib/src/sentry_attachment/sentry_attachment.dart + + + + + +/lib/src/sentry_attachment/sentry_attachment.dart->/lib/src/utils.dart + + + + + +/lib/src/sentry_attachment/sentry_attachment.dart->/lib/src/protocol/sentry_view_hierarchy.dart + + + + + +/lib/src/exception_cause_extractor.dart + +exception_cause_extractor + + + +/lib/src/exception_cause_extractor.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/exception_cause_extractor.dart->/lib/src/exception_cause.dart + + + + + +/lib/src/exception_cause_extractor.dart->/lib/src/protocol.dart + + + + + +/lib/src/noop_sentry_client.dart + +noop_sentry_client + + + +/lib/src/noop_sentry_client.dart->/lib/src/sentry_client.dart + + + + + +/lib/src/noop_sentry_client.dart->/lib/src/hint.dart + + + + + +/lib/src/noop_sentry_client.dart->/lib/src/sentry_trace_context_header.dart + + + + + +/lib/src/noop_sentry_client.dart->/lib/src/protocol.dart + + + + + +/lib/src/noop_sentry_client.dart->/lib/src/sentry_user_feedback.dart + + + + + +/lib/src/noop_sentry_client.dart->/lib/src/scope.dart + + + + + +/lib/src/noop_sentry_client.dart->/lib/src/sentry_envelope.dart + + + + + +/lib/src/sentry_transaction_context.dart->/lib/src/sentry_trace_origins.dart + + + + + +/lib/src/sentry_transaction_context.dart->/lib/src/sentry_baggage.dart + + + + + +/lib/src/sentry_transaction_context.dart->/lib/src/tracing.dart + + + + + +/lib/src/sentry_transaction_context.dart->/lib/src/protocol.dart + + + + + +/lib/src/sentry_tracer_finish_status.dart + +sentry_tracer_finish_status + + + +/lib/src/sentry_tracer.dart->/lib/src/sentry_tracer_finish_status.dart + + + + + +/lib/src/utils/sample_rate_format.dart + +sample_rate_format + + + +/lib/src/sentry_tracer.dart->/lib/src/utils/sample_rate_format.dart + + + + + +/lib/src/sentry_tracer.dart->/lib/sentry.dart + + + + + +/lib/src/sentry_span_interface.dart->/lib/src/tracing.dart + + + + + +/lib/src/sentry_span_interface.dart->/lib/src/protocol.dart + + + + + +/lib/src/noop_origin.dart + +noop_origin + + + +/lib/src/hub_adapter.dart->/lib/src/sentry.dart + + + + + +/lib/src/hub_adapter.dart->/lib/src/sentry_client.dart + + + + + +/lib/src/hub_adapter.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/hub_adapter.dart->/lib/src/hint.dart + + + + + +/lib/src/hub_adapter.dart->/lib/src/tracing.dart + + + + + +/lib/src/hub_adapter.dart->/lib/src/protocol.dart + + + + + +/lib/src/hub_adapter.dart->/lib/src/sentry_user_feedback.dart + + + + + +/lib/src/hub_adapter.dart->/lib/src/scope.dart + + + + + +/lib/src/hub_adapter.dart->/lib/src/hub.dart + + + + + +/lib/src/sentry_user_feedback.dart->/lib/src/protocol.dart + + + + + +/lib/src/http_client/failed_request_client.dart->/lib/src/throwable_mechanism.dart + + + + + +/lib/src/http_client/failed_request_client.dart->/lib/src/type_check_hint.dart + + + + + +/lib/src/http_client/failed_request_client.dart->/lib/src/hint.dart + + + + + +/lib/src/http_client/failed_request_client.dart->/lib/src/protocol.dart + + + + + +/lib/src/http_client/failed_request_client.dart->/lib/src/hub_adapter.dart + + + + + +/lib/src/http_client/sentry_http_client.dart + +sentry_http_client + + + +/lib/src/http_client/failed_request_client.dart->/lib/src/http_client/sentry_http_client.dart + + + + + +/lib/src/http_client/sentry_http_client_error.dart + +sentry_http_client_error + + + +/lib/src/http_client/failed_request_client.dart->/lib/src/http_client/sentry_http_client_error.dart + + + + + +/lib/src/utils/tracing_utils.dart + +tracing_utils + + + +/lib/src/http_client/failed_request_client.dart->/lib/src/utils/tracing_utils.dart + + + + + +/lib/src/http_client/failed_request_client.dart->/lib/src/hub.dart + + + + + +/lib/src/http_client/sentry_http_client.dart->/lib/src/hub_adapter.dart + + + + + +/lib/src/http_client/sentry_http_client.dart->/lib/src/http_client/failed_request_client.dart + + + + + +/lib/src/http_client/breadcrumb_client.dart + +breadcrumb_client + + + +/lib/src/http_client/sentry_http_client.dart->/lib/src/http_client/breadcrumb_client.dart + + + + + +/lib/src/http_client/tracing_client.dart + +tracing_client + + + +/lib/src/http_client/sentry_http_client.dart->/lib/src/http_client/tracing_client.dart + + + + + +/lib/src/http_client/sentry_http_client.dart->/lib/src/hub.dart + + + + + +/lib/src/http_client/breadcrumb_client.dart->/lib/src/protocol.dart + + + + + +/lib/src/http_client/breadcrumb_client.dart->/lib/src/hub_adapter.dart + + + + + +/lib/src/http_client/breadcrumb_client.dart->/lib/src/utils/http_sanitizer.dart + + + + + +/lib/src/utils/url_details.dart + +url_details + + + +/lib/src/http_client/breadcrumb_client.dart->/lib/src/utils/url_details.dart + + + + + +/lib/src/http_client/breadcrumb_client.dart->/lib/src/hub.dart + + + + + +/lib/src/http_client/tracing_client.dart->/lib/src/sentry_trace_origins.dart + + + + + +/lib/src/http_client/tracing_client.dart->/lib/src/tracing.dart + + + + + +/lib/src/http_client/tracing_client.dart->/lib/src/protocol.dart + + + + + +/lib/src/http_client/tracing_client.dart->/lib/src/hub_adapter.dart + + + + + +/lib/src/http_client/tracing_client.dart->/lib/src/utils/http_sanitizer.dart + + + + + +/lib/src/http_client/tracing_client.dart->/lib/src/utils/tracing_utils.dart + + + + + +/lib/src/http_client/tracing_client.dart->/lib/src/hub.dart + + + + + +/lib/src/noop_sentry_span.dart->/lib/src/utils.dart + + + + + +/lib/src/noop_sentry_span.dart->/lib/src/tracing.dart + + + + + +/lib/src/noop_sentry_span.dart->/lib/src/protocol.dart + + + + + +/lib/src/sentry_tracer_finish_status.dart->/lib/sentry.dart + + + + + +/lib/src/run_zoned_guarded_integration.dart->/lib/src/throwable_mechanism.dart + + + + + +/lib/src/run_zoned_guarded_integration.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/run_zoned_guarded_integration.dart->/lib/src/integration.dart + + + + + +/lib/src/run_zoned_guarded_integration.dart->/lib/src/protocol.dart + + + + + +/lib/src/run_zoned_guarded_integration.dart->/lib/src/hub.dart + + + + + +/lib/src/transport/noop_transport.dart->/lib/src/protocol.dart + + + + + +/lib/src/transport/transport.dart + +transport + + + +/lib/src/transport/noop_transport.dart->/lib/src/transport/transport.dart + + + + + +/lib/src/transport/noop_transport.dart->/lib/src/sentry_envelope.dart + + + + + +/lib/src/transport/rate_limit_parser.dart + +rate_limit_parser + + + +/lib/src/transport/rate_limit_parser.dart->/lib/src/transport/data_category.dart + + + + + +/lib/src/transport/rate_limit.dart + +rate_limit + + + +/lib/src/transport/rate_limit_parser.dart->/lib/src/transport/rate_limit.dart + + + + + +/lib/src/transport/noop_encode.dart + +noop_encode + + + +/lib/src/transport/transport.dart->/lib/src/protocol.dart + + + + + +/lib/src/transport/transport.dart->/lib/src/sentry_envelope.dart + + + + + +/lib/src/transport/rate_limiter.dart->/lib/src/sentry_envelope_item.dart + + + + + +/lib/src/transport/rate_limiter.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/transport/rate_limiter.dart->/lib/src/transport/rate_limit_parser.dart + + + + + +/lib/src/transport/rate_limiter.dart->/lib/src/transport/data_category.dart + + + + + +/lib/src/transport/rate_limiter.dart->/lib/src/transport/rate_limit.dart + + + + + +/lib/src/transport/rate_limiter.dart->/lib/src/client_reports/discard_reason.dart + + + + + +/lib/src/transport/rate_limiter.dart->/lib/src/sentry_envelope.dart + + + + + +/lib/src/transport/encode.dart + +encode + + + +/lib/src/transport/rate_limit.dart->/lib/src/transport/data_category.dart + + + + + +/lib/src/transport/http_transport.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/transport/http_transport.dart->/lib/src/noop_client.dart + + + + + +/lib/src/transport/http_transport.dart->/lib/src/protocol.dart + + + + + +/lib/src/transport/http_transport.dart->/lib/src/transport/noop_encode.dart + + + + + +/lib/src/transport/http_transport.dart->/lib/src/transport/data_category.dart + + + + + +/lib/src/transport/http_transport.dart->/lib/src/transport/transport.dart + + + + + +/lib/src/transport/http_transport.dart->/lib/src/transport/rate_limiter.dart + + + + + +/lib/src/transport/http_transport.dart->/lib/src/client_reports/client_report_recorder.dart + + + + + +/lib/src/transport/http_transport.dart->/lib/src/client_reports/discard_reason.dart + + + + + +/lib/src/transport/http_transport.dart->/lib/src/sentry_envelope.dart + + + + + +/lib/src/recursive_exception_cause_extractor.dart + +recursive_exception_cause_extractor + + + +/lib/src/recursive_exception_cause_extractor.dart->/lib/src/throwable_mechanism.dart + + + + + +/lib/src/recursive_exception_cause_extractor.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/recursive_exception_cause_extractor.dart->/lib/src/exception_cause.dart + + + + + +/lib/src/recursive_exception_cause_extractor.dart->/lib/src/protocol.dart + + + + + +/lib/src/scope.dart->/lib/src/propagation_context.dart + + + + + +/lib/src/scope.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/scope.dart->/lib/src/hint.dart + + + + + +/lib/src/scope.dart->/lib/src/protocol.dart + + + + + +/lib/src/scope.dart->/lib/src/sentry_attachment/sentry_attachment.dart + + + + + +/lib/src/scope.dart->/lib/src/sentry_tracer.dart + + + + + +/lib/src/scope.dart->/lib/src/sentry_span_interface.dart + + + + + +/lib/src/scope.dart->/lib/src/event_processor.dart + + + + + +/lib/src/scope_observer.dart + +scope_observer + + + +/lib/src/scope.dart->/lib/src/scope_observer.dart + + + + + +/lib/src/event_processor.dart->/lib/src/hint.dart + + + + + +/lib/src/event_processor.dart->/lib/src/protocol.dart + + + + + +/lib/src/utils/http_sanitizer.dart->/lib/src/protocol.dart + + + + + +/lib/src/utils/http_sanitizer.dart->/lib/src/utils/url_details.dart + + + + + +/lib/src/utils/url_details.dart->/lib/sentry.dart + + + + + +/lib/src/utils/http_header_utils.dart + +http_header_utils + + + +/lib/src/utils/_web_get_isolate_name.dart + +_web_get_isolate_name + + + +/lib/src/utils/tracing_utils.dart->/lib/sentry.dart + + + + + +/lib/src/utils/_io_get_isolate_name.dart + +_io_get_isolate_name + + + +/lib/src/client_reports/client_report.dart->/lib/src/utils.dart + + + + + +/lib/src/client_reports/discarded_event.dart + +discarded_event + + + +/lib/src/client_reports/client_report.dart->/lib/src/client_reports/discarded_event.dart + + + + + +/lib/src/client_reports/noop_client_report_recorder.dart->/lib/src/transport/data_category.dart + + + + + +/lib/src/client_reports/noop_client_report_recorder.dart->/lib/src/client_reports/client_report.dart + + + + + +/lib/src/client_reports/noop_client_report_recorder.dart->/lib/src/client_reports/client_report_recorder.dart + + + + + +/lib/src/client_reports/noop_client_report_recorder.dart->/lib/src/client_reports/discard_reason.dart + + + + + +/lib/src/client_reports/discarded_event.dart->/lib/src/transport/data_category.dart + + + + + +/lib/src/client_reports/discarded_event.dart->/lib/src/client_reports/discard_reason.dart + + + + + +/lib/src/client_reports/client_report_recorder.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/client_reports/client_report_recorder.dart->/lib/src/transport/data_category.dart + + + + + +/lib/src/client_reports/client_report_recorder.dart->/lib/src/client_reports/client_report.dart + + + + + +/lib/src/client_reports/client_report_recorder.dart->/lib/src/client_reports/discarded_event.dart + + + + + +/lib/src/client_reports/client_report_recorder.dart->/lib/src/client_reports/discard_reason.dart + + + + + +/lib/src/sentry_stack_trace_factory.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/sentry_stack_trace_factory.dart->/lib/src/protocol.dart + + + + + +/lib/src/sentry_stack_trace_factory.dart->/lib/src/noop_origin.dart + + + + + +/lib/src/sentry_measurement.dart->/lib/src/sentry_measurement_unit.dart + + + + + +/lib/src/sentry_envelope_header.dart + +sentry_envelope_header + + + +/lib/src/sentry_envelope_header.dart->/lib/src/utils.dart + + + + + +/lib/src/sentry_envelope_header.dart->/lib/src/protocol/sdk_version.dart + + + + + +/lib/src/sentry_envelope_header.dart->/lib/src/protocol/sentry_id.dart + + + + + +/lib/src/sentry_envelope_header.dart->/lib/src/sentry_trace_context_header.dart + + + + + +/lib/src/sentry_isolate.dart->/lib/src/throwable_mechanism.dart + + + + + +/lib/src/sentry_isolate.dart->/lib/src/protocol.dart + + + + + +/lib/src/sentry_isolate.dart->/lib/src/hub_adapter.dart + + + + + +/lib/src/sentry_isolate.dart->/lib/src/hub.dart + + + + + +/lib/src/scope_observer.dart->/lib/src/protocol/breadcrumb.dart + + + + + +/lib/src/scope_observer.dart->/lib/src/protocol/sentry_user.dart + + + + + +/lib/src/sentry_envelope.dart->/lib/src/utils.dart + + + + + +/lib/src/sentry_envelope.dart->/lib/src/sentry_item_type.dart + + + + + +/lib/src/sentry_envelope.dart->/lib/src/sentry_envelope_item.dart + + + + + +/lib/src/sentry_envelope.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/sentry_envelope.dart->/lib/src/sentry_trace_context_header.dart + + + + + +/lib/src/sentry_envelope.dart->/lib/src/protocol.dart + + + + + +/lib/src/sentry_envelope.dart->/lib/src/sentry_attachment/sentry_attachment.dart + + + + + +/lib/src/sentry_envelope.dart->/lib/src/sentry_user_feedback.dart + + + + + +/lib/src/sentry_envelope.dart->/lib/src/client_reports/client_report.dart + + + + + +/lib/src/sentry_envelope.dart->/lib/src/sentry_envelope_header.dart + + + + + +/lib/src/sentry_sampling_context.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/sentry_sampling_context.dart->/lib/src/tracing.dart + + + + + +/lib/src/sentry_exception_factory.dart->/lib/src/throwable_mechanism.dart + + + + + +/lib/src/sentry_exception_factory.dart->/lib/src/sentry_options.dart + + + + + +/lib/src/sentry_exception_factory.dart->/lib/src/protocol.dart + + + + + +/lib/src/sentry_exception_factory.dart->/lib/src/recursive_exception_cause_extractor.dart + + + + + +/lib/src/sentry_exception_factory.dart->/lib/src/sentry_stack_trace_factory.dart + + + + + +/lib/src/hub.dart->/lib/src/propagation_context.dart + + + + + +/lib/src/hub.dart->/lib/src/sentry_traces_sampler.dart + + + + + +/lib/src/hub.dart->/lib/src/sentry_tracer.dart + + + + + +/lib/src/hub.dart->/lib/src/transport/data_category.dart + + + + + +/lib/src/hub.dart->/lib/src/client_reports/discard_reason.dart + + + + + +/lib/src/hub.dart->/lib/sentry.dart + + + + + +/lib/src/origin.dart + +origin + + + +/lib/sentry.dart->/lib/src/utils.dart + + + + + +/lib/sentry.dart->/lib/src/sentry_trace_origins.dart + + + + + +/lib/sentry.dart->/lib/src/sentry.dart + + + + + +/lib/sentry.dart->/lib/src/sentry_envelope_item.dart + + + + + +/lib/sentry.dart->/lib/src/sentry_client.dart + + + + + +/lib/sentry.dart->/lib/src/sentry_baggage.dart + + + + + +/lib/sentry.dart->/lib/src/exception_stacktrace_extractor.dart + + + + + +/lib/sentry.dart->/lib/src/throwable_mechanism.dart + + + + + +/lib/sentry.dart->/lib/src/type_check_hint.dart + + + + + +/lib/sentry.dart->/lib/src/sentry_options.dart + + + + + +/lib/sentry.dart->/lib/src/hint.dart + + + + + +/lib/sentry.dart->/lib/src/platform_checker.dart + + + + + +/lib/sentry.dart->/lib/src/tracing.dart + + + + + +/lib/sentry.dart->/lib/src/exception_cause.dart + + + + + +/lib/sentry.dart->/lib/src/integration.dart + + + + + +/lib/sentry.dart->/lib/src/protocol.dart + + + + + +/lib/sentry.dart->/lib/src/sentry_attachment/sentry_attachment.dart + + + + + +/lib/sentry.dart->/lib/src/exception_cause_extractor.dart + + + + + +/lib/sentry.dart->/lib/src/hub_adapter.dart + + + + + +/lib/sentry.dart->/lib/src/sentry_user_feedback.dart + + + + + +/lib/sentry.dart->/lib/src/http_client/sentry_http_client.dart + + + + + +/lib/sentry.dart->/lib/src/http_client/sentry_http_client_error.dart + + + + + +/lib/sentry.dart->/lib/src/run_zoned_guarded_integration.dart + + + + + +/lib/sentry.dart->/lib/src/transport/transport.dart + + + + + +/lib/sentry.dart->/lib/src/scope.dart + + + + + +/lib/sentry.dart->/lib/src/event_processor.dart + + + + + +/lib/sentry.dart->/lib/src/utils/http_sanitizer.dart + + + + + +/lib/sentry.dart->/lib/src/utils/url_details.dart + + + + + +/lib/sentry.dart->/lib/src/utils/http_header_utils.dart + + + + + +/lib/sentry.dart->/lib/src/utils/tracing_utils.dart + + + + + +/lib/sentry.dart->/lib/src/scope_observer.dart + + + + + +/lib/sentry.dart->/lib/src/sentry_envelope.dart + + + + + +/lib/sentry.dart->/lib/src/hub.dart + + + + + +/lib/sentry_io.dart + +sentry_io + + + +/lib/sentry_io.dart->/lib/src/sentry_isolate_extension.dart + + + + + +/lib/sentry_io.dart->/lib/src/sentry_attachment/io_sentry_attachment.dart + + + + + +/lib/sentry_io.dart->/lib/src/sentry_isolate.dart + + + + + +/lib/sentry_io.dart->/lib/sentry.dart + + + + + diff --git a/dart/lib/sentry.dart b/dart/lib/sentry.dart index 9d06bb7e2a..5419aa45b8 100644 --- a/dart/lib/sentry.dart +++ b/dart/lib/sentry.dart @@ -3,6 +3,8 @@ // found in the LICENSE file. /// A pure Dart client for Sentry.io crash reporting. +library sentry_dart; + export 'src/run_zoned_guarded_integration.dart'; export 'src/hub.dart'; // useful for tests @@ -48,3 +50,5 @@ export 'src/utils/http_header_utils.dart'; export 'src/sentry_trace_origins.dart'; // ignore: invalid_export_of_internal_element export 'src/utils.dart'; +// spotlight debugging +export 'src/spotlight.dart'; diff --git a/dart/lib/src/diagnostic_logger.dart b/dart/lib/src/diagnostic_logger.dart index 9a393f974f..ca523c12ae 100644 --- a/dart/lib/src/diagnostic_logger.dart +++ b/dart/lib/src/diagnostic_logger.dart @@ -26,6 +26,8 @@ class DiagnosticLogger { } bool _isEnabled(SentryLevel level) { - return _options.debug && level.ordinal >= _options.diagnosticLevel.ordinal; + return _options.debug && + level.ordinal >= _options.diagnosticLevel.ordinal || + level == SentryLevel.fatal; } } diff --git a/dart/lib/src/hint.dart b/dart/lib/src/hint.dart index f14f69d5dc..5d8dbf1f0a 100644 --- a/dart/lib/src/hint.dart +++ b/dart/lib/src/hint.dart @@ -40,7 +40,7 @@ import 'sentry_attachment/sentry_attachment.dart'; /// }; /// ``` class Hint { - final Map _internalStorage = {}; + final Map _internalStorage = {}; final List attachments = []; @@ -62,7 +62,7 @@ class Hint { return hint; } - factory Hint.withMap(Map map) { + factory Hint.withMap(Map map) { final hint = Hint(); hint.addAll(map); return hint; @@ -80,17 +80,19 @@ class Hint { return hint; } - // Objects + // Key/Value Storage - void addAll(Map keysAndValues) { - _internalStorage.addAll(keysAndValues); + void addAll(Map keysAndValues) { + final withoutNullValues = + keysAndValues.map((key, value) => MapEntry(key, value ?? "null")); + _internalStorage.addAll(withoutNullValues); } - void set(String key, Object value) { - _internalStorage[key] = value; + void set(String key, dynamic value) { + _internalStorage[key] = value ?? "null"; } - Object? get(String key) { + dynamic get(String key) { return _internalStorage[key]; } diff --git a/dart/lib/src/http_client/tracing_client.dart b/dart/lib/src/http_client/tracing_client.dart index ae7a81e973..95627724c3 100644 --- a/dart/lib/src/http_client/tracing_client.dart +++ b/dart/lib/src/http_client/tracing_client.dart @@ -41,20 +41,33 @@ class TracingClient extends BaseClient { span = null; } - span?.setData('http.method', request.method); + span?.setData('http.request.method', request.method); urlDetails?.applyToSpan(span); StreamedResponse? response; try { - if (span != null) { - if (containsTargetOrMatchesRegExp( - _hub.options.tracePropagationTargets, request.url.toString())) { - addSentryTraceHeader(span, request.headers); - addBaggageHeader( + if (containsTargetOrMatchesRegExp( + _hub.options.tracePropagationTargets, request.url.toString())) { + if (span != null) { + addSentryTraceHeaderFromSpan(span, request.headers); + addBaggageHeaderFromSpan( span, request.headers, logger: _hub.options.logger, ); + } else { + final scope = _hub.scope; + final propagationContext = scope.propagationContext; + + final traceHeader = propagationContext.toSentryTrace(); + addSentryTraceHeader(traceHeader, request.headers); + + final baggage = propagationContext.baggage; + if (baggage != null) { + final baggageHeader = SentryBaggageHeader.fromBaggage(baggage); + addBaggageHeader(baggageHeader, request.headers, + logger: _hub.options.logger); + } } } diff --git a/dart/lib/src/hub.dart b/dart/lib/src/hub.dart index e1ffe802dd..42291d1c87 100644 --- a/dart/lib/src/hub.dart +++ b/dart/lib/src/hub.dart @@ -2,6 +2,8 @@ import 'dart:async'; import 'dart:collection'; import 'package:meta/meta.dart'; +import 'profiling.dart'; +import 'propagation_context.dart'; import 'transport/data_category.dart'; import '../sentry.dart'; @@ -65,6 +67,9 @@ class Hub { /// Last event id recorded by the Hub SentryId get lastEventId => _lastEventId; + @internal + Scope get scope => _peek().scope; + /// Captures the event. Future captureEvent( SentryEvent event, { @@ -273,7 +278,7 @@ class Hub { exception: exception, stackTrace: stackTrace, ); - if (_options.devMode) { + if (_options.automatedTestMode) { rethrow; } } @@ -373,7 +378,7 @@ class Hub { SentryLevel.error, "Error in the 'configureScope' callback, error: $err", ); - if (_options.devMode) { + if (_options.automatedTestMode) { rethrow; } } @@ -426,19 +431,17 @@ class Hub { "Instance is disabled and this 'startTransaction' call is a no-op.", ); } else if (!_options.isTracingEnabled()) { - _options.logger( - SentryLevel.info, - "Tracing is disabled and this 'startTransaction' returns a no-op.", - ); + final item = _peek(); + item.scope.propagationContext = PropagationContext(); } else { final item = _peek(); - final samplingContext = SentrySamplingContext( - transactionContext, customSamplingContext ?? {}); - // if transactionContext has no sampled decision, run the traces sampler - if (transactionContext.samplingDecision == null) { - final samplingDecision = _tracesSampler.sample(samplingContext); + var samplingDecision = transactionContext.samplingDecision; + if (samplingDecision == null) { + final samplingContext = SentrySamplingContext( + transactionContext, customSamplingContext ?? {}); + samplingDecision = _tracesSampler.sample(samplingContext); transactionContext = transactionContext.copyWith(samplingDecision: samplingDecision); } @@ -449,6 +452,12 @@ class Hub { ); } + SentryProfiler? profiler; + if (_profilerFactory != null && + _tracesSampler.sampleProfiling(samplingDecision)) { + profiler = _profilerFactory?.startProfiler(transactionContext); + } + final tracer = SentryTracer( transactionContext, this, @@ -457,6 +466,7 @@ class Hub { autoFinishAfter: autoFinishAfter, trimEnd: trimEnd ?? false, onFinish: onFinish, + profiler: profiler, ); if (bindToScope ?? false) { item.scope.span = tracer; @@ -552,6 +562,14 @@ class Hub { ) => _throwableToSpan.add(throwable, span, transaction); + @internal + SentryProfilerFactory? get profilerFactory => _profilerFactory; + + @internal + set profilerFactory(SentryProfilerFactory? value) => _profilerFactory = value; + + SentryProfilerFactory? _profilerFactory; + SentryEvent _assignTraceContext(SentryEvent event) { // assign trace context if (event.throwable != null && event.contexts.trace == null) { @@ -587,6 +605,8 @@ class _WeakMap { final SentryOptions _options; + final throwableHandler = UnsupportedThrowablesHandler(); + _WeakMap(this._options); void add( @@ -597,6 +617,7 @@ class _WeakMap { if (throwable == null) { return; } + throwable = throwableHandler.wrapIfUnsupportedType(throwable); try { if (_expando[throwable] == null) { _expando[throwable] = MapEntry(span, transaction); @@ -615,6 +636,7 @@ class _WeakMap { if (throwable == null) { return null; } + throwable = throwableHandler.wrapIfUnsupportedType(throwable); try { return _expando[throwable] as MapEntry?; } catch (exception, stackTrace) { @@ -628,3 +650,35 @@ class _WeakMap { return null; } } + +/// A handler for unsupported throwables used for Expando. +@visibleForTesting +class UnsupportedThrowablesHandler { + final _unsupportedTypes = {String, int, double, bool}; + final _unsupportedThrowables = {}; + + dynamic wrapIfUnsupportedType(dynamic throwable) { + if (_unsupportedTypes.contains(throwable.runtimeType)) { + throwable = _UnsupportedExceptionWrapper(Exception(throwable)); + _unsupportedThrowables.add(throwable); + } + return _unsupportedThrowables.lookup(throwable) ?? throwable; + } +} + +class _UnsupportedExceptionWrapper { + _UnsupportedExceptionWrapper(this.exception); + + final Exception exception; + + @override + bool operator ==(Object other) { + if (other is _UnsupportedExceptionWrapper) { + return other.exception.toString() == exception.toString(); + } + return false; + } + + @override + int get hashCode => exception.toString().hashCode; +} diff --git a/dart/lib/src/hub_adapter.dart b/dart/lib/src/hub_adapter.dart index 8c1a176df8..8a9107ae54 100644 --- a/dart/lib/src/hub_adapter.dart +++ b/dart/lib/src/hub_adapter.dart @@ -4,7 +4,9 @@ import 'package:meta/meta.dart'; import 'hint.dart'; import 'hub.dart'; +import 'profiling.dart'; import 'protocol.dart'; +import 'scope.dart'; import 'sentry.dart'; import 'sentry_client.dart'; import 'sentry_user_feedback.dart'; @@ -166,4 +168,17 @@ class HubAdapter implements Hub { String transaction, ) => Sentry.currentHub.setSpanContext(throwable, span, transaction); + + @internal + @override + set profilerFactory(SentryProfilerFactory? value) => + Sentry.currentHub.profilerFactory = value; + + @internal + @override + SentryProfilerFactory? get profilerFactory => + Sentry.currentHub.profilerFactory; + + @override + Scope get scope => Sentry.currentHub.scope; } diff --git a/dart/lib/src/noop_hub.dart b/dart/lib/src/noop_hub.dart index ea005184b6..06d31e7da2 100644 --- a/dart/lib/src/noop_hub.dart +++ b/dart/lib/src/noop_hub.dart @@ -4,7 +4,9 @@ import 'package:meta/meta.dart'; import 'hint.dart'; import 'hub.dart'; +import 'profiling.dart'; import 'protocol.dart'; +import 'scope.dart'; import 'sentry_client.dart'; import 'sentry_options.dart'; import 'sentry_user_feedback.dart'; @@ -118,4 +120,15 @@ class NoOpHub implements Hub { @override void setSpanContext(throwable, ISentrySpan span, String transaction) {} + + @internal + @override + set profilerFactory(SentryProfilerFactory? value) {} + + @internal + @override + SentryProfilerFactory? get profilerFactory => null; + + @override + Scope get scope => Scope(_options); } diff --git a/dart/lib/src/profiling.dart b/dart/lib/src/profiling.dart new file mode 100644 index 0000000000..d0ed997313 --- /dev/null +++ b/dart/lib/src/profiling.dart @@ -0,0 +1,22 @@ +import 'dart:async'; + +import 'package:meta/meta.dart'; + +import '../sentry.dart'; + +@internal +abstract class SentryProfilerFactory { + SentryProfiler? startProfiler(SentryTransactionContext context); +} + +@internal +abstract class SentryProfiler { + Future finishFor(SentryTransaction transaction); + void dispose(); +} + +// See https://develop.sentry.dev/sdk/profiles/ +@internal +abstract class SentryProfileInfo { + SentryEnvelopeItem asEnvelopeItem(); +} diff --git a/dart/lib/src/propagation_context.dart b/dart/lib/src/propagation_context.dart new file mode 100644 index 0000000000..1a0f32355a --- /dev/null +++ b/dart/lib/src/propagation_context.dart @@ -0,0 +1,12 @@ +import 'package:meta/meta.dart'; +import 'protocol.dart'; +import 'sentry_baggage.dart'; + +@internal +class PropagationContext { + late SentryId traceId = SentryId.newId(); + late SpanId spanId = SpanId.newId(); + SentryBaggage? baggage; + + SentryTraceHeader toSentryTrace() => SentryTraceHeader(traceId, spanId); +} diff --git a/dart/lib/src/protocol/sentry_app.dart b/dart/lib/src/protocol/sentry_app.dart index 67accebe1a..b5163e5856 100644 --- a/dart/lib/src/protocol/sentry_app.dart +++ b/dart/lib/src/protocol/sentry_app.dart @@ -18,6 +18,7 @@ class SentryApp { this.deviceAppHash, this.appMemory, this.inForeground, + this.viewNames, }); /// Human readable application name, as it appears on the platform. @@ -48,20 +49,27 @@ class SentryApp { /// An app is in foreground when it's visible to the user. final bool? inForeground; + /// The names of the currently visible views. + final List? viewNames; + /// Deserializes a [SentryApp] from JSON [Map]. - factory SentryApp.fromJson(Map data) => SentryApp( - name: data['app_name'], - version: data['app_version'], - identifier: data['app_identifier'], - build: data['app_build'], - buildType: data['build_type'], - startTime: data['app_start_time'] != null - ? DateTime.tryParse(data['app_start_time']) - : null, - deviceAppHash: data['device_app_hash'], - appMemory: data['app_memory'], - inForeground: data['in_foreground'], - ); + factory SentryApp.fromJson(Map data) { + final viewNamesJson = data['view_names'] as List?; + return SentryApp( + name: data['app_name'], + version: data['app_version'], + identifier: data['app_identifier'], + build: data['app_build'], + buildType: data['build_type'], + startTime: data['app_start_time'] != null + ? DateTime.tryParse(data['app_start_time']) + : null, + deviceAppHash: data['device_app_hash'], + appMemory: data['app_memory'], + inForeground: data['in_foreground'], + viewNames: viewNamesJson?.map((e) => e as String).toList(), + ); + } /// Produces a [Map] that can be serialized to JSON. Map toJson() { @@ -71,10 +79,11 @@ class SentryApp { if (identifier != null) 'app_identifier': identifier!, if (build != null) 'app_build': build!, if (buildType != null) 'build_type': buildType!, + if (startTime != null) 'app_start_time': startTime!.toIso8601String(), if (deviceAppHash != null) 'device_app_hash': deviceAppHash!, if (appMemory != null) 'app_memory': appMemory!, - if (startTime != null) 'app_start_time': startTime!.toIso8601String(), if (inForeground != null) 'in_foreground': inForeground!, + if (viewNames != null && viewNames!.isNotEmpty) 'view_names': viewNames!, }; } @@ -88,6 +97,7 @@ class SentryApp { deviceAppHash: deviceAppHash, appMemory: appMemory, inForeground: inForeground, + viewNames: viewNames, ); SentryApp copyWith({ @@ -100,6 +110,7 @@ class SentryApp { String? deviceAppHash, int? appMemory, bool? inForeground, + List? viewNames, }) => SentryApp( name: name ?? this.name, @@ -111,5 +122,6 @@ class SentryApp { deviceAppHash: deviceAppHash ?? this.deviceAppHash, appMemory: appMemory ?? this.appMemory, inForeground: inForeground ?? this.inForeground, + viewNames: viewNames ?? this.viewNames, ); } diff --git a/dart/lib/src/protocol/sentry_event.dart b/dart/lib/src/protocol/sentry_event.dart index e51441cd7d..32a76b9885 100644 --- a/dart/lib/src/protocol/sentry_event.dart +++ b/dart/lib/src/protocol/sentry_event.dart @@ -59,7 +59,7 @@ class SentryEvent with SentryEventLike { /// The ID Sentry.io assigned to the submitted event for future reference. final SentryId eventId; - /// A timestamp representing when the breadcrumb occurred. + /// A timestamp representing when the event occurred. final DateTime? timestamp; /// A string representing the platform the SDK is submitting from. This will be used by the Sentry interface to customize various components in the interface. diff --git a/dart/lib/src/protocol/sentry_trace_context.dart b/dart/lib/src/protocol/sentry_trace_context.dart index fab3d1444d..25c4ca7ad8 100644 --- a/dart/lib/src/protocol/sentry_trace_context.dart +++ b/dart/lib/src/protocol/sentry_trace_context.dart @@ -1,5 +1,7 @@ import 'package:meta/meta.dart'; +import '../../sentry.dart'; +import '../propagation_context.dart'; import '../protocol.dart'; @immutable @@ -87,4 +89,14 @@ class SentryTraceContext { this.origin, }) : traceId = traceId ?? SentryId.newId(), spanId = spanId ?? SpanId.newId(); + + @internal + factory SentryTraceContext.fromPropagationContext( + PropagationContext propagationContext) { + return SentryTraceContext( + traceId: propagationContext.traceId, + spanId: propagationContext.spanId, + operation: 'default', + ); + } } diff --git a/dart/lib/src/protocol/sentry_transaction.dart b/dart/lib/src/protocol/sentry_transaction.dart index 44e6c4298f..e00fa23355 100644 --- a/dart/lib/src/protocol/sentry_transaction.dart +++ b/dart/lib/src/protocol/sentry_transaction.dart @@ -10,66 +10,56 @@ class SentryTransaction extends SentryEvent { late final DateTime startTimestamp; static const String _type = 'transaction'; late final List spans; - final SentryTracer _tracer; + @internal + final SentryTracer tracer; late final Map measurements; late final SentryTransactionInfo? transactionInfo; SentryTransaction( - this._tracer, { - SentryId? eventId, + this.tracer, { + super.eventId, DateTime? timestamp, - String? platform, - String? serverName, - String? release, - String? dist, - String? environment, + super.platform, + super.serverName, + super.release, + super.dist, + super.environment, String? transaction, dynamic throwable, Map? tags, @Deprecated( 'Additional Data is deprecated in favor of structured [Contexts] and should be avoided when possible') Map? extra, - SentryUser? user, - Contexts? contexts, - List? breadcrumbs, - SdkVersion? sdk, - SentryRequest? request, + super.user, + super.contexts, + super.breadcrumbs, + super.sdk, + super.request, String? type, Map? measurements, SentryTransactionInfo? transactionInfo, }) : super( - eventId: eventId, - timestamp: timestamp ?? _tracer.endTimestamp, - platform: platform, - serverName: serverName, - release: release, - dist: dist, - environment: environment, - transaction: transaction ?? _tracer.name, - throwable: throwable ?? _tracer.throwable, - tags: tags ?? _tracer.tags, + timestamp: timestamp ?? tracer.endTimestamp, + transaction: transaction ?? tracer.name, + throwable: throwable ?? tracer.throwable, + tags: tags ?? tracer.tags, // ignore: deprecated_member_use_from_same_package - extra: extra ?? _tracer.data, - user: user, - contexts: contexts, - breadcrumbs: breadcrumbs, - sdk: sdk, - request: request, + extra: extra ?? tracer.data, type: _type, ) { - startTimestamp = _tracer.startTimestamp; + startTimestamp = tracer.startTimestamp; - final spanContext = _tracer.context; - spans = _tracer.children; + final spanContext = tracer.context; + spans = tracer.children; this.measurements = measurements ?? {}; - this.contexts.trace = spanContext.toTraceContext( - sampled: _tracer.samplingDecision?.sampled, - status: _tracer.status, + contexts.trace = spanContext.toTraceContext( + sampled: tracer.samplingDecision?.sampled, + status: tracer.status, ); this.transactionInfo = transactionInfo ?? - SentryTransactionInfo(_tracer.transactionNameSource.name); + SentryTransactionInfo(tracer.transactionNameSource.name); } @override @@ -136,7 +126,7 @@ class SentryTransaction extends SentryEvent { SentryTransactionInfo? transactionInfo, }) => SentryTransaction( - _tracer, + tracer, eventId: eventId ?? this.eventId, timestamp: timestamp ?? this.timestamp, platform: platform ?? this.platform, diff --git a/dart/lib/src/run_zoned_guarded_integration.dart b/dart/lib/src/run_zoned_guarded_integration.dart index 623a9a5f54..20f0857e3b 100644 --- a/dart/lib/src/run_zoned_guarded_integration.dart +++ b/dart/lib/src/run_zoned_guarded_integration.dart @@ -50,7 +50,9 @@ class RunZonedGuardedIntegration extends Integration { final event = SentryEvent( throwable: throwableMechanism, - level: SentryLevel.fatal, + level: options.markAutomaticallyCollectedErrorsAsFatal + ? SentryLevel.fatal + : SentryLevel.error, timestamp: hub.options.clock(), ); diff --git a/dart/lib/src/scope.dart b/dart/lib/src/scope.dart index bbe8bb54d5..3fef9a92a2 100644 --- a/dart/lib/src/scope.dart +++ b/dart/lib/src/scope.dart @@ -1,8 +1,11 @@ import 'dart:async'; import 'dart:collection'; +import 'package:meta/meta.dart'; + import 'event_processor.dart'; import 'hint.dart'; +import 'propagation_context.dart'; import 'protocol.dart'; import 'scope_observer.dart'; import 'sentry_attachment/sentry_attachment.dart'; @@ -39,6 +42,9 @@ class Scope { /// Returns active transaction or null if there is no active transaction. ISentrySpan? span; + @internal + PropagationContext propagationContext = PropagationContext(); + SentryUser? _user; /// Get the current user. @@ -136,6 +142,7 @@ class Scope { List.unmodifiable(_eventProcessors); final SentryOptions _options; + bool _enableScopeSync = true; final List _attachments = []; @@ -171,7 +178,7 @@ class Scope { exception: exception, stackTrace: stackTrace, ); - if (_options.devMode) { + if (_options.automatedTestMode) { rethrow; } } @@ -311,10 +318,15 @@ class Scope { }); final newSpan = span; - if (event.contexts.trace == null && newSpan != null) { - event.contexts.trace = newSpan.context.toTraceContext( - sampled: newSpan.samplingDecision?.sampled, - ); + if (event.contexts.trace == null) { + if (newSpan != null) { + event.contexts.trace = newSpan.context.toTraceContext( + sampled: newSpan.samplingDecision?.sampled, + ); + } else { + event.contexts.trace = + SentryTraceContext.fromPropagationContext(propagationContext); + } } SentryEvent? processedEvent = event; @@ -333,7 +345,7 @@ class Scope { exception: exception, stackTrace: stackTrace, ); - if (_options.devMode) { + if (_options.automatedTestMode) { rethrow; } } @@ -412,7 +424,8 @@ class Scope { ..level = level ..fingerprint = List.from(fingerprint) .._transaction = _transaction - ..span = span; + ..span = span + .._enableScopeSync = false; clone._setUserSync(user); @@ -450,7 +463,7 @@ class Scope { } Future _callScopeObservers(_OnScopeObserver action) async { - if (_options.enableScopeSync) { + if (_options.enableScopeSync && _enableScopeSync) { for (final scopeObserver in _options.scopeObservers) { await action(scopeObserver); } diff --git a/dart/lib/src/sentry.dart b/dart/lib/src/sentry.dart index b3ec82ce10..88fdd42996 100644 --- a/dart/lib/src/sentry.dart +++ b/dart/lib/src/sentry.dart @@ -58,7 +58,7 @@ class Sentry { exception: exception, stackTrace: stackTrace, ); - if (sentryOptions.devMode) { + if (sentryOptions.automatedTestMode) { rethrow; } } diff --git a/dart/lib/src/sentry_attachment/io_sentry_attachment.dart b/dart/lib/src/sentry_attachment/io_sentry_attachment.dart index a1e2585556..ae07b51508 100644 --- a/dart/lib/src/sentry_attachment/io_sentry_attachment.dart +++ b/dart/lib/src/sentry_attachment/io_sentry_attachment.dart @@ -24,12 +24,10 @@ class IoSentryAttachment extends SentryAttachment { IoSentryAttachment.fromFile( File file, { String? filename, - String? attachmentType, - String? contentType, + super.attachmentType, + super.contentType, }) : super.fromLoader( loader: () => file.readAsBytes(), filename: filename ?? file.uri.pathSegments.last, - attachmentType: attachmentType, - contentType: contentType, ); } diff --git a/dart/lib/src/sentry_baggage.dart b/dart/lib/src/sentry_baggage.dart index 50547622d5..25aab900f4 100644 --- a/dart/lib/src/sentry_baggage.dart +++ b/dart/lib/src/sentry_baggage.dart @@ -1,4 +1,7 @@ -import 'protocol/sentry_level.dart'; +import 'package:meta/meta.dart'; +import 'scope.dart'; +import 'protocol.dart'; + import 'sentry_options.dart'; class SentryBaggage { @@ -87,6 +90,27 @@ class SentryBaggage { return SentryBaggage(keyValues, logger: logger); } + @internal + setValuesFromScope(Scope scope, SentryOptions options) { + final propagationContext = scope.propagationContext; + setTraceId(propagationContext.traceId.toString()); + if (options.dsn != null) { + setPublicKey(Dsn.parse(options.dsn!).publicKey); + } + if (options.release != null) { + setRelease(options.release!); + } + if (options.environment != null) { + setEnvironment(options.environment!); + } + if (scope.user?.id != null) { + setUserId(scope.user!.id!); + } + if (scope.user?.segment != null) { + setUserSegment(scope.user!.segment!); + } + } + static Map _extractKeyValuesFromBaggageString( String headerValue, { SentryLogger? logger, @@ -164,6 +188,10 @@ class SentryBaggage { set(_sampleRateKeyName, value); } + void setSampled(String value) { + set('sentry-sampled', value); + } + double? getSampleRate() { final sampleRate = get(_sampleRateKeyName); if (sampleRate == null) { diff --git a/dart/lib/src/sentry_client.dart b/dart/lib/src/sentry_client.dart index d354e4a449..d3121dfbce 100644 --- a/dart/lib/src/sentry_client.dart +++ b/dart/lib/src/sentry_client.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:math'; import 'package:meta/meta.dart'; +import 'sentry_baggage.dart'; import 'sentry_attachment/sentry_attachment.dart'; import 'event_processor.dart'; @@ -15,6 +16,7 @@ import 'sentry_options.dart'; import 'sentry_stack_trace_factory.dart'; import 'transport/http_transport.dart'; import 'transport/noop_transport.dart'; +import 'transport/spotlight_http_transport.dart'; import 'utils/isolate_utils.dart'; import 'version.dart'; import 'sentry_envelope.dart'; @@ -47,6 +49,9 @@ class SentryClient { final rateLimiter = RateLimiter(options); options.transport = HttpTransport(options, rateLimiter); } + if (options.spotlight.enabled) { + options.transport = SpotlightHttpTransport(options, options.transport); + } return SentryClient._(options); } @@ -119,11 +124,24 @@ class SentryClient { attachments.add(viewHierarchy); } + var traceContext = scope?.span?.traceContext(); + if (traceContext == null) { + if (scope?.propagationContext.baggage == null) { + scope?.propagationContext.baggage = + SentryBaggage({}, logger: _options.logger); + scope?.propagationContext.baggage?.setValuesFromScope(scope, _options); + } + if (scope != null) { + traceContext = SentryTraceContextHeader.fromBaggage( + scope.propagationContext.baggage!); + } + } + final envelope = SentryEnvelope.fromEvent( preparedEvent, _options.sdk, dsn: _options.dsn, - traceContext: scope?.span?.traceContext(), + traceContext: traceContext, attachments: attachments.isNotEmpty ? attachments : null, ); @@ -322,6 +340,11 @@ class SentryClient { traceContext: traceContext, attachments: attachments, ); + + final profileInfo = preparedTransaction.tracer.profileInfo; + if (profileInfo != null) { + envelope.items.add(profileInfo.asEnvelopeItem()); + } final id = await captureEnvelope(envelope); return id ?? SentryId.empty(); @@ -378,7 +401,7 @@ class SentryClient { exception: exception, stackTrace: stackTrace, ); - if (_options.devMode) { + if (_options.automatedTestMode) { rethrow; } } @@ -415,7 +438,7 @@ class SentryClient { exception: exception, stackTrace: stackTrace, ); - if (_options.devMode) { + if (_options.automatedTestMode) { rethrow; } } diff --git a/dart/lib/src/sentry_envelope_item.dart b/dart/lib/src/sentry_envelope_item.dart index f88f808600..5e38a7123d 100644 --- a/dart/lib/src/sentry_envelope_item.dart +++ b/dart/lib/src/sentry_envelope_item.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:convert'; + import 'client_reports/client_report.dart'; import 'protocol.dart'; import 'utils.dart'; @@ -97,6 +98,7 @@ class SentryEnvelopeItem { final newLine = utf8.encode('\n'); final data = await dataFactory(); + // TODO the data copy could be avoided - this would be most significant with attachments. return [...itemHeader, ...newLine, ...data]; } catch (e) { return []; diff --git a/dart/lib/src/sentry_isolate.dart b/dart/lib/src/sentry_isolate.dart index 8a6b71d48f..9998544d5b 100644 --- a/dart/lib/src/sentry_isolate.dart +++ b/dart/lib/src/sentry_isolate.dart @@ -75,7 +75,9 @@ class SentryIsolate { final event = SentryEvent( throwable: throwableMechanism, - level: SentryLevel.fatal, + level: hub.options.markAutomaticallyCollectedErrorsAsFatal + ? SentryLevel.fatal + : SentryLevel.error, timestamp: hub.options.clock(), ); diff --git a/dart/lib/src/sentry_item_type.dart b/dart/lib/src/sentry_item_type.dart index c74b6b6049..6215cbb78f 100644 --- a/dart/lib/src/sentry_item_type.dart +++ b/dart/lib/src/sentry_item_type.dart @@ -4,5 +4,6 @@ class SentryItemType { static const String attachment = 'attachment'; static const String transaction = 'transaction'; static const String clientReport = 'client_report'; + static const String profile = 'profile'; static const String unknown = '__unknown__'; } diff --git a/dart/lib/src/sentry_options.dart b/dart/lib/src/sentry_options.dart index 37f7dc01e9..6fe367e732 100644 --- a/dart/lib/src/sentry_options.dart +++ b/dart/lib/src/sentry_options.dart @@ -289,6 +289,17 @@ class SentryOptions { /// to be sent to Sentry. TracesSamplerCallback? tracesSampler; + double? _profilesSampleRate; + + @internal // Only exposed by SentryFlutterOptions at the moment. + double? get profilesSampleRate => _profilesSampleRate; + + @internal // Only exposed by SentryFlutterOptions at the moment. + set profilesSampleRate(double? value) { + assert(value == null || (value >= 0 && value <= 1)); + _profilesSampleRate = value; + } + /// Send statistics to sentry when the client drops events. bool sendClientReports = true; @@ -353,10 +364,22 @@ class SentryOptions { /// are set. bool? enableTracing; - /// Changed SDK behaviour when set to true: + /// Only for internal use. Changed SDK behaviour when set to true: /// - Rethrow exceptions that occur in user provided closures @internal - bool devMode = false; + bool automatedTestMode = false; + + /// Errors that the SDK automatically collects, for example in + /// [SentryIsolate], have `level` [SentryLevel.fatal] set per default. + /// Settings this to `false` will set the `level` to [SentryLevel.error]. + bool markAutomaticallyCollectedErrorsAsFatal = true; + + /// The Spotlight configuration. + /// Disabled by default. + /// ```dart + /// spotlight = Spotlight(enabled: true) + /// ``` + Spotlight spotlight = Spotlight(enabled: false); SentryOptions({this.dsn, PlatformChecker? checker}) { if (checker != null) { diff --git a/dart/lib/src/sentry_trace_context_header.dart b/dart/lib/src/sentry_trace_context_header.dart index 181752b359..bcb1d0b1bb 100644 --- a/dart/lib/src/sentry_trace_context_header.dart +++ b/dart/lib/src/sentry_trace_context_header.dart @@ -12,6 +12,7 @@ class SentryTraceContextHeader { this.userSegment, this.transaction, this.sampleRate, + this.sampled, }); final SentryId traceId; @@ -22,6 +23,7 @@ class SentryTraceContextHeader { final String? userSegment; final String? transaction; final String? sampleRate; + final String? sampled; /// Deserializes a [SentryTraceContextHeader] from JSON [Map]. factory SentryTraceContextHeader.fromJson(Map json) { @@ -34,6 +36,7 @@ class SentryTraceContextHeader { userSegment: json['user_segment'], transaction: json['transaction'], sampleRate: json['sample_rate'], + sampled: json['sampled'], ); } @@ -48,6 +51,7 @@ class SentryTraceContextHeader { if (userSegment != null) 'user_segment': userSegment, if (transaction != null) 'transaction': transaction, if (sampleRate != null) 'sample_rate': sampleRate, + if (sampled != null) 'sampled': sampled, }; } @@ -76,7 +80,18 @@ class SentryTraceContextHeader { if (sampleRate != null) { baggage.setSampleRate(sampleRate!); } - + if (sampled != null) { + baggage.setSampled(sampled!); + } return baggage; } + + factory SentryTraceContextHeader.fromBaggage(SentryBaggage baggage) { + return SentryTraceContextHeader( + SentryId.fromId(baggage.get('sentry-trace_id').toString()), + baggage.get('sentry-public_key').toString(), + release: baggage.get('sentry-release'), + environment: baggage.get('sentry-environment'), + ); + } } diff --git a/dart/lib/src/sentry_trace_origins.dart b/dart/lib/src/sentry_trace_origins.dart index e3fd4dbafc..5a7c49b339 100644 --- a/dart/lib/src/sentry_trace_origins.dart +++ b/dart/lib/src/sentry_trace_origins.dart @@ -18,4 +18,13 @@ class SentryTraceOrigins { 'auto.db.sqflite.database_executor'; static const autoDbSqfliteDatabaseFactory = 'auto.db.sqflite.database_factory'; + static const autoDbIsar = 'auto.db.isar'; + static const autoDbIsarCollection = 'auto.db.isar.collection'; + static const autoDbHive = 'auto.db.hive'; + static const autoDbHiveBoxBase = 'auto.db.hive.box_base'; + static const autoDbHiveLazyBox = 'auto.db.hive.lazy_box'; + static const autoDbHiveBoxCollection = 'auto.db.hive.box_collection'; + static const autoDbDriftQueryExecutor = 'auto.db.drift.query.executor'; + static const autoDbDriftTransactionExecutor = + 'auto.db.drift.transaction.executor'; } diff --git a/dart/lib/src/sentry_tracer.dart b/dart/lib/src/sentry_tracer.dart index 30a9eb27d3..ff9449fc42 100644 --- a/dart/lib/src/sentry_tracer.dart +++ b/dart/lib/src/sentry_tracer.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:meta/meta.dart'; import '../sentry.dart'; +import 'profiling.dart'; import 'sentry_tracer_finish_status.dart'; import 'utils/sample_rate_format.dart'; @@ -31,6 +32,13 @@ class SentryTracer extends ISentrySpan { SentryTraceContextHeader? _sentryTraceContextHeader; + // Profiler attached to this tracer. + late final SentryProfiler? profiler; + + // Resulting profile, after it has been collected. This is later used by + // SentryClient to attach as an envelope item when sending the transaction. + SentryProfileInfo? profileInfo; + /// If [waitForChildren] is true, this transaction will not finish until all /// its children are finished. /// @@ -52,6 +60,7 @@ class SentryTracer extends ISentrySpan { Duration? autoFinishAfter, bool trimEnd = false, OnTransactionFinish? onFinish, + this.profiler, }) { _rootSpan = SentrySpan( this, @@ -77,8 +86,13 @@ class SentryTracer extends ISentrySpan { final commonEndTimestamp = endTimestamp ?? _hub.options.clock(); _autoFinishAfterTimer?.cancel(); _finishStatus = SentryTracerFinishStatus.finishing(status); - if (!_rootSpan.finished && - (!_waitForChildren || _haveAllChildrenFinished())) { + if (_rootSpan.finished) { + return; + } + if (_waitForChildren && !_haveAllChildrenFinished()) { + return; + } + try { _rootSpan.status ??= status; // remove span where its endTimestamp is before startTimestamp @@ -122,10 +136,17 @@ class SentryTracer extends ISentrySpan { final transaction = SentryTransaction(this); transaction.measurements.addAll(_measurements); + + profileInfo = (status == null || status == SpanStatus.ok()) + ? await profiler?.finishFor(transaction) + : null; + await _hub.captureTransaction( transaction, traceContext: traceContext(), ); + } finally { + profiler?.dispose(); } } @@ -337,6 +358,7 @@ class SentryTracer extends ISentrySpan { transaction: _isHighQualityTransactionName(transactionNameSource) ? name : null, sampleRate: _sampleRateToString(_rootSpan.samplingDecision?.sampleRate), + sampled: _rootSpan.samplingDecision?.sampled.toString(), ); return _sentryTraceContextHeader; diff --git a/dart/lib/src/sentry_traces_sampler.dart b/dart/lib/src/sentry_traces_sampler.dart index 62d94dc339..b1668084c9 100644 --- a/dart/lib/src/sentry_traces_sampler.dart +++ b/dart/lib/src/sentry_traces_sampler.dart @@ -14,7 +14,12 @@ class SentryTracesSampler { SentryTracesSampler( this._options, { Random? random, - }) : _random = random ?? Random(); + }) : _random = random ?? Random() { + if (_options.tracesSampler != null && _options.tracesSampleRate != null) { + _options.logger(SentryLevel.warning, + 'Both tracesSampler and traceSampleRate are set. tracesSampler will take precedence and fallback to traceSampleRate if it returns null.'); + } + } SentryTracesSamplingDecision sample(SentrySamplingContext samplingContext) { final samplingDecision = @@ -40,7 +45,7 @@ class SentryTracesSampler { exception: exception, stackTrace: stackTrace, ); - if (_options.devMode) { + if (_options.automatedTestMode) { rethrow; } } @@ -67,5 +72,13 @@ class SentryTracesSampler { return SentryTracesSamplingDecision(false); } + bool sampleProfiling(SentryTracesSamplingDecision tracesSamplingDecision) { + double? optionsRate = _options.profilesSampleRate; + if (optionsRate == null || !tracesSamplingDecision.sampled) { + return false; + } + return _sample(optionsRate); + } + bool _sample(double result) => !(result < _random.nextDouble()); } diff --git a/dart/lib/src/sentry_transaction_context.dart b/dart/lib/src/sentry_transaction_context.dart index 66024459f5..32ab0324b7 100644 --- a/dart/lib/src/sentry_transaction_context.dart +++ b/dart/lib/src/sentry_transaction_context.dart @@ -15,21 +15,16 @@ class SentryTransactionContext extends SentrySpanContext { SentryTransactionContext( this.name, String operation, { - String? description, + super.description, this.parentSamplingDecision, - SentryId? traceId, - SpanId? spanId, - SpanId? parentSpanId, + super.traceId, + super.spanId, + super.parentSpanId, this.transactionNameSource, this.samplingDecision, - String? origin, + super.origin, }) : super( operation: operation, - description: description, - traceId: traceId, - spanId: spanId, - parentSpanId: parentSpanId, - origin: origin, ); factory SentryTransactionContext.fromSentryTrace( diff --git a/dart/lib/src/spotlight.dart b/dart/lib/src/spotlight.dart new file mode 100644 index 0000000000..b106ed3547 --- /dev/null +++ b/dart/lib/src/spotlight.dart @@ -0,0 +1,21 @@ +import 'platform_checker.dart'; + +/// Spotlight configuration class. +class Spotlight { + /// Whether to enable Spotlight for local development. + bool enabled; + + /// The Spotlight Sidecar URL. + /// Defaults to http://10.0.2.2:8969/stream due to Emulator on Android. + /// Otherwise defaults to http://localhost:8969/stream. + String url; + + Spotlight({required this.enabled, String? url}) + : url = url ?? _defaultSpotlightUrl(); +} + +String _defaultSpotlightUrl() { + return (PlatformChecker().platform.isAndroid + ? 'http://10.0.2.2:8969/stream' + : 'http://localhost:8969/stream'); +} diff --git a/dart/lib/src/transport/http_transport.dart b/dart/lib/src/transport/http_transport.dart index acf0e6cf64..90dd8949ce 100644 --- a/dart/lib/src/transport/http_transport.dart +++ b/dart/lib/src/transport/http_transport.dart @@ -2,11 +2,9 @@ import 'dart:async'; import 'dart:convert'; import 'package:http/http.dart'; +import '../utils/transport_utils.dart'; +import 'http_transport_request_handler.dart'; -import '../client_reports/client_report_recorder.dart'; -import '../client_reports/discard_reason.dart'; -import 'data_category.dart'; -import 'noop_encode.dart' if (dart.library.io) 'encode.dart'; import '../noop_client.dart'; import '../protocol.dart'; import '../sentry_options.dart'; @@ -18,15 +16,9 @@ import 'rate_limiter.dart'; class HttpTransport implements Transport { final SentryOptions _options; - final Dsn _dsn; - final RateLimiter _rateLimiter; - final ClientReportRecorder _recorder; - - late _CredentialBuilder _credentialBuilder; - - final Map _headers; + final HttpTransportRequestHandler _requestHandler; factory HttpTransport(SentryOptions options, RateLimiter rateLimiter) { if (options.httpClient is NoOpClient) { @@ -37,17 +29,8 @@ class HttpTransport implements Transport { } HttpTransport._(this._options, this._rateLimiter) - : _dsn = Dsn.parse(_options.dsn!), - _recorder = _options.recorder, - _headers = _buildHeaders( - _options.platformChecker.isWeb, - _options.sentryClientName, - ) { - _credentialBuilder = _CredentialBuilder( - _dsn, - _options.sentryClientName, - ); - } + : _requestHandler = HttpTransportRequestHandler( + _options, Dsn.parse(_options.dsn!).postUri); @override Future send(SentryEnvelope envelope) async { @@ -57,63 +40,31 @@ class HttpTransport implements Transport { } filteredEnvelope.header.sentAt = _options.clock(); - final streamedRequest = await _createStreamedRequest(filteredEnvelope); + final streamedRequest = + await _requestHandler.createRequest(filteredEnvelope); + final response = await _options.httpClient .send(streamedRequest) .then(Response.fromStream); _updateRetryAfterLimits(response); - if (response.statusCode != 200) { - // body guard to not log the error as it has performance impact to allocate - // the body String. - if (_options.debug) { - _options.logger( - SentryLevel.error, - 'API returned an error, statusCode = ${response.statusCode}, ' - 'body = ${response.body}', - ); - } - - if (response.statusCode >= 400 && response.statusCode != 429) { - _recorder.recordLostEvent( - DiscardReason.networkError, DataCategory.error); - } - - return SentryId.empty(); - } else { - _options.logger( - SentryLevel.debug, - 'Envelope ${envelope.header.eventId ?? "--"} was sent successfully.', - ); - } + TransportUtils.logResponse(_options, envelope, response, target: 'Sentry'); - final eventId = json.decode(response.body)['id']; - if (eventId == null) { - return null; + if (response.statusCode == 200) { + return _parseEventId(response); } - return SentryId.fromId(eventId); + return SentryId.empty(); } - Future _createStreamedRequest( - SentryEnvelope envelope) async { - final streamedRequest = StreamedRequest('POST', _dsn.postUri); - - if (_options.compressPayload) { - final compressionSink = compressInSink(streamedRequest.sink, _headers); - envelope - .envelopeStream(_options) - .listen(compressionSink.add) - .onDone(compressionSink.close); - } else { - envelope - .envelopeStream(_options) - .listen(streamedRequest.sink.add) - .onDone(streamedRequest.sink.close); + SentryId? _parseEventId(Response response) { + try { + final eventId = json.decode(response.body)['id']; + return eventId != null ? SentryId.fromId(eventId) : null; + } catch (e) { + _options.logger(SentryLevel.error, 'Error parsing response: $e'); + return null; } - streamedRequest.headers.addAll(_credentialBuilder.configure(_headers)); - - return streamedRequest; } void _updateRetryAfterLimits(Response response) { @@ -131,51 +82,3 @@ class HttpTransport implements Transport { sentryRateLimitHeader, retryAfterHeader, response.statusCode); } } - -class _CredentialBuilder { - final String _authHeader; - - _CredentialBuilder._(String authHeader) : _authHeader = authHeader; - - factory _CredentialBuilder(Dsn dsn, String sdkIdentifier) { - final authHeader = _buildAuthHeader( - publicKey: dsn.publicKey, - secretKey: dsn.secretKey, - sdkIdentifier: sdkIdentifier, - ); - - return _CredentialBuilder._(authHeader); - } - - static String _buildAuthHeader({ - required String publicKey, - String? secretKey, - required String sdkIdentifier, - }) { - var header = 'Sentry sentry_version=7, sentry_client=$sdkIdentifier, ' - 'sentry_key=$publicKey'; - - if (secretKey != null) { - header += ', sentry_secret=$secretKey'; - } - - return header; - } - - Map configure(Map headers) { - return headers - ..addAll( - {'X-Sentry-Auth': _authHeader}, - ); - } -} - -Map _buildHeaders(bool isWeb, String sdkIdentifier) { - final headers = {'Content-Type': 'application/x-sentry-envelope'}; - // NOTE(lejard_h) overriding user agent on VM and Flutter not sure why - // for web it use browser user agent - if (!isWeb) { - headers['User-Agent'] = sdkIdentifier; - } - return headers; -} diff --git a/dart/lib/src/transport/http_transport_request_handler.dart b/dart/lib/src/transport/http_transport_request_handler.dart new file mode 100644 index 0000000000..4aa50898c5 --- /dev/null +++ b/dart/lib/src/transport/http_transport_request_handler.dart @@ -0,0 +1,98 @@ +import 'dart:async'; + +import 'package:http/http.dart'; +import 'package:meta/meta.dart'; + +import 'noop_encode.dart' if (dart.library.io) 'encode.dart'; +import '../protocol.dart'; +import '../sentry_options.dart'; +import '../sentry_envelope.dart'; + +@internal +class HttpTransportRequestHandler { + final SentryOptions _options; + final Dsn _dsn; + final Map _headers; + final Uri _requestUri; + late _CredentialBuilder _credentialBuilder; + + HttpTransportRequestHandler(this._options, this._requestUri) + : _dsn = Dsn.parse(_options.dsn!), + _headers = _buildHeaders( + _options.platformChecker.isWeb, + _options.sentryClientName, + ) { + _credentialBuilder = _CredentialBuilder( + _dsn, + _options.sentryClientName, + ); + } + + Future createRequest(SentryEnvelope envelope) async { + final streamedRequest = StreamedRequest('POST', _requestUri); + + if (_options.compressPayload) { + final compressionSink = compressInSink(streamedRequest.sink, _headers); + envelope + .envelopeStream(_options) + .listen(compressionSink.add) + .onDone(compressionSink.close); + } else { + envelope + .envelopeStream(_options) + .listen(streamedRequest.sink.add) + .onDone(streamedRequest.sink.close); + } + + streamedRequest.headers.addAll(_credentialBuilder.configure(_headers)); + return streamedRequest; + } +} + +Map _buildHeaders(bool isWeb, String sdkIdentifier) { + final headers = {'Content-Type': 'application/x-sentry-envelope'}; + // NOTE(lejard_h) overriding user agent on VM and Flutter not sure why + // for web it use browser user agent + if (!isWeb) { + headers['User-Agent'] = sdkIdentifier; + } + return headers; +} + +class _CredentialBuilder { + final String _authHeader; + + _CredentialBuilder._(String authHeader) : _authHeader = authHeader; + + factory _CredentialBuilder(Dsn dsn, String sdkIdentifier) { + final authHeader = _buildAuthHeader( + publicKey: dsn.publicKey, + secretKey: dsn.secretKey, + sdkIdentifier: sdkIdentifier, + ); + + return _CredentialBuilder._(authHeader); + } + + static String _buildAuthHeader({ + required String publicKey, + String? secretKey, + required String sdkIdentifier, + }) { + var header = 'Sentry sentry_version=7, sentry_client=$sdkIdentifier, ' + 'sentry_key=$publicKey'; + + if (secretKey != null) { + header += ', sentry_secret=$secretKey'; + } + + return header; + } + + Map configure(Map headers) { + return headers + ..addAll( + {'X-Sentry-Auth': _authHeader}, + ); + } +} diff --git a/dart/lib/src/transport/spotlight_http_transport.dart b/dart/lib/src/transport/spotlight_http_transport.dart new file mode 100644 index 0000000000..f51e77d478 --- /dev/null +++ b/dart/lib/src/transport/spotlight_http_transport.dart @@ -0,0 +1,52 @@ +import 'package:http/http.dart'; +import '../utils/transport_utils.dart'; +import 'http_transport_request_handler.dart'; + +import '../../sentry.dart'; +import '../noop_client.dart'; + +/// Spotlight HTTP transport decorator that sends Sentry envelopes to both Sentry and Spotlight. +class SpotlightHttpTransport extends Transport { + final SentryOptions _options; + final Transport _transport; + final HttpTransportRequestHandler _requestHandler; + + factory SpotlightHttpTransport(SentryOptions options, Transport transport) { + if (options.httpClient is NoOpClient) { + options.httpClient = Client(); + } + return SpotlightHttpTransport._(options, transport); + } + + SpotlightHttpTransport._(this._options, this._transport) + : _requestHandler = HttpTransportRequestHandler( + _options, Uri.parse(_options.spotlight.url)); + + @override + Future send(SentryEnvelope envelope) async { + try { + await _sendToSpotlight(envelope); + } catch (e) { + _options.logger( + SentryLevel.warning, 'Failed to send envelope to Spotlight: $e'); + } + return _transport.send(envelope); + } + + Future _sendToSpotlight(SentryEnvelope envelope) async { + envelope.header.sentAt = _options.clock(); + + // Screenshots do not work currently https://github.com/getsentry/spotlight/issues/274 + envelope.items + .removeWhere((element) => element.header.contentType == 'image/png'); + + final spotlightRequest = await _requestHandler.createRequest(envelope); + + final response = await _options.httpClient + .send(spotlightRequest) + .then(Response.fromStream); + + TransportUtils.logResponse(_options, envelope, response, + target: 'Spotlight'); + } +} diff --git a/dart/lib/src/utils/sample_rate_format.dart b/dart/lib/src/utils/sample_rate_format.dart index 4abb79edd8..e69163f30b 100644 --- a/dart/lib/src/utils/sample_rate_format.dart +++ b/dart/lib/src/utils/sample_rate_format.dart @@ -1,3 +1,4 @@ +// ignore: dangling_library_doc_comments /// Code ported & adapted from `intl` package /// https://pub.dev/packages/intl /// diff --git a/dart/lib/src/utils/tracing_utils.dart b/dart/lib/src/utils/tracing_utils.dart index a60497509f..6198062ddc 100644 --- a/dart/lib/src/utils/tracing_utils.dart +++ b/dart/lib/src/utils/tracing_utils.dart @@ -1,42 +1,55 @@ import '../../sentry.dart'; -void addSentryTraceHeader(ISentrySpan span, Map headers) { +void addSentryTraceHeaderFromSpan( + ISentrySpan span, Map headers) { final traceHeader = span.toSentryTrace(); headers[traceHeader.name] = traceHeader.value; } -void addBaggageHeader( +void addSentryTraceHeader( + SentryTraceHeader traceHeader, Map headers) { + headers[traceHeader.name] = traceHeader.value; +} + +void addBaggageHeaderFromSpan( ISentrySpan span, Map headers, { SentryLogger? logger, }) { final baggage = span.toBaggageHeader(); if (baggage != null) { - final currentValue = headers[baggage.name] as String? ?? ''; + addBaggageHeader(baggage, headers, logger: logger); + } +} - final currentBaggage = SentryBaggage.fromHeader( - currentValue, - logger: logger, - ); - final sentryBaggage = SentryBaggage.fromHeader( - baggage.value, - logger: logger, - ); +void addBaggageHeader( + SentryBaggageHeader baggage, + Map headers, { + SentryLogger? logger, +}) { + final currentValue = headers[baggage.name] as String? ?? ''; - // overwrite sentry's keys https://develop.sentry.dev/sdk/performance/dynamic-sampling-context/#baggage - final filteredBaggageHeader = Map.from(currentBaggage.keyValues); - filteredBaggageHeader - .removeWhere((key, value) => key.startsWith('sentry-')); + final currentBaggage = SentryBaggage.fromHeader( + currentValue, + logger: logger, + ); + final sentryBaggage = SentryBaggage.fromHeader( + baggage.value, + logger: logger, + ); - final mergedBaggage = { - ...filteredBaggageHeader, - ...sentryBaggage.keyValues, - }; + // overwrite sentry's keys https://develop.sentry.dev/sdk/performance/dynamic-sampling-context/#baggage + final filteredBaggageHeader = Map.from(currentBaggage.keyValues); + filteredBaggageHeader.removeWhere((key, value) => key.startsWith('sentry-')); - final newBaggage = SentryBaggage(mergedBaggage, logger: logger); + final mergedBaggage = { + ...filteredBaggageHeader, + ...sentryBaggage.keyValues, + }; - headers[baggage.name] = newBaggage.toHeaderString(); - } + final newBaggage = SentryBaggage(mergedBaggage, logger: logger); + + headers[baggage.name] = newBaggage.toHeaderString(); } bool containsTargetOrMatchesRegExp( diff --git a/dart/lib/src/utils/transport_utils.dart b/dart/lib/src/utils/transport_utils.dart new file mode 100644 index 0000000000..388db8e8d5 --- /dev/null +++ b/dart/lib/src/utils/transport_utils.dart @@ -0,0 +1,30 @@ +import 'package:http/http.dart'; + +import '../../sentry_io.dart'; +import '../client_reports/discard_reason.dart'; +import '../transport/data_category.dart'; + +class TransportUtils { + static void logResponse( + SentryOptions options, SentryEnvelope envelope, Response response, + {required String target}) { + if (response.statusCode != 200) { + if (options.debug) { + options.logger( + SentryLevel.error, + 'Error, statusCode = ${response.statusCode}, body = ${response.body}', + ); + } + + if (response.statusCode >= 400 && response.statusCode != 429) { + options.recorder + .recordLostEvent(DiscardReason.networkError, DataCategory.error); + } + } else { + options.logger( + SentryLevel.debug, + 'Envelope ${envelope.header.eventId ?? "--"} was sent successfully to $target.', + ); + } + } +} diff --git a/dart/lib/src/version.dart b/dart/lib/src/version.dart index 6e9ff2059d..c29bdd09cb 100644 --- a/dart/lib/src/version.dart +++ b/dart/lib/src/version.dart @@ -9,7 +9,7 @@ library version; /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '7.9.0'; +const String sdkVersion = '7.16.0'; String sdkName(bool isWeb) => isWeb ? _browserSdkName : _ioSdkName; diff --git a/dart/pubspec.yaml b/dart/pubspec.yaml index 330d6084e7..1cc9bf8c75 100644 --- a/dart/pubspec.yaml +++ b/dart/pubspec.yaml @@ -1,5 +1,5 @@ name: sentry -version: 7.9.0 +version: 7.16.0 description: > A crash reporting library for Dart that sends crash reports to Sentry.io. This library supports Dart VM and Web. For Flutter consider sentry_flutter instead. @@ -15,11 +15,12 @@ dependencies: http: '>=0.13.0 <2.0.0' meta: ^1.3.0 stack_trace: ^1.10.0 - uuid: ^3.0.0 + uuid: '>=3.0.0 <5.0.0' dev_dependencies: + build_runner: ^2.4.2 mockito: ^5.1.0 - lints: ^2.0.0 + lints: ^3.0.0 test: ^1.21.1 yaml: ^3.1.0 # needed for version match (code and pubspec) collection: ^1.16.0 diff --git a/dart/test/diagnostic_logger_test.dart b/dart/test/diagnostic_logger_test.dart new file mode 100644 index 0000000000..ec53421e33 --- /dev/null +++ b/dart/test/diagnostic_logger_test.dart @@ -0,0 +1,64 @@ +import 'package:sentry/sentry.dart'; +import 'package:sentry/src/diagnostic_logger.dart'; +import 'package:test/test.dart'; + +void main() { + late Fixture fixture; + + setUp(() { + fixture = Fixture(); + }); + + test('$DiagnosticLogger do not log if debug is disabled', () { + fixture.options.debug = false; + + fixture.getSut().log(SentryLevel.error, 'foobar'); + + expect(fixture.loggedMessage, isNull); + }); + + test('$DiagnosticLogger log if debug is enabled', () { + fixture.options.debug = true; + + fixture.getSut().log(SentryLevel.error, 'foobar'); + + expect(fixture.loggedMessage, 'foobar'); + }); + + test('$DiagnosticLogger do not log if level is too low', () { + fixture.options.debug = true; + fixture.options.diagnosticLevel = SentryLevel.error; + + fixture.getSut().log(SentryLevel.warning, 'foobar'); + + expect(fixture.loggedMessage, isNull); + }); + + test('$DiagnosticLogger always log fatal', () { + fixture.options.debug = false; + + fixture.getSut().log(SentryLevel.fatal, 'foobar'); + + expect(fixture.loggedMessage, 'foobar'); + }); +} + +class Fixture { + var options = SentryOptions(); + + Object? loggedMessage; + + DiagnosticLogger getSut() { + return DiagnosticLogger(mockLogger, options); + } + + void mockLogger( + SentryLevel level, + String message, { + String? logger, + Object? exception, + StackTrace? stackTrace, + }) { + loggedMessage = message; + } +} diff --git a/dart/test/environment_test.dart b/dart/test/environment_test.dart index 6a409022c5..b16225d1dd 100644 --- a/dart/test/environment_test.dart +++ b/dart/test/environment_test.dart @@ -23,7 +23,7 @@ void main() { release: 'release-9.8.7', dist: 'bar', ); - options.devMode = true; + options.automatedTestMode = true; await Sentry.init( (options) => options, @@ -39,19 +39,19 @@ void main() { test('SentryOptions are overriden by environment', () async { final options = SentryOptions(); options.environmentVariables = MockEnvironmentVariables( - dsn: 'foo-bar', + dsn: fakeDsn, environment: 'staging', release: 'release-9.8.7', dist: 'bar', ); - options.devMode = true; + options.automatedTestMode = true; await Sentry.init( (options) => options, options: options, ); - expect(options.dsn, 'foo-bar'); + expect(options.dsn, fakeDsn); expect(options.environment, 'staging'); expect(options.release, 'release-9.8.7'); expect(options.dist, 'bar'); diff --git a/dart/test/event_processor/deduplication_event_processor_test.dart b/dart/test/event_processor/deduplication_event_processor_test.dart index 4ced85c113..3e17fe4065 100644 --- a/dart/test/event_processor/deduplication_event_processor_test.dart +++ b/dart/test/event_processor/deduplication_event_processor_test.dart @@ -77,7 +77,7 @@ void main() { final transport = MockTransport(); - final options = SentryOptions(dsn: fakeDsn)..devMode = true; + final options = SentryOptions(dsn: fakeDsn)..automatedTestMode = true; await Sentry.init( (options) { options.dsn = fakeDsn; diff --git a/dart/test/event_processor/enricher/io_enricher_test.dart b/dart/test/event_processor/enricher/io_enricher_test.dart index fcf37f958e..72080cba3f 100644 --- a/dart/test/event_processor/enricher/io_enricher_test.dart +++ b/dart/test/event_processor/enricher/io_enricher_test.dart @@ -159,7 +159,7 @@ void main() { }); test('$IoEnricherEventProcessor gets added on init', () async { - final options = SentryOptions(dsn: fakeDsn)..devMode = true; + final options = SentryOptions(dsn: fakeDsn)..automatedTestMode = true; late SentryOptions configuredOptions; await Sentry.init( (options) { diff --git a/dart/test/hint_test.dart b/dart/test/hint_test.dart index d46a022405..04c09a28a0 100644 --- a/dart/test/hint_test.dart +++ b/dart/test/hint_test.dart @@ -82,6 +82,23 @@ void main() { expect(sut.screenshot, attachment); expect(sut.viewHierarchy, attachment); }); + + test('Hint init with map null fallback', () { + final hint = Hint.withMap({'fixture-key': null}); + expect("null", hint.get("fixture-key")); + }); + + test('Hint addAll with map null fallback', () { + final hint = Hint(); + hint.addAll({'fixture-key': null}); + expect("null", hint.get("fixture-key")); + }); + + test('Hint set with null value fallback', () { + final hint = Hint(); + hint.set("fixture-key", null); + expect("null", hint.get("fixture-key")); + }); } class Fixture { diff --git a/dart/test/http_client/tracing_client_test.dart b/dart/test/http_client/tracing_client_test.dart index dce3b3ef31..cc48d5cb37 100644 --- a/dart/test/http_client/tracing_client_test.dart +++ b/dart/test/http_client/tracing_client_test.dart @@ -38,7 +38,7 @@ void main() { expect(span.status, SpanStatus.ok()); expect(span.context.operation, 'http.client'); expect(span.context.description, 'GET https://example.com'); - expect(span.data['http.method'], 'GET'); + expect(span.data['http.request.method'], 'GET'); expect(span.data['url'], 'https://example.com'); expect(span.data['http.query'], 'foo=bar'); expect(span.data['http.fragment'], 'baz'); @@ -141,20 +141,6 @@ void main() { expect(response.request!.headers[sentryTrace.name], sentryTrace.value); }); - test('captured span do not add headers if NoOp', () async { - final sut = fixture.getSut( - client: fixture.getClient(statusCode: 200, reason: 'OK'), - ); - - await fixture._hub - .configureScope((scope) => scope.span = NoOpSentrySpan()); - - final response = await sut.get(requestUri); - - expect(response.request!.headers['baggage'], null); - expect(response.request!.headers['sentry-trace'], null); - }); - test('captured span do not add headers if origins not set', () async { final sut = fixture.getSut( client: fixture.getClient( @@ -188,6 +174,38 @@ void main() { await sut.get(requestUri); }); + + test('set headers from propagationContext when tracing is disabled', + () async { + fixture._options.enableTracing = false; + final sut = fixture.getSut( + client: fixture.getClient(statusCode: 200, reason: 'OK'), + ); + + final propagationContext = fixture._hub.scope.propagationContext; + propagationContext.baggage = SentryBaggage({'foo': 'bar'}); + + final response = await sut.get(requestUri); + + expect(response.request!.headers['sentry-trace'], + propagationContext.toSentryTrace().value); + expect(response.request!.headers['baggage'], 'foo=bar'); + }); + + test('set headers from propagationContext when no transaction', () async { + final sut = fixture.getSut( + client: fixture.getClient(statusCode: 200, reason: 'OK'), + ); + + final propagationContext = fixture._hub.scope.propagationContext; + propagationContext.baggage = SentryBaggage({'foo': 'bar'}); + + final response = await sut.get(requestUri); + + expect(response.request!.headers['sentry-trace'], + propagationContext.toSentryTrace().value); + expect(response.request!.headers['baggage'], 'foo=bar'); + }); }); } diff --git a/dart/test/hub_test.dart b/dart/test/hub_test.dart index 32e0f1021c..31698329d6 100644 --- a/dart/test/hub_test.dart +++ b/dart/test/hub_test.dart @@ -1,4 +1,5 @@ import 'package:collection/collection.dart'; +import 'package:mockito/mockito.dart'; import 'package:sentry/sentry.dart'; import 'package:sentry/src/client_reports/discard_reason.dart'; import 'package:sentry/src/sentry_tracer.dart'; @@ -6,6 +7,7 @@ import 'package:sentry/src/transport/data_category.dart'; import 'package:test/test.dart'; import 'mocks.dart'; +import 'mocks.mocks.dart'; import 'mocks/mock_client_report_recorder.dart'; import 'mocks/mock_sentry_client.dart'; @@ -148,8 +150,8 @@ void main() { final capturedEvent = fixture.client.captureEventCalls.first; - expect(capturedEvent.event.transaction, isNull); - expect(capturedEvent.event.contexts.trace, isNull); + expect(capturedEvent.event.transaction, 'test'); + expect(capturedEvent.event.contexts.trace, isNotNull); }); }); @@ -374,6 +376,70 @@ void main() { expect( fixture.client.captureTransactionCalls.first.traceContext, context); }); + + test('profiler is not started by default', () async { + final hub = fixture.getSut(); + final tr = hub.startTransaction('name', 'op'); + expect(tr, isA()); + expect((tr as SentryTracer).profiler, isNull); + }); + + test('profiler is started according to the sampling rate', () async { + final hub = fixture.getSut(); + final factory = MockSentryProfilerFactory(); + when(factory.startProfiler(fixture._context)) + .thenReturn(MockSentryProfiler()); + hub.profilerFactory = factory; + + var tr = hub.startTransactionWithContext(fixture._context); + expect((tr as SentryTracer).profiler, isNull); + verifyZeroInteractions(factory); + + hub.options.profilesSampleRate = 1.0; + tr = hub.startTransactionWithContext(fixture._context); + expect((tr as SentryTracer).profiler, isNotNull); + verify(factory.startProfiler(fixture._context)).called(1); + }); + + test('profiler.finish() is called', () async { + final hub = fixture.getSut(); + final factory = MockSentryProfilerFactory(); + final profiler = MockSentryProfiler(); + final expected = MockSentryProfileInfo(); + when(factory.startProfiler(fixture._context)).thenReturn(profiler); + when(profiler.finishFor(any)).thenAnswer((_) async => expected); + + hub.profilerFactory = factory; + hub.options.profilesSampleRate = 1.0; + final tr = hub.startTransactionWithContext(fixture._context); + await tr.finish(); + verify(profiler.finishFor(any)).called(1); + verify(profiler.dispose()).called(1); + }); + + test('profiler.dispose() is called even if not captured', () async { + final hub = fixture.getSut(); + final factory = MockSentryProfilerFactory(); + final profiler = MockSentryProfiler(); + final expected = MockSentryProfileInfo(); + when(factory.startProfiler(fixture._context)).thenReturn(profiler); + when(profiler.finishFor(any)).thenAnswer((_) async => expected); + + hub.profilerFactory = factory; + hub.options.profilesSampleRate = 1.0; + final tr = hub.startTransactionWithContext(fixture._context); + await tr.finish(status: SpanStatus.aborted()); + verify(profiler.dispose()).called(1); + verifyNever(profiler.finishFor(any)); + }); + + test('returns scope', () async { + final hub = fixture.getSut(); + + final scope = hub.scope; + + expect(scope, isNotNull); + }); }); group('Hub scope', () { @@ -641,10 +707,12 @@ class Fixture { final hub = Hub(options); + // A fully configured context - won't trigger a copy in startTransaction(). _context = SentryTransactionContext( 'name', 'op', samplingDecision: SentryTracesSamplingDecision(sampled!), + origin: SentryTraceOrigins.manual, ); tracer = SentryTracer(_context, hub); diff --git a/dart/test/initialization_test.dart b/dart/test/initialization_test.dart index fae9f26e82..7eb8c15265 100644 --- a/dart/test/initialization_test.dart +++ b/dart/test/initialization_test.dart @@ -14,7 +14,7 @@ void main() { }); test('async re-initilization', () async { - final options = SentryOptions(dsn: fakeDsn)..devMode = true; + final options = SentryOptions(dsn: fakeDsn)..automatedTestMode = true; await Sentry.init( (options) { options.dsn = fakeDsn; @@ -35,7 +35,7 @@ void main() { // This is the failure from // https://github.com/getsentry/sentry-dart/issues/508 test('re-initilization', () async { - final options = SentryOptions(dsn: fakeDsn)..devMode = true; + final options = SentryOptions(dsn: fakeDsn)..automatedTestMode = true; await Sentry.init( (options) { options.dsn = fakeDsn; diff --git a/dart/test/mocks.dart b/dart/test/mocks.dart index 08058d3b32..82a6fe329d 100644 --- a/dart/test/mocks.dart +++ b/dart/test/mocks.dart @@ -1,4 +1,6 @@ +import 'package:mockito/annotations.dart'; import 'package:sentry/sentry.dart'; +import 'package:sentry/src/profiling.dart'; import 'package:sentry/src/transport/rate_limiter.dart'; final fakeDsn = 'https://abc@def.ingest.sentry.io/1234567'; @@ -149,3 +151,10 @@ class MockRateLimiter implements RateLimiter { this.errorCode = errorCode; } } + +@GenerateMocks([ + SentryProfilerFactory, + SentryProfiler, + SentryProfileInfo, +]) +void main() {} diff --git a/dart/test/mocks.mocks.dart b/dart/test/mocks.mocks.dart new file mode 100644 index 0000000000..5f2556400e --- /dev/null +++ b/dart/test/mocks.mocks.dart @@ -0,0 +1,101 @@ +// Mocks generated by Mockito 5.4.2 from annotations +// in sentry/test/mocks.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i4; + +import 'package:mockito/mockito.dart' as _i1; +import 'package:sentry/sentry.dart' as _i2; +import 'package:sentry/src/profiling.dart' as _i3; + +// 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 _FakeSentryEnvelopeItem_0 extends _i1.SmartFake + implements _i2.SentryEnvelopeItem { + _FakeSentryEnvelopeItem_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [SentryProfilerFactory]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockSentryProfilerFactory extends _i1.Mock + implements _i3.SentryProfilerFactory { + MockSentryProfilerFactory() { + _i1.throwOnMissingStub(this); + } + + @override + _i3.SentryProfiler? startProfiler(_i2.SentryTransactionContext? context) => + (super.noSuchMethod(Invocation.method( + #startProfiler, + [context], + )) as _i3.SentryProfiler?); +} + +/// A class which mocks [SentryProfiler]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockSentryProfiler extends _i1.Mock implements _i3.SentryProfiler { + MockSentryProfiler() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.Future<_i3.SentryProfileInfo?> finishFor( + _i2.SentryTransaction? transaction) => + (super.noSuchMethod( + Invocation.method( + #finishFor, + [transaction], + ), + returnValue: _i4.Future<_i3.SentryProfileInfo?>.value(), + ) as _i4.Future<_i3.SentryProfileInfo?>); + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [SentryProfileInfo]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockSentryProfileInfo extends _i1.Mock implements _i3.SentryProfileInfo { + MockSentryProfileInfo() { + _i1.throwOnMissingStub(this); + } + + @override + _i2.SentryEnvelopeItem asEnvelopeItem() => (super.noSuchMethod( + Invocation.method( + #asEnvelopeItem, + [], + ), + returnValue: _FakeSentryEnvelopeItem_0( + this, + Invocation.method( + #asEnvelopeItem, + [], + ), + ), + ) as _i2.SentryEnvelopeItem); +} diff --git a/dart/test/mocks/mock_hub.dart b/dart/test/mocks/mock_hub.dart index d8b4d7384b..351ad70672 100644 --- a/dart/test/mocks/mock_hub.dart +++ b/dart/test/mocks/mock_hub.dart @@ -131,6 +131,9 @@ class MockHub with NoSuchMethodProvider implements Hub { void setSpanContext(throwable, ISentrySpan span, String transaction) { spanContextCals++; } + + @override + Scope get scope => Scope(_options); } class CaptureEventCall { diff --git a/dart/test/protocol/sentry_app_test.dart b/dart/test/protocol/sentry_app_test.dart index 6c72e956d3..6fd4236efc 100644 --- a/dart/test/protocol/sentry_app_test.dart +++ b/dart/test/protocol/sentry_app_test.dart @@ -14,6 +14,7 @@ void main() { startTime: testStartTime, deviceAppHash: 'fixture-deviceAppHash', inForeground: true, + viewNames: ['fixture-viewName', 'fixture-viewName2'], ); final sentryAppJson = { @@ -25,25 +26,36 @@ void main() { 'app_start_time': testStartTime.toIso8601String(), 'device_app_hash': 'fixture-deviceAppHash', 'in_foreground': true, + 'view_names': ['fixture-viewName', 'fixture-viewName2'], }; group('json', () { test('toJson', () { final json = sentryApp.toJson(); - expect( - MapEquality().equals(sentryAppJson, json), - true, - ); + expect(json['app_name'], 'fixture-name'); + expect(json['app_version'], 'fixture-version'); + expect(json['app_identifier'], 'fixture-identifier'); + expect(json['app_build'], 'fixture-build'); + expect(json['build_type'], 'fixture-buildType'); + expect(json['app_start_time'], testStartTime.toIso8601String()); + expect(json['device_app_hash'], 'fixture-deviceAppHash'); + expect(json['in_foreground'], true); + expect(json['view_names'], ['fixture-viewName', 'fixture-viewName2']); }); test('fromJson', () { final sentryApp = SentryApp.fromJson(sentryAppJson); final json = sentryApp.toJson(); - expect( - MapEquality().equals(sentryAppJson, json), - true, - ); + expect(json['app_name'], 'fixture-name'); + expect(json['app_version'], 'fixture-version'); + expect(json['app_identifier'], 'fixture-identifier'); + expect(json['app_build'], 'fixture-build'); + expect(json['build_type'], 'fixture-buildType'); + expect(json['app_start_time'], testStartTime.toIso8601String()); + expect(json['device_app_hash'], 'fixture-deviceAppHash'); + expect(json['in_foreground'], true); + expect(json['view_names'], ['fixture-viewName', 'fixture-viewName2']); }); }); @@ -73,6 +85,7 @@ void main() { startTime: startTime, deviceAppHash: 'hash1', inForeground: true, + viewNames: ['screen1'], ); expect('name1', copy.name); @@ -83,6 +96,7 @@ void main() { expect(startTime, copy.startTime); expect('hash1', copy.deviceAppHash); expect(true, copy.inForeground); + expect(['screen1'], copy.viewNames); }); }); } diff --git a/dart/test/protocol/sentry_baggage_header_test.dart b/dart/test/protocol/sentry_baggage_header_test.dart index 4fdb6a13d4..38428be41a 100644 --- a/dart/test/protocol/sentry_baggage_header_test.dart +++ b/dart/test/protocol/sentry_baggage_header_test.dart @@ -20,11 +20,12 @@ void main() { baggage.setUserSegment('userSegment'); baggage.setTransaction('transaction'); baggage.setSampleRate('1.0'); + baggage.setSampled('false'); final baggageHeader = SentryBaggageHeader.fromBaggage(baggage); expect(baggageHeader.value, - 'sentry-trace_id=$id,sentry-public_key=publicKey,sentry-release=release,sentry-environment=environment,sentry-user_id=userId,sentry-user_segment=userSegment,sentry-transaction=transaction,sentry-sample_rate=1.0'); + 'sentry-trace_id=$id,sentry-public_key=publicKey,sentry-release=release,sentry-environment=environment,sentry-user_id=userId,sentry-user_segment=userSegment,sentry-transaction=transaction,sentry-sample_rate=1.0,sentry-sampled=false'); }); }); } diff --git a/dart/test/run_zoned_guarded_integration_test.dart b/dart/test/run_zoned_guarded_integration_test.dart index 7e8045445d..13b102d7da 100644 --- a/dart/test/run_zoned_guarded_integration_test.dart +++ b/dart/test/run_zoned_guarded_integration_test.dart @@ -54,6 +54,23 @@ void main() { expect(onErrorCalled, true); }); + + test('sets level to error instead of fatal', () async { + final exception = StateError('error'); + final stackTrace = StackTrace.current; + + final hub = Hub(fixture.options); + final client = MockSentryClient(); + hub.bindClient(client); + + final sut = fixture.getSut(runner: () async {}); + + fixture.options.markAutomaticallyCollectedErrorsAsFatal = false; + await sut.captureError(hub, fixture.options, exception, stackTrace); + + final capturedEvent = client.captureEventCalls.last.event; + expect(capturedEvent.level, SentryLevel.error); + }); }); } diff --git a/dart/test/scope_test.dart b/dart/test/scope_test.dart index d93b1cf112..66cc543b6b 100644 --- a/dart/test/scope_test.dart +++ b/dart/test/scope_test.dart @@ -395,6 +395,14 @@ void main() { expect(1, fixture.mockScopeObserver.numberOfRemoveTagCalls); }); + test('clone has disabled scope sync', () async { + final sut = fixture.getSut(scopeObserver: fixture.mockScopeObserver); + final clone = sut.clone(); + + await clone.setContexts("fixture-contexts-key", "fixture-contexts-value"); + expect(0, fixture.mockScopeObserver.numberOfSetContextsCalls); + }); + group('Scope apply', () { final scopeUser = SentryUser( id: '800', diff --git a/dart/test/sentry_client_test.dart b/dart/test/sentry_client_test.dart index 522bfcae73..121151f640 100644 --- a/dart/test/sentry_client_test.dart +++ b/dart/test/sentry_client_test.dart @@ -13,6 +13,7 @@ import 'package:sentry/src/sentry_stack_trace_factory.dart'; import 'package:sentry/src/sentry_tracer.dart'; import 'package:sentry/src/transport/data_category.dart'; import 'package:sentry/src/utils/iterable_utils.dart'; +import 'package:sentry/src/transport/spotlight_http_transport.dart'; import 'package:test/test.dart'; import 'mocks.dart'; @@ -543,6 +544,137 @@ void main() { fixture = Fixture(); }); + test( + 'when scope does not have an active transaction, trace state is set on the envelope from scope', + () async { + final client = fixture.getSut(); + final scope = Scope(fixture.options); + await client.captureEvent(SentryEvent(), scope: scope); + + final capturedEnvelope = (fixture.transport).envelopes.first; + final capturedTraceContext = capturedEnvelope.header.traceContext; + final capturedTraceId = capturedTraceContext?.traceId; + final propagationContextTraceId = scope.propagationContext.traceId; + + expect(capturedTraceContext, isNotNull); + expect(capturedTraceId, propagationContextTraceId); + }); + + test('attaches trace context from span if none present yet', () async { + final client = fixture.getSut(); + final spanContext = SentrySpanContext( + traceId: SentryId.newId(), + spanId: SpanId.newId(), + operation: 'op.load', + ); + final scope = Scope(fixture.options); + scope.span = SentrySpan(fixture.tracer, spanContext, MockHub()); + + final sentryEvent = SentryEvent(); + await client.captureEvent(sentryEvent, scope: scope); + + expect(fixture.transport.envelopes.length, 1); + expect(spanContext.spanId, sentryEvent.contexts.trace!.spanId); + expect(spanContext.traceId, sentryEvent.contexts.trace!.traceId); + }); + + test( + 'attaches trace context from scope if none present yet and no span on scope', + () async { + final client = fixture.getSut(); + + final scope = Scope(fixture.options); + final scopePropagationContext = scope.propagationContext; + + final sentryEvent = SentryEvent(); + await client.captureEvent(sentryEvent, scope: scope); + + expect(fixture.transport.envelopes.length, 1); + expect( + scopePropagationContext.traceId, sentryEvent.contexts.trace!.traceId); + expect( + scopePropagationContext.spanId, sentryEvent.contexts.trace!.spanId); + }); + + test('keeps existing trace context if already present', () async { + final client = fixture.getSut(); + + final spanContext = SentrySpanContext( + traceId: SentryId.newId(), + spanId: SpanId.newId(), + operation: 'op.load', + ); + final scope = Scope(fixture.options); + scope.span = SentrySpan(fixture.tracer, spanContext, MockHub()); + + final propagationContext = scope.propagationContext; + final preExistingSpanContext = SentryTraceContext( + traceId: SentryId.newId(), + spanId: SpanId.newId(), + operation: 'op.load'); + + final sentryEvent = SentryEvent(); + sentryEvent.contexts.trace = preExistingSpanContext; + await client.captureEvent(sentryEvent, scope: scope); + + expect(fixture.transport.envelopes.length, 1); + expect( + preExistingSpanContext.traceId, sentryEvent.contexts.trace!.traceId); + expect(preExistingSpanContext.spanId, sentryEvent.contexts.trace!.spanId); + expect(spanContext.traceId, isNot(sentryEvent.contexts.trace!.traceId)); + expect(spanContext.spanId, isNot(sentryEvent.contexts.trace!.spanId)); + expect(propagationContext.traceId, + isNot(sentryEvent.contexts.trace!.traceId)); + expect( + propagationContext.spanId, isNot(sentryEvent.contexts.trace!.spanId)); + }); + + test( + 'uses propagation context on scope for trace header if no transaction is on scope', + () async { + final client = fixture.getSut(); + + final scope = Scope(fixture.options); + final scopePropagationContext = scope.propagationContext; + + final sentryEvent = SentryEvent(); + await client.captureEvent(sentryEvent, scope: scope); + + final capturedEnvelope = fixture.transport.envelopes.first; + final capturedTraceContext = capturedEnvelope.header.traceContext; + + expect(fixture.transport.envelopes.length, 1); + expect(scope.span, isNull); + expect(capturedTraceContext, isNotNull); + expect(scopePropagationContext.traceId, capturedTraceContext!.traceId); + }); + + test( + 'uses trace context on transaction for trace header if a transaction is on scope', + () async { + final client = fixture.getSut(); + + final spanContext = SentrySpanContext( + traceId: SentryId.newId(), + spanId: SpanId.newId(), + operation: 'op.load', + ); + final scope = Scope(fixture.options); + scope.span = SentrySpan(fixture.tracer, spanContext, MockHub()); + + final sentryEvent = SentryEvent(); + await client.captureEvent(sentryEvent, scope: scope); + + final capturedEnvelope = fixture.transport.envelopes.first; + final capturedTraceContext = capturedEnvelope.header.traceContext; + + expect(fixture.transport.envelopes.length, 1); + expect(scope.span, isNotNull); + expect(capturedTraceContext, isNotNull); + expect( + scope.span!.traceContext()!.traceId, capturedTraceContext!.traceId); + }); + test('should contain a transaction in the envelope', () async { try { throw StateError('Error'); @@ -847,8 +979,7 @@ void main() { expect(capturedEvent.user?.ipAddress, '{{auto}}'); }); - test('event has a user with IP address', - () async { + test('event has a user with IP address', () async { final client = fixture.getSut(sendDefaultPii: true); await client.captureEvent(fakeEvent); @@ -864,8 +995,7 @@ void main() { expect(capturedEvent.user?.email, fakeEvent.user!.email); }); - test('event has a user without IP address', - () async { + test('event has a user without IP address', () async { final client = fixture.getSut(sendDefaultPii: true); final event = fakeEvent.copyWith(user: fakeUser); @@ -1372,6 +1502,14 @@ void main() { expect(capturedEnvelope.header.dsn, fixture.options.dsn); }); + + test('Spotlight enabled should set transport to SpotlightHttpTransport', + () async { + fixture.options.spotlight = Spotlight(enabled: true); + fixture.getSut(); + + expect(fixture.options.transport is SpotlightHttpTransport, true); + }); }); } diff --git a/dart/test/sentry_isolate_test.dart b/dart/test/sentry_isolate_test.dart index 1b1939ac2f..7cebc3e5e4 100644 --- a/dart/test/sentry_isolate_test.dart +++ b/dart/test/sentry_isolate_test.dart @@ -1,6 +1,7 @@ @TestOn('vm') import 'package:sentry/src/hub.dart'; +import 'package:sentry/src/protocol/sentry_level.dart'; import 'package:sentry/src/protocol/span_status.dart'; import 'package:sentry/src/sentry_isolate.dart'; import 'package:sentry/src/sentry_options.dart'; @@ -48,6 +49,23 @@ void main() { await span?.finish(); }); + + test('sets level to error instead of fatal', () async { + final exception = StateError('error'); + final stackTrace = StackTrace.current.toString(); + + final hub = Hub(fixture.options); + final client = MockSentryClient(); + hub.bindClient(client); + + fixture.options.markAutomaticallyCollectedErrorsAsFatal = false; + + await SentryIsolate.handleIsolateError( + hub, [exception.toString(), stackTrace]); + + final capturedEvent = client.captureEventCalls.last.event; + expect(capturedEvent.level, SentryLevel.error); + }); }); } diff --git a/dart/test/sentry_options_test.dart b/dart/test/sentry_options_test.dart index f6dec29e90..e921c87b32 100644 --- a/dart/test/sentry_options_test.dart +++ b/dart/test/sentry_options_test.dart @@ -127,4 +127,10 @@ void main() { expect(options.isTracingEnabled(), false); }); + + test('Spotlight is disabled by default', () { + final options = SentryOptions(dsn: fakeDsn); + + expect(options.spotlight.enabled, false); + }); } diff --git a/dart/test/sentry_test.dart b/dart/test/sentry_test.dart index 2705f23161..b041f19527 100644 --- a/dart/test/sentry_test.dart +++ b/dart/test/sentry_test.dart @@ -18,7 +18,7 @@ void main() { var anException = Exception(); setUp(() async { - final options = SentryOptions(dsn: fakeDsn)..devMode = true; + final options = SentryOptions(dsn: fakeDsn)..automatedTestMode = true; await Sentry.init( options: options, (options) => { @@ -137,7 +137,7 @@ void main() { }); test('null DSN', () async { - final options = SentryOptions(dsn: fakeDsn)..devMode = true; + final options = SentryOptions(dsn: fakeDsn)..automatedTestMode = true; expect( () async => await Sentry.init( options: options, @@ -150,7 +150,7 @@ void main() { test('appRunner should be optional', () async { expect(Sentry.isEnabled, false); - final options = SentryOptions(dsn: fakeDsn)..devMode = true; + final options = SentryOptions(dsn: fakeDsn)..automatedTestMode = true; await Sentry.init( options: options, (options) => options.dsn = fakeDsn, @@ -159,7 +159,7 @@ void main() { }); test('empty DSN', () async { - final options = SentryOptions(dsn: fakeDsn)..devMode = true; + final options = SentryOptions(dsn: fakeDsn)..automatedTestMode = true; await Sentry.init( options: options, (options) => options.dsn = '', @@ -170,7 +170,7 @@ void main() { test('empty DSN disables the SDK but runs the integrations', () async { final integration = MockIntegration(); - final options = SentryOptions(dsn: fakeDsn)..devMode = true; + final options = SentryOptions(dsn: fakeDsn)..automatedTestMode = true; await Sentry.init( options: options, (options) { @@ -183,7 +183,7 @@ void main() { }); test('close disables the SDK', () async { - final options = SentryOptions(dsn: fakeDsn)..devMode = true; + final options = SentryOptions(dsn: fakeDsn)..automatedTestMode = true; await Sentry.init( options: options, (options) => options.dsn = fakeDsn, @@ -207,7 +207,7 @@ void main() { test('should install integrations', () async { final integration = MockIntegration(); - final options = SentryOptions(dsn: fakeDsn)..devMode = true; + final options = SentryOptions(dsn: fakeDsn)..automatedTestMode = true; await Sentry.init( options: options, (options) { @@ -221,7 +221,7 @@ void main() { test('should add default integrations', () async { late SentryOptions optionsReference; - final options = SentryOptions(dsn: fakeDsn)..devMode = true; + final options = SentryOptions(dsn: fakeDsn)..automatedTestMode = true; await Sentry.init( options: options, (options) { @@ -245,7 +245,7 @@ void main() { }, onPlatform: {'browser': Skip()}); test('should add only web compatible default integrations', () async { - final options = SentryOptions(dsn: fakeDsn)..devMode = true; + final options = SentryOptions(dsn: fakeDsn)..automatedTestMode = true; await Sentry.init( options: options, (options) { @@ -261,7 +261,7 @@ void main() { test('should close integrations', () async { final integration = MockIntegration(); - final options = SentryOptions(dsn: fakeDsn)..devMode = true; + final options = SentryOptions(dsn: fakeDsn)..automatedTestMode = true; await Sentry.init( options: options, (options) { @@ -277,7 +277,7 @@ void main() { }); test('$DeduplicationEventProcessor is added on init', () async { - final options = SentryOptions(dsn: fakeDsn)..devMode = true; + final options = SentryOptions(dsn: fakeDsn)..automatedTestMode = true; await Sentry.init( options: options, (options) { @@ -294,7 +294,7 @@ void main() { final completer = Completer(); var completed = false; - final options = SentryOptions(dsn: fakeDsn)..devMode = true; + final options = SentryOptions(dsn: fakeDsn)..automatedTestMode = true; final init = Sentry.init( options: options, (options) { @@ -321,7 +321,7 @@ void main() { final completer = Completer(); var completed = false; - final options = SentryOptions(dsn: fakeDsn)..devMode = true; + final options = SentryOptions(dsn: fakeDsn)..automatedTestMode = true; final init = Sentry.init( options: options, (options) { @@ -345,11 +345,11 @@ void main() { test('options.environment debug', () async { final sentryOptions = SentryOptions(dsn: fakeDsn) - ..devMode = true + ..automatedTestMode = true ..platformChecker = FakePlatformChecker.debugMode(); final options = SentryOptions(); - options.devMode = true; + options.automatedTestMode = true; await Sentry.init( (options) { options.dsn = fakeDsn; @@ -363,7 +363,7 @@ void main() { test('options.environment profile', () async { final sentryOptions = SentryOptions(dsn: fakeDsn, checker: FakePlatformChecker.profileMode()) - ..devMode = true; + ..automatedTestMode = true; await Sentry.init( (options) { @@ -378,7 +378,7 @@ void main() { test('options.environment production (defaultEnvironment)', () async { final sentryOptions = SentryOptions(dsn: fakeDsn, checker: FakePlatformChecker.releaseMode()) - ..devMode = true; + ..automatedTestMode = true; await Sentry.init( (options) { options.dsn = fakeDsn; @@ -392,7 +392,7 @@ void main() { test('options.logger is set by setting the debug flag', () async { final sentryOptions = SentryOptions(dsn: fakeDsn, checker: FakePlatformChecker.debugMode()) - ..devMode = true; + ..automatedTestMode = true; await Sentry.init( (options) { @@ -417,7 +417,7 @@ void main() { test('throw is handled and logged', () async { final sentryOptions = SentryOptions(dsn: fakeDsn) - ..devMode = false + ..automatedTestMode = false ..debug = true ..logger = fixture.mockLogger; @@ -439,7 +439,7 @@ void main() { test('throw is handled and logged', () async { final sentryOptions = SentryOptions(dsn: fakeDsn) - ..devMode = false + ..automatedTestMode = false ..debug = true ..logger = fixture.mockLogger; diff --git a/dart/test/sentry_trace_context_header_test.dart b/dart/test/sentry_trace_context_header_test.dart index 8de346c943..6ba6d93bc2 100644 --- a/dart/test/sentry_trace_context_header_test.dart +++ b/dart/test/sentry_trace_context_header_test.dart @@ -14,6 +14,7 @@ void main() { 'user_segment': 'user_segment', 'transaction': 'transaction', 'sample_rate': '1.0', + 'sampled': 'false' }; final context = SentryTraceContextHeader.fromJson(mapJson); @@ -26,6 +27,7 @@ void main() { expect(context.userSegment, 'user_segment'); expect(context.transaction, 'transaction'); expect(context.sampleRate, '1.0'); + expect(context.sampled, 'false'); }); test('toJson', () { @@ -38,7 +40,7 @@ void main() { final baggage = context.toBaggage(); expect(baggage.toHeaderString(), - 'sentry-trace_id=${id.toString()},sentry-public_key=123,sentry-release=release,sentry-environment=environment,sentry-user_id=user_id,sentry-user_segment=user_segment,sentry-transaction=transaction,sentry-sample_rate=1.0'); + 'sentry-trace_id=${id.toString()},sentry-public_key=123,sentry-release=release,sentry-environment=environment,sentry-user_id=user_id,sentry-user_segment=user_segment,sentry-transaction=transaction,sentry-sample_rate=1.0,sentry-sampled=false'); }); }); } diff --git a/dart/test/sentry_tracer_test.dart b/dart/test/sentry_tracer_test.dart index 24649e23b2..684e2e97f2 100644 --- a/dart/test/sentry_tracer_test.dart +++ b/dart/test/sentry_tracer_test.dart @@ -473,6 +473,7 @@ void main() { expect(newBaggage.get('sentry-user_segment'), 'segment'); expect(newBaggage.get('sentry-transaction'), 'name'); expect(newBaggage.get('sentry-sample_rate'), '1'); + expect(newBaggage.get('sentry-sampled'), 'true'); }); test('skip transaction name if low cardinality', () { @@ -546,6 +547,7 @@ void main() { expect(context.userSegment, 'segment'); expect(context.transaction, 'name'); expect(context.sampleRate, '1'); + expect(context.sampled, 'true'); }); }); } diff --git a/dart/test/transport/spotlight_http_transport_test.dart b/dart/test/transport/spotlight_http_transport_test.dart new file mode 100644 index 0000000000..b23f1fd87f --- /dev/null +++ b/dart/test/transport/spotlight_http_transport_test.dart @@ -0,0 +1,70 @@ +import 'package:http/http.dart' as http; +import 'package:http/testing.dart'; +import 'package:sentry/sentry.dart'; +import 'package:sentry/src/transport/http_transport.dart'; +import 'package:sentry/src/transport/rate_limiter.dart'; +import 'package:sentry/src/transport/spotlight_http_transport.dart'; +import 'package:test/expect.dart'; +import 'package:test/scaffolding.dart'; + +import '../mocks.dart'; +import '../mocks/mock_client_report_recorder.dart'; + +void main() { + group('send to Sentry', () { + late Fixture fixture; + + setUp(() { + fixture = Fixture(); + }); + + test('send event to Sentry even if Spotlight fails', () async { + List? body; + + final httpMock = MockClient((http.Request request) async { + body = request.bodyBytes; + if (request.url.toString() == fixture.options.spotlight.url) { + return http.Response('{}', 500); + } + return http.Response('{}', 200); + }); + + fixture.options.compressPayload = false; + final mockRateLimiter = MockRateLimiter(); + final sut = fixture.getSut(httpMock, mockRateLimiter); + + final sentryEvent = SentryEvent(); + final envelope = SentryEnvelope.fromEvent( + sentryEvent, + fixture.options.sdk, + dsn: fixture.options.dsn, + ); + await sut.send(envelope); + + final envelopeData = []; + await envelope + .envelopeStream(fixture.options) + .forEach(envelopeData.addAll); + + expect(body, envelopeData); + }); + }); +} + +class Fixture { + final options = SentryOptions( + dsn: 'https://public:secret@sentry.example.com/1', + ); + + late var clientReportRecorder = MockClientReportRecorder(); + + Transport getSut(http.Client client, RateLimiter rateLimiter) { + options.httpClient = client; + options.recorder = clientReportRecorder; + options.clock = () { + return DateTime.utc(2019); + }; + final httpTransport = HttpTransport(options, rateLimiter); + return SpotlightHttpTransport(options, httpTransport); + } +} diff --git a/dart/test/unsupported_throwables_test.dart b/dart/test/unsupported_throwables_test.dart new file mode 100644 index 0000000000..9cac063a34 --- /dev/null +++ b/dart/test/unsupported_throwables_test.dart @@ -0,0 +1,92 @@ +import 'package:sentry/src/hub.dart'; +import 'package:test/expect.dart'; +import 'package:test/scaffolding.dart'; + +void main() { + late Fixture fixture; + + setUp(() { + fixture = Fixture(); + }); + + group('unsupported throwable types', () { + test('wrapped string throwable does not throw when expanding', () async { + final throwableHandler = fixture.sut; + final unsupportedThrowable = 'test throwable'; + final wrappedThrowable = + throwableHandler.wrapIfUnsupportedType(unsupportedThrowable); + + expect(() { + fixture.expando[wrappedThrowable]; + }, returnsNormally); + }); + + test('wrapped int throwable does not throw when expanding', () async { + final throwableHandler = fixture.sut; + final unsupportedThrowable = 1; + final wrappedThrowable = + throwableHandler.wrapIfUnsupportedType(unsupportedThrowable); + + expect(() { + fixture.expando[wrappedThrowable]; + }, returnsNormally); + }); + + test('wrapped double throwable does not throw when expanding', () async { + final throwableHandler = fixture.sut; + final unsupportedThrowable = 1.0; + final wrappedThrowable = + throwableHandler.wrapIfUnsupportedType(unsupportedThrowable); + + expect(() { + fixture.expando[wrappedThrowable]; + }, returnsNormally); + }); + + test('wrapped bool throwable does not throw when expanding', () async { + final throwableHandler = fixture.sut; + final unsupportedThrowable = true; + final wrappedThrowable = + throwableHandler.wrapIfUnsupportedType(unsupportedThrowable); + + expect(() { + fixture.expando[wrappedThrowable]; + }, returnsNormally); + }); + + test( + 'creating multiple instances of string wrapped exceptions accesses the same expando value', + () async { + final unsupportedThrowable = 'test throwable'; + final throwableHandler = fixture.sut; + + final first = + throwableHandler.wrapIfUnsupportedType(unsupportedThrowable); + fixture.expando[first] = 1; + + final second = + throwableHandler.wrapIfUnsupportedType(unsupportedThrowable); + expect(fixture.expando[second], 1); + fixture.expando[second] = 2.0; + + final third = + throwableHandler.wrapIfUnsupportedType(unsupportedThrowable); + expect(fixture.expando[third], 2.0); + }); + }); + + group('supported throwable type', () { + test('does not wrap exception if it is a supported type', () async { + final supportedThrowable = Exception('test throwable'); + final result = fixture.sut.wrapIfUnsupportedType(supportedThrowable); + + expect(result, supportedThrowable); + }); + }); +} + +class Fixture { + final expando = Expando(); + + UnsupportedThrowablesHandler get sut => UnsupportedThrowablesHandler(); +} diff --git a/dart/test/utils/tracing_utils_test.dart b/dart/test/utils/tracing_utils_test.dart index 39d6da6349..96b26b55b1 100644 --- a/dart/test/utils/tracing_utils_test.dart +++ b/dart/test/utils/tracing_utils_test.dart @@ -50,15 +50,25 @@ void main() { }); }); - group('$addSentryTraceHeader', () { + group('$addSentryTraceHeaderFromSpan', () { final fixture = Fixture(); + test('adds sentry trace header from span', () { + final headers = {}; + final sut = fixture.getSut(); + final sentryHeader = sut.toSentryTrace(); + + addSentryTraceHeaderFromSpan(sut, headers); + + expect(headers[sentryHeader.name], sentryHeader.value); + }); + test('adds sentry trace header', () { final headers = {}; final sut = fixture.getSut(); final sentryHeader = sut.toSentryTrace(); - addSentryTraceHeader(sut, headers); + addSentryTraceHeader(sentryHeader, headers); expect(headers[sentryHeader.name], sentryHeader.value); }); @@ -72,12 +82,22 @@ void main() { final sut = fixture.getSut(); final baggage = sut.toBaggageHeader(); - addBaggageHeader(sut, headers); + addBaggageHeader(sut.toBaggageHeader()!, headers); + + expect(headers[baggage!.name], baggage.value); + }); + + test('adds baggage header from span', () { + final headers = {}; + final sut = fixture.getSut(); + final baggage = sut.toBaggageHeader(); + + addBaggageHeaderFromSpan(sut, headers); expect(headers[baggage!.name], baggage.value); }); - test('appends baggage header', () { + test('appends baggage header from span', () { final headers = {}; final oldValue = 'other-vendor-value-1=foo'; headers['baggage'] = oldValue; @@ -87,7 +107,7 @@ void main() { final newValue = '$oldValue,${baggage!.value}'; - addBaggageHeader(sut, headers); + addBaggageHeaderFromSpan(sut, headers); expect(headers[baggage.name], newValue); }); @@ -102,10 +122,10 @@ void main() { final sut = fixture.getSut(); final baggage = sut.toBaggageHeader(); - addBaggageHeader(sut, headers); + addBaggageHeaderFromSpan(sut, headers); expect(headers[baggage!.name], - 'other-vendor-value=foo,sentry-trace_id=${sut.context.traceId},sentry-public_key=abc,sentry-release=release,sentry-environment=environment,sentry-user_segment=segment,sentry-transaction=name,sentry-sample_rate=1'); + 'other-vendor-value=foo,sentry-trace_id=${sut.context.traceId},sentry-public_key=abc,sentry-release=release,sentry-environment=environment,sentry-user_segment=segment,sentry-transaction=name,sentry-sample_rate=1,sentry-sampled=true'); }); }); diff --git a/dio/README.md b/dio/README.md index 72c1cbeaa8..a8cf767237 100644 --- a/dio/README.md +++ b/dio/README.md @@ -49,8 +49,9 @@ Depending on your configuration, this adds performance tracing and http breadcru #### Resources -* [![Documentation](https://img.shields.io/badge/documentation-sentry.io-green.svg)](https://docs.sentry.io/platforms/dart/) -* [![Forum](https://img.shields.io/badge/forum-sentry-green.svg)](https://forum.sentry.io/c/sdks) -* [![Discord](https://img.shields.io/discord/621778831602221064)](https://discord.gg/Ww9hbqr) +* [![Flutter docs](https://img.shields.io/badge/documentation-sentry.io-green.svg?label=flutter%20docs)](https://docs.sentry.io/platforms/flutter/) +* [![Dart docs](https://img.shields.io/badge/documentation-sentry.io-green.svg?label=dart%20docs)](https://docs.sentry.io/platforms/dart/) +* [![Discussions](https://img.shields.io/github/discussions/getsentry/sentry-dart.svg)](https://github.com/getsentry/sentry-dart/discussions) +* [![Discord Chat](https://img.shields.io/discord/621778831602221064?logo=discord&logoColor=ffffff&color=7389D8)](https://discord.gg/PXa5Apfe7K) * [![Stack Overflow](https://img.shields.io/badge/stack%20overflow-sentry-green.svg)](https://stackoverflow.com/questions/tagged/sentry) -* [![Twitter Follow](https://img.shields.io/twitter/follow/getsentry?label=getsentry&style=social)](https://twitter.com/intent/follow?screen_name=getsentry) +* [![Twitter Follow](https://img.shields.io/twitter/follow/getsentry?label=getsentry&style=social)](https://twitter.com/intent/follow?screen_name=getsentry) \ No newline at end of file diff --git a/dio/class-diagram.svg b/dio/class-diagram.svg new file mode 100644 index 0000000000..0e368cbdf5 --- /dev/null +++ b/dio/class-diagram.svg @@ -0,0 +1,159 @@ + + + + + + + + +cluster~ + +dio + + +cluster~/lib + +lib + + +cluster~/lib/src + +src + + + +/lib/src/version.dart + +version + + + +/lib/src/dio_event_processor.dart + +dio_event_processor + + + +/lib/src/dio_stacktrace_extractor.dart + +dio_stacktrace_extractor + + + +/lib/src/sentry_dio_client_adapter.dart + +sentry_dio_client_adapter + + + +/lib/src/tracing_client_adapter.dart + +tracing_client_adapter + + + +/lib/src/sentry_dio_client_adapter.dart->/lib/src/tracing_client_adapter.dart + + + + + +/lib/src/breadcrumb_client_adapter.dart + +breadcrumb_client_adapter + + + +/lib/src/sentry_dio_client_adapter.dart->/lib/src/breadcrumb_client_adapter.dart + + + + + +/lib/src/sentry_transformer.dart + +sentry_transformer + + + +/lib/src/dio_error_extractor.dart + +dio_error_extractor + + + +/lib/src/sentry_dio_extension.dart + +sentry_dio_extension + + + +/lib/src/sentry_dio_extension.dart->/lib/src/version.dart + + + + + +/lib/src/sentry_dio_extension.dart->/lib/src/dio_event_processor.dart + + + + + +/lib/src/sentry_dio_extension.dart->/lib/src/dio_stacktrace_extractor.dart + + + + + +/lib/src/sentry_dio_extension.dart->/lib/src/sentry_dio_client_adapter.dart + + + + + +/lib/src/sentry_dio_extension.dart->/lib/src/sentry_transformer.dart + + + + + +/lib/src/sentry_dio_extension.dart->/lib/src/dio_error_extractor.dart + + + + + +/lib/src/failed_request_interceptor.dart + +failed_request_interceptor + + + +/lib/src/sentry_dio_extension.dart->/lib/src/failed_request_interceptor.dart + + + + + +/lib/sentry_dio.dart + +sentry_dio + + + +/lib/sentry_dio.dart->/lib/src/dio_event_processor.dart + + + + + +/lib/sentry_dio.dart->/lib/src/sentry_dio_extension.dart + + + + + diff --git a/dio/lib/src/sentry_transformer.dart b/dio/lib/src/sentry_transformer.dart index 5b43afbfeb..f5fb7c8ac4 100644 --- a/dio/lib/src/sentry_transformer.dart +++ b/dio/lib/src/sentry_transformer.dart @@ -27,7 +27,7 @@ class SentryTransformer implements Transformer { description: description, ); - span?.setData('http.method', options.method); + span?.setData('http.request.method', options.method); // ignore: invalid_use_of_internal_member span?.origin = SentryTraceOrigins.autoHttpDioTransformer; @@ -65,7 +65,7 @@ class SentryTransformer implements Transformer { description: description, ); - span?.setData('http.method', options.method); + span?.setData('http.request.method', options.method); // ignore: invalid_use_of_internal_member span?.origin = SentryTraceOrigins.autoHttpDioTransformer; diff --git a/dio/lib/src/tracing_client_adapter.dart b/dio/lib/src/tracing_client_adapter.dart index 506339e7d4..0c8def1442 100644 --- a/dio/lib/src/tracing_client_adapter.dart +++ b/dio/lib/src/tracing_client_adapter.dart @@ -46,24 +46,43 @@ class TracingClientAdapter implements HttpClientAdapter { span = null; } - span?.setData('http.method', options.method); + span?.setData('http.request.method', options.method); urlDetails?.applyToSpan(span); ResponseBody? response; try { - if (span != null) { - if (containsTargetOrMatchesRegExp( - // ignore: invalid_use_of_internal_member - _hub.options.tracePropagationTargets, - options.uri.toString(), - )) { - addSentryTraceHeader(span, options.headers); - addBaggageHeader( + if (containsTargetOrMatchesRegExp( + // ignore: invalid_use_of_internal_member + _hub.options.tracePropagationTargets, + options.uri.toString(), + )) { + if (span != null) { + addSentryTraceHeaderFromSpan(span, options.headers); + addBaggageHeaderFromSpan( span, options.headers, // ignore: invalid_use_of_internal_member logger: _hub.options.logger, ); + } else { + // ignore: invalid_use_of_internal_member + final scope = _hub.scope; + // ignore: invalid_use_of_internal_member + final propagationContext = scope.propagationContext; + + final traceHeader = propagationContext.toSentryTrace(); + addSentryTraceHeader(traceHeader, options.headers); + + final baggage = propagationContext.baggage; + if (baggage != null) { + final baggageHeader = SentryBaggageHeader.fromBaggage(baggage); + addBaggageHeader( + baggageHeader, + options.headers, + // ignore: invalid_use_of_internal_member + logger: _hub.options.logger, + ); + } } } diff --git a/dio/lib/src/version.dart b/dio/lib/src/version.dart index 0efaa7daaa..175e956f04 100644 --- a/dio/lib/src/version.dart +++ b/dio/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '7.9.0'; +const String sdkVersion = '7.16.0'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_dio'; diff --git a/dio/pubspec.yaml b/dio/pubspec.yaml index 1343b6127b..e1f02a0123 100644 --- a/dio/pubspec.yaml +++ b/dio/pubspec.yaml @@ -1,21 +1,21 @@ name: sentry_dio description: An integration which adds support for performance tracing for the Dio package. -version: 7.9.0 +version: 7.16.0 homepage: https://docs.sentry.io/platforms/dart/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues -documentation: https://docs.sentry.io/platforms/dart/configuration/integrations/dio/ +documentation: https://docs.sentry.io/platforms/dart/integrations/dio/ environment: sdk: '>=2.17.0 <4.0.0' dependencies: dio: ^5.0.0 - sentry: 7.9.0 + sentry: 7.16.0 dev_dependencies: meta: ^1.3.0 - lints: ^2.0.0 + lints: ^3.0.0 test: ^1.21.1 coverage: ^1.3.0 mockito: ^5.1.0 diff --git a/dio/test/sentry_transformer_test.dart b/dio/test/sentry_transformer_test.dart index 492f6e9b23..ffa793c791 100644 --- a/dio/test/sentry_transformer_test.dart +++ b/dio/test/sentry_transformer_test.dart @@ -39,7 +39,7 @@ void main() { expect(span.status, SpanStatus.ok()); expect(span.context.operation, 'serialize.http.client'); expect(span.context.description, 'GET https://example.com'); - expect(span.data['http.method'], 'GET'); + expect(span.data['http.request.method'], 'GET'); expect(span.data['url'], 'https://example.com'); expect(span.data['http.query'], 'foo=bar'); expect(span.data['http.fragment'], 'baz'); @@ -67,7 +67,7 @@ void main() { expect(span.status, SpanStatus.internalError()); expect(span.context.operation, 'serialize.http.client'); expect(span.context.description, 'GET https://example.com'); - expect(span.data['http.method'], 'GET'); + expect(span.data['http.request.method'], 'GET'); expect(span.data['url'], 'https://example.com'); expect(span.data['http.query'], 'foo=bar'); expect(span.data['http.fragment'], 'baz'); @@ -96,7 +96,7 @@ void main() { expect(span.status, SpanStatus.ok()); expect(span.context.operation, 'serialize.http.client'); expect(span.context.description, 'GET https://example.com'); - expect(span.data['http.method'], 'GET'); + expect(span.data['http.request.method'], 'GET'); expect(span.data['url'], 'https://example.com'); expect(span.data['http.query'], 'foo=bar'); expect(span.data['http.fragment'], 'baz'); @@ -126,7 +126,7 @@ void main() { expect(span.status, SpanStatus.internalError()); expect(span.context.operation, 'serialize.http.client'); expect(span.context.description, 'GET https://example.com'); - expect(span.data['http.method'], 'GET'); + expect(span.data['http.request.method'], 'GET'); expect(span.data['url'], 'https://example.com'); expect(span.data['http.query'], 'foo=bar'); expect(span.data['http.fragment'], 'baz'); diff --git a/dio/test/tracing_client_adapter_test.dart b/dio/test/tracing_client_adapter_test.dart index e0d07d527d..f67ec4c14d 100644 --- a/dio/test/tracing_client_adapter_test.dart +++ b/dio/test/tracing_client_adapter_test.dart @@ -43,7 +43,7 @@ void main() { expect(span.status, SpanStatus.ok()); expect(span.context.operation, 'http.client'); expect(span.context.description, 'GET https://example.com'); - expect(span.data['http.method'], 'GET'); + expect(span.data['http.request.method'], 'GET'); expect(span.data['url'], 'https://example.com'); expect(span.data['http.query'], 'foo=bar'); expect(span.data['http.fragment'], 'baz'); @@ -127,25 +127,48 @@ void main() { ); }); - test('captured span do not add headers if NoOp', () async { + test('do not throw if no span bound to the scope', () async { + final sut = fixture.getSut( + client: fixture.getClient(statusCode: 200, reason: 'OK'), + ); + + await sut.get(requestOptions); + }); + + test('set headers from propagationContext when tracing is disabled', + () async { + fixture._options.enableTracing = false; final sut = fixture.getSut( client: fixture.getClient(statusCode: 200, reason: 'OK'), ); - await fixture._hub - .configureScope((scope) => scope.span = NoOpSentrySpan()); + + final propagationContext = fixture._hub.scope.propagationContext; + propagationContext.baggage = SentryBaggage({'foo': 'bar'}); final response = await sut.get(requestOptions); - expect(response.headers['baggage'], null); - expect(response.headers['sentry-trace'], null); + expect( + response.headers['sentry-trace'], + [propagationContext.toSentryTrace().value], + ); + expect(response.headers['baggage'], ['foo=bar']); }); - test('do not throw if no span bound to the scope', () async { + test('set headers from propagationContext when no transaction', () async { final sut = fixture.getSut( client: fixture.getClient(statusCode: 200, reason: 'OK'), ); - await sut.get(requestOptions); + final propagationContext = fixture._hub.scope.propagationContext; + propagationContext.baggage = SentryBaggage({'foo': 'bar'}); + + final response = await sut.get(requestOptions); + + expect( + response.headers['sentry-trace'], + [propagationContext.toSentryTrace().value], + ); + expect(response.headers['baggage'], ['foo=bar']); }); }); } diff --git a/docs/new-package-release-checklist.md b/docs/new-package-release-checklist.md new file mode 100644 index 0000000000..0a7cd19821 --- /dev/null +++ b/docs/new-package-release-checklist.md @@ -0,0 +1,57 @@ +# New Package Release Checklist + +This page serves as a checklist of what to do when releasing a new package for the first time. + +## Release Preparation + +- [ ] Make sure the project is set up + - [ ] The package only exports the public API + - [ ] The package contains an example folder + - [ ] The package contains a README.md file + - [ ] CI badges show a status + - [ ] The package contains a CHANGELOG.md file (symlink to the root changelog) + - [ ] The package contains a dartdoc_options.yaml file (symlink to the root file) + - [ ] The package contains a LICENSE (default is `MIT`) + - [ ] The package contains a pubspec.yaml file + - [ ] The package contains a analysis_options.yaml file + +- [ ] Update the [Flutter example](https://github.com/getsentry/sentry-dart/tree/main/flutter/example) to use your new package if applicable + +- [ ] Make sure your new package has a `version.dart` in the `lib/src` folder. + - This is used to set the version and package in the `Hub`. See this [example](https://github.com/getsentry/sentry-dart/blob/8609bd8dd7ea572e5d241a59643c7570e5621bda/sqflite/lib/src/sentry_database.dart#L69). + - The version will be updated to the newest version after triggering the release process. + +- [ ] Create a new workflow called `your-package-name.yml` for building and testing the package. + +- [ ] Excluding `your-package-name.yml`, add the package to the `paths-ignore` section of all package workflow files. + - For examples see `sqflite.yml`, `dio.yml` etc... + +- [ ] Add an entry to [diagram.yml](https://github.com/getsentry/sentry-dart/blob/main/.github/workflows/diagrams.yml) for your package. + +- [ ] In the root `.gitignore` file add the package coverage as ignored. + +The `analyze` workflow will fail in your PR and in the main branch because the package is not released yet and the `pubspec.yaml` is not 'valid' according to the analyzer. +This is expected - it will succeed after the release. +- [ ] Make sure the analyze workflow doesn't have other failures, only the one mentioned above. + +- [ ] **Very important**: add your package to `scripts/bump-version.sh`. + +## Doing the Release + +Do these steps in the **correct order** + +- [ ] Add your package only as a `pub-dev` target in `.craft.yml`. (**not registry**) + - The release process might fail if you add it to the registry at this point. +- [ ] Trigger the release + - [ ] Check that the release bot successfully updated the versions in `version.dart` and `pubspec.yaml` in the release branch. + +## After the first release + +- [ ] Check if package is succesfully released on `pub.dev` +- [ ] Add the package to the Sentry Release Registry + - Instructions on how to do this can be found [here](https://github.com/getsentry/sentry-release-registry#adding-new-sdks) + - [Example PR](https://github.com/getsentry/sentry-release-registry/pull/136) +- [ ] Add an entry to `.craft.yml` for the package in the `registry` section. + - Now all future releases will be added to the registry automatically. +- [ ] Update the repo's `README.md` +- [ ] Prepare and merge [Sentry documentation](https://github.com/getsentry/sentry-docs/) diff --git a/drift/.gitignore b/drift/.gitignore new file mode 100644 index 0000000000..ba521d5a39 --- /dev/null +++ b/drift/.gitignore @@ -0,0 +1,14 @@ +# Omit committing pubspec.lock for library packages; see +# https://dart.dev/guides/libraries/private-files#pubspeclock. +pubspec.lock + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ diff --git a/drift/CHANGELOG.md b/drift/CHANGELOG.md new file mode 120000 index 0000000000..04c99a55ca --- /dev/null +++ b/drift/CHANGELOG.md @@ -0,0 +1 @@ +../CHANGELOG.md \ No newline at end of file diff --git a/drift/LICENSE b/drift/LICENSE new file mode 100644 index 0000000000..2a6964d84d --- /dev/null +++ b/drift/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Sentry + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/drift/README.md b/drift/README.md new file mode 100644 index 0000000000..2a572aba02 --- /dev/null +++ b/drift/README.md @@ -0,0 +1,82 @@ +

+ + + +
+

+ +Sentry integration for `drift` package +=========== + +| package | build | pub | likes | popularity | pub points | +|-------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------| ------- | +| sentry_drift | [![build](https://github.com/getsentry/sentry-dart/actions/workflows/drift.yml/badge.svg?branch=main)](https://github.com/getsentry/sentry-dart/actions?query=workflow%3Asentry-drift) | [![pub package](https://img.shields.io/pub/v/sentry_drift.svg)](https://pub.dev/packages/sentry_drift) | [![likes](https://img.shields.io/pub/likes/sentry_drift)](https://pub.dev/packages/sentry_drift/score) | [![popularity](https://img.shields.io/pub/popularity/sentry_drift)](https://pub.dev/packages/sentry_drift/score) | [![pub points](https://img.shields.io/pub/points/sentry_drift)](https://pub.dev/packages/sentry_drift/score) + +Integration for the [`drift`](https://pub.dev/packages/drift) package. + +#### Usage + +- Sign up for a Sentry.io account and get a DSN at https://sentry.io. + +- Follow the installing instructions on [pub.dev](https://pub.dev/packages/sentry/install). + +- Initialize the Sentry SDK using the DSN issued by Sentry.io. + +- Call... + +```dart +import 'package:drift/drift.dart'; +import 'package:drift/native.dart'; +import 'package:sentry/sentry.dart'; +import 'package:sentry_drift/sentry_drift.dart'; + +import 'your_database.dart'; + +Future main() async { + // ATTENTION: Change the DSN below with your own to see the events in Sentry. Get one at sentry.io + const dsn = + 'https://e85b375ffb9f43cf8bdf9787768149e0@o447951.ingest.sentry.io/5428562'; + + await Sentry.init( + (options) { + options.dsn = dsn; + options.tracesSampleRate = 1.0; + options.debug = true; + }, + appRunner: runApp, // Init your App. + ); +} + +Future runApp() async { + final tr = + Sentry.startTransaction('drift', 'op', bindToScope: true); + final executor = SentryQueryExecutor( + () => NativeDatabase.memory(), + databaseName: 'my_db_name', + ); + final db = AppDatabase(executor); + + await db.into(db.todoItems).insert( + TodoItemsCompanion.insert( + title: 'This is a test thing', + content: 'test', + ), + ); + + final items = await db.select(db.todoItems).get(); + print(items); + + await db.close(); + + await tr.finish(status: const SpanStatus.ok()); +} +``` + +#### Resources + +* [![Flutter docs](https://img.shields.io/badge/documentation-sentry.io-green.svg?label=flutter%20docs)](https://docs.sentry.io/platforms/flutter/) +* [![Dart docs](https://img.shields.io/badge/documentation-sentry.io-green.svg?label=dart%20docs)](https://docs.sentry.io/platforms/dart/) +* [![Discussions](https://img.shields.io/github/discussions/getsentry/sentry-dart.svg)](https://github.com/getsentry/sentry-dart/discussions) +* [![Discord Chat](https://img.shields.io/discord/621778831602221064?logo=discord&logoColor=ffffff&color=7389D8)](https://discord.gg/PXa5Apfe7K) +* [![Stack Overflow](https://img.shields.io/badge/stack%20overflow-sentry-green.svg)](https://stackoverflow.com/questions/tagged/sentry) +* [![Twitter Follow](https://img.shields.io/twitter/follow/getsentry?label=getsentry&style=social)](https://twitter.com/intent/follow?screen_name=getsentry) \ No newline at end of file diff --git a/drift/analysis_options.yaml b/drift/analysis_options.yaml new file mode 100644 index 0000000000..c5f7c0d066 --- /dev/null +++ b/drift/analysis_options.yaml @@ -0,0 +1,33 @@ +include: package:lints/recommended.yaml + +analyzer: + language: + strict-casts: true + strict-inference: true + strict-raw-types: true + errors: + # treat missing required parameters as a warning (not a hint) + missing_required_param: error + # treat missing returns as a warning (not a hint) + missing_return: error + # allow having TODOs in the code + todo: ignore + # allow self-reference to deprecated members (we do this because otherwise we have + # to annotate every member in every test, assert, etc, when we deprecate something) + deprecated_member_use_from_same_package: warning + # ignore sentry/path on pubspec as we change it on deployment + invalid_dependency: ignore + exclude: + - example/** + - test/mocks/mocks.mocks.dart + +linter: + rules: + - prefer_final_locals + - public_member_api_docs + - prefer_single_quotes + - prefer_relative_imports + - unnecessary_brace_in_string_interps + - implementation_imports + - require_trailing_commas + - unawaited_futures diff --git a/drift/dartdoc_options.yaml b/drift/dartdoc_options.yaml new file mode 120000 index 0000000000..7cbb8c0d74 --- /dev/null +++ b/drift/dartdoc_options.yaml @@ -0,0 +1 @@ +../dart/dartdoc_options.yaml \ No newline at end of file diff --git a/drift/example/database.dart b/drift/example/database.dart new file mode 100644 index 0000000000..71a467b984 --- /dev/null +++ b/drift/example/database.dart @@ -0,0 +1,21 @@ +import 'dart:io'; + +import 'package:drift/drift.dart'; +import 'package:drift/native.dart'; + +part 'database.g.dart'; + +class TodoItems extends Table { + IntColumn get id => integer().autoIncrement()(); + TextColumn get title => text().withLength(min: 6, max: 32)(); + TextColumn get content => text().named('body')(); + IntColumn get category => integer().nullable()(); +} + +@DriftDatabase(tables: [TodoItems]) +class AppDatabase extends _$AppDatabase { + AppDatabase(super.e); + + @override + int get schemaVersion => 1; +} diff --git a/drift/example/database.g.dart b/drift/example/database.g.dart new file mode 100644 index 0000000000..1f9d234456 --- /dev/null +++ b/drift/example/database.g.dart @@ -0,0 +1,269 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'database.dart'; + +// ignore_for_file: type=lint +class $TodoItemsTable extends TodoItems + with TableInfo<$TodoItemsTable, TodoItem> { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + $TodoItemsTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _idMeta = const VerificationMeta('id'); + @override + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + static const VerificationMeta _titleMeta = const VerificationMeta('title'); + @override + late final GeneratedColumn title = GeneratedColumn( + 'title', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 6, maxTextLength: 32), + type: DriftSqlType.string, + requiredDuringInsert: true); + static const VerificationMeta _contentMeta = + const VerificationMeta('content'); + @override + late final GeneratedColumn content = GeneratedColumn( + 'body', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + static const VerificationMeta _categoryMeta = + const VerificationMeta('category'); + @override + late final GeneratedColumn category = GeneratedColumn( + 'category', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + @override + List get $columns => [id, title, content, category]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'todo_items'; + @override + VerificationContext validateIntegrity(Insertable instance, + {bool isInserting = false}) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('id')) { + context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); + } + if (data.containsKey('title')) { + context.handle( + _titleMeta, title.isAcceptableOrUnknown(data['title']!, _titleMeta)); + } else if (isInserting) { + context.missing(_titleMeta); + } + if (data.containsKey('body')) { + context.handle(_contentMeta, + content.isAcceptableOrUnknown(data['body']!, _contentMeta)); + } else if (isInserting) { + context.missing(_contentMeta); + } + if (data.containsKey('category')) { + context.handle(_categoryMeta, + category.isAcceptableOrUnknown(data['category']!, _categoryMeta)); + } + return context; + } + + @override + Set get $primaryKey => {id}; + @override + TodoItem map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return TodoItem( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + title: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}title'])!, + content: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}body'])!, + category: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}category']), + ); + } + + @override + $TodoItemsTable createAlias(String alias) { + return $TodoItemsTable(attachedDatabase, alias); + } +} + +class TodoItem extends DataClass implements Insertable { + final int id; + final String title; + final String content; + final int? category; + const TodoItem( + {required this.id, + required this.title, + required this.content, + this.category}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['title'] = Variable(title); + map['body'] = Variable(content); + if (!nullToAbsent || category != null) { + map['category'] = Variable(category); + } + return map; + } + + TodoItemsCompanion toCompanion(bool nullToAbsent) { + return TodoItemsCompanion( + id: Value(id), + title: Value(title), + content: Value(content), + category: category == null && nullToAbsent + ? const Value.absent() + : Value(category), + ); + } + + factory TodoItem.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return TodoItem( + id: serializer.fromJson(json['id']), + title: serializer.fromJson(json['title']), + content: serializer.fromJson(json['content']), + category: serializer.fromJson(json['category']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'title': serializer.toJson(title), + 'content': serializer.toJson(content), + 'category': serializer.toJson(category), + }; + } + + TodoItem copyWith( + {int? id, + String? title, + String? content, + Value category = const Value.absent()}) => + TodoItem( + id: id ?? this.id, + title: title ?? this.title, + content: content ?? this.content, + category: category.present ? category.value : this.category, + ); + @override + String toString() { + return (StringBuffer('TodoItem(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('content: $content, ') + ..write('category: $category') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, title, content, category); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is TodoItem && + other.id == this.id && + other.title == this.title && + other.content == this.content && + other.category == this.category); +} + +class TodoItemsCompanion extends UpdateCompanion { + final Value id; + final Value title; + final Value content; + final Value category; + const TodoItemsCompanion({ + this.id = const Value.absent(), + this.title = const Value.absent(), + this.content = const Value.absent(), + this.category = const Value.absent(), + }); + TodoItemsCompanion.insert({ + this.id = const Value.absent(), + required String title, + required String content, + this.category = const Value.absent(), + }) : title = Value(title), + content = Value(content); + static Insertable custom({ + Expression? id, + Expression? title, + Expression? content, + Expression? category, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (title != null) 'title': title, + if (content != null) 'body': content, + if (category != null) 'category': category, + }); + } + + TodoItemsCompanion copyWith( + {Value? id, + Value? title, + Value? content, + Value? category}) { + return TodoItemsCompanion( + id: id ?? this.id, + title: title ?? this.title, + content: content ?? this.content, + category: category ?? this.category, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (title.present) { + map['title'] = Variable(title.value); + } + if (content.present) { + map['body'] = Variable(content.value); + } + if (category.present) { + map['category'] = Variable(category.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('TodoItemsCompanion(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('content: $content, ') + ..write('category: $category') + ..write(')')) + .toString(); + } +} + +abstract class _$AppDatabase extends GeneratedDatabase { + _$AppDatabase(QueryExecutor e) : super(e); + late final $TodoItemsTable todoItems = $TodoItemsTable(this); + @override + Iterable> get allTables => + allSchemaEntities.whereType>(); + @override + List get allSchemaEntities => [todoItems]; +} diff --git a/drift/example/example.dart b/drift/example/example.dart new file mode 100644 index 0000000000..bfe8b6d8e6 --- /dev/null +++ b/drift/example/example.dart @@ -0,0 +1,44 @@ +import 'package:drift/drift.dart'; +import 'package:drift/native.dart'; +import 'package:sentry/sentry.dart'; +import 'package:sentry_drift/sentry_drift.dart'; + +import 'database.dart'; + +Future main() async { + // ATTENTION: Change the DSN below with your own to see the events in Sentry. Get one at sentry.io + const dsn = + 'https://e85b375ffb9f43cf8bdf9787768149e0@o447951.ingest.sentry.io/5428562'; + + await Sentry.init( + (options) { + options.dsn = dsn; + options.tracesSampleRate = 1.0; + options.debug = true; + }, + appRunner: runApp, // Init your App. + ); +} + +Future runApp() async { + final tr = Sentry.startTransaction('drift', 'op', bindToScope: true); + final executor = SentryQueryExecutor( + () => NativeDatabase.memory(), + databaseName: 'your_db_name', + ); + final db = AppDatabase(executor); + + await db.into(db.todoItems).insert( + TodoItemsCompanion.insert( + title: 'This is a test thing', + content: 'test', + ), + ); + + final items = await db.select(db.todoItems).get(); + print(items); + + await db.close(); + + await tr.finish(status: const SpanStatus.ok()); +} diff --git a/drift/lib/sentry_drift.dart b/drift/lib/sentry_drift.dart new file mode 100644 index 0000000000..ba84220b42 --- /dev/null +++ b/drift/lib/sentry_drift.dart @@ -0,0 +1,3 @@ +library sentry_drift; + +export 'src/sentry_query_executor.dart'; diff --git a/drift/lib/src/sentry_query_executor.dart b/drift/lib/src/sentry_query_executor.dart new file mode 100644 index 0000000000..6f09906970 --- /dev/null +++ b/drift/lib/src/sentry_query_executor.dart @@ -0,0 +1,183 @@ +import 'dart:async'; + +import 'package:drift/drift.dart'; +import 'package:meta/meta.dart'; +import 'package:sentry/sentry.dart'; +import 'version.dart'; +import 'sentry_span_helper.dart'; +import 'sentry_transaction_executor.dart'; + +/// Signature of a function that opens a database connection when instructed to. +typedef DatabaseOpener = FutureOr Function(); + +/// The Sentry Query Executor. +/// +/// If the constructor parameter queryExecutor is null, [LazyDatabase] will be +/// used as a default. +@experimental +class SentryQueryExecutor extends QueryExecutor { + Hub _hub; + + final _spanHelper = SentrySpanHelper( + // ignore: invalid_use_of_internal_member + SentryTraceOrigins.autoDbDriftQueryExecutor, + ); + + final QueryExecutor _executor; + + final String _dbName; + + @internal + // ignore: public_member_api_docs + static const dbNameKey = 'db.name'; + + @internal + // ignore: public_member_api_docs + static const dbOp = 'db'; + + @internal + // ignore: public_member_api_docs + static const dbSystemKey = 'db.system'; + + @internal + // ignore: public_member_api_docs + static const dbSystem = 'sqlite'; + + bool _isOpen = false; + + /// Declares a [SentryQueryExecutor] that will run [opener] when the database is + /// first requested to be opened. You must specify the same [dialect] as the + /// underlying database has + SentryQueryExecutor( + DatabaseOpener opener, { + @internal Hub? hub, + @internal QueryExecutor? queryExecutor, + required String databaseName, + }) : _hub = hub ?? HubAdapter(), + _dbName = databaseName, + _executor = queryExecutor ?? LazyDatabase(opener) { + // ignore: invalid_use_of_internal_member + final options = _hub.options; + options.sdk.addIntegration('SentryDriftTracing'); + options.sdk.addPackage(packageName, sdkVersion); + _spanHelper.setHub(_hub); + } + + /// @nodoc + @internal + void setHub(Hub hub) { + _hub = hub; + _spanHelper.setHub(hub); + } + + @override + TransactionExecutor beginTransaction() { + final transactionExecutor = _executor.beginTransaction(); + final sentryTransactionExecutor = SentryTransactionExecutor( + transactionExecutor, + _hub, + dbName: _dbName, + ); + sentryTransactionExecutor.beginTransaction(); + return sentryTransactionExecutor; + } + + @override + Future runBatched(BatchedStatements statements) { + return _spanHelper.asyncWrapInSpan( + statements.toString(), + () async { + return await _executor.runBatched(statements); + }, + dbName: _dbName, + ); + } + + @override + Future ensureOpen(QueryExecutorUser user) { + if (_isOpen) { + return Future.value(true); + } + return _spanHelper.asyncWrapInSpan( + 'Open DB: $_dbName', + () async { + final res = await _executor.ensureOpen(user); + _isOpen = true; + return res; + }, + dbName: _dbName, + ); + } + + @override + Future runCustom(String statement, [List? args]) { + return _spanHelper.asyncWrapInSpan( + statement, + () async { + return await _executor.runCustom(statement, args); + }, + dbName: _dbName, + ); + } + + @override + Future runDelete(String statement, List args) { + return _spanHelper.asyncWrapInSpan( + statement, + () async { + return await _executor.runDelete(statement, args); + }, + dbName: _dbName, + ); + } + + @override + Future runInsert(String statement, List args) { + return _spanHelper.asyncWrapInSpan( + statement, + () async { + return await _executor.runInsert(statement, args); + }, + dbName: _dbName, + ); + } + + @override + Future>> runSelect( + String statement, + List args, + ) { + return _spanHelper.asyncWrapInSpan( + statement, + () async { + return await _executor.runSelect(statement, args); + }, + dbName: _dbName, + ); + } + + @override + Future runUpdate(String statement, List args) { + return _spanHelper.asyncWrapInSpan( + statement, + () async { + return await _executor.runUpdate(statement, args); + }, + dbName: _dbName, + ); + } + + @override + Future close() { + return _spanHelper.asyncWrapInSpan( + 'Close DB: $_dbName', + () async { + return await _executor.close(); + }, + dbName: _dbName, + ); + } + + @override + SqlDialect get dialect => _executor.dialect; +} diff --git a/drift/lib/src/sentry_span_helper.dart b/drift/lib/src/sentry_span_helper.dart new file mode 100644 index 0000000000..762bd24d08 --- /dev/null +++ b/drift/lib/src/sentry_span_helper.dart @@ -0,0 +1,155 @@ +import 'package:meta/meta.dart'; + +import 'package:sentry/sentry.dart'; + +import 'sentry_query_executor.dart'; + +/// @nodoc +@internal +class SentrySpanHelper { + /// @nodoc + Hub _hub = HubAdapter(); + + /// @nodoc + final String _origin; + + /// @nodoc + SentrySpanHelper(this._origin); + + /// @nodoc + void setHub(Hub hub) { + _hub = hub; + } + + /// @nodoc + @internal + Future asyncWrapInSpan( + String description, + Future Function() execute, { + String? dbName, + bool useTransactionSpan = false, + }) async { + ISentrySpan? currentSpan = _hub.getSpan(); + if (useTransactionSpan) { + currentSpan = transactionSpan; + } + final span = currentSpan?.startChild( + SentryQueryExecutor.dbOp, + description: description, + ); + + // ignore: invalid_use_of_internal_member + span?.origin = _origin; + + span?.setData( + SentryQueryExecutor.dbSystemKey, + SentryQueryExecutor.dbSystem, + ); + + if (dbName != null) { + span?.setData(SentryQueryExecutor.dbNameKey, dbName); + } + + try { + final result = await execute(); + span?.status = SpanStatus.ok(); + + return result; + } catch (exception) { + span?.throwable = exception; + span?.status = SpanStatus.internalError(); + + rethrow; + } finally { + await span?.finish(); + } + } + + /// This span is used for the database transaction. + @internal + ISentrySpan? transactionSpan; + + /// @nodoc + @internal + T beginTransaction( + String description, + T Function() execute, { + String? dbName, + }) { + final currentSpan = _hub.getSpan(); + final span = currentSpan?.startChild( + SentryQueryExecutor.dbOp, + description: description, + ); + + // ignore: invalid_use_of_internal_member + span?.origin = _origin; + + span?.setData( + SentryQueryExecutor.dbSystemKey, + SentryQueryExecutor.dbSystem, + ); + + if (dbName != null) { + span?.setData(SentryQueryExecutor.dbNameKey, dbName); + } + + try { + final result = execute(); + span?.status = SpanStatus.unknown(); + + return result; + } catch (exception) { + span?.throwable = exception; + span?.status = SpanStatus.internalError(); + + rethrow; + } finally { + transactionSpan = span; + } + } + + /// @nodoc + @internal + Future finishTransaction( + Future Function() execute, { + String? dbName, + }) async { + try { + final result = await execute(); + transactionSpan?.status = SpanStatus.ok(); + + return result; + } catch (exception) { + transactionSpan?.throwable = exception; + transactionSpan?.status = SpanStatus.internalError(); + + rethrow; + } finally { + await transactionSpan?.finish(); + transactionSpan = null; + } + } + + /// @nodoc + @internal + Future abortTransaction( + Future Function() execute, { + String? dbName, + }) async { + try { + final result = await execute(); + transactionSpan?.status = SpanStatus.aborted(); + + return result; + } catch (exception) { + transactionSpan?.throwable = exception; + transactionSpan?.status = SpanStatus.internalError(); + + rethrow; + } finally { + await transactionSpan?.finish(); + transactionSpan = null; + } + } +} diff --git a/drift/lib/src/sentry_transaction_executor.dart b/drift/lib/src/sentry_transaction_executor.dart new file mode 100644 index 0000000000..afd7625524 --- /dev/null +++ b/drift/lib/src/sentry_transaction_executor.dart @@ -0,0 +1,155 @@ +import 'package:drift/backends.dart'; +import 'package:meta/meta.dart'; +import 'package:sentry/sentry.dart'; +import 'sentry_span_helper.dart'; + +/// @nodoc +@internal +class SentryTransactionExecutor extends TransactionExecutor { + final TransactionExecutor _executor; + + final Hub _hub; + + final _spanHelper = SentrySpanHelper( + // ignore: invalid_use_of_internal_member + SentryTraceOrigins.autoDbDriftTransactionExecutor, + ); + + final String? _dbName; + + bool _isOpen = false; + + final _withinTransactionDescription = 'Within transaction: '; + + /// @nodoc + SentryTransactionExecutor(this._executor, Hub hub, {@internal String? dbName}) + : _hub = hub, + _dbName = dbName { + _spanHelper.setHub(_hub); + } + + @override + TransactionExecutor beginTransaction() { + return _spanHelper.beginTransaction( + 'transaction', + () { + return _executor.beginTransaction(); + }, + dbName: _dbName, + ); + } + + @override + Future rollback() { + return _spanHelper.abortTransaction(() async { + return await _executor.rollback(); + }); + } + + @override + Future send() { + return _spanHelper.finishTransaction(() async { + return await _executor.send(); + }); + } + + @override + SqlDialect get dialect => _executor.dialect; + + @override + Future ensureOpen(QueryExecutorUser user) { + if (_isOpen) { + return Future.value(true); + } + return _spanHelper.asyncWrapInSpan( + 'Open transaction', + () async { + final res = await _executor.ensureOpen(user); + _isOpen = true; + return res; + }, + dbName: _dbName, + ); + } + + @override + Future runBatched(BatchedStatements statements) { + return _spanHelper.asyncWrapInSpan( + 'batch', + () async { + return await _executor.runBatched(statements); + }, + dbName: _dbName, + ); + } + + @override + Future runCustom(String statement, [List? args]) { + return _spanHelper.asyncWrapInSpan( + _spanDescriptionForOperations(statement), + () async { + return _executor.runCustom(statement, args); + }, + dbName: _dbName, + useTransactionSpan: true, + ); + } + + @override + Future runDelete(String statement, List args) { + return _spanHelper.asyncWrapInSpan( + _spanDescriptionForOperations(statement), + () async { + return _executor.runDelete(statement, args); + }, + dbName: _dbName, + useTransactionSpan: true, + ); + } + + @override + Future runInsert(String statement, List args) { + return _spanHelper.asyncWrapInSpan( + _spanDescriptionForOperations(statement), + () async { + return _executor.runInsert(statement, args); + }, + dbName: _dbName, + useTransactionSpan: true, + ); + } + + @override + Future>> runSelect( + String statement, + List args, + ) { + return _spanHelper.asyncWrapInSpan( + _spanDescriptionForOperations(statement), + () async { + return _executor.runSelect(statement, args); + }, + dbName: _dbName, + useTransactionSpan: true, + ); + } + + @override + Future runUpdate(String statement, List args) { + return _spanHelper.asyncWrapInSpan( + _spanDescriptionForOperations(statement), + () async { + return _executor.runUpdate(statement, args); + }, + dbName: _dbName, + useTransactionSpan: true, + ); + } + + @override + bool get supportsNestedTransactions => _executor.supportsNestedTransactions; + + String _spanDescriptionForOperations(String operation) { + return '$_withinTransactionDescription$operation'; + } +} diff --git a/drift/lib/src/version.dart b/drift/lib/src/version.dart new file mode 100644 index 0000000000..2795a157be --- /dev/null +++ b/drift/lib/src/version.dart @@ -0,0 +1,5 @@ +/// The SDK version reported to Sentry.io in the submitted events. +const String sdkVersion = '7.16.0'; + +/// The package name reported to Sentry.io in the submitted events. +const String packageName = 'pub:sentry_drift'; diff --git a/drift/pubspec.yaml b/drift/pubspec.yaml new file mode 100644 index 0000000000..92323b4f63 --- /dev/null +++ b/drift/pubspec.yaml @@ -0,0 +1,28 @@ +name: sentry_drift +description: An integration which adds support for performance tracing for the drift package. +version: 7.16.0 +homepage: https://docs.sentry.io/platforms/flutter/ +repository: https://github.com/getsentry/sentry-dart +issue_tracker: https://github.com/getsentry/sentry-dart/issues + +environment: + sdk: '>=2.17.0 <4.0.0' + flutter: '>=3.3.0' + +dependencies: + sentry: 7.16.0 + meta: ^1.3.0 + drift: ^2.13.0 + +dev_dependencies: + lints: ^3.0.0 + flutter_test: + sdk: flutter + coverage: ^1.3.0 + mockito: ^5.1.0 + build_runner: ^2.4.6 + drift_dev: ^2.13.0 + yaml: ^3.1.0 # needed for version match (code and pubspec) + sqlite3_flutter_libs: ^0.5.0 + sqlite3: ^2.1.0 + archive: ^3.1.2 \ No newline at end of file diff --git a/drift/pubspec_overrides.yaml b/drift/pubspec_overrides.yaml new file mode 100644 index 0000000000..16e71d16f0 --- /dev/null +++ b/drift/pubspec_overrides.yaml @@ -0,0 +1,3 @@ +dependency_overrides: + sentry: + path: ../dart diff --git a/drift/test/mocks/mocks.dart b/drift/test/mocks/mocks.dart new file mode 100644 index 0000000000..4842f97455 --- /dev/null +++ b/drift/test/mocks/mocks.dart @@ -0,0 +1,10 @@ +import 'package:drift/drift.dart'; +import 'package:mockito/annotations.dart'; +import 'package:sentry/sentry.dart'; + +@GenerateMocks([ + Hub, + LazyDatabase, + TransactionExecutor, +]) +void main() {} diff --git a/drift/test/mocks/mocks.mocks.dart b/drift/test/mocks/mocks.mocks.dart new file mode 100644 index 0000000000..f6a88c359a --- /dev/null +++ b/drift/test/mocks/mocks.mocks.dart @@ -0,0 +1,769 @@ +// Mocks generated by Mockito 5.4.2 from annotations +// in sentry_drift/test/mocks/mocks.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i5; + +import 'package:drift/backends.dart' as _i3; +import 'package:drift/drift.dart' as _i6; +import 'package:mockito/mockito.dart' as _i1; +import 'package:sentry/sentry.dart' as _i2; +import 'package:sentry/src/profiling.dart' as _i4; + +// 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 _FakeSentryOptions_0 extends _i1.SmartFake implements _i2.SentryOptions { + _FakeSentryOptions_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeSentryId_1 extends _i1.SmartFake implements _i2.SentryId { + _FakeSentryId_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeScope_2 extends _i1.SmartFake implements _i2.Scope { + _FakeScope_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeHub_3 extends _i1.SmartFake implements _i2.Hub { + _FakeHub_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeISentrySpan_4 extends _i1.SmartFake implements _i2.ISentrySpan { + _FakeISentrySpan_4( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeQueryExecutor_5 extends _i1.SmartFake implements _i3.QueryExecutor { + _FakeQueryExecutor_5( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeTransactionExecutor_6 extends _i1.SmartFake + implements _i3.TransactionExecutor { + _FakeTransactionExecutor_6( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [Hub]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockHub extends _i1.Mock implements _i2.Hub { + MockHub() { + _i1.throwOnMissingStub(this); + } + + @override + _i2.SentryOptions get options => (super.noSuchMethod( + Invocation.getter(#options), + returnValue: _FakeSentryOptions_0( + this, + Invocation.getter(#options), + ), + ) as _i2.SentryOptions); + + @override + bool get isEnabled => (super.noSuchMethod( + Invocation.getter(#isEnabled), + returnValue: false, + ) as bool); + + @override + _i2.SentryId get lastEventId => (super.noSuchMethod( + Invocation.getter(#lastEventId), + returnValue: _FakeSentryId_1( + this, + Invocation.getter(#lastEventId), + ), + ) as _i2.SentryId); + + @override + _i2.Scope get scope => (super.noSuchMethod( + Invocation.getter(#scope), + returnValue: _FakeScope_2( + this, + Invocation.getter(#scope), + ), + ) as _i2.Scope); + + @override + set profilerFactory(_i4.SentryProfilerFactory? value) => super.noSuchMethod( + Invocation.setter( + #profilerFactory, + value, + ), + returnValueForMissingStub: null, + ); + + @override + _i5.Future<_i2.SentryId> captureEvent( + _i2.SentryEvent? event, { + dynamic stackTrace, + _i2.Hint? hint, + _i2.ScopeCallback? withScope, + }) => + (super.noSuchMethod( + Invocation.method( + #captureEvent, + [event], + { + #stackTrace: stackTrace, + #hint: hint, + #withScope: withScope, + }, + ), + returnValue: _i5.Future<_i2.SentryId>.value(_FakeSentryId_1( + this, + Invocation.method( + #captureEvent, + [event], + { + #stackTrace: stackTrace, + #hint: hint, + #withScope: withScope, + }, + ), + )), + ) as _i5.Future<_i2.SentryId>); + + @override + _i5.Future<_i2.SentryId> captureException( + dynamic throwable, { + dynamic stackTrace, + _i2.Hint? hint, + _i2.ScopeCallback? withScope, + }) => + (super.noSuchMethod( + Invocation.method( + #captureException, + [throwable], + { + #stackTrace: stackTrace, + #hint: hint, + #withScope: withScope, + }, + ), + returnValue: _i5.Future<_i2.SentryId>.value(_FakeSentryId_1( + this, + Invocation.method( + #captureException, + [throwable], + { + #stackTrace: stackTrace, + #hint: hint, + #withScope: withScope, + }, + ), + )), + ) as _i5.Future<_i2.SentryId>); + + @override + _i5.Future<_i2.SentryId> captureMessage( + String? message, { + _i2.SentryLevel? level, + String? template, + List? params, + _i2.Hint? hint, + _i2.ScopeCallback? withScope, + }) => + (super.noSuchMethod( + Invocation.method( + #captureMessage, + [message], + { + #level: level, + #template: template, + #params: params, + #hint: hint, + #withScope: withScope, + }, + ), + returnValue: _i5.Future<_i2.SentryId>.value(_FakeSentryId_1( + this, + Invocation.method( + #captureMessage, + [message], + { + #level: level, + #template: template, + #params: params, + #hint: hint, + #withScope: withScope, + }, + ), + )), + ) as _i5.Future<_i2.SentryId>); + + @override + _i5.Future captureUserFeedback(_i2.SentryUserFeedback? userFeedback) => + (super.noSuchMethod( + Invocation.method( + #captureUserFeedback, + [userFeedback], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future addBreadcrumb( + _i2.Breadcrumb? crumb, { + _i2.Hint? hint, + }) => + (super.noSuchMethod( + Invocation.method( + #addBreadcrumb, + [crumb], + {#hint: hint}, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + void bindClient(_i2.SentryClient? client) => super.noSuchMethod( + Invocation.method( + #bindClient, + [client], + ), + returnValueForMissingStub: null, + ); + + @override + _i2.Hub clone() => (super.noSuchMethod( + Invocation.method( + #clone, + [], + ), + returnValue: _FakeHub_3( + this, + Invocation.method( + #clone, + [], + ), + ), + ) as _i2.Hub); + + @override + _i5.Future close() => (super.noSuchMethod( + Invocation.method( + #close, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.FutureOr configureScope(_i2.ScopeCallback? callback) => + (super.noSuchMethod(Invocation.method( + #configureScope, + [callback], + )) as _i5.FutureOr); + + @override + _i2.ISentrySpan startTransaction( + String? name, + String? operation, { + String? description, + DateTime? startTimestamp, + bool? bindToScope, + bool? waitForChildren, + Duration? autoFinishAfter, + bool? trimEnd, + _i2.OnTransactionFinish? onFinish, + Map? customSamplingContext, + }) => + (super.noSuchMethod( + Invocation.method( + #startTransaction, + [ + name, + operation, + ], + { + #description: description, + #startTimestamp: startTimestamp, + #bindToScope: bindToScope, + #waitForChildren: waitForChildren, + #autoFinishAfter: autoFinishAfter, + #trimEnd: trimEnd, + #onFinish: onFinish, + #customSamplingContext: customSamplingContext, + }, + ), + returnValue: _FakeISentrySpan_4( + this, + Invocation.method( + #startTransaction, + [ + name, + operation, + ], + { + #description: description, + #startTimestamp: startTimestamp, + #bindToScope: bindToScope, + #waitForChildren: waitForChildren, + #autoFinishAfter: autoFinishAfter, + #trimEnd: trimEnd, + #onFinish: onFinish, + #customSamplingContext: customSamplingContext, + }, + ), + ), + ) as _i2.ISentrySpan); + + @override + _i2.ISentrySpan startTransactionWithContext( + _i2.SentryTransactionContext? transactionContext, { + Map? customSamplingContext, + DateTime? startTimestamp, + bool? bindToScope, + bool? waitForChildren, + Duration? autoFinishAfter, + bool? trimEnd, + _i2.OnTransactionFinish? onFinish, + }) => + (super.noSuchMethod( + Invocation.method( + #startTransactionWithContext, + [transactionContext], + { + #customSamplingContext: customSamplingContext, + #startTimestamp: startTimestamp, + #bindToScope: bindToScope, + #waitForChildren: waitForChildren, + #autoFinishAfter: autoFinishAfter, + #trimEnd: trimEnd, + #onFinish: onFinish, + }, + ), + returnValue: _FakeISentrySpan_4( + this, + Invocation.method( + #startTransactionWithContext, + [transactionContext], + { + #customSamplingContext: customSamplingContext, + #startTimestamp: startTimestamp, + #bindToScope: bindToScope, + #waitForChildren: waitForChildren, + #autoFinishAfter: autoFinishAfter, + #trimEnd: trimEnd, + #onFinish: onFinish, + }, + ), + ), + ) as _i2.ISentrySpan); + + @override + _i5.Future<_i2.SentryId> captureTransaction( + _i2.SentryTransaction? transaction, { + _i2.SentryTraceContextHeader? traceContext, + }) => + (super.noSuchMethod( + Invocation.method( + #captureTransaction, + [transaction], + {#traceContext: traceContext}, + ), + returnValue: _i5.Future<_i2.SentryId>.value(_FakeSentryId_1( + this, + Invocation.method( + #captureTransaction, + [transaction], + {#traceContext: traceContext}, + ), + )), + ) as _i5.Future<_i2.SentryId>); + + @override + void setSpanContext( + dynamic throwable, + _i2.ISentrySpan? span, + String? transaction, + ) => + super.noSuchMethod( + Invocation.method( + #setSpanContext, + [ + throwable, + span, + transaction, + ], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [LazyDatabase]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockLazyDatabase extends _i1.Mock implements _i6.LazyDatabase { + MockLazyDatabase() { + _i1.throwOnMissingStub(this); + } + + @override + _i6.DatabaseOpener get opener => (super.noSuchMethod( + Invocation.getter(#opener), + returnValue: () => + _i5.Future<_i3.QueryExecutor>.value(_FakeQueryExecutor_5( + this, + Invocation.getter(#opener), + )), + ) as _i6.DatabaseOpener); + + @override + _i3.SqlDialect get dialect => (super.noSuchMethod( + Invocation.getter(#dialect), + returnValue: _i3.SqlDialect.sqlite, + ) as _i3.SqlDialect); + + @override + _i3.TransactionExecutor beginTransaction() => (super.noSuchMethod( + Invocation.method( + #beginTransaction, + [], + ), + returnValue: _FakeTransactionExecutor_6( + this, + Invocation.method( + #beginTransaction, + [], + ), + ), + ) as _i3.TransactionExecutor); + + @override + _i5.Future ensureOpen(_i3.QueryExecutorUser? user) => + (super.noSuchMethod( + Invocation.method( + #ensureOpen, + [user], + ), + returnValue: _i5.Future.value(false), + ) as _i5.Future); + + @override + _i5.Future runBatched(_i3.BatchedStatements? statements) => + (super.noSuchMethod( + Invocation.method( + #runBatched, + [statements], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future runCustom( + String? statement, [ + List? args, + ]) => + (super.noSuchMethod( + Invocation.method( + #runCustom, + [ + statement, + args, + ], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future runDelete( + String? statement, + List? args, + ) => + (super.noSuchMethod( + Invocation.method( + #runDelete, + [ + statement, + args, + ], + ), + returnValue: _i5.Future.value(0), + ) as _i5.Future); + + @override + _i5.Future runInsert( + String? statement, + List? args, + ) => + (super.noSuchMethod( + Invocation.method( + #runInsert, + [ + statement, + args, + ], + ), + returnValue: _i5.Future.value(0), + ) as _i5.Future); + + @override + _i5.Future>> runSelect( + String? statement, + List? args, + ) => + (super.noSuchMethod( + Invocation.method( + #runSelect, + [ + statement, + args, + ], + ), + returnValue: _i5.Future>>.value( + >[]), + ) as _i5.Future>>); + + @override + _i5.Future runUpdate( + String? statement, + List? args, + ) => + (super.noSuchMethod( + Invocation.method( + #runUpdate, + [ + statement, + args, + ], + ), + returnValue: _i5.Future.value(0), + ) as _i5.Future); + + @override + _i5.Future close() => (super.noSuchMethod( + Invocation.method( + #close, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); +} + +/// A class which mocks [TransactionExecutor]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockTransactionExecutor extends _i1.Mock + implements _i3.TransactionExecutor { + MockTransactionExecutor() { + _i1.throwOnMissingStub(this); + } + + @override + bool get supportsNestedTransactions => (super.noSuchMethod( + Invocation.getter(#supportsNestedTransactions), + returnValue: false, + ) as bool); + + @override + _i3.SqlDialect get dialect => (super.noSuchMethod( + Invocation.getter(#dialect), + returnValue: _i3.SqlDialect.sqlite, + ) as _i3.SqlDialect); + + @override + _i5.Future send() => (super.noSuchMethod( + Invocation.method( + #send, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future rollback() => (super.noSuchMethod( + Invocation.method( + #rollback, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future ensureOpen(_i3.QueryExecutorUser? user) => + (super.noSuchMethod( + Invocation.method( + #ensureOpen, + [user], + ), + returnValue: _i5.Future.value(false), + ) as _i5.Future); + + @override + _i5.Future>> runSelect( + String? statement, + List? args, + ) => + (super.noSuchMethod( + Invocation.method( + #runSelect, + [ + statement, + args, + ], + ), + returnValue: _i5.Future>>.value( + >[]), + ) as _i5.Future>>); + + @override + _i5.Future runInsert( + String? statement, + List? args, + ) => + (super.noSuchMethod( + Invocation.method( + #runInsert, + [ + statement, + args, + ], + ), + returnValue: _i5.Future.value(0), + ) as _i5.Future); + + @override + _i5.Future runUpdate( + String? statement, + List? args, + ) => + (super.noSuchMethod( + Invocation.method( + #runUpdate, + [ + statement, + args, + ], + ), + returnValue: _i5.Future.value(0), + ) as _i5.Future); + + @override + _i5.Future runDelete( + String? statement, + List? args, + ) => + (super.noSuchMethod( + Invocation.method( + #runDelete, + [ + statement, + args, + ], + ), + returnValue: _i5.Future.value(0), + ) as _i5.Future); + + @override + _i5.Future runCustom( + String? statement, [ + List? args, + ]) => + (super.noSuchMethod( + Invocation.method( + #runCustom, + [ + statement, + args, + ], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future runBatched(_i3.BatchedStatements? statements) => + (super.noSuchMethod( + Invocation.method( + #runBatched, + [statements], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i3.TransactionExecutor beginTransaction() => (super.noSuchMethod( + Invocation.method( + #beginTransaction, + [], + ), + returnValue: _FakeTransactionExecutor_6( + this, + Invocation.method( + #beginTransaction, + [], + ), + ), + ) as _i3.TransactionExecutor); + + @override + _i5.Future close() => (super.noSuchMethod( + Invocation.method( + #close, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); +} diff --git a/drift/test/sentry_database_test.dart b/drift/test/sentry_database_test.dart new file mode 100644 index 0000000000..1a2f594007 --- /dev/null +++ b/drift/test/sentry_database_test.dart @@ -0,0 +1,683 @@ +// ignore_for_file: invalid_use_of_internal_member + +@TestOn('vm') + +import 'package:drift/drift.dart'; +import 'package:drift/native.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:sentry/sentry.dart'; +import 'package:sentry/src/sentry_tracer.dart'; +import 'package:sentry_drift/src/sentry_query_executor.dart'; +import 'package:sentry_drift/src/sentry_transaction_executor.dart'; +import 'package:sentry_drift/src/version.dart'; +import 'package:sqlite3/open.dart'; + +import 'mocks/mocks.mocks.dart'; +import 'test_database.dart'; +import 'utils/windows_helper.dart'; + +void main() { + open.overrideFor(OperatingSystem.windows, openOnWindows); + + final expectedInsertStatement = + 'INSERT INTO "todo_items" ("title", "body") VALUES (?, ?)'; + final expectedUpdateStatement = + 'UPDATE "todo_items" SET "title" = ?, "body" = ? WHERE "title" = ?;'; + final expectedSelectStatement = 'SELECT * FROM todo_items'; + final expectedDeleteStatement = 'DELETE FROM "todo_items";'; + final expectedCloseStatement = 'Close DB: ${Fixture.dbName}'; + final expectedOpenStatement = 'Open DB: ${Fixture.dbName}'; + final expectedTransactionStatement = 'transaction'; + final withinTransactionDescription = 'Within transaction: '; + + void verifySpan( + String description, + SentrySpan? span, { + String origin = SentryTraceOrigins.autoDbDriftQueryExecutor, + SpanStatus? status, + }) { + status ??= SpanStatus.ok(); + expect(span?.context.operation, SentryQueryExecutor.dbOp); + expect(span?.context.description, description); + expect(span?.status, status); + expect(span?.origin, origin); + expect( + span?.data[SentryQueryExecutor.dbSystemKey], + SentryQueryExecutor.dbSystem, + ); + expect( + span?.data[SentryQueryExecutor.dbNameKey], + Fixture.dbName, + ); + } + + void verifyErrorSpan( + String description, + Exception exception, + SentrySpan? span, { + String origin = SentryTraceOrigins.autoDbDriftQueryExecutor, + }) { + expect(span?.context.operation, SentryQueryExecutor.dbOp); + expect(span?.context.description, description); + expect(span?.status, SpanStatus.internalError()); + expect(span?.origin, origin); + expect( + span?.data[SentryQueryExecutor.dbSystemKey], + SentryQueryExecutor.dbSystem, + ); + expect( + span?.data[SentryQueryExecutor.dbNameKey], + Fixture.dbName, + ); + + expect(span?.throwable, exception); + } + + Future insertRow(AppDatabase sut, {bool withError = false}) { + if (withError) { + return sut.into(sut.todoItems).insert( + TodoItemsCompanion.insert( + title: '', + content: '', + ), + ); + } else { + return sut.into(sut.todoItems).insert( + TodoItemsCompanion.insert( + title: 'todo: finish drift setup', + content: 'We can now write queries and define our own tables.', + ), + ); + } + } + + Future updateRow(AppDatabase sut, {bool withError = false}) { + if (withError) { + return (sut.update(sut.todoItems) + ..where((tbl) => tbl.title.equals('doesnt exist'))) + .write( + TodoItemsCompanion( + title: Value('after update'), + content: Value('We can now write queries and define our own tables.'), + ), + ); + } else { + return (sut.update(sut.todoItems) + ..where((tbl) => tbl.title.equals('todo: finish drift setup'))) + .write( + TodoItemsCompanion( + title: Value('after update'), + content: Value('We can now write queries and define our own tables.'), + ), + ); + } + } + + group('adds span', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + + await fixture.setUp(); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('open span is only added once', () async { + final sut = fixture.sut; + + await insertRow(sut); + await insertRow(sut); + await insertRow(sut); + + final openSpansCount = fixture.tracer.children + .where( + (element) => element.context.description == expectedOpenStatement, + ) + .length; + + expect(openSpansCount, 1); + }); + + test('insert adds span', () async { + final sut = fixture.sut; + + await insertRow(sut); + + verifySpan( + expectedInsertStatement, + fixture.getCreatedSpan(), + ); + }); + + test('update adds span', () async { + final sut = fixture.sut; + + await insertRow(sut); + await updateRow(sut); + + verifySpan( + expectedUpdateStatement, + fixture.getCreatedSpan(), + ); + }); + + test('custom adds span', () async { + final sut = fixture.sut; + + await sut.customStatement('SELECT * FROM todo_items'); + + verifySpan( + expectedSelectStatement, + fixture.getCreatedSpan(), + ); + }); + + test('delete adds span', () async { + final sut = fixture.sut; + + await insertRow(sut); + await fixture.sut.delete(fixture.sut.todoItems).go(); + + verifySpan( + expectedDeleteStatement, + fixture.getCreatedSpan(), + ); + }); + + test('transaction adds insert spans', () async { + final sut = fixture.sut; + + await sut.transaction(() async { + await insertRow(sut); + await insertRow(sut); + }); + + final insertSpanCount = fixture.tracer.children + .where( + (element) => + element.context.description == + '$withinTransactionDescription$expectedInsertStatement', + ) + .length; + expect(insertSpanCount, 2); + + verifySpan( + '$withinTransactionDescription$expectedInsertStatement', + fixture.getCreatedSpan(), + origin: SentryTraceOrigins.autoDbDriftTransactionExecutor, + ); + + verifySpan( + expectedTransactionStatement, + fixture.getCreatedSpanByDescription(expectedTransactionStatement), + origin: SentryTraceOrigins.autoDbDriftTransactionExecutor, + ); + }); + + test('transaction adds update spans', () async { + final sut = fixture.sut; + + await sut.transaction(() async { + await insertRow(sut); + await updateRow(sut); + }); + + final updateSpanCount = fixture.tracer.children + .where( + (element) => + element.context.description == + '$withinTransactionDescription$expectedUpdateStatement', + ) + .length; + expect(updateSpanCount, 1); + + verifySpan( + '$withinTransactionDescription$expectedUpdateStatement', + fixture.getCreatedSpan(), + origin: SentryTraceOrigins.autoDbDriftTransactionExecutor, + ); + + verifySpan( + expectedTransactionStatement, + fixture.getCreatedSpanByDescription(expectedTransactionStatement), + origin: SentryTraceOrigins.autoDbDriftTransactionExecutor, + ); + }); + + test('transaction adds delete spans', () async { + final sut = fixture.sut; + + await sut.transaction(() async { + await insertRow(sut); + await fixture.sut.delete(fixture.sut.todoItems).go(); + }); + + final deleteSpanCount = fixture.tracer.children + .where( + (element) => + element.context.description == + '$withinTransactionDescription$expectedDeleteStatement', + ) + .length; + expect(deleteSpanCount, 1); + + verifySpan( + '$withinTransactionDescription$expectedDeleteStatement', + fixture.getCreatedSpan(), + origin: SentryTraceOrigins.autoDbDriftTransactionExecutor, + ); + + verifySpan( + expectedTransactionStatement, + fixture.getCreatedSpanByDescription(expectedTransactionStatement), + origin: SentryTraceOrigins.autoDbDriftTransactionExecutor, + ); + }); + + test('transaction adds custom spans', () async { + final sut = fixture.sut; + + await sut.transaction(() async { + await insertRow(sut); + await sut.customStatement('SELECT * FROM todo_items'); + }); + + final customSpanCount = fixture.tracer.children + .where( + (element) => + element.context.description == + '$withinTransactionDescription$expectedSelectStatement', + ) + .length; + expect(customSpanCount, 1); + + verifySpan( + '$withinTransactionDescription$expectedSelectStatement', + fixture.getCreatedSpan(), + origin: SentryTraceOrigins.autoDbDriftTransactionExecutor, + ); + + verifySpan( + expectedTransactionStatement, + fixture.getCreatedSpanByDescription(expectedTransactionStatement), + origin: SentryTraceOrigins.autoDbDriftTransactionExecutor, + ); + }); + + test('transaction rollback adds span', () async { + final sut = fixture.sut; + + await insertRow(sut); + await insertRow(sut); + + try { + await sut.transaction(() async { + await insertRow(sut, withError: true); + }); + } catch (_) {} + + verifySpan( + expectedTransactionStatement, + fixture.getCreatedSpan(), + origin: SentryTraceOrigins.autoDbDriftTransactionExecutor, + status: SpanStatus.aborted(), + ); + }); + + test('batch adds span', () async { + final sut = fixture.sut; + + await sut.batch((batch) async { + await insertRow(sut); + await insertRow(sut); + }); + + verifySpan( + 'batch', + fixture.getCreatedSpan(), + origin: SentryTraceOrigins.autoDbDriftTransactionExecutor, + ); + }); + + test('close adds span', () async { + final sut = fixture.sut; + + await sut.close(); + + verifySpan( + 'Close DB: ${Fixture.dbName}', + fixture.getCreatedSpan(), + ); + }); + + test('open adds span', () async { + final sut = fixture.sut; + + // SentryDriftDatabase is by default lazily opened by default so it won't + // create a span until it is actually used. + await sut.select(sut.todoItems).get(); + + verifySpan( + expectedOpenStatement, + fixture.getCreatedSpanByDescription(expectedOpenStatement), + ); + }); + }); + + group('does not add span', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + + await fixture.setUp(); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('does not add open span if db is not used', () async { + fixture.sut; + + expect(fixture.tracer.children.isEmpty, true); + }); + + test('batch does not add span for failed operations', () async { + final sut = fixture.sut; + + try { + await sut.batch((batch) async { + await insertRow(sut, withError: true); + await insertRow(sut); + }); + } catch (_) {} + + expect(fixture.tracer.children.isEmpty, true); + }); + }); + + group('adds error span', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.mockLazyDatabase.ensureOpen(any)) + .thenAnswer((_) => Future.value(true)); + + await fixture.setUp(injectMock: true); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('throwing runInsert throws error span', () async { + when(fixture.mockLazyDatabase.runInsert(any, any)) + .thenThrow(fixture.exception); + + try { + await insertRow(fixture.sut); + } catch (exception) { + expect(exception, fixture.exception); + } + + verifyErrorSpan( + expectedInsertStatement, + fixture.exception, + fixture.getCreatedSpan(), + ); + }); + + test('throwing runUpdate throws error span', () async { + when(fixture.mockLazyDatabase.runUpdate(any, any)) + .thenThrow(fixture.exception); + + try { + await updateRow(fixture.sut); + } catch (exception) { + expect(exception, fixture.exception); + } + + verifyErrorSpan( + expectedUpdateStatement, + fixture.exception, + fixture.getCreatedSpan(), + ); + }); + + test('throwing runCustom throws error span', () async { + when(fixture.mockLazyDatabase.runCustom(any, any)) + .thenThrow(fixture.exception); + + try { + await fixture.sut.customStatement('SELECT * FROM todo_items'); + } catch (exception) { + expect(exception, fixture.exception); + } + + verifyErrorSpan( + expectedSelectStatement, + fixture.exception, + fixture.getCreatedSpan(), + ); + }); + + test('throwing transaction throws error span', () async { + final mockTransactionExecutor = MockTransactionExecutor(); + when(mockTransactionExecutor.beginTransaction()) + .thenThrow(fixture.exception); + + try { + // We need to move it inside the try/catch becaue SentryTransactionExecutor + // starts beginTransaction() directly after init + final SentryTransactionExecutor transactionExecutor = + SentryTransactionExecutor( + mockTransactionExecutor, + fixture.hub, + dbName: Fixture.dbName, + ); + + when(fixture.mockLazyDatabase.beginTransaction()) + .thenReturn(transactionExecutor); + + await fixture.sut.transaction(() async { + await insertRow(fixture.sut); + }); + } catch (exception) { + expect(exception, fixture.exception); + } + + verifyErrorSpan( + expectedTransactionStatement, + fixture.exception, + fixture.getCreatedSpan(), + origin: SentryTraceOrigins.autoDbDriftTransactionExecutor, + ); + }); + + test('throwing batch throws error span', () async { + final mockTransactionExecutor = MockTransactionExecutor(); + when(mockTransactionExecutor.beginTransaction()) + .thenThrow(fixture.exception); + + // We need to move it inside the try/catch becaue SentryTransactionExecutor + // starts beginTransaction() directly after init + final SentryTransactionExecutor transactionExecutor = + SentryTransactionExecutor( + mockTransactionExecutor, + fixture.hub, + dbName: Fixture.dbName, + ); + + when(fixture.mockLazyDatabase.beginTransaction()) + .thenReturn(transactionExecutor); + + when(fixture.mockLazyDatabase.runInsert(any, any)) + .thenAnswer((realInvocation) => Future.value(1)); + + try { + await fixture.sut.batch((batch) async { + await insertRow(fixture.sut); + }); + } catch (exception) { + expect(exception, fixture.exception); + } + + verifyErrorSpan( + expectedTransactionStatement, + fixture.exception, + fixture.getCreatedSpan(), + origin: SentryTraceOrigins.autoDbDriftTransactionExecutor, + ); + }); + + test('throwing close throws error span', () async { + when(fixture.mockLazyDatabase.close()).thenThrow(fixture.exception); + when(fixture.mockLazyDatabase.runInsert(any, any)) + .thenAnswer((_) => Future.value(1)); + + try { + await insertRow(fixture.sut); + await fixture.sut.close(); + } catch (exception) { + expect(exception, fixture.exception); + } + + verifyErrorSpan( + expectedCloseStatement, + fixture.exception, + fixture.getCreatedSpan(), + ); + + when(fixture.mockLazyDatabase.close()).thenAnswer((_) => Future.value()); + }); + + test('throwing ensureOpen throws error span', () async { + when(fixture.mockLazyDatabase.ensureOpen(any)) + .thenThrow(fixture.exception); + + try { + await fixture.sut.select(fixture.sut.todoItems).get(); + } catch (exception) { + expect(exception, fixture.exception); + } + + verifyErrorSpan( + expectedOpenStatement, + fixture.exception, + fixture.getCreatedSpanByDescription(expectedOpenStatement), + ); + }); + + test('throwing runDelete throws error span', () async { + when(fixture.mockLazyDatabase.runDelete(any, any)) + .thenThrow(fixture.exception); + + try { + await fixture.sut.delete(fixture.sut.todoItems).go(); + } catch (exception) { + expect(exception, fixture.exception); + } + + verifyErrorSpan( + expectedDeleteStatement, + fixture.exception, + fixture.getCreatedSpan(), + ); + }); + }); + + group('integrations', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + + await fixture.setUp(); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('adds integration', () { + expect( + fixture.options.sdk.integrations.contains('SentryDriftTracing'), + true, + ); + }); + + test('adds package', () { + expect( + fixture.options.sdk.packages.any( + (element) => + element.name == packageName && element.version == sdkVersion, + ), + true, + ); + }); + }); +} + +class Fixture { + final options = SentryOptions(); + final hub = MockHub(); + static final dbName = 'people-drift-impl'; + final exception = Exception('fixture-exception'); + final _context = SentryTransactionContext('name', 'operation'); + late final tracer = SentryTracer(_context, hub); + late AppDatabase sut; + final mockLazyDatabase = MockLazyDatabase(); + + Future setUp({bool injectMock = false}) async { + sut = AppDatabase(openConnection(injectMock: injectMock)); + } + + Future tearDown() async { + await sut.close(); + } + + SentrySpan? getCreatedSpan() { + return tracer.children.last; + } + + SentrySpan? getCreatedSpanByDescription(String description) { + return tracer.children + .firstWhere((element) => element.context.description == description); + } + + SentryQueryExecutor openConnection({bool injectMock = false}) { + if (injectMock) { + final executor = + SentryQueryExecutor(() => mockLazyDatabase, databaseName: dbName); + executor.setHub(hub); + return executor; + } else { + return SentryQueryExecutor( + () { + return NativeDatabase.memory(); + }, + hub: hub, + databaseName: dbName, + ); + } + } +} diff --git a/drift/test/sqlite3.dll b/drift/test/sqlite3.dll new file mode 100644 index 0000000000000000000000000000000000000000..1239c35203c895f202e5ee6be32b214dab4898df GIT binary patch literal 3123712 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 z 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 av?>m291LcTF1={ZKU16c#ItIq=U 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

X+`x~9cU+RWUJ!i<+;c)OuBV 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ϯ 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%0A8;;mI3 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,=6m4_ZTSBUWGSG*yw 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

eFUBoX0%w~r9E1ZDy7wv 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%0A*uaNak-zVQ(Huh2_Dvg53VM}n;OzvfHS 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%0DfMU7g^eMYM9uoG7LVH*-*Rmm#L;$AVOpaj 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 sIJ><|Dm3TakA$`CSp0MHJzIbshr}=a^ z#3%rg`UAj;y#bJXyZ|UW`kdve&t>i^*5<>kAAGPYZu9@{Tf5{qGuy{uzRSB#S#c}a zA5ydwZb~wWvL62}@vP#GR}c^G{#)Jr4df5I+sSX=DU**p_Vlv8M@lETb@02y5UzBZL&@QjYJd{x$ionSJ2>mv}8Db zQ_HT{aykFmd|6wu$(oAf(^gRTMyqJA+^)Bqjz;g{N!f?*;8>HUmQnk6AwD?0h9}Ox zNbU@f-X}e*eyA^cczSLZdMK^4{&>I<%QWx^BkKT4^`Pke?ULwFG(g3-8T#$(B<)x6 zx}EI7$IoUYKJ3V6-x32A1xw6^!=I5##>ob+mYSj3A-Nbi@sl-)1AJDu;VHM`^fZt28iiF--A`+vD0_UleU7R zWm>AU9u!}5>y$b8-+hB%D@yPK-&2Vn8>D8<5DDs3(=b%nGLV7NqO)L`~7(fIMUSx9V!?8WHu}zn~9fRL$mkEFruGW(fI|sW?pd;6sLh<;#JvWdt+4@GaR%cMNtUDWtvoU9{r^ zLfqbxTI>M4ED#+QF!%m98S7i#W>+hb=sxHBKI!q&`}?BD(%TZ~G5l?y$-~tzW|wb|I9<3Eso4W5*Qmtf zKuSxx16RucC|2BSdGK`ASp+qVX-iQe6*gP$ z{zr#gQyNFElHklCD={awQXVS9Ob0VIm(KUQ!bHrWfU)MWzsb3pco29%NwoB z(2Ll-E7GT zZy2!KiBshODi##`!|#j=`A#jePq4nd3mLbWuu6w_?26^BiC`s!9w424qyUw98yshW z_N~r!VApSTiwV6mymwS^in+o1Dc@K%5r7G7e-HQO$>sse+R4o((`w(E_eow$-rcR!3WlfW@BE%%gx{;@xHQV zL#bBUsK;F&5+7?eRH{7mV@0Ehd8&?=tvs>)OuUD0aAs@H*6XcgEZx)0t^SO<@ZMx% zi|qCCtkN^;{ASZuE4;^-u~iT6VFyAdo?AwPo)H(1ZVx&a7H?O1e5?qV4Q9jX9%P-= z;?Jw6YO^7)-mTNzKEA8(o4m>xXLrr@I{%qFM%c8|JPoz8O-sa&Qy@1kHzbD6`W+@koO(YIU^64H=ohF13 zFInG`Ls6%k_D9yB8EMj1)iLqxT)pZ@=R@)V^}Nz4(JO0q5)q!J+JP0p?LJmx=M&9jfFLIIeP@w zo+auDCa^OqF;5{{iC^8dXA=t@cde7gPmQ<{ze7~ zP?zn6t&r+epjfMZUvl1d7NIh>=y@ASlxH;sP0PR<3T%_tm9^+;`acoyZhY3)BlLsl z=;$MVMk6EVN&!@_ZyBD~2-$;!;Ava|m!o+bg9A#jiM5C8t34ph9;B~^4Ln3UTrCJh zh^-PBfu4pNrsuq#=hBMgoW2_Q%DD-`Mx>FCv$Hgh{b3C^W^xlIB|4hegF5WdHg%$HPG z$R9doNH4f|ND4w~WOe}!HDc&4m|asDK3F36U=+!*S}+V5HERBzR{UT{`l6#FPH{Uz zE7-PD@Xu?Nkkgu#B{Yh^B=u;C5*y7E0R)B>Zf$^D6U00K(PIuD3NK_kU0JYAF`J(W zcACQpN*bdtMK5(ZLN%^~BNRZ2BO0J*IAT520GZ6BnTjR!yoTVJ4o{45cp^(LhG+P? zR=NRFGB?@-S1FE2HaF-*H9*YmLvVnoyzOv2^4EMzuJ=0}SMcU=WQRm1e1P+r$H7+KOxf^86-6OIZ z6GjAe{T{CxDjCT1tyV@Obnb1c-|O>dFoeSVbyR!=>J|OTF_)7b%9SofkU|~cu6|z* z!iq)|v}J5jJ>?M1vkGsG#hZhp^x};U@5&ktysP#IK)8xW2_LQ!!Z91372MNfh%agk zo>9CecoIDnq?_tOIed+-w1;vn;hM=cm#dFD*J-Qwdgi36&>OawZ}6OSyX3q9Pj2Li z0LR*j!<8AEx%aA^*T~txlW$JyO1_R1q@K!*Mv_vb@Ef98G|bYD;)eZu<_^o|Ee!fQ&}T z_DO&+dfj|S+2 z!Cl81bC)w6!kksGTVJ+cUuOB2eNeLOV5w~UmR2`~e8h$sZ;jueW^)XP&{=ShW7%}d z6G7@}|YYllVL=W~Opt5U#= zeg0!<-12FUedc36ZlQCJJyNAq*YgZBLDw92pmOpWy$p^$#HkCrtnM1on}264{d+U7 zX=lx5)iq_z4e{yWD8pQ|#QcB-o)5Ia(|=2Zu3vC-{V%jJADBC>Ke4LAld=aduP4D*tBWt~toclYQ$D&bjVQivVx?LfRwMEQw%kK|2zXhzJ_2EXes7;a5?Siss={y&crFS{_`>EA|zYT9H z{4HneA`yRl>J1lv+Y|8j6IMzU{=Uym2mWkUMg)KJz+bB1Z`T_R{sguT{DH&;&7Thv z;kmMC%GO$+M@(LDb;4Me z+yvXK@&Tv6dQWg@KwJH{fpfB~r&aDJEtin{7vV8~_1jwY(}E64q-){-;5K?$s&zL7 z1Lj(#Dq}{EhUJnl`5C7HYnRlIiMMuVSWXwBX zvchE9|I(51D>CNhNyfJ&V@yYeDH-XKah_yoa(5$N9}Vf8M%aYH3Xyx>s9uQ>pe$lfJBx z>Bgq5mdKTo>eqs4+G=Z*JP>bb>}#P7EHRDi_F16B9J&;_lBHdB;g=p)m?1^lNt4zi z&XLYd!BVU81trgiJMui;k>}_7&p%vR4bPMm{#jWK21m->V|0HgwWOMgSfong;(SMc zKARk2VGk`2;+nGA`qnm~v`|Ia#L-zhHEZRj$m9pCe7& z-FO(%T=s!=bAQ3M=d+lQN2d8$FwBm~!I^T&#AQ00GyHgXp3q`-VZ)b1QnH&w5Cus} zc3k6CsUJE?K9YQHDg1$?R2oTXZqjlmDI0Og&kI$j5^}tKOM#BolYJiX?>aIDvZCW= zq;<(iXYS%=__}0dcAQ@ z@=%%`HZpx}4cQ$J$!!g}9S=#I?I}vI$gQuqa_bCNZVeK-g`z?gXFGs#3={r`5$sw`ZiwDp8B^_mgbJ~;50|lKvj`ph6=+*Zc=zriAT0(OS4zA zni4yeNXrAXJ(?6SK$C>{Bad%EcTMF)D0BFrlw}i+4;tS0)LK$q`+>%-Xb+ zgD?_apPp?_n&}psr0S9Q*^!D0E5JfAW{}bHY;&_eIw^_s&r1l6NcC-cT6QqS&{h|u za+~Jd4&>J7+@^Dz?A&H>OZ-$Rn`tJ6o4vt&IY@q#{29dVTWE~2G(*iXMoF10{)`>O zxhdQalKU*MwlpvH3znS(A*rTb5g8zu)GG{U&DdRyjjM?N6T81(ymS%XS8Tr?Wsz~i zF^x}P|G%KnbY*{usjALOIZ-UUQ`i*^_> zwSIH_bB=)gcI-2muX6YEVLCn%| zY=S`eviDMYL8SDf$n{&SuT#Hlj9ANo2$edOk8NjjT0Yil|L_>P$4nVto#yGZ<&iz* zVb+>W9kx8D);YF3X?JC1Qj*{$-BI{rYfOi))H0HQ?COleQA7xV1ksH+u z^_2spKy=vqSD+vlRkX_H4#wHrq&kAF&bK_Amt$6NYD+w+E;j%(g_tr&a;dGw06G1_ zfV)4_ZO>%s0cik{y#ayfn^{j?PeX|B@Nb40Zgw00bvfttI>R&_;F>sTjt%v})(@W* zfon<))>}fLrs=@jQR3Ew5=)qmP(muTu1ZLss_w&a)LbGTn?%7h!PU~1!&3fCr+hX^ z&sULPjNNPvanf?67>_>ZQL3>HtX7{A{8<0~Huus08pHi_4zd>%a@5h{uL{C1X_Z6O zByec(1c52bdQQDM$a-3?;U(Z7GsDZle^W4BN~BmnQ#tDh7`r~#2)~;YdXhc-?lV{> zuQ#^bM#+A4%`q2}W{m`zab<8U3%A)T0n^i})i1q{n^@f%wrFEZ5_AU2pQi$q@>2U$ zUZUrDFUM3bEQh(WtQrOaF-v%Am7t(U>|6QfNxZ&NUgzCGm^*ZQv9bFXSw}!l@s4xs zypDZnt3N4_$T>a|7^yl~C;lAgo%nN{LY(JB?s>Ap(&+4+hs-8&w}2rtO?gkGmJpDh=*-x1s@Ipqj)dwqNdR5j!X zP4LS}R(1NSx4^*Us4uD1eEC5H$<>@6HMU{v0b|w{?9zPxu|v~?Un;HH7BynJ7HEp$ z__vL%3BMMo^B31IUJDg<(rM!7y34IjH@_C_UtiRNF&3G-&_Q#ZC93eo2-2=s-ZO{IyuSyV-G{8y4R0Sl6A*VLLUmTUQ)1| zu3YixuGmpK^4|9BkI(X0XS1tMXP(uiGhLGHiVN3wdg`p|_8i^>FFTD1e+4abwt^Vl ztX@BR`&k})T_VXH@m^xd-~T5EA98QT?<0Bv5?|1 z=o9a|ygQ)xce|9?`(M4bLFBWw;yLnqvk#i|ybugpsacZQQwLJ-F6iss0iEv-?c?2v zeZ9NkFYb4Z6dAgEzOKd$OM+R&r)o zXFRnl_FNTTQ%AzX$kSD3nQ2)WWZ{58n(n5xTJ2B9)6Q`!q1;wLMnPRe2qhOSR8 z91(g=H&X-AdzSLDVcswORF3so65UY3#|xFSAvgKTd%2*A+gyLNB*}UjEmb=1QATpA zFrv}ks$gG?HPF5)vSz!L+~8Cah(<+s;oEo|syo(p%Eg?vZ1hZtgM+swalYoG!OEw{ z@KzvNBZ_ZjBuB5kVM*=vOZ3`@t4OH*x%?HHxS4~rE3`Ww=P{1O%gfDmM)W80g|e}0 z%lRseTqQ3!JNeP2;&&K6aQ-};MOHM}$>y3$J(48B_4L}z?AmniCd2#M(t~UucouK7 zuaq85#QtQbn!;<6f`!^M>Dn`sl8PJWoo>vkuPlw+TPok3RC{;6e6aTJF>>*4atbZp zEn)ZyPYMxER<#OW6)hVrFdC6!x-82w$DhqjIc{|NBV;}yskxGpPf8srTO_4KQYuJk zCWQlI2A9qZgx{^ALdj^AS|!m#3H3771@a{&mlX9f)deafrG%83@|Jp<8Hkk5Hud>> zq;$TvLSG1KN*C(po$~<;-)@@4xi4x zr^3xCk(`-sPQ?e3HQUXa$%o=Ht zmK~LbIFQyzJAeaNqtXfo+8SvCslXeR7B~>s$oB|Fx1Sp@a;I2_$2J&S! z^4;3f#fJF<`K*l7mpZC`Qt`UbM3NI{Xf=NjiSq+#6C7A&g`DS{`14K9v(#i=t?m(P z5!ml8RXHQfOit94k>+O7q~<{MPN5B+RHe}x_erXxSViQLG#fM7GNfY~6$TK19(CPh z9e7+C^ODud)qDeSWxXwTYwU8S84fUN!j4mF$`31<#zY=esgWeLtwHL~zNJzXgps9A z15&r)?_+edks2Meh=b8tCOEs$drXI)vA<_V@)CGwUzHJ6l2os@H( z6b_-yDsfUqIw|?2jCWGfos>dS#yKemey8dwA>}kDWlqZ~&`J|lSq&%!rOvQ@DSt(9p#7V4$^eK5@s)8lxB+9&)MB7QcQ4*O@9_?(m z{*Z|~r|7WZ*5iAg=HF3EOC-=sq`bB4)I|pfyIEGWssyx$MsZ`v&G6C!PGY-o&84Vx z(FbJ-tK}LL6#Y3eJ*yw!kB$I&9~BW53^U?iKSs-$xTWdl+7^zq_B_iEPJhXK*=kay z%FJeK38l(w{>o8vqQCKAZz(VOi+owDzKmfVmpYMC54bNJur5m-au=jmytSDQbmD~f=(`m1J647WAs%{oRu#5 z89S_>k)I(R`mKBerQ}3v>G%@$FCbrEl_ROq?-r6Hrz+=4`HUSn%(ht9r~(yklQIYm z!`G*jI8BXCd(tXW1*UZ?V8jbNVdW$?p+aAEQbH37wpj<85?VM-Up1m@_O8V2uj;F= z?3(?on?2@h>r%v8l$bqTUv*X2>>CoZzoxJHYS-+E ziP=}_tFGvpolACSXT~wdpeLOio%XI3Ym@@2UlqO`)Xt6K*+Pn{l9HMoPRQ^vL)RAst#;GK$v-Flv~LX;6Ixl@=}U!^)zGF5#LqV)4LDYGVc zw$SgJfF{>Fey!-(x=mf#>*cyq_^L(1K?ls~o@L2$E|hpCMvX012M5j@UYqW)UcmdR zWOBlAnB0qtLl$Ar^<@U}O4G_w(Ak;Z@07GL5=rr1lIB@mMM)wtpp$9YMmA~`dQeHO zXkt9)^Na>mQo=I|pHabc1AKRy4y~wd_n@%)~d$pPdaRhi79lr({7O`mjg` zb&e-{7%b4S`H0VXL{5;ETZ&)Ca;DtQ;C6;{JCoa)rIB&OnT-X#rI9ZO%sX499%rk7 zJ@9*))nijI*VU?IdyKF{8CKD+1b-^uI*0r6$Y11D2^RPp^-`oDetJ93cXQA+7L;Iu z;>4EJuls*vORPUbz!zR-85^!!ZOtXp%-VD#)}YAq-8GOVmS5dT)85miO`J} z840KP)$lm|--TDE61yPl5+`M{lftnKSreR;^PH3!q|9+rMmZ@nN%@wOk|inOqm8JJ ztpG%OGt@epc#QF}l7X@SlQN^xFk6hsj4ejdgKBsj#f=&;hx^S>7$<)=S-g^er^dQ248n9{rHhxu@*UdN{;}`&jl#0`h5P%I(W7FPP4U%VlrT>@wZ;yd6DMok&&a7 zW3ypCCvWPj29c@;5rPEi=4;k9tjjY1<1xUte!>8ZgB#h5z(o`g*(q*z(J9&bs_b|T zB7vzPhXPK$s!)6&K!i9V`Xj5YK}x9lrJ8sNB#TqxL+cevAbgnxZL)G1Pv!a#V3Qfo zM_l#rChj-4yeIKeIriGlaw&OeZF<1_nnTH@k&8+r7mT*AgrfKLLec1`DG%wWNwWW* z@>6v;1=*K!zjKT1OL@h)MfRm^b#9S;7nPZB8D>p<8;2cD-ikI0zF><}6QtfSH{F`3 z8ei_Q#&c5^`L(<&5z(KMw*rw6G{^!D^DE@uEy%q&iE{7A?t)$T@_*aIamyLzFW!fp z`HNa1Z23M2d-289#K7~k%ysVBeDJh<+qs87JuNpl_o|F2F_c$jrl|W~*Rdb|xrm!Q zS&vOr;tjS&iKn7Aa1!T4N=H}wWJdI2_LkUe+#F6V=9}E#|DrNkaG4cEA>NJDa(g+i zqFKP|8?9e%m699n-33kS!?IT@^;&hj&~*duD1>s9IY^oLlr*@^+*8nIM5beGOZ0@$ z0qdea!lSGrucYPv=;HJI(eI|}(aX22JU#HE(d~Q8`ciZASmJ!H!`Z7r`IF*fa7$h4 z*v3Hg;ul4!Q!WD5D=cznw3bFMKWIcRDWtqAtK@?evi_vj6qgB|;pXmE5X|=&|)Ivn6RYS0YnOql*elqqn{ii2ix>7AYLP{RFnMX=I9lOZ0dYiy+rhEDON~R{pLo0^wyoKoZCp5 zWX+`Ffd6M~nbf>v7o@;Km3RJ#7x}Z(+Wk5~n0luNy zGstPrf_5n*!wnye*AXwXk9`gY4^l{o>RB%%3SW!2T3Y;qD&>z(9U!G

On(^GKhl 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 integer().autoIncrement()(); + TextColumn get title => text().withLength(min: 6, max: 32)(); + TextColumn get content => text().named('body')(); + IntColumn get category => integer().nullable()(); +} + +@DriftDatabase(tables: [TodoItems]) +class AppDatabase extends _$AppDatabase { + AppDatabase(super.e); + + @override + int get schemaVersion => 1; +} diff --git a/drift/test/test_database.g.dart b/drift/test/test_database.g.dart new file mode 100644 index 0000000000..65430026da --- /dev/null +++ b/drift/test/test_database.g.dart @@ -0,0 +1,269 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'test_database.dart'; + +// ignore_for_file: type=lint +class $TodoItemsTable extends TodoItems + with TableInfo<$TodoItemsTable, TodoItem> { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + $TodoItemsTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _idMeta = const VerificationMeta('id'); + @override + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + static const VerificationMeta _titleMeta = const VerificationMeta('title'); + @override + late final GeneratedColumn title = GeneratedColumn( + 'title', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 6, maxTextLength: 32), + type: DriftSqlType.string, + requiredDuringInsert: true); + static const VerificationMeta _contentMeta = + const VerificationMeta('content'); + @override + late final GeneratedColumn content = GeneratedColumn( + 'body', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + static const VerificationMeta _categoryMeta = + const VerificationMeta('category'); + @override + late final GeneratedColumn category = GeneratedColumn( + 'category', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + @override + List get $columns => [id, title, content, category]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'todo_items'; + @override + VerificationContext validateIntegrity(Insertable instance, + {bool isInserting = false}) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('id')) { + context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); + } + if (data.containsKey('title')) { + context.handle( + _titleMeta, title.isAcceptableOrUnknown(data['title']!, _titleMeta)); + } else if (isInserting) { + context.missing(_titleMeta); + } + if (data.containsKey('body')) { + context.handle(_contentMeta, + content.isAcceptableOrUnknown(data['body']!, _contentMeta)); + } else if (isInserting) { + context.missing(_contentMeta); + } + if (data.containsKey('category')) { + context.handle(_categoryMeta, + category.isAcceptableOrUnknown(data['category']!, _categoryMeta)); + } + return context; + } + + @override + Set get $primaryKey => {id}; + @override + TodoItem map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return TodoItem( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + title: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}title'])!, + content: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}body'])!, + category: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}category']), + ); + } + + @override + $TodoItemsTable createAlias(String alias) { + return $TodoItemsTable(attachedDatabase, alias); + } +} + +class TodoItem extends DataClass implements Insertable { + final int id; + final String title; + final String content; + final int? category; + const TodoItem( + {required this.id, + required this.title, + required this.content, + this.category}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['title'] = Variable(title); + map['body'] = Variable(content); + if (!nullToAbsent || category != null) { + map['category'] = Variable(category); + } + return map; + } + + TodoItemsCompanion toCompanion(bool nullToAbsent) { + return TodoItemsCompanion( + id: Value(id), + title: Value(title), + content: Value(content), + category: category == null && nullToAbsent + ? const Value.absent() + : Value(category), + ); + } + + factory TodoItem.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return TodoItem( + id: serializer.fromJson(json['id']), + title: serializer.fromJson(json['title']), + content: serializer.fromJson(json['content']), + category: serializer.fromJson(json['category']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'title': serializer.toJson(title), + 'content': serializer.toJson(content), + 'category': serializer.toJson(category), + }; + } + + TodoItem copyWith( + {int? id, + String? title, + String? content, + Value category = const Value.absent()}) => + TodoItem( + id: id ?? this.id, + title: title ?? this.title, + content: content ?? this.content, + category: category.present ? category.value : this.category, + ); + @override + String toString() { + return (StringBuffer('TodoItem(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('content: $content, ') + ..write('category: $category') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, title, content, category); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is TodoItem && + other.id == this.id && + other.title == this.title && + other.content == this.content && + other.category == this.category); +} + +class TodoItemsCompanion extends UpdateCompanion { + final Value id; + final Value title; + final Value content; + final Value category; + const TodoItemsCompanion({ + this.id = const Value.absent(), + this.title = const Value.absent(), + this.content = const Value.absent(), + this.category = const Value.absent(), + }); + TodoItemsCompanion.insert({ + this.id = const Value.absent(), + required String title, + required String content, + this.category = const Value.absent(), + }) : title = Value(title), + content = Value(content); + static Insertable custom({ + Expression? id, + Expression? title, + Expression? content, + Expression? category, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (title != null) 'title': title, + if (content != null) 'body': content, + if (category != null) 'category': category, + }); + } + + TodoItemsCompanion copyWith( + {Value? id, + Value? title, + Value? content, + Value? category}) { + return TodoItemsCompanion( + id: id ?? this.id, + title: title ?? this.title, + content: content ?? this.content, + category: category ?? this.category, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (title.present) { + map['title'] = Variable(title.value); + } + if (content.present) { + map['body'] = Variable(content.value); + } + if (category.present) { + map['category'] = Variable(category.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('TodoItemsCompanion(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('content: $content, ') + ..write('category: $category') + ..write(')')) + .toString(); + } +} + +abstract class _$AppDatabase extends GeneratedDatabase { + _$AppDatabase(QueryExecutor e) : super(e); + late final $TodoItemsTable todoItems = $TodoItemsTable(this); + @override + Iterable> get allTables => + allSchemaEntities.whereType>(); + @override + List get allSchemaEntities => [todoItems]; +} diff --git a/drift/test/utils/windows_helper.dart b/drift/test/utils/windows_helper.dart new file mode 100644 index 0000000000..e77fb03bed --- /dev/null +++ b/drift/test/utils/windows_helper.dart @@ -0,0 +1,8 @@ +import 'dart:ffi'; +import 'dart:io'; + +DynamicLibrary openOnWindows() { + final scriptDir = File(Platform.script.toFilePath()).parent; + final libraryNextToScript = File('${scriptDir.path}/test/sqlite3.dll'); + return DynamicLibrary.open(libraryNextToScript.path); +} diff --git a/e2e_test/bin/e2e_test.dart b/e2e_test/bin/e2e_test.dart index 785f98ea72..d8d315c5e3 100644 --- a/e2e_test/bin/e2e_test.dart +++ b/e2e_test/bin/e2e_test.dart @@ -20,7 +20,7 @@ void main(List arguments) async { } final options = SentryOptions(dsn: _exampleDsn) // ignore: invalid_use_of_internal_member - ..devMode = true; + ..automatedTestMode = true; await Sentry.init( (options) { options.dsn = _exampleDsn; diff --git a/file/class-diagram.svg b/file/class-diagram.svg new file mode 100644 index 0000000000..e8497bd57d --- /dev/null +++ b/file/class-diagram.svg @@ -0,0 +1,111 @@ + + + + + + + + +cluster~ + +file + + +cluster~/lib + +lib + + +cluster~/lib/src + +src + + + +/lib/sentry_file.dart + +sentry_file + + + +/lib/src/sentry_file.dart + +sentry_file + + + +/lib/sentry_file.dart->/lib/src/sentry_file.dart + + + + + +/lib/src/sentry_io_overrides.dart + +sentry_io_overrides + + + +/lib/sentry_file.dart->/lib/src/sentry_io_overrides.dart + + + + + +/lib/src/sentry_io_overrides_integration.dart + +sentry_io_overrides_integration + + + +/lib/sentry_file.dart->/lib/src/sentry_io_overrides_integration.dart + + + + + +/lib/src/sentry_file_extension.dart + +sentry_file_extension + + + +/lib/sentry_file.dart->/lib/src/sentry_file_extension.dart + + + + + +/lib/src/version.dart + +version + + + +/lib/src/sentry_file.dart->/lib/src/version.dart + + + + + +/lib/src/sentry_io_overrides.dart->/lib/sentry_file.dart + + + + + +/lib/src/sentry_io_overrides_integration.dart->/lib/src/sentry_io_overrides.dart + + + + + +/lib/src/sentry_file_extension.dart->/lib/sentry_file.dart + + + + + diff --git a/file/lib/src/sentry_file.dart b/file/lib/src/sentry_file.dart index 4b7659dc0c..de0004c938 100644 --- a/file/lib/src/sentry_file.dart +++ b/file/lib/src/sentry_file.dart @@ -215,7 +215,8 @@ import 'version.dart'; typedef Callback = FutureOr Function(); /// The Sentry wrapper for the File IO implementation that creates a span -/// out of the active transaction in the scope. +/// out of the active transaction in the scope and a breadcrumb, which gets +/// added to the hub. /// The span is started before the operation is executed and finished after. /// The File tracing isn't available for Web. /// @@ -228,7 +229,7 @@ typedef Callback = FutureOr Function(); /// final sentryFile = SentryFile(file); /// // span starts /// await sentryFile.writeAsString('Hello World'); -/// // span finishes +/// // span finishes, adds breadcrumb /// ``` /// /// All the copy, create, delete, open, rename, read, and write operations are @@ -425,8 +426,13 @@ class SentryFile implements File { span?.origin = SentryTraceOrigins.autoFile; span?.setData('file.async', true); + + final Map breadcrumbData = {}; + breadcrumbData['file.async'] = true; + if (_hub.options.sendDefaultPii) { span?.setData('file.path', absolute.path); + breadcrumbData['file.path'] = absolute.path; } T data; try { @@ -453,6 +459,7 @@ class SentryFile implements File { if (length != null) { span?.setData('file.size', length); + breadcrumbData['file.size'] = length; } span?.status = SpanStatus.ok(); @@ -462,6 +469,14 @@ class SentryFile implements File { rethrow; } finally { await span?.finish(); + + await _hub.addBreadcrumb( + Breadcrumb( + message: desc, + data: breadcrumbData, + category: operation, + ), + ); } return data; } @@ -475,8 +490,12 @@ class SentryFile implements File { span?.origin = SentryTraceOrigins.autoFile; span?.setData('file.async', false); + final Map breadcrumbData = {}; + breadcrumbData['file.async'] = false; + if (_hub.options.sendDefaultPii) { span?.setData('file.path', absolute.path); + breadcrumbData['file.path'] = absolute.path; } T data; @@ -504,6 +523,7 @@ class SentryFile implements File { if (length != null) { span?.setData('file.size', length); + breadcrumbData['file.size'] = length; } span?.status = SpanStatus.ok(); @@ -513,6 +533,14 @@ class SentryFile implements File { rethrow; } finally { span?.finish(); + + _hub.addBreadcrumb( + Breadcrumb( + message: desc, + data: breadcrumbData, + category: operation, + ), + ); } return data; } diff --git a/file/lib/src/version.dart b/file/lib/src/version.dart index 5b59773228..a2a31b3a5e 100644 --- a/file/lib/src/version.dart +++ b/file/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '7.9.0'; +const String sdkVersion = '7.16.0'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_file'; diff --git a/file/pubspec.yaml b/file/pubspec.yaml index d6fcad6e27..509e596a13 100644 --- a/file/pubspec.yaml +++ b/file/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_file description: An integration which adds support for performance tracing for dart.io.File. -version: 7.9.0 +version: 7.16.0 homepage: https://docs.sentry.io/platforms/dart/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues @@ -10,11 +10,11 @@ environment: sdk: '>=2.19.0 <4.0.0' dependencies: - sentry: 7.9.0 + sentry: 7.16.0 meta: ^1.3.0 dev_dependencies: - lints: ^2.0.0 + lints: ^3.0.0 test: ^1.21.1 coverage: ^1.3.0 mockito: ^5.1.0 diff --git a/file/test/mock_sentry_client.dart b/file/test/mock_sentry_client.dart index c68fde9b47..4a4a28142d 100644 --- a/file/test/mock_sentry_client.dart +++ b/file/test/mock_sentry_client.dart @@ -14,7 +14,7 @@ class MockSentryClient with NoSuchMethodProvider implements SentryClient { SentryTraceContextHeader? traceContext, }) async { captureTransactionCalls - .add(CaptureTransactionCall(transaction, traceContext)); + .add(CaptureTransactionCall(transaction, traceContext, scope)); return transaction.eventId; } } @@ -22,6 +22,7 @@ class MockSentryClient with NoSuchMethodProvider implements SentryClient { class CaptureTransactionCall { final SentryTransaction transaction; final SentryTraceContextHeader? traceContext; + final Scope? scope; - CaptureTransactionCall(this.transaction, this.traceContext); + CaptureTransactionCall(this.transaction, this.traceContext, this.scope); } diff --git a/file/test/sentry_file_test.dart b/file/test/sentry_file_test.dart index a3fc47f670..3f7135de54 100644 --- a/file/test/sentry_file_test.dart +++ b/file/test/sentry_file_test.dart @@ -36,6 +36,20 @@ void main() { expect(span.origin, SentryTraceOrigins.autoFile); } + void _asserBreadcrumb(bool async) { + final call = fixture.client.captureTransactionCalls.first; + final breadcrumb = call.scope?.breadcrumbs.first; + + expect(breadcrumb?.category, 'file.copy'); + expect(breadcrumb?.data?['file.size'], 7); + expect(breadcrumb?.data?['file.async'], async); + expect(breadcrumb?.message, 'testfile.txt'); + expect( + (breadcrumb?.data?['file.path'] as String) + .endsWith('test_resources/testfile.txt'), + true); + } + test('async', () async { final file = File('test_resources/testfile.txt'); @@ -56,6 +70,7 @@ void main() { expect(sut.uri.toFilePath(), isNot(newFile.uri.toFilePath())); _assertSpan(true); + _asserBreadcrumb(true); await newFile.delete(); }); @@ -80,6 +95,7 @@ void main() { expect(sut.uri.toFilePath(), isNot(newFile.uri.toFilePath())); _assertSpan(false); + _asserBreadcrumb(false); newFile.deleteSync(); }); @@ -107,6 +123,20 @@ void main() { expect(span.origin, SentryTraceOrigins.autoFile); } + void _assertBreadcrumb(bool async, {int? size = 0}) { + final call = fixture.client.captureTransactionCalls.first; + final breadcrumb = call.scope?.breadcrumbs.first; + + expect(breadcrumb?.category, 'file.write'); + expect(breadcrumb?.data?['file.size'], size); + expect(breadcrumb?.data?['file.async'], async); + expect(breadcrumb?.message, 'testfile_create.txt'); + expect( + (breadcrumb?.data?['file.path'] as String) + .endsWith('test_resources/testfile_create.txt'), + true); + } + test('async', () async { final file = File('test_resources/testfile_create.txt'); expect(await file.exists(), false); @@ -126,6 +156,7 @@ void main() { expect(await newFile.exists(), true); _assertSpan(true); + _assertBreadcrumb(true); await newFile.delete(); }); @@ -149,6 +180,7 @@ void main() { expect(sut.existsSync(), true); _assertSpan(false); + _assertBreadcrumb(false); sut.deleteSync(); }); @@ -176,6 +208,20 @@ void main() { expect(span.origin, SentryTraceOrigins.autoFile); } + void _assertBreadcrumb(bool async, {int? size = 0}) { + final call = fixture.client.captureTransactionCalls.first; + final breadcrumb = call.scope?.breadcrumbs.first; + + expect(breadcrumb?.category, 'file.delete'); + expect(breadcrumb?.data?['file.size'], size); + expect(breadcrumb?.data?['file.async'], async); + expect(breadcrumb?.message, 'testfile_delete.txt'); + expect( + (breadcrumb?.data?['file.path'] as String) + .endsWith('test_resources/testfile_delete.txt'), + true); + } + test('async', () async { final file = File('test_resources/testfile_delete.txt'); await file.create(); @@ -196,6 +242,7 @@ void main() { expect(await newFile.exists(), false); _assertSpan(true); + _assertBreadcrumb(true); }); test('sync', () async { @@ -218,6 +265,7 @@ void main() { expect(sut.existsSync(), false); _assertSpan(false); + _assertBreadcrumb(false); }); }); @@ -243,6 +291,20 @@ void main() { expect(span.origin, SentryTraceOrigins.autoFile); } + void _assertBreadcrumb() { + final call = fixture.client.captureTransactionCalls.first; + final breadcrumb = call.scope?.breadcrumbs.first; + + expect(breadcrumb?.category, 'file.open'); + expect(breadcrumb?.data?['file.size'], 3535); + expect(breadcrumb?.data?['file.async'], true); + expect(breadcrumb?.message, 'sentry.png'); + expect( + (breadcrumb?.data?['file.path'] as String) + .endsWith('test_resources/sentry.png'), + true); + } + test('async', () async { final file = File('test_resources/sentry.png'); @@ -261,6 +323,7 @@ void main() { await newFile.close(); _assertSpan(); + _assertBreadcrumb(); }); }); @@ -286,6 +349,20 @@ void main() { expect(span.origin, SentryTraceOrigins.autoFile); } + void _assertBreadcrumb(String fileName, bool async, {int? size = 0}) { + final call = fixture.client.captureTransactionCalls.first; + final breadcrumb = call.scope?.breadcrumbs.first; + + expect(breadcrumb?.category, 'file.read'); + expect(breadcrumb?.data?['file.size'], size); + expect(breadcrumb?.data?['file.async'], async); + expect(breadcrumb?.message, fileName); + expect( + (breadcrumb?.data?['file.path'] as String) + .endsWith('test_resources/$fileName'), + true); + } + test('as bytes async', () async { final file = File('test_resources/sentry.png'); @@ -302,6 +379,7 @@ void main() { await tr.finish(); _assertSpan('sentry.png', true, size: 3535); + _assertBreadcrumb('sentry.png', true, size: 3535); }); test('as bytes sync', () async { @@ -320,6 +398,7 @@ void main() { await tr.finish(); _assertSpan('sentry.png', false, size: 3535); + _assertBreadcrumb('sentry.png', false, size: 3535); }); test('lines async', () async { @@ -338,6 +417,7 @@ void main() { await tr.finish(); _assertSpan('testfile.txt', true, size: 7); + _assertBreadcrumb('testfile.txt', true, size: 7); }); test('lines sync', () async { @@ -356,6 +436,7 @@ void main() { await tr.finish(); _assertSpan('testfile.txt', false, size: 7); + _assertBreadcrumb('testfile.txt', false, size: 7); }); test('string async', () async { @@ -374,6 +455,7 @@ void main() { await tr.finish(); _assertSpan('testfile.txt', true, size: 7); + _assertBreadcrumb('testfile.txt', true, size: 7); }); test('string sync', () async { @@ -392,6 +474,7 @@ void main() { await tr.finish(); _assertSpan('testfile.txt', false, size: 7); + _assertBreadcrumb('testfile.txt', false, size: 7); }); }); @@ -416,6 +499,20 @@ void main() { expect(span.origin, SentryTraceOrigins.autoFile); } + void _assertBreadcrumb(bool async, String name) { + final call = fixture.client.captureTransactionCalls.first; + final breadcrumb = call.scope?.breadcrumbs.first; + + expect(breadcrumb?.category, 'file.rename'); + expect(breadcrumb?.data?['file.size'], 0); + expect(breadcrumb?.data?['file.async'], async); + expect(breadcrumb?.message, name); + expect( + (breadcrumb?.data?['file.path'] as String) + .endsWith('test_resources/$name'), + true); + } + test('async', () async { final file = File('test_resources/old_name.txt'); await file.create(); @@ -438,6 +535,7 @@ void main() { expect(sut.uri.toFilePath(), isNot(newFile.uri.toFilePath())); _assertSpan(true, 'old_name.txt'); + _assertBreadcrumb(true, 'old_name.txt'); await newFile.delete(); }); @@ -464,6 +562,7 @@ void main() { expect(sut.uri.toFilePath(), isNot(newFile.uri.toFilePath())); _assertSpan(false, 'old_name.txt'); + _assertBreadcrumb(false, 'old_name.txt'); newFile.deleteSync(); }); @@ -485,6 +584,14 @@ void main() { expect(span.origin, SentryTraceOrigins.autoFile); } + void _assertBreadcrumb(bool async) { + final call = fixture.client.captureTransactionCalls.first; + final breadcrumb = call.scope?.breadcrumbs.first; + + expect(breadcrumb?.data?['file.async'], async); + expect(breadcrumb?.data?['file.path'], null); + } + test('does not add file path if sendDefaultPii is disabled async', () async { final file = File('test_resources/testfile.txt'); @@ -501,6 +608,7 @@ void main() { await tr.finish(); _assertSpan(true); + _assertBreadcrumb(true); }); test('does not add file path if sendDefaultPii is disabled sync', () async { @@ -518,6 +626,7 @@ void main() { await tr.finish(); _assertSpan(false); + _assertBreadcrumb(false); }); test('add SentryFileTracing integration', () async { diff --git a/flutter/.gitignore b/flutter/.gitignore index f0f719b22d..068bf84155 100644 --- a/flutter/.gitignore +++ b/flutter/.gitignore @@ -10,3 +10,4 @@ build/ .cxx/ .vscode/launch.json +cocoa_bindings_temp diff --git a/flutter/README.md b/flutter/README.md index ed8b2d2007..b6b7f55d8b 100644 --- a/flutter/README.md +++ b/flutter/README.md @@ -99,7 +99,7 @@ runApp( ); ``` -This adds performance tracing for all `AssetBundle` usages, where the `AssetBundle` is accessed with `DefaultAssetBunlde.of(context)`. +This adds performance tracing for all `AssetBundle` usages, where the `AssetBundle` is accessed with `DefaultAssetBundle.of(context)`. This includes all of Flutters internal access of `AssetBundle`s, like `Image.asset` for example. ##### Tracking HTTP events @@ -127,8 +127,9 @@ Or [try out the Alpha version of the Sentry Dart Plugin](https://github.com/gets #### Resources -* [![Documentation](https://img.shields.io/badge/documentation-sentry.io-green.svg)](https://docs.sentry.io/platforms/flutter/) -* [![Forum](https://img.shields.io/badge/forum-sentry-green.svg)](https://forum.sentry.io/c/sdks) -* [![Discord](https://img.shields.io/discord/621778831602221064)](https://discord.gg/Ww9hbqr) +* [![Flutter docs](https://img.shields.io/badge/documentation-sentry.io-green.svg?label=flutter%20docs)](https://docs.sentry.io/platforms/flutter/) +* [![Dart docs](https://img.shields.io/badge/documentation-sentry.io-green.svg?label=dart%20docs)](https://docs.sentry.io/platforms/dart/) +* [![Discussions](https://img.shields.io/github/discussions/getsentry/sentry-dart.svg)](https://github.com/getsentry/sentry-dart/discussions) +* [![Discord Chat](https://img.shields.io/discord/621778831602221064?logo=discord&logoColor=ffffff&color=7389D8)](https://discord.gg/PXa5Apfe7K) * [![Stack Overflow](https://img.shields.io/badge/stack%20overflow-sentry-green.svg)](https://stackoverflow.com/questions/tagged/sentry) * [![Twitter Follow](https://img.shields.io/twitter/follow/getsentry?label=getsentry&style=social)](https://twitter.com/intent/follow?screen_name=getsentry) diff --git a/flutter/analysis_options.yaml b/flutter/analysis_options.yaml index 47255eaaa4..d95702842f 100644 --- a/flutter/analysis_options.yaml +++ b/flutter/analysis_options.yaml @@ -1,6 +1,8 @@ include: package:flutter_lints/flutter.yaml analyzer: + exclude: + - test/*.mocks.dart language: strict-casts: true strict-inference: true diff --git a/flutter/android/build.gradle b/flutter/android/build.gradle index 5e40acda85..5bb8ed8a20 100644 --- a/flutter/android/build.gradle +++ b/flutter/android/build.gradle @@ -60,6 +60,9 @@ android { } dependencies { - api 'io.sentry:sentry-android:6.28.0' + api 'io.sentry:sentry-android:7.3.0' implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" + + // Required -- JUnit 4 framework + testImplementation "junit:junit:4.13.2" } diff --git a/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutter.kt b/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutter.kt new file mode 100644 index 0000000000..c06a8b0dc2 --- /dev/null +++ b/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutter.kt @@ -0,0 +1,134 @@ +package io.sentry.flutter + +import io.sentry.SentryLevel +import io.sentry.android.core.BuildConfig +import io.sentry.android.core.SentryAndroidOptions +import io.sentry.protocol.SdkVersion +import java.util.Locale + +class SentryFlutter( + private val androidSdk: String, + private val nativeSdk: String, +) { + var autoPerformanceTracingEnabled = false + + fun updateOptions( + options: SentryAndroidOptions, + data: Map, + ) { + data.getIfNotNull("dsn") { + options.dsn = it + } + data.getIfNotNull("debug") { + options.isDebug = it + } + data.getIfNotNull("environment") { + options.environment = it + } + data.getIfNotNull("release") { + options.release = it + } + data.getIfNotNull("dist") { + options.dist = it + } + data.getIfNotNull("enableAutoSessionTracking") { + options.isEnableAutoSessionTracking = it + } + data.getIfNotNull("autoSessionTrackingIntervalMillis") { + options.sessionTrackingIntervalMillis = it + } + data.getIfNotNull("anrTimeoutIntervalMillis") { + options.anrTimeoutIntervalMillis = it + } + data.getIfNotNull("attachThreads") { + options.isAttachThreads = it + } + data.getIfNotNull("attachStacktrace") { + options.isAttachStacktrace = it + } + data.getIfNotNull("enableAutoNativeBreadcrumbs") { + options.isEnableActivityLifecycleBreadcrumbs = it + options.isEnableAppLifecycleBreadcrumbs = it + options.isEnableSystemEventBreadcrumbs = it + options.isEnableAppComponentBreadcrumbs = it + options.isEnableUserInteractionBreadcrumbs = it + } + data.getIfNotNull("maxBreadcrumbs") { + options.maxBreadcrumbs = it + } + data.getIfNotNull("maxCacheItems") { + options.maxCacheItems = it + } + data.getIfNotNull("diagnosticLevel") { + if (options.isDebug) { + val sentryLevel = SentryLevel.valueOf(it.toUpperCase(Locale.ROOT)) + options.setDiagnosticLevel(sentryLevel) + } + } + data.getIfNotNull("anrEnabled") { + options.isAnrEnabled = it + } + data.getIfNotNull("sendDefaultPii") { + options.isSendDefaultPii = it + } + data.getIfNotNull("enableNdkScopeSync") { + options.isEnableScopeSync = it + } + data.getIfNotNull("proguardUuid") { + options.proguardUuid = it + } + + val nativeCrashHandling = (data["enableNativeCrashHandling"] as? Boolean) ?: true + // nativeCrashHandling has priority over anrEnabled + if (!nativeCrashHandling) { + options.isEnableUncaughtExceptionHandler = false + options.isAnrEnabled = false + // if split symbols are enabled, we need Ndk integration so we can't really offer the option + // to turn it off + // options.isEnableNdk = false + } + + data.getIfNotNull("enableAutoPerformanceTracing") { enableAutoPerformanceTracing -> + if (enableAutoPerformanceTracing) { + autoPerformanceTracingEnabled = true + } + } + + data.getIfNotNull("sendClientReports") { + options.isSendClientReports = it + } + + data.getIfNotNull("maxAttachmentSize") { + options.maxAttachmentSize = it + } + + var sdkVersion = options.sdkVersion + if (sdkVersion == null) { + sdkVersion = SdkVersion(androidSdk, BuildConfig.VERSION_NAME) + } else { + sdkVersion.name = androidSdk + } + + options.sdkVersion = sdkVersion + options.sentryClientName = "$androidSdk/${BuildConfig.VERSION_NAME}" + options.nativeSdkName = nativeSdk + + data.getIfNotNull("connectionTimeoutMillis") { + options.connectionTimeoutMillis = it + } + data.getIfNotNull("readTimeoutMillis") { + options.readTimeoutMillis = it + } + } +} + +// Call the `completion` closure if cast to map value with `key` and type `T` is successful. +@Suppress("UNCHECKED_CAST") +private fun Map.getIfNotNull( + key: String, + callback: (T) -> Unit, +) { + (get(key) as? T)?.let { + callback(it) + } +} diff --git a/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt b/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt index 58423b91fa..602253bbb3 100644 --- a/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt +++ b/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt @@ -16,36 +16,37 @@ import io.sentry.Hint import io.sentry.HubAdapter import io.sentry.Sentry import io.sentry.SentryEvent -import io.sentry.SentryLevel import io.sentry.SentryOptions import io.sentry.android.core.ActivityFramesTracker -import io.sentry.android.core.AppStartState -import io.sentry.android.core.BuildConfig.VERSION_NAME import io.sentry.android.core.InternalSentrySdk import io.sentry.android.core.LoadClass import io.sentry.android.core.SentryAndroid import io.sentry.android.core.SentryAndroidOptions +import io.sentry.android.core.performance.AppStartMetrics import io.sentry.protocol.DebugImage import io.sentry.protocol.SdkVersion import io.sentry.protocol.SentryId import io.sentry.protocol.User -import java.io.File import java.lang.ref.WeakReference -import java.util.Locale -import java.util.UUID class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { private lateinit var channel: MethodChannel private lateinit var context: Context + private lateinit var sentryFlutter: SentryFlutter private var activity: WeakReference? = null private var framesTracker: ActivityFramesTracker? = null - private var autoPerformanceTracingEnabled = false override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { context = flutterPluginBinding.applicationContext channel = MethodChannel(flutterPluginBinding.binaryMessenger, "sentry_flutter") channel.setMethodCallHandler(this) + + sentryFlutter = + SentryFlutter( + androidSdk = androidSdk, + nativeSdk = nativeSdk, + ) } override fun onMethodCall(call: MethodCall, result: Result) { @@ -109,90 +110,26 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { } SentryAndroid.init(context) { options -> - args.getIfNotNull("dsn") { options.dsn = it } - args.getIfNotNull("debug") { options.isDebug = it } - args.getIfNotNull("environment") { options.environment = it } - args.getIfNotNull("release") { options.release = it } - args.getIfNotNull("dist") { options.dist = it } - args.getIfNotNull("enableAutoSessionTracking") { - options.isEnableAutoSessionTracking = it - } - args.getIfNotNull("autoSessionTrackingIntervalMillis") { - options.sessionTrackingIntervalMillis = it - } - args.getIfNotNull("anrTimeoutIntervalMillis") { - options.anrTimeoutIntervalMillis = it - } - args.getIfNotNull("attachThreads") { options.isAttachThreads = it } - args.getIfNotNull("attachStacktrace") { options.isAttachStacktrace = it } - args.getIfNotNull("enableAutoNativeBreadcrumbs") { - options.isEnableActivityLifecycleBreadcrumbs = it - options.isEnableAppLifecycleBreadcrumbs = it - options.isEnableSystemEventBreadcrumbs = it - options.isEnableAppComponentBreadcrumbs = it - options.isEnableUserInteractionBreadcrumbs = it - } - args.getIfNotNull("maxBreadcrumbs") { options.maxBreadcrumbs = it } - args.getIfNotNull("maxCacheItems") { options.maxCacheItems = it } - args.getIfNotNull("diagnosticLevel") { - if (options.isDebug) { - val sentryLevel = SentryLevel.valueOf(it.toUpperCase(Locale.ROOT)) - options.setDiagnosticLevel(sentryLevel) - } - } - args.getIfNotNull("anrEnabled") { options.isAnrEnabled = it } - args.getIfNotNull("sendDefaultPii") { options.isSendDefaultPii = it } - args.getIfNotNull("enableNdkScopeSync") { options.isEnableScopeSync = it } - args.getIfNotNull("proguardUuid") { options.proguardUuid = it } - - val nativeCrashHandling = (args["enableNativeCrashHandling"] as? Boolean) ?: true - // nativeCrashHandling has priority over anrEnabled - if (!nativeCrashHandling) { - options.isEnableUncaughtExceptionHandler = false - options.isAnrEnabled = false - // if split symbols are enabled, we need Ndk integration so we can't really offer the option - // to turn it off - // options.isEnableNdk = false - } + sentryFlutter.updateOptions(options, args) - args.getIfNotNull("enableAutoPerformanceTracing") { enableAutoPerformanceTracing -> - if (enableAutoPerformanceTracing) { - autoPerformanceTracingEnabled = true - framesTracker = ActivityFramesTracker(LoadClass(), options) - } + if (sentryFlutter.autoPerformanceTracingEnabled) { + framesTracker = ActivityFramesTracker(LoadClass(), options) } - args.getIfNotNull("sendClientReports") { options.isSendClientReports = it } - - args.getIfNotNull("maxAttachmentSize") { options.maxAttachmentSize = it } - - var sdkVersion = options.sdkVersion - if (sdkVersion == null) { - sdkVersion = SdkVersion(androidSdk, VERSION_NAME) - } else { - sdkVersion.name = androidSdk - } - - options.sdkVersion = sdkVersion - options.sentryClientName = "$androidSdk/$VERSION_NAME" - options.nativeSdkName = nativeSdk options.beforeSend = BeforeSendCallbackImpl(options.sdkVersion) - - args.getIfNotNull("connectionTimeoutMillis") { options.connectionTimeoutMillis = it } - args.getIfNotNull("readTimeoutMillis") { options.readTimeoutMillis = it } - - // missing proxy } result.success("") } private fun fetchNativeAppStart(result: Result) { - if (!autoPerformanceTracingEnabled) { + if (!sentryFlutter.autoPerformanceTracingEnabled) { result.success(null) return } - val appStartTime = AppStartState.getInstance().appStartTime - val isColdStart = AppStartState.getInstance().isColdStart + + val appStartTime = AppStartMetrics.getInstance().appStartTimeSpan.startTimestamp + val isColdStart = + AppStartMetrics.getInstance().appStartType == AppStartMetrics.AppStartType.COLD if (appStartTime == null) { Log.w("Sentry", "App start won't be sent due to missing appStartTime") @@ -204,14 +141,14 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { val appStartTimeMillis = DateUtils.nanosToMillis(appStartTime.nanoTimestamp().toDouble()) val item = mapOf( "appStartTime" to appStartTimeMillis, - "isColdStart" to isColdStart + "isColdStart" to isColdStart, ) result.success(item) } } private fun beginNativeFrames(result: Result) { - if (!autoPerformanceTracingEnabled) { + if (!sentryFlutter.autoPerformanceTracingEnabled) { result.success(null) return } @@ -224,7 +161,7 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { private fun endNativeFrames(id: String?, result: Result) { val activity = activity?.get() - if (!autoPerformanceTracingEnabled || activity == null || id == null) { + if (!sentryFlutter.autoPerformanceTracingEnabled || activity == null || id == null) { if (id == null) { Log.w("Sentry", "Parameter id cannot be null when calling endNativeFrames.") } @@ -245,7 +182,7 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { val frames = mapOf( "totalFrames" to total, "slowFrames" to slow, - "frozenFrames" to frozen + "frozenFrames" to frozen, ) result.success(frames) } @@ -396,7 +333,7 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { } private class BeforeSendCallbackImpl( - private val sdkVersion: SdkVersion? + private val sdkVersion: SdkVersion?, ) : SentryOptions.BeforeSendCallback { override fun execute(event: SentryEvent, hint: Hint): SentryEvent { setEventOriginTag(event) @@ -424,7 +361,7 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { private fun setEventEnvironmentTag( event: SentryEvent, origin: String = "android", - environment: String + environment: String, ) { event.setTag("event.origin", origin) event.setTag("event.environment", environment) @@ -451,18 +388,12 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { return } val currentScope = InternalSentrySdk.getCurrentScope() - val serializedScope = InternalSentrySdk.serializeScope( - context, - options, - currentScope - ) + val serializedScope = + InternalSentrySdk.serializeScope( + context, + options, + currentScope, + ) result.success(serializedScope) } } - -// Call the `completion` closure if cast to map value with `key` and type `T` is successful. -private fun Map.getIfNotNull(key: String, callback: (T) -> Unit) { - (get(key) as? T)?.let { - callback(it) - } -} diff --git a/flutter/android/src/test/kotlin/io/sentry/flutter/SentryFlutterTest.kt b/flutter/android/src/test/kotlin/io/sentry/flutter/SentryFlutterTest.kt new file mode 100644 index 0000000000..724559bb76 --- /dev/null +++ b/flutter/android/src/test/kotlin/io/sentry/flutter/SentryFlutterTest.kt @@ -0,0 +1,138 @@ +package io.sentry.flutter + +import io.sentry.SentryLevel +import io.sentry.android.core.BuildConfig +import io.sentry.android.core.SentryAndroidOptions +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Test + +class SentryFlutterTest { + private lateinit var fixture: Fixture + + @Before + fun before() { + fixture = Fixture() + } + + @Test + fun updateOptions() { + // Given + val sut = fixture.getSut() + + // When + sut.updateOptions(fixture.options, fixture.data) + + // Then + assertEquals("fixture-dsn", fixture.options.dsn) + assertEquals(true, fixture.options.isDebug) + assertEquals("fixture-environment", fixture.options.environment) + assertEquals("fixture-release", fixture.options.release) + assertEquals("fixture-dist", fixture.options.dist) + assertEquals(false, fixture.options.isEnableAutoSessionTracking) + assertEquals(9001L, fixture.options.sessionTrackingIntervalMillis) + assertEquals(9002L, fixture.options.anrTimeoutIntervalMillis) + assertEquals(true, fixture.options.isAttachThreads) + assertEquals(false, fixture.options.isAttachStacktrace) + assertEquals(false, fixture.options.isEnableActivityLifecycleBreadcrumbs) + assertEquals(false, fixture.options.isEnableAppLifecycleBreadcrumbs) + assertEquals(false, fixture.options.isEnableSystemEventBreadcrumbs) + assertEquals(false, fixture.options.isEnableAppComponentBreadcrumbs) + assertEquals(false, fixture.options.isEnableUserInteractionBreadcrumbs) + assertEquals(9003, fixture.options.maxBreadcrumbs) + assertEquals(9004, fixture.options.maxCacheItems) + assertEquals(false, fixture.options.isAnrEnabled) + assertEquals(true, fixture.options.isSendDefaultPii) + assertEquals(false, fixture.options.isEnableScopeSync) + assertEquals("fixture-proguardUuid", fixture.options.proguardUuid) + assertEquals(false, fixture.options.isSendClientReports) + assertEquals(9005L, fixture.options.maxAttachmentSize) + + assertEquals("sentry.java.android.flutter", fixture.options.sdkVersion?.name) + assertEquals(BuildConfig.VERSION_NAME, fixture.options.sdkVersion?.version) + assertEquals( + "sentry.java.android.flutter/${BuildConfig.VERSION_NAME}", + fixture.options.sentryClientName, + ) + assertEquals("fixture-nativeSdk", fixture.options.nativeSdkName) + + assertEquals(true, sut.autoPerformanceTracingEnabled) + + assertEquals(9006, fixture.options.connectionTimeoutMillis) + assertEquals(9007, fixture.options.readTimeoutMillis) + } + + @Test + fun initNativeSdkDiagnosticLevel() { + // Given + val sut = fixture.getSut() + fixture.options.isDebug = true + + // When + sut.updateOptions( + fixture.options, + mapOf( + "diagnosticLevel" to "warning", + ), + ) + + // Then + assertEquals(SentryLevel.WARNING, fixture.options.diagnosticLevel) + } + + @Test + fun initNativeSdkEnableNativeCrashHandling() { + // Given + val sut = fixture.getSut() + + // When + sut.updateOptions( + fixture.options, + mapOf( + "enableNativeCrashHandling" to false, + ), + ) + + // Then + assertEquals(false, fixture.options.isEnableUncaughtExceptionHandler) + assertEquals(false, fixture.options.isAnrEnabled) + } +} + +class Fixture { + var options = SentryAndroidOptions() + + val data = + mapOf( + "dsn" to "fixture-dsn", + "debug" to true, + "environment" to "fixture-environment", + "release" to "fixture-release", + "dist" to "fixture-dist", + "enableAutoSessionTracking" to false, + "autoSessionTrackingIntervalMillis" to 9001L, + "anrTimeoutIntervalMillis" to 9002L, + "attachThreads" to true, + "attachStacktrace" to false, + "enableAutoNativeBreadcrumbs" to false, + "maxBreadcrumbs" to 9003, + "maxCacheItems" to 9004, + "anrEnabled" to false, + "sendDefaultPii" to true, + "enableNdkScopeSync" to false, + "proguardUuid" to "fixture-proguardUuid", + "enableNativeCrashHandling" to false, + "sendClientReports" to false, + "maxAttachmentSize" to 9005L, + "enableAutoPerformanceTracing" to true, + "connectionTimeoutMillis" to 9006, + "readTimeoutMillis" to 9007, + ) + + fun getSut(): SentryFlutter { + return SentryFlutter( + androidSdk = "sentry.java.android.flutter", + nativeSdk = "fixture-nativeSdk", + ) + } +} diff --git a/flutter/class-diagram.svg b/flutter/class-diagram.svg new file mode 100644 index 0000000000..511429f7f8 --- /dev/null +++ b/flutter/class-diagram.svg @@ -0,0 +1,869 @@ + + + + + + + + +cluster~ + +flutter + + +cluster~/lib + +lib + + +cluster~/lib/src + +src + + +cluster~/lib/src/renderer + +renderer + + +cluster~/lib/src/screenshot + +screenshot + + +cluster~/lib/src/user_interaction + +user_interaction + + +cluster~/lib/src/event_processor + +event_processor + + +cluster~/lib/src/navigation + +navigation + + +cluster~/lib/src/view_hierarchy + +view_hierarchy + + +cluster~/lib/src/jvm + +jvm + + +cluster~/lib/src/native + +native + + +cluster~/lib/src/native/cocoa + +cocoa + + +cluster~/lib/src/integrations + +integrations + + + +/lib/sentry_flutter.dart + +sentry_flutter + + + +/lib/src/sentry_flutter.dart + +sentry_flutter + + + +/lib/sentry_flutter.dart->/lib/src/sentry_flutter.dart + + + + + +/lib/src/screenshot/sentry_screenshot_widget.dart + +sentry_screenshot_widget + + + +/lib/sentry_flutter.dart->/lib/src/screenshot/sentry_screenshot_widget.dart + + + + + +/lib/src/screenshot/sentry_screenshot_quality.dart + +sentry_screenshot_quality + + + +/lib/sentry_flutter.dart->/lib/src/screenshot/sentry_screenshot_quality.dart + + + + + +/lib/src/flutter_sentry_attachment.dart + +flutter_sentry_attachment + + + +/lib/sentry_flutter.dart->/lib/src/flutter_sentry_attachment.dart + + + + + +/lib/src/binding_wrapper.dart + +binding_wrapper + + + +/lib/sentry_flutter.dart->/lib/src/binding_wrapper.dart + + + + + +/lib/src/user_interaction/sentry_user_interaction_widget.dart + +sentry_user_interaction_widget + + + +/lib/sentry_flutter.dart->/lib/src/user_interaction/sentry_user_interaction_widget.dart + + + + + +/lib/src/sentry_asset_bundle.dart + +sentry_asset_bundle + + + +/lib/sentry_flutter.dart->/lib/src/sentry_asset_bundle.dart + + + + + +/lib/src/navigation/sentry_navigator_observer.dart + +sentry_navigator_observer + + + +/lib/sentry_flutter.dart->/lib/src/navigation/sentry_navigator_observer.dart + + + + + +/lib/src/sentry_flutter_options.dart + +sentry_flutter_options + + + +/lib/sentry_flutter.dart->/lib/src/sentry_flutter_options.dart + + + + + +/lib/src/integrations/on_error_integration.dart + +on_error_integration + + + +/lib/sentry_flutter.dart->/lib/src/integrations/on_error_integration.dart + + + + + +/lib/src/integrations/load_release_integration.dart + +load_release_integration + + + +/lib/sentry_flutter.dart->/lib/src/integrations/load_release_integration.dart + + + + + +/lib/src/renderer/renderer.dart + +renderer + + + +/lib/src/renderer/unknown_renderer.dart + +unknown_renderer + + + +/lib/src/renderer/unknown_renderer.dart->/lib/src/renderer/renderer.dart + + + + + +/lib/src/renderer/io_renderer.dart + +io_renderer + + + +/lib/src/renderer/io_renderer.dart->/lib/src/renderer/renderer.dart + + + + + +/lib/src/renderer/html_renderer.dart + +html_renderer + + + +/lib/src/renderer/html_renderer.dart->/lib/src/renderer/renderer.dart + + + + + +/lib/src/version.dart + +version + + + +/lib/src/sentry_flutter.dart->/lib/sentry_flutter.dart + + + + + +/lib/src/sentry_flutter.dart->/lib/src/renderer/renderer.dart + + + + + +/lib/src/sentry_flutter.dart->/lib/src/version.dart + + + + + +/lib/src/file_system_transport.dart + +file_system_transport + + + +/lib/src/sentry_flutter.dart->/lib/src/file_system_transport.dart + + + + + +/lib/src/event_processor/flutter_exception_event_processor.dart + +flutter_exception_event_processor + + + +/lib/src/sentry_flutter.dart->/lib/src/event_processor/flutter_exception_event_processor.dart + + + + + +/lib/src/event_processor/flutter_enricher_event_processor.dart + +flutter_enricher_event_processor + + + +/lib/src/sentry_flutter.dart->/lib/src/event_processor/flutter_enricher_event_processor.dart + + + + + +/lib/src/event_processor/platform_exception_event_processor.dart + +platform_exception_event_processor + + + +/lib/src/sentry_flutter.dart->/lib/src/event_processor/platform_exception_event_processor.dart + + + + + +/lib/src/event_processor/android_platform_exception_event_processor.dart + +android_platform_exception_event_processor + + + +/lib/src/sentry_flutter.dart->/lib/src/event_processor/android_platform_exception_event_processor.dart + + + + + +/lib/src/view_hierarchy/view_hierarchy_integration.dart + +view_hierarchy_integration + + + +/lib/src/sentry_flutter.dart->/lib/src/view_hierarchy/view_hierarchy_integration.dart + + + + + +/lib/src/native/native_scope_observer.dart + +native_scope_observer + + + +/lib/src/sentry_flutter.dart->/lib/src/native/native_scope_observer.dart + + + + + +/lib/src/native/sentry_native_channel.dart + +sentry_native_channel + + + +/lib/src/sentry_flutter.dart->/lib/src/native/sentry_native_channel.dart + + + + + +/lib/src/native/sentry_native.dart + +sentry_native + + + +/lib/src/sentry_flutter.dart->/lib/src/native/sentry_native.dart + + + + + +/lib/src/integrations/screenshot_integration.dart + +screenshot_integration + + + +/lib/src/sentry_flutter.dart->/lib/src/integrations/screenshot_integration.dart + + + + + +/lib/src/integrations/integrations.dart + +integrations + + + +/lib/src/sentry_flutter.dart->/lib/src/integrations/integrations.dart + + + + + +/lib/src/binding_wrapper.dart->/lib/sentry_flutter.dart + + + + + +/lib/src/user_interaction/sentry_user_interaction_widget.dart->/lib/sentry_flutter.dart + + + + + +/lib/src/user_interaction/user_interaction_widget.dart + +user_interaction_widget + + + +/lib/src/user_interaction/sentry_user_interaction_widget.dart->/lib/src/user_interaction/user_interaction_widget.dart + + + + + +/lib/src/widget_utils.dart + +widget_utils + + + +/lib/src/user_interaction/sentry_user_interaction_widget.dart->/lib/src/widget_utils.dart + + + + + +/lib/src/event_processor/screenshot_event_processor.dart + +screenshot_event_processor + + + +/lib/src/event_processor/screenshot_event_processor.dart->/lib/src/renderer/renderer.dart + + + + + +/lib/src/event_processor/screenshot_event_processor.dart->/lib/src/screenshot/sentry_screenshot_widget.dart + + + + + +/lib/src/event_processor/screenshot_event_processor.dart->/lib/src/sentry_flutter_options.dart + + + + + +/lib/src/event_processor/flutter_enricher_event_processor.dart->/lib/src/sentry_flutter_options.dart + + + + + +/lib/src/event_processor/android_platform_exception_event_processor.dart->/lib/sentry_flutter.dart + + + + + +/lib/src/jvm/jvm_exception.dart + +jvm_exception + + + +/lib/src/event_processor/android_platform_exception_event_processor.dart->/lib/src/jvm/jvm_exception.dart + + + + + +/lib/src/jvm/jvm_frame.dart + +jvm_frame + + + +/lib/src/event_processor/android_platform_exception_event_processor.dart->/lib/src/jvm/jvm_frame.dart + + + + + +/lib/src/event_processor/native_app_start_event_processor.dart + +native_app_start_event_processor + + + +/lib/src/event_processor/native_app_start_event_processor.dart->/lib/src/native/sentry_native.dart + + + + + +/lib/src/navigation/sentry_navigator_observer.dart->/lib/sentry_flutter.dart + + + + + +/lib/src/navigation/sentry_navigator_observer.dart->/lib/src/native/sentry_native.dart + + + + + +/lib/src/sentry_flutter_options.dart->/lib/src/renderer/renderer.dart + + + + + +/lib/src/sentry_flutter_options.dart->/lib/src/screenshot/sentry_screenshot_quality.dart + + + + + +/lib/src/sentry_flutter_options.dart->/lib/src/binding_wrapper.dart + + + + + +/lib/src/widgets_binding_observer.dart + +widgets_binding_observer + + + +/lib/src/widgets_binding_observer.dart->/lib/sentry_flutter.dart + + + + + +/lib/src/view_hierarchy/view_hierarchy_integration.dart->/lib/sentry_flutter.dart + + + + + +/lib/src/view_hierarchy/view_hierarchy_event_processor.dart + +view_hierarchy_event_processor + + + +/lib/src/view_hierarchy/view_hierarchy_integration.dart->/lib/src/view_hierarchy/view_hierarchy_event_processor.dart + + + + + +/lib/src/view_hierarchy/sentry_tree_walker.dart + +sentry_tree_walker + + + +/lib/src/view_hierarchy/sentry_tree_walker.dart->/lib/sentry_flutter.dart + + + + + +/lib/src/view_hierarchy/sentry_tree_walker.dart->/lib/src/widget_utils.dart + + + + + +/lib/src/view_hierarchy/view_hierarchy_event_processor.dart->/lib/sentry_flutter.dart + + + + + +/lib/src/view_hierarchy/view_hierarchy_event_processor.dart->/lib/src/view_hierarchy/sentry_tree_walker.dart + + + + + +/lib/src/jvm/jvm_exception.dart->/lib/src/jvm/jvm_frame.dart + + + + + +/lib/src/native/method_channel_helper.dart + +method_channel_helper + + + +/lib/src/native/native_scope_observer.dart->/lib/src/native/sentry_native.dart + + + + + +/lib/src/native/sentry_native_channel.dart->/lib/sentry_flutter.dart + + + + + +/lib/src/native/sentry_native_channel.dart->/lib/src/native/method_channel_helper.dart + + + + + +/lib/src/native/sentry_native_channel.dart->/lib/src/native/sentry_native.dart + + + + + +/lib/src/native/sentry_native.dart->/lib/sentry_flutter.dart + + + + + +/lib/src/native/sentry_native.dart->/lib/src/native/sentry_native_channel.dart + + + + + +/lib/src/native/cocoa/binding.dart + +binding + + + +/lib/src/integrations/load_image_list_integration.dart + +load_image_list_integration + + + +/lib/src/integrations/load_image_list_integration.dart->/lib/src/sentry_flutter_options.dart + + + + + +/lib/src/integrations/load_contexts_integration.dart + +load_contexts_integration + + + +/lib/src/integrations/load_contexts_integration.dart->/lib/src/sentry_flutter_options.dart + + + + + +/lib/src/integrations/on_error_integration.dart->/lib/src/sentry_flutter_options.dart + + + + + +/lib/src/integrations/widgets_binding_integration.dart + +widgets_binding_integration + + + +/lib/src/integrations/widgets_binding_integration.dart->/lib/src/sentry_flutter_options.dart + + + + + +/lib/src/integrations/widgets_binding_integration.dart->/lib/src/widgets_binding_observer.dart + + + + + +/lib/src/integrations/native_app_start_integration.dart + +native_app_start_integration + + + +/lib/src/integrations/native_app_start_integration.dart->/lib/src/event_processor/native_app_start_event_processor.dart + + + + + +/lib/src/integrations/native_app_start_integration.dart->/lib/src/sentry_flutter_options.dart + + + + + +/lib/src/integrations/native_app_start_integration.dart->/lib/src/native/sentry_native.dart + + + + + +/lib/src/integrations/load_release_integration.dart->/lib/src/sentry_flutter_options.dart + + + + + +/lib/src/integrations/flutter_error_integration.dart + +flutter_error_integration + + + +/lib/src/integrations/flutter_error_integration.dart->/lib/src/sentry_flutter_options.dart + + + + + +/lib/src/integrations/debug_print_integration.dart + +debug_print_integration + + + +/lib/src/integrations/debug_print_integration.dart->/lib/src/sentry_flutter_options.dart + + + + + +/lib/src/integrations/screenshot_integration.dart->/lib/src/event_processor/screenshot_event_processor.dart + + + + + +/lib/src/integrations/screenshot_integration.dart->/lib/src/sentry_flutter_options.dart + + + + + +/lib/src/integrations/integrations.dart->/lib/src/integrations/load_image_list_integration.dart + + + + + +/lib/src/integrations/integrations.dart->/lib/src/integrations/load_contexts_integration.dart + + + + + +/lib/src/integrations/integrations.dart->/lib/src/integrations/on_error_integration.dart + + + + + +/lib/src/integrations/integrations.dart->/lib/src/integrations/widgets_binding_integration.dart + + + + + +/lib/src/integrations/integrations.dart->/lib/src/integrations/native_app_start_integration.dart + + + + + +/lib/src/integrations/integrations.dart->/lib/src/integrations/load_release_integration.dart + + + + + +/lib/src/integrations/integrations.dart->/lib/src/integrations/flutter_error_integration.dart + + + + + +/lib/src/integrations/integrations.dart->/lib/src/integrations/debug_print_integration.dart + + + + + +/lib/src/integrations/widgets_flutter_binding_integration.dart + +widgets_flutter_binding_integration + + + +/lib/src/integrations/integrations.dart->/lib/src/integrations/widgets_flutter_binding_integration.dart + + + + + +/lib/src/integrations/native_sdk_integration.dart + +native_sdk_integration + + + +/lib/src/integrations/integrations.dart->/lib/src/integrations/native_sdk_integration.dart + + + + + +/lib/src/integrations/widgets_flutter_binding_integration.dart->/lib/src/sentry_flutter_options.dart + + + + + +/lib/src/integrations/native_sdk_integration.dart->/lib/src/sentry_flutter_options.dart + + + + + +/lib/sentry_flutter_web.dart + +sentry_flutter_web + + + diff --git a/flutter/config/detekt-bl.xml b/flutter/config/detekt-bl.xml index c8da2b8940..bfd59bc97e 100644 --- a/flutter/config/detekt-bl.xml +++ b/flutter/config/detekt-bl.xml @@ -2,9 +2,8 @@ - ComplexMethod:SentryFlutterPlugin.kt$SentryFlutterPlugin$override fun onMethodCall(call: MethodCall, result: Result) - ComplexMethod:SentryFlutterPlugin.kt$SentryFlutterPlugin$private fun setUser(user: Map<String, Any?>?, result: Result) - LongMethod:SentryFlutterPlugin.kt$SentryFlutterPlugin$private fun initNativeSdk(call: MethodCall, result: Result) + CyclomaticComplexMethod:SentryFlutterPlugin.kt$SentryFlutterPlugin$override fun onMethodCall(call: MethodCall, result: Result) + LongMethod:SentryFlutter.kt$SentryFlutter$fun updateOptions( options: SentryAndroidOptions, data: Map<String, Any>, ) MagicNumber:MainActivity.kt$MainActivity$6_000 TooGenericExceptionCaught:MainActivity.kt$MainActivity$e: Exception TooGenericExceptionThrown:MainActivity.kt$MainActivity$throw Exception("Catch this java exception thrown from Kotlin thread!") diff --git a/flutter/example/android/app/src/main/kotlin/io/sentry/samples/flutter/MainActivity.kt b/flutter/example/android/app/src/main/kotlin/io/sentry/samples/flutter/MainActivity.kt index 14f222d254..7966a33655 100644 --- a/flutter/example/android/app/src/main/kotlin/io/sentry/samples/flutter/MainActivity.kt +++ b/flutter/example/android/app/src/main/kotlin/io/sentry/samples/flutter/MainActivity.kt @@ -11,37 +11,33 @@ class MainActivity : FlutterActivity() { override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) - MethodChannel(flutterEngine.dartExecutor.binaryMessenger, _channel).setMethodCallHandler { - call, result -> + MethodChannel( + flutterEngine.dartExecutor.binaryMessenger, + _channel, + ).setMethodCallHandler { call, result -> // Note: this method is invoked on the main thread. when (call.method) { - "throw" -> { + "throw" -> thread(isDaemon = true) { throw Exception("Catch this java exception thrown from Kotlin thread!") } - } - "anr" -> { - Thread.sleep(6_000) - } - "capture" -> { + + "anr" -> Thread.sleep(6_000) + + "capture" -> try { throw RuntimeException("Catch this java exception!") } catch (e: Exception) { Sentry.captureException(e) } - } - "crash" -> { - crash() - } - "cpp_capture_message" -> { - message() - } - "platform_exception" -> { - throw RuntimeException("Catch this platform exception!") - } - else -> { - result.notImplemented() - } + + "crash" -> crash() + + "cpp_capture_message" -> message() + + "platform_exception" -> throw RuntimeException("Catch this platform exception!") + + else -> result.notImplemented() } result.success("") } diff --git a/flutter/example/android/build.gradle b/flutter/example/android/build.gradle index 71b614b7a1..e628374358 100644 --- a/flutter/example/android/build.gradle +++ b/flutter/example/android/build.gradle @@ -1,5 +1,6 @@ buildscript { ext.kotlin_version = '1.6.21' + repositories { google() mavenCentral() @@ -31,3 +32,4 @@ subprojects { tasks.register("clean", Delete) { delete rootProject.buildDir } + diff --git a/flutter/example/integration_test/all.dart b/flutter/example/integration_test/all.dart new file mode 100644 index 0000000000..69cc5a6641 --- /dev/null +++ b/flutter/example/integration_test/all.dart @@ -0,0 +1,8 @@ +// Workaround for https://github.com/flutter/flutter/issues/101031 +import 'integration_test.dart' as a; +import 'profiling_test.dart' as b; + +void main() { + a.main(); + b.main(); +} diff --git a/flutter/example/integration_test/integration_test.dart b/flutter/example/integration_test/integration_test.dart index 9dc182111a..732228e5fb 100644 --- a/flutter/example/integration_test/integration_test.dart +++ b/flutter/example/integration_test/integration_test.dart @@ -10,9 +10,9 @@ import 'package:sentry_flutter_example/main.dart'; import 'package:http/http.dart'; void main() { - const org = 'sentry-sdks'; - const slug = 'sentry-flutter'; - const authToken = String.fromEnvironment('SENTRY_AUTH_TOKEN'); + // const org = 'sentry-sdks'; + // const slug = 'sentry-flutter'; + // const authToken = String.fromEnvironment('SENTRY_AUTH_TOKEN'); const fakeDsn = 'https://abc@def.ingest.sentry.io/1234567'; TestWidgetsFlutterBinding.ensureInitialized(); @@ -141,59 +141,59 @@ void main() { await transaction.finish(); }); - group('e2e', () { - var output = find.byKey(const Key('output')); - late Fixture fixture; - - setUp(() { - fixture = Fixture(); - }); - - testWidgets('captureException', (tester) async { - await setupSentryAndApp(tester, - dsn: exampleDsn, beforeSendCallback: fixture.beforeSend); - - await tester.tap(find.text('captureException')); - await tester.pumpAndSettle(); - - final text = output.evaluate().single.widget as Text; - final id = text.data!; - - final uri = Uri.parse( - 'https://sentry.io/api/0/projects/$org/$slug/events/$id/', - ); - expect(authToken, isNotEmpty); - - final event = await fixture.poll(uri, authToken); - expect(event, isNotNull); - - final sentEvent = fixture.sentEvent; - expect(sentEvent, isNotNull); - - final tags = event!["tags"] as List; - - expect(sentEvent!.eventId.toString(), event["id"]); - expect("_Exception: Exception: captureException", event["title"]); - expect(sentEvent.release, event["release"]["version"]); - expect( - 2, - (tags.firstWhere((e) => e["value"] == sentEvent.environment) as Map) - .length); - expect(sentEvent.fingerprint, event["fingerprint"] ?? []); - expect( - 2, - (tags.firstWhere((e) => e["value"] == SentryLevel.error.name) as Map) - .length); - expect(sentEvent.logger, event["logger"]); - - final dist = tags.firstWhere((element) => element['key'] == 'dist'); - expect('1', dist['value']); - - final environment = - tags.firstWhere((element) => element['key'] == 'environment'); - expect('integration', environment['value']); - }); - }); + // group('e2e', () { + // var output = find.byKey(const Key('output')); + // late Fixture fixture; + // + // setUp(() { + // fixture = Fixture(); + // }); + // + // testWidgets('captureException', (tester) async { + // await setupSentryAndApp(tester, + // dsn: exampleDsn, beforeSendCallback: fixture.beforeSend); + // + // await tester.tap(find.text('captureException')); + // await tester.pumpAndSettle(); + // + // final text = output.evaluate().single.widget as Text; + // final id = text.data!; + // + // final uri = Uri.parse( + // 'https://sentry.io/api/0/projects/$org/$slug/events/$id/', + // ); + // expect(authToken, isNotEmpty); + // + // final event = await fixture.poll(uri, authToken); + // expect(event, isNotNull); + // + // final sentEvent = fixture.sentEvent; + // expect(sentEvent, isNotNull); + // + // final tags = event!["tags"] as List; + // + // expect(sentEvent!.eventId.toString(), event["id"]); + // expect("_Exception: Exception: captureException", event["title"]); + // expect(sentEvent.release, event["release"]["version"]); + // expect( + // 2, + // (tags.firstWhere((e) => e["value"] == sentEvent.environment) as Map) + // .length); + // expect(sentEvent.fingerprint, event["fingerprint"] ?? []); + // expect( + // 2, + // (tags.firstWhere((e) => e["value"] == SentryLevel.error.name) as Map) + // .length); + // expect(sentEvent.logger, event["logger"]); + // + // final dist = tags.firstWhere((element) => element['key'] == 'dist'); + // expect('1', dist['value']); + // + // final environment = + // tags.firstWhere((element) => element['key'] == 'environment'); + // expect('integration', environment['value']); + // }); + // }); } class Fixture { diff --git a/flutter/example/integration_test/profiling_test.dart b/flutter/example/integration_test/profiling_test.dart new file mode 100644 index 0000000000..e6c1db8bbd --- /dev/null +++ b/flutter/example/integration_test/profiling_test.dart @@ -0,0 +1,66 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; +import '../../../dart/test/mocks/mock_transport.dart'; + +void main() { + final transport = MockTransport(); + + setUp(() async { + await SentryFlutter.init((options) { + // ignore: invalid_use_of_internal_member + options.automatedTestMode = true; + options.dsn = 'https://abc@def.ingest.sentry.io/1234567'; + options.debug = true; + options.transport = transport; + options.tracesSampleRate = 1.0; + options.profilesSampleRate = 1.0; + }); + }); + + tearDown(() async { + await Sentry.close(); + transport.reset(); + }); + + test('native binding is initialized', () async { + // ignore: invalid_use_of_internal_member + expect(SentryFlutter.native, isNotNull); + }); + + test('profile is captured', () async { + final tx = Sentry.startTransaction("name", "op"); + await Future.delayed(const Duration(milliseconds: 1000)); + await tx.finish(); + expect(transport.calls, 1); + + final envelope = transport.envelopes.first; + expect(envelope.items.length, 2); + expect(envelope.items[0].header.type, "transaction"); + expect(await envelope.items[0].header.length(), greaterThan(0)); + expect(envelope.items[1].header.type, "profile"); + expect(await envelope.items[1].header.length(), greaterThan(0)); + + final txJson = utf8.decode(await envelope.items[0].dataFactory()); + final txData = json.decode(txJson) as Map; + + final profileJson = utf8.decode(await envelope.items[1].dataFactory()); + final profileData = json.decode(profileJson) as Map; + + expect(txData["event_id"], isNotNull); + expect(txData["event_id"], profileData["transaction"]["id"]); + expect(txData["contexts"]["trace"]["trace_id"], isNotNull); + expect(txData["contexts"]["trace"]["trace_id"], + profileData["transaction"]["trace_id"]); + expect(profileData["debug_meta"]["images"], isNotEmpty); + expect(profileData["profile"]["thread_metadata"], isNotEmpty); + expect(profileData["profile"]["samples"], isNotEmpty); + expect(profileData["profile"]["stacks"], isNotEmpty); + expect(profileData["profile"]["frames"], isNotEmpty); + }, + skip: (Platform.isMacOS || Platform.isIOS) + ? false + : "Profiling is not supported on this platform"); +} diff --git a/flutter/example/ios/Podfile b/flutter/example/ios/Podfile index 313ea4a153..877d653518 100644 --- a/flutter/example/ios/Podfile +++ b/flutter/example/ios/Podfile @@ -32,10 +32,19 @@ target 'Runner' do use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + + # Configure test target + target 'RunnerTests' do + inherit! :search_paths + end + end post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) + target.build_configurations.each do |config| + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0' + end end end diff --git a/flutter/example/ios/Runner.xcodeproj/project.pbxproj b/flutter/example/ios/Runner.xcodeproj/project.pbxproj index b9f077ebb4..29c58327af 100644 --- a/flutter/example/ios/Runner.xcodeproj/project.pbxproj +++ b/flutter/example/ios/Runner.xcodeproj/project.pbxproj @@ -7,16 +7,28 @@ objects = { /* Begin PBXBuildFile section */ + 0E6A6386E49E9527E131F978 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 804FA4C73FD409C61067DA3C /* Pods_RunnerTests.framework */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 15A74CDF250075770078F130 /* Buggy.m in Sources */ = {isa = PBXBuildFile; fileRef = 15A74CDE250075770078F130 /* Buggy.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 4DFA0D3B754F0E702B3CB4B1 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4B1A3E5A486E474A287B9BF /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 92B25CED2A80EB3100884BDF /* SentryFlutterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92B25CEC2A80EB3100884BDF /* SentryFlutterTests.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + 92B25CEE2A80EB3100884BDF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXCopyFilesBuildPhase section */ 9705A1C41CF9048500538489 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; @@ -37,11 +49,15 @@ 15A74CDE250075770078F130 /* Buggy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Buggy.m; sourceTree = ""; }; 38199AEAF0F80C193173BC10 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 3CEA108DF90E0A3E0A377D59 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 4F22DC026405C7E7F57CEBA6 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 768362D06CA53D13052997C4 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 804FA4C73FD409C61067DA3C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 92B25CEA2A80EB3100884BDF /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 92B25CEC2A80EB3100884BDF /* SentryFlutterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryFlutterTests.swift; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -50,9 +66,19 @@ 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; C4B1A3E5A486E474A287B9BF /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + F2579A3BD1D48D0BC33E4ADF /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + FDFDFB8E5235EA47CE65FBC5 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 92B25CE72A80EB3100884BDF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0E6A6386E49E9527E131F978 /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -70,10 +96,21 @@ 38199AEAF0F80C193173BC10 /* Pods-Runner.debug.xcconfig */, 4F22DC026405C7E7F57CEBA6 /* Pods-Runner.release.xcconfig */, 768362D06CA53D13052997C4 /* Pods-Runner.profile.xcconfig */, + F2579A3BD1D48D0BC33E4ADF /* Pods-RunnerTests.debug.xcconfig */, + FDFDFB8E5235EA47CE65FBC5 /* Pods-RunnerTests.release.xcconfig */, + 3CEA108DF90E0A3E0A377D59 /* Pods-RunnerTests.profile.xcconfig */, ); path = Pods; sourceTree = ""; }; + 92B25CEB2A80EB3100884BDF /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 92B25CEC2A80EB3100884BDF /* SentryFlutterTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -90,6 +127,7 @@ children = ( 9740EEB11CF90186004384FC /* Flutter */, 97C146F01CF9000F007C117D /* Runner */, + 92B25CEB2A80EB3100884BDF /* RunnerTests */, 97C146EF1CF9000F007C117D /* Products */, 2BEB9477FF568D2F04848764 /* Pods */, EDEF7FDEB4F4BFCED18D7311 /* Frameworks */, @@ -100,6 +138,7 @@ isa = PBXGroup; children = ( 97C146EE1CF9000F007C117D /* Runner.app */, + 92B25CEA2A80EB3100884BDF /* RunnerTests.xctest */, ); name = Products; sourceTree = ""; @@ -125,6 +164,7 @@ isa = PBXGroup; children = ( C4B1A3E5A486E474A287B9BF /* Pods_Runner.framework */, + 804FA4C73FD409C61067DA3C /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -132,6 +172,25 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 92B25CE92A80EB3100884BDF /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 92B25CF32A80EB3100884BDF /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 95EC4C94BEBF8B73E55C82BD /* [CP] Check Pods Manifest.lock */, + 92B25CE62A80EB3100884BDF /* Sources */, + 92B25CE72A80EB3100884BDF /* Frameworks */, + 92B25CE82A80EB3100884BDF /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 92B25CEF2A80EB3100884BDF /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 92B25CEA2A80EB3100884BDF /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; 97C146ED1CF9000F007C117D /* Runner */ = { isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; @@ -161,9 +220,14 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = YES; - LastUpgradeCheck = 1300; + LastSwiftUpdateCheck = 1430; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = ""; TargetAttributes = { + 92B25CE92A80EB3100884BDF = { + CreatedOnToolsVersion = 14.3.1; + TestTargetID = 97C146ED1CF9000F007C117D; + }; 97C146ED1CF9000F007C117D = { CreatedOnToolsVersion = 7.3.1; LastSwiftMigration = 1100; @@ -184,11 +248,19 @@ projectRoot = ""; targets = ( 97C146ED1CF9000F007C117D /* Runner */, + 92B25CE92A80EB3100884BDF /* RunnerTests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 92B25CE82A80EB3100884BDF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 97C146EC1CF9000F007C117D /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -239,7 +311,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin\n"; }; 4D812E05A580E1EFEF066A51 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; @@ -258,6 +330,28 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; + 95EC4C94BEBF8B73E55C82BD /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -271,11 +365,19 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 92B25CE62A80EB3100884BDF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 92B25CED2A80EB3100884BDF /* SentryFlutterTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 97C146EA1CF9000F007C117D /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -288,6 +390,14 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 92B25CEF2A80EB3100884BDF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 92B25CEE2A80EB3100884BDF /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin PBXVariantGroup section */ 97C146FA1CF9000F007C117D /* Main.storyboard */ = { isa = PBXVariantGroup; @@ -389,6 +499,90 @@ }; name = Profile; }; + 92B25CF02A80EB3100884BDF /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F2579A3BD1D48D0BC33E4ADF /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 97JCY7859U; + GCC_C_LANGUAGE_STANDARD = gnu11; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.2; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = io.sentry.flutter.example.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 92B25CF12A80EB3100884BDF /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FDFDFB8E5235EA47CE65FBC5 /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 97JCY7859U; + GCC_C_LANGUAGE_STANDARD = gnu11; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.2; + MARKETING_VERSION = 1.0; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = io.sentry.flutter.example.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 92B25CF22A80EB3100884BDF /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3CEA108DF90E0A3E0A377D59 /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 97JCY7859U; + GCC_C_LANGUAGE_STANDARD = gnu11; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 16.2; + MARKETING_VERSION = 1.0; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = io.sentry.flutter.example.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; 97C147031CF9000F007C117D /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -562,6 +756,16 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 92B25CF32A80EB3100884BDF /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 92B25CF02A80EB3100884BDF /* Debug */, + 92B25CF12A80EB3100884BDF /* Release */, + 92B25CF22A80EB3100884BDF /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index c87d15a335..0fa7c24eb1 100644 --- a/flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ + + + + SentryFlutter { + return SentryFlutter() + } + } +} diff --git a/flutter/example/lib/auto_close_screen.dart b/flutter/example/lib/auto_close_screen.dart new file mode 100644 index 0000000000..15e8fac1fb --- /dev/null +++ b/flutter/example/lib/auto_close_screen.dart @@ -0,0 +1,47 @@ +import 'package:flutter/material.dart'; +import 'package:sentry/sentry.dart'; + +/// This screen is only used to demonstrate how route navigation works. +/// Init will create a child span and pop the screen after 3 seconds. +/// Afterwards the transaction should be seen on the performance page. +class AutoCloseScreen extends StatefulWidget { + const AutoCloseScreen({super.key}); + + @override + AutoCloseScreenState createState() => AutoCloseScreenState(); +} + +class AutoCloseScreenState extends State { + static const delayInSeconds = 3; + + @override + void initState() { + super.initState(); + _doComplexOperationThenClose(); + } + + Future _doComplexOperationThenClose() async { + final activeSpan = Sentry.getSpan(); + final childSpan = activeSpan?.startChild('complex operation', + description: 'running a $delayInSeconds seconds operation'); + await Future.delayed(const Duration(seconds: delayInSeconds)); + childSpan?.finish(); + // ignore: use_build_context_synchronously + Navigator.of(context).pop(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Delayed Screen'), + ), + body: const Center( + child: Text( + 'This screen will automatically close in $delayInSeconds seconds...', + textAlign: TextAlign.center, + ), + ), + ); + } +} diff --git a/flutter/example/lib/drift/connection/connection.dart b/flutter/example/lib/drift/connection/connection.dart new file mode 100644 index 0000000000..7ef7ddc757 --- /dev/null +++ b/flutter/example/lib/drift/connection/connection.dart @@ -0,0 +1 @@ +export 'unsupported.dart' if (dart.library.ffi) 'native.dart'; diff --git a/flutter/example/lib/drift/connection/native.dart b/flutter/example/lib/drift/connection/native.dart new file mode 100644 index 0000000000..fb9987412e --- /dev/null +++ b/flutter/example/lib/drift/connection/native.dart @@ -0,0 +1,7 @@ +import 'package:drift/backends.dart'; +import 'package:drift/drift.dart'; +import 'package:drift/native.dart'; + +QueryExecutor inMemoryExecutor() { + return NativeDatabase.memory(); +} diff --git a/flutter/example/lib/drift/connection/unsupported.dart b/flutter/example/lib/drift/connection/unsupported.dart new file mode 100644 index 0000000000..87b9b45143 --- /dev/null +++ b/flutter/example/lib/drift/connection/unsupported.dart @@ -0,0 +1,17 @@ +import 'package:drift/drift.dart'; + +Never _unsupported() { + throw UnsupportedError( + 'No suitable database implementation was found on this platform.'); +} + +// Depending on the platform the app is compiled to, the following stubs will +// be replaced with the methods in native.dart or web.dart + +QueryExecutor inMemoryExecutor() { + return _unsupported(); +} + +Future validateDatabaseSchema(GeneratedDatabase database) async { + _unsupported(); +} diff --git a/flutter/example/lib/drift/database.dart b/flutter/example/lib/drift/database.dart new file mode 100644 index 0000000000..914a87ca1a --- /dev/null +++ b/flutter/example/lib/drift/database.dart @@ -0,0 +1,18 @@ +import 'package:drift/drift.dart'; + +part 'database.g.dart'; + +class TodoItems extends Table { + IntColumn get id => integer().autoIncrement()(); + TextColumn get title => text().withLength(min: 6, max: 32)(); + TextColumn get content => text().named('body')(); + IntColumn get category => integer().nullable()(); +} + +@DriftDatabase(tables: [TodoItems]) +class AppDatabase extends _$AppDatabase { + AppDatabase(super.e); + + @override + int get schemaVersion => 1; +} diff --git a/flutter/example/lib/drift/database.g.dart b/flutter/example/lib/drift/database.g.dart new file mode 100644 index 0000000000..1f9d234456 --- /dev/null +++ b/flutter/example/lib/drift/database.g.dart @@ -0,0 +1,269 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'database.dart'; + +// ignore_for_file: type=lint +class $TodoItemsTable extends TodoItems + with TableInfo<$TodoItemsTable, TodoItem> { + @override + final GeneratedDatabase attachedDatabase; + final String? _alias; + $TodoItemsTable(this.attachedDatabase, [this._alias]); + static const VerificationMeta _idMeta = const VerificationMeta('id'); + @override + late final GeneratedColumn id = GeneratedColumn( + 'id', aliasedName, false, + hasAutoIncrement: true, + type: DriftSqlType.int, + requiredDuringInsert: false, + defaultConstraints: + GeneratedColumn.constraintIsAlways('PRIMARY KEY AUTOINCREMENT')); + static const VerificationMeta _titleMeta = const VerificationMeta('title'); + @override + late final GeneratedColumn title = GeneratedColumn( + 'title', aliasedName, false, + additionalChecks: + GeneratedColumn.checkTextLength(minTextLength: 6, maxTextLength: 32), + type: DriftSqlType.string, + requiredDuringInsert: true); + static const VerificationMeta _contentMeta = + const VerificationMeta('content'); + @override + late final GeneratedColumn content = GeneratedColumn( + 'body', aliasedName, false, + type: DriftSqlType.string, requiredDuringInsert: true); + static const VerificationMeta _categoryMeta = + const VerificationMeta('category'); + @override + late final GeneratedColumn category = GeneratedColumn( + 'category', aliasedName, true, + type: DriftSqlType.int, requiredDuringInsert: false); + @override + List get $columns => [id, title, content, category]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'todo_items'; + @override + VerificationContext validateIntegrity(Insertable instance, + {bool isInserting = false}) { + final context = VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('id')) { + context.handle(_idMeta, id.isAcceptableOrUnknown(data['id']!, _idMeta)); + } + if (data.containsKey('title')) { + context.handle( + _titleMeta, title.isAcceptableOrUnknown(data['title']!, _titleMeta)); + } else if (isInserting) { + context.missing(_titleMeta); + } + if (data.containsKey('body')) { + context.handle(_contentMeta, + content.isAcceptableOrUnknown(data['body']!, _contentMeta)); + } else if (isInserting) { + context.missing(_contentMeta); + } + if (data.containsKey('category')) { + context.handle(_categoryMeta, + category.isAcceptableOrUnknown(data['category']!, _categoryMeta)); + } + return context; + } + + @override + Set get $primaryKey => {id}; + @override + TodoItem map(Map data, {String? tablePrefix}) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return TodoItem( + id: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}id'])!, + title: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}title'])!, + content: attachedDatabase.typeMapping + .read(DriftSqlType.string, data['${effectivePrefix}body'])!, + category: attachedDatabase.typeMapping + .read(DriftSqlType.int, data['${effectivePrefix}category']), + ); + } + + @override + $TodoItemsTable createAlias(String alias) { + return $TodoItemsTable(attachedDatabase, alias); + } +} + +class TodoItem extends DataClass implements Insertable { + final int id; + final String title; + final String content; + final int? category; + const TodoItem( + {required this.id, + required this.title, + required this.content, + this.category}); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['id'] = Variable(id); + map['title'] = Variable(title); + map['body'] = Variable(content); + if (!nullToAbsent || category != null) { + map['category'] = Variable(category); + } + return map; + } + + TodoItemsCompanion toCompanion(bool nullToAbsent) { + return TodoItemsCompanion( + id: Value(id), + title: Value(title), + content: Value(content), + category: category == null && nullToAbsent + ? const Value.absent() + : Value(category), + ); + } + + factory TodoItem.fromJson(Map json, + {ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return TodoItem( + id: serializer.fromJson(json['id']), + title: serializer.fromJson(json['title']), + content: serializer.fromJson(json['content']), + category: serializer.fromJson(json['category']), + ); + } + @override + Map toJson({ValueSerializer? serializer}) { + serializer ??= driftRuntimeOptions.defaultSerializer; + return { + 'id': serializer.toJson(id), + 'title': serializer.toJson(title), + 'content': serializer.toJson(content), + 'category': serializer.toJson(category), + }; + } + + TodoItem copyWith( + {int? id, + String? title, + String? content, + Value category = const Value.absent()}) => + TodoItem( + id: id ?? this.id, + title: title ?? this.title, + content: content ?? this.content, + category: category.present ? category.value : this.category, + ); + @override + String toString() { + return (StringBuffer('TodoItem(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('content: $content, ') + ..write('category: $category') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(id, title, content, category); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is TodoItem && + other.id == this.id && + other.title == this.title && + other.content == this.content && + other.category == this.category); +} + +class TodoItemsCompanion extends UpdateCompanion { + final Value id; + final Value title; + final Value content; + final Value category; + const TodoItemsCompanion({ + this.id = const Value.absent(), + this.title = const Value.absent(), + this.content = const Value.absent(), + this.category = const Value.absent(), + }); + TodoItemsCompanion.insert({ + this.id = const Value.absent(), + required String title, + required String content, + this.category = const Value.absent(), + }) : title = Value(title), + content = Value(content); + static Insertable custom({ + Expression? id, + Expression? title, + Expression? content, + Expression? category, + }) { + return RawValuesInsertable({ + if (id != null) 'id': id, + if (title != null) 'title': title, + if (content != null) 'body': content, + if (category != null) 'category': category, + }); + } + + TodoItemsCompanion copyWith( + {Value? id, + Value? title, + Value? content, + Value? category}) { + return TodoItemsCompanion( + id: id ?? this.id, + title: title ?? this.title, + content: content ?? this.content, + category: category ?? this.category, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (id.present) { + map['id'] = Variable(id.value); + } + if (title.present) { + map['title'] = Variable(title.value); + } + if (content.present) { + map['body'] = Variable(content.value); + } + if (category.present) { + map['category'] = Variable(category.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('TodoItemsCompanion(') + ..write('id: $id, ') + ..write('title: $title, ') + ..write('content: $content, ') + ..write('category: $category') + ..write(')')) + .toString(); + } +} + +abstract class _$AppDatabase extends GeneratedDatabase { + _$AppDatabase(QueryExecutor e) : super(e); + late final $TodoItemsTable todoItems = $TodoItemsTable(this); + @override + Iterable> get allTables => + allSchemaEntities.whereType>(); + @override + List get allSchemaEntities => [todoItems]; +} diff --git a/flutter/example/lib/isar/user.dart b/flutter/example/lib/isar/user.dart new file mode 100644 index 0000000000..f255d2389d --- /dev/null +++ b/flutter/example/lib/isar/user.dart @@ -0,0 +1,12 @@ +import 'package:isar/isar.dart'; + +part 'user.g.dart'; + +@collection +class User { + Id id = Isar.autoIncrement; + + String? name; + + int? age; +} diff --git a/flutter/example/lib/isar/user.g.dart b/flutter/example/lib/isar/user.g.dart new file mode 100644 index 0000000000..c4d7ef985f --- /dev/null +++ b/flutter/example/lib/isar/user.g.dart @@ -0,0 +1,553 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user.dart'; + +// ************************************************************************** +// IsarCollectionGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +extension GetUserCollection on Isar { + IsarCollection get users => this.collection(); +} + +final UserSchema = CollectionSchema( + name: r'User', + id: BigInt.parse("-7838171048429979076").toInt(), + properties: { + r'age': PropertySchema( + id: BigInt.parse("0").toInt(), + name: r'age', + type: IsarType.long, + ), + r'name': PropertySchema( + id: BigInt.parse("1").toInt(), + name: r'name', + type: IsarType.string, + ) + }, + estimateSize: _userEstimateSize, + serialize: _userSerialize, + deserialize: _userDeserialize, + deserializeProp: _userDeserializeProp, + idName: r'id', + indexes: {}, + links: {}, + embeddedSchemas: {}, + getId: _userGetId, + getLinks: _userGetLinks, + attach: _userAttach, + version: '3.1.0', +); + +int _userEstimateSize( + User object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + { + final value = object.name; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + return bytesCount; +} + +void _userSerialize( + User object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeLong(offsets[0], object.age); + writer.writeString(offsets[1], object.name); +} + +User _userDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = User(); + object.age = reader.readLongOrNull(offsets[0]); + object.id = id; + object.name = reader.readStringOrNull(offsets[1]); + return object; +} + +P _userDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readLongOrNull(offset)) as P; + case 1: + return (reader.readStringOrNull(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +Id _userGetId(User object) { + return object.id; +} + +List> _userGetLinks(User object) { + return []; +} + +void _userAttach(IsarCollection col, Id id, User object) { + object.id = id; +} + +extension UserQueryWhereSort on QueryBuilder { + QueryBuilder anyId() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(const IdWhereClause.any()); + }); + } +} + +extension UserQueryWhere on QueryBuilder { + QueryBuilder idEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: id, + upper: id, + )); + }); + } + + QueryBuilder idNotEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ) + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ); + } else { + return query + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ) + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ); + } + }); + } + + QueryBuilder idGreaterThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: include), + ); + }); + } + + QueryBuilder idLessThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: include), + ); + }); + } + + QueryBuilder idBetween( + Id lowerId, + Id upperId, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: lowerId, + includeLower: includeLower, + upper: upperId, + includeUpper: includeUpper, + )); + }); + } +} + +extension UserQueryFilter on QueryBuilder { + QueryBuilder ageIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'age', + )); + }); + } + + QueryBuilder ageIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'age', + )); + }); + } + + QueryBuilder ageEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'age', + value: value, + )); + }); + } + + QueryBuilder ageGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'age', + value: value, + )); + }); + } + + QueryBuilder ageLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'age', + value: value, + )); + }); + } + + QueryBuilder ageBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'age', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder idEqualTo(Id value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idGreaterThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idLessThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idBetween( + Id lower, + Id upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'id', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder nameIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'name', + )); + }); + } + + QueryBuilder nameIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'name', + )); + }); + } + + QueryBuilder nameEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'name', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameContains(String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameMatches(String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'name', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'name', + value: '', + )); + }); + } + + QueryBuilder nameIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'name', + value: '', + )); + }); + } +} + +extension UserQueryObject on QueryBuilder {} + +extension UserQueryLinks on QueryBuilder {} + +extension UserQuerySortBy on QueryBuilder { + QueryBuilder sortByAge() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'age', Sort.asc); + }); + } + + QueryBuilder sortByAgeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'age', Sort.desc); + }); + } + + QueryBuilder sortByName() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'name', Sort.asc); + }); + } + + QueryBuilder sortByNameDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'name', Sort.desc); + }); + } +} + +extension UserQuerySortThenBy on QueryBuilder { + QueryBuilder thenByAge() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'age', Sort.asc); + }); + } + + QueryBuilder thenByAgeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'age', Sort.desc); + }); + } + + QueryBuilder thenById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.asc); + }); + } + + QueryBuilder thenByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.desc); + }); + } + + QueryBuilder thenByName() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'name', Sort.asc); + }); + } + + QueryBuilder thenByNameDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'name', Sort.desc); + }); + } +} + +extension UserQueryWhereDistinct on QueryBuilder { + QueryBuilder distinctByAge() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'age'); + }); + } + + QueryBuilder distinctByName( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'name', caseSensitive: caseSensitive); + }); + } +} + +extension UserQueryProperty on QueryBuilder { + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'id'); + }); + } + + QueryBuilder ageProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'age'); + }); + } + + QueryBuilder nameProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'name'); + }); + } +} diff --git a/flutter/example/lib/main.dart b/flutter/example/lib/main.dart index 6d657a589e..26bbdce6d8 100644 --- a/flutter/example/lib/main.dart +++ b/flutter/example/lib/main.dart @@ -7,7 +7,10 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:logging/logging.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:sentry_drift/sentry_drift.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; +import 'package:sentry_isar/sentry_isar.dart'; import 'package:sentry_sqflite/sentry_sqflite.dart'; import 'package:sqflite/sqflite.dart'; // import 'package:sqflite_common_ffi/sqflite_ffi.dart'; @@ -15,27 +18,35 @@ import 'package:sqflite/sqflite.dart'; import 'package:universal_platform/universal_platform.dart'; import 'package:feedback/feedback.dart' as feedback; import 'package:provider/provider.dart'; +import 'auto_close_screen.dart'; +import 'drift/database.dart'; +import 'drift/connection/connection.dart'; +import 'isar/user.dart'; import 'user_feedback_dialog.dart'; import 'package:dio/dio.dart'; import 'package:sentry_dio/sentry_dio.dart'; import 'package:sentry_logging/sentry_logging.dart'; +import 'package:sentry_hive/sentry_hive.dart'; // ATTENTION: Change the DSN below with your own to see the events in Sentry. Get one at sentry.io const String exampleDsn = 'https://e85b375ffb9f43cf8bdf9787768149e0@o447951.ingest.sentry.io/5428562'; +/// This is an exampleUrl that will be used to demonstrate how http requests are captured. +const String exampleUrl = 'https://jsonplaceholder.typicode.com/todos/'; + const _channel = MethodChannel('example.flutter.sentry.io'); var _isIntegrationTest = false; +final GlobalKey navigatorKey = GlobalKey(); + Future main() async { await setupSentry( () => runApp( - SentryScreenshotWidget( - child: SentryUserInteractionWidget( - child: DefaultAssetBundle( - bundle: SentryAssetBundle(), - child: const MyApp(), - ), + SentryWidget( + child: DefaultAssetBundle( + bundle: SentryAssetBundle(), + child: const MyApp(), ), ), ), @@ -48,6 +59,7 @@ Future setupSentry(AppRunner appRunner, String dsn, await SentryFlutter.init((options) { options.dsn = exampleDsn; options.tracesSampleRate = 1.0; + options.profilesSampleRate = 1.0; options.reportPackages = false; options.addInAppInclude('sentry_flutter_example'); options.considerInAppFramesByDefault = false; @@ -93,6 +105,7 @@ class _MyAppState extends State { create: (_) => ThemeProvider(), child: Builder( builder: (context) => MaterialApp( + navigatorKey: navigatorKey, navigatorObservers: [ SentryNavigatorObserver(), ], @@ -105,6 +118,30 @@ class _MyAppState extends State { } } +class TooltipButton extends StatelessWidget { + final String text; + final String buttonTitle; + final void Function()? onPressed; + + const TooltipButton( + {required this.onPressed, + required this.buttonTitle, + required this.text, + Key? key}) + : super(key: key); + + @override + Widget build(BuildContext context) { + return Tooltip( + message: text, + child: ElevatedButton( + onPressed: onPressed, + key: key, + child: Text(buttonTitle), + )); + } +} + class MainScaffold extends StatelessWidget { const MainScaffold({ Key? key, @@ -147,67 +184,121 @@ class MainScaffold extends StatelessWidget { child: Column( children: [ if (_isIntegrationTest) const IntegrationTestWidget(), - const Center(child: Text('Trigger an action:\n')), - ElevatedButton( - onPressed: () => sqfliteTest(), - child: const Text('sqflite'), + const Center(child: Text('Trigger an action.\n')), + const Padding( + padding: EdgeInsets.all(15), //apply padding to all four sides + child: Center( + child: Text( + 'Long press a button to see more information. (hover on web)')), + ), + TooltipButton( + onPressed: () => navigateToAutoCloseScreen(context), + text: + 'Pushes a screen and creates a transaction named \'AutoCloseScreen\' with a child span that finishes after 3 seconds. \nAfter the screen has popped the transaction can then be seen on the performance page.', + buttonTitle: 'Route Navigation Observer', + ), + if (!UniversalPlatform.isWeb) + TooltipButton( + onPressed: driftTest, + text: + 'Executes CRUD operations on an in-memory with Drift and sends the created transaction to Sentry.', + buttonTitle: 'drift', + ), + if (!UniversalPlatform.isWeb) + TooltipButton( + onPressed: hiveTest, + text: + 'Executes CRUD operations on an in-memory with Hive and sends the created transaction to Sentry.', + buttonTitle: 'hive', + ), + if (!UniversalPlatform.isWeb) + TooltipButton( + onPressed: isarTest, + text: + 'Executes CRUD operations on an in-memory with Isart and sends the created transaction to Sentry.', + buttonTitle: 'isar', + ), + TooltipButton( + onPressed: sqfliteTest, + text: + 'Executes CRUD operations on an in-memory with Hive and sends the created transaction to Sentry.', + buttonTitle: 'sqflite', ), - ElevatedButton( + TooltipButton( onPressed: () => SecondaryScaffold.openSecondaryScaffold(context), - child: const Text('Open another Scaffold'), + text: + 'Demonstrates how the router integration adds a navigation event to the breadcrumbs that can be seen when throwing an exception for example.', + buttonTitle: 'Open another Scaffold', ), - ElevatedButton( - onPressed: () => tryCatch(), - key: const Key('dart_try_catch'), - child: const Text('Dart: try catch'), + const TooltipButton( + onPressed: tryCatch, + key: Key('dart_try_catch'), + text: 'Creates a caught exception and sends it to Sentry.', + buttonTitle: 'Dart: try catch', ), - ElevatedButton( - onPressed: () => Scaffold.of(context).showBottomSheet( - (context) => const Text('Scaffold error'), - ), - child: const Text('Flutter error : Scaffold.of()'), + TooltipButton( + onPressed: () => Scaffold.of(context) + .showBottomSheet((context) => const Text('Scaffold error')), + text: + 'Creates an uncaught exception and sends it to Sentry. This demonstrates how our flutter error integration catches unhandled exceptions.', + buttonTitle: 'Flutter error : Scaffold.of()', ), - ElevatedButton( + TooltipButton( // Warning : not captured if a debugger is attached // https://github.com/flutter/flutter/issues/48972 onPressed: () => throw Exception('Throws onPressed'), - child: const Text('Dart: throw onPressed'), + text: + 'Creates an uncaught exception and sends it to Sentry. This demonstrates how our flutter error integration catches unhandled exceptions.', + buttonTitle: 'Dart: throw onPressed', ), - ElevatedButton( + TooltipButton( + // Warning : not captured if a debugger is attached + // https://github.com/flutter/flutter/issues/48972 onPressed: () { - // Only relevant in debug builds - // Warning : not captured if a debugger is attached - // https://github.com/flutter/flutter/issues/48972 assert(false, 'assert failure'); }, - child: const Text('Dart: assert'), + text: + 'Creates an uncaught exception and sends it to Sentry. This demonstrates how our flutter error integration catches unhandled exceptions.', + buttonTitle: 'Dart: assert', ), // Calling the SDK with an appRunner will handle errors from Futures // in SDKs runZonedGuarded onError handler - ElevatedButton( + TooltipButton( onPressed: () async => asyncThrows(), - child: const Text('Dart: async throws'), + text: + 'Creates an async uncaught exception and sends it to Sentry. This demonstrates how our flutter error integration catches unhandled exceptions.', + buttonTitle: 'Dart: async throws', ), - ElevatedButton( + TooltipButton( onPressed: () async => { await Future.microtask( () => throw StateError('Failure in a microtask'), ) }, - child: const Text('Dart: Fail in microtask.'), + text: + 'Creates an uncaught exception in a microtask and sends it to Sentry. This demonstrates how our flutter error integration catches unhandled exceptions.', + buttonTitle: 'Dart: Fail in microtask', ), - ElevatedButton( - onPressed: () async => {await compute(loop, 10)}, - child: const Text('Dart: Fail in compute'), + TooltipButton( + onPressed: () async => { + await compute(loop, 10), + }, + text: + 'Creates an uncaught exception in a compute isolate and sends it to Sentry. This demonstrates how our flutter error integration catches unhandled exceptions.', + buttonTitle: 'Dart: Fail in compute', ), - ElevatedButton( - onPressed: () => Future.delayed( - const Duration(milliseconds: 100), - () => throw Exception('Throws in Future.delayed'), - ), - child: const Text('Throws in Future.delayed'), + TooltipButton( + onPressed: () async => { + await Future.delayed( + const Duration(milliseconds: 100), + () => throw StateError('Failure in a Future.delayed'), + ), + }, + text: + 'Creates an uncaught exception in a Future.delayed and sends it to Sentry. This demonstrates how our flutter error integration catches unhandled exceptions.', + buttonTitle: 'Throws in Future.delayed', ), - ElevatedButton( + TooltipButton( onPressed: () { // modeled after a real exception FlutterError.onError?.call(FlutterErrorDetails( @@ -225,9 +316,11 @@ class MainScaffold extends StatelessWidget { ], )); }, - child: const Text('Capture from FlutterError.onError'), + text: + 'Creates a FlutterError and passes it to FlutterError.onError callback. This demonstrates how our flutter error integration catches unhandled exceptions.', + buttonTitle: 'Capture from FlutterError.onError', ), - ElevatedButton( + TooltipButton( onPressed: () { // Only usable on Flutter >= 3.3 // and needs the following additional setup: @@ -239,41 +332,41 @@ class MainScaffold extends StatelessWidget { StackTrace.current, ); }, - child: const Text('Capture from PlatformDispatcher.onError'), + text: + 'This is only usable on Flutter >= 3.3 and requires additional setup: options.addIntegration(OnErrorIntegration());', + buttonTitle: 'Capture from PlatformDispatcher.onError', ), - ElevatedButton( - key: const Key('view hierarchy'), - onPressed: () => {}, - child: const Visibility( - visible: true, - child: Opacity( - opacity: 0.5, - child: Text('view hierarchy'), - ), - ), - ), - ElevatedButton( + TooltipButton( onPressed: () => makeWebRequest(context), - child: const Text('Dart: Web request'), + text: + 'Attaches web request related spans to the transaction and send it to Sentry.', + buttonTitle: 'Dart: Web request', ), - ElevatedButton( - onPressed: () => showDialogWithTextAndImage(context), - child: const Text('Flutter: Load assets'), - ), - ElevatedButton( + TooltipButton( + onPressed: () => makeWebRequestWithDio(context), key: const Key('dio_web_request'), - onPressed: () async => await makeWebRequestWithDio(context), - child: const Text('Dio: Web request'), + text: + 'Attaches web request related spans to the transaction and send it to Sentry.', + buttonTitle: 'Dio: Web request', + ), + + TooltipButton( + onPressed: () => showDialogWithTextAndImage(context), + text: + 'Attaches asset bundle related spans to the transaction and send it to Sentry.', + buttonTitle: 'Flutter: Load assets', ), - ElevatedButton( + TooltipButton( onPressed: () { // ignore: avoid_print print('A print breadcrumb'); Sentry.captureMessage('A message with a print() Breadcrumb'); }, - child: const Text('Record print() as breadcrumb'), + text: + 'Sends a captureMessage to Sentry with a breadcrumb created by a print() statement.', + buttonTitle: 'Record print() as breadcrumb', ), - ElevatedButton( + TooltipButton( onPressed: () { Sentry.captureMessage( 'This event has an extra tag', @@ -282,10 +375,11 @@ class MainScaffold extends StatelessWidget { }, ); }, - child: - const Text('Capture message with scope with additional tag'), + text: + 'Sends the capture message event with additional Tag to Sentry.', + buttonTitle: 'Capture message with scope with additional tag', ), - ElevatedButton( + TooltipButton( onPressed: () async { final transaction = Sentry.getSpan() ?? Sentry.startTransaction( @@ -327,12 +421,14 @@ class MainScaffold extends StatelessWidget { status: const SpanStatus.internalError()); await Future.delayed(const Duration(milliseconds: 50)); - + // findPrimeNumber(1000000); // Uncomment to see it with profiling await transaction.finish(status: const SpanStatus.ok()); }, - child: const Text('Capture transaction'), + text: + 'Creates a custom transaction, adds child spans and send them to Sentry.', + buttonTitle: 'Capture transaction', ), - ElevatedButton( + TooltipButton( onPressed: () { Sentry.captureMessage( 'This message has an attachment', @@ -348,9 +444,10 @@ class MainScaffold extends StatelessWidget { }, ); }, - child: const Text('Capture message with attachment'), + text: 'Sends the capture message with an attachment to Sentry.', + buttonTitle: 'Capture message with attachment', ), - ElevatedButton( + TooltipButton( onPressed: () { feedback.BetterFeedback.of(context) .show((feedback.UserFeedback feedback) { @@ -374,9 +471,11 @@ class MainScaffold extends StatelessWidget { ); }); }, - child: const Text('Capture message with image attachment'), + text: + 'Sends the capture message with an image attachment to Sentry.', + buttonTitle: 'Capture message with image attachment', ), - ElevatedButton( + TooltipButton( onPressed: () async { final id = await Sentry.captureMessage('UserFeedback'); // ignore: use_build_context_synchronously @@ -392,9 +491,11 @@ class MainScaffold extends StatelessWidget { }, ); }, - child: const Text('Capture User Feedback'), + text: + 'Shows a custom user feedback dialog without an ongoing event that captures and sends user feedback data to Sentry.', + buttonTitle: 'Capture User Feedback', ), - ElevatedButton( + TooltipButton( onPressed: () async { await showDialog( context: context, @@ -403,24 +504,88 @@ class MainScaffold extends StatelessWidget { }, ); }, - child: const Text('Show UserFeedback Dialog without event'), + text: '', + buttonTitle: 'Show UserFeedback Dialog without event', ), - ElevatedButton( + TooltipButton( onPressed: () { final log = Logger('Logging'); log.info('My Logging test'); }, - child: const Text('Logging'), + text: + 'Demonstrates the logging integration. log.info() will create an info event send it to Sentry.', + buttonTitle: 'Logging', ), if (UniversalPlatform.isIOS || UniversalPlatform.isMacOS) const CocoaExample(), if (UniversalPlatform.isAndroid) const AndroidExample(), - ], + ].map((widget) { + if (kIsWeb) { + // Add vertical padding to web so the tooltip doesn't obstruct the clicking of the button below. + return Padding( + padding: const EdgeInsets.only(top: 18.0, bottom: 18.0), + child: widget, + ); + } + return widget; + }).toList(), ), ), ); } + Future isarTest() async { + final tr = Sentry.startTransaction( + 'isarTest', + 'db', + bindToScope: true, + ); + + final dir = await getApplicationDocumentsDirectory(); + + final isar = await SentryIsar.open( + [UserSchema], + directory: dir.path, + ); + + final newUser = User() + ..name = 'Joe Dirt' + ..age = 36; + + await isar.writeTxn(() async { + await isar.users.put(newUser); // insert & update + }); + + final existingUser = await isar.users.get(newUser.id); // get + + await isar.writeTxn(() async { + await isar.users.delete(existingUser!.id); // delete + }); + + await tr.finish(status: const SpanStatus.ok()); + } + + Future hiveTest() async { + final tr = Sentry.startTransaction( + 'hiveTest', + 'db', + bindToScope: true, + ); + + final appDir = await getApplicationDocumentsDirectory(); + SentryHive.init(appDir.path); + + final catsBox = await SentryHive.openBox('cats'); + await catsBox.put('fluffy', {'name': 'Fluffy', 'age': 4}); + await catsBox.put('loki', {'name': 'Loki', 'age': 2}); + await catsBox.clear(); + await catsBox.close(); + + SentryHive.close(); + + await tr.finish(status: const SpanStatus.ok()); + } + Future sqfliteTest() async { final tr = Sentry.startTransaction( 'sqfliteTest', @@ -466,6 +631,34 @@ class MainScaffold extends StatelessWidget { await tr.finish(status: const SpanStatus.ok()); } + + Future driftTest() async { + final tr = Sentry.startTransaction( + 'driftTest', + 'db', + bindToScope: true, + ); + + final executor = SentryQueryExecutor( + () async => inMemoryExecutor(), + databaseName: 'sentry_in_memory_db', + ); + + final db = AppDatabase(executor); + + await db.into(db.todoItems).insert( + TodoItemsCompanion.insert( + title: 'This is a test thing', + content: 'test', + ), + ); + + await db.select(db.todoItems).get(); + + await db.close(); + + await tr.finish(status: const SpanStatus.ok()); + } } extension BuildContextExtension on BuildContext { @@ -526,6 +719,16 @@ class AndroidExample extends StatelessWidget { } } +void navigateToAutoCloseScreen(BuildContext context) { + Navigator.push( + context, + MaterialPageRoute( + settings: const RouteSettings(name: 'AutoCloseScreen'), + builder: (context) => const AutoCloseScreen(), + ), + ); +} + Future tryCatch() async { try { throw StateError('try catch'); @@ -699,7 +902,7 @@ Future makeWebRequest(BuildContext context) async { ); // We don't do any exception handling here. // In case of an exception, let it get caught and reported to Sentry - final response = await client.get(Uri.parse('https://flutter.dev/')); + final response = await client.get(Uri.parse(exampleUrl)); await transaction.finish(status: const SpanStatus.ok()); @@ -711,10 +914,6 @@ Future makeWebRequest(BuildContext context) async { // ignore: use_build_context_synchronously await showDialog( context: context, - // gets tracked if using SentryNavigatorObserver - routeSettings: const RouteSettings( - name: 'flutter.dev dialog', - ), builder: (context) { return AlertDialog( title: Text('Response ${response.statusCode}'), @@ -748,7 +947,7 @@ Future makeWebRequestWithDio(BuildContext context) async { ); Response? response; try { - response = await dio.get('https://flutter.dev/'); + response = await dio.get(exampleUrl); span.status = const SpanStatus.ok(); } catch (exception, stackTrace) { span.throwable = exception; @@ -766,10 +965,6 @@ Future makeWebRequestWithDio(BuildContext context) async { // ignore: use_build_context_synchronously await showDialog( context: context, - // gets tracked if using SentryNavigatorObserver - routeSettings: const RouteSettings( - name: 'flutter.dev dialog', - ), builder: (context) { return AlertDialog( title: Text('Response ${response?.statusCode}'), @@ -855,3 +1050,26 @@ class ThemeProvider extends ChangeNotifier { Future execute(String method) async { await _channel.invokeMethod(method); } + +// Don't inline this one or it shows up as an anonymous closure in profiles. +@pragma("vm:never-inline") +int findPrimeNumber(int n) { + int count = 0; + int a = 2; + while (count < n) { + int b = 2; + bool prime = true; // to check if found a prime + while (b * b <= a) { + if (a % b == 0) { + prime = false; + break; + } + b++; + } + if (prime) { + count++; + } + a++; + } + return a - 1; +} diff --git a/flutter/example/macos/Podfile b/flutter/example/macos/Podfile index fe733905db..6feac427ca 100644 --- a/flutter/example/macos/Podfile +++ b/flutter/example/macos/Podfile @@ -1,4 +1,4 @@ -platform :osx, '10.13' +platform :osx, '10.14' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' @@ -36,5 +36,8 @@ end post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_macos_build_settings(target) + target.build_configurations.each do |config| + config.build_settings['MACOSX_DEPLOYMENT_TARGET'] = '10.14' + end end end diff --git a/flutter/example/macos/Runner.xcodeproj/project.pbxproj b/flutter/example/macos/Runner.xcodeproj/project.pbxproj index d74803f7c0..ad9c506c71 100644 --- a/flutter/example/macos/Runner.xcodeproj/project.pbxproj +++ b/flutter/example/macos/Runner.xcodeproj/project.pbxproj @@ -208,8 +208,8 @@ 33CC10E52044A3C60003C045 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1300; + LastSwiftUpdateCheck = 1430; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = ""; TargetAttributes = { 33CC10EC2044A3C60003C045 = { @@ -412,7 +412,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.13; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; @@ -492,7 +492,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.13; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; @@ -539,7 +539,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.13; + MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; diff --git a/flutter/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/flutter/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 152c342968..99a6840afc 100644 --- a/flutter/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/flutter/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ SentryLevel { + switch diagnosticLevel { + case "fatal": + return .fatal + case "error": + return .error + case "debug": + return .debug + case "warning": + return .warning + case "info": + return .info + default: + return .none + } + } +} diff --git a/flutter/ios/Classes/SentryFlutterPluginApple.swift b/flutter/ios/Classes/SentryFlutterPluginApple.swift index f531fda120..be5e301791 100644 --- a/flutter/ios/Classes/SentryFlutterPluginApple.swift +++ b/flutter/ios/Classes/SentryFlutterPluginApple.swift @@ -39,6 +39,8 @@ public class SentryFlutterPluginApple: NSObject, FlutterPlugin { registrar.addMethodCallDelegate(instance, channel: channel) } + private lazy var sentryFlutter = SentryFlutter() + private func registerObserver() { NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive), @@ -150,6 +152,14 @@ public class SentryFlutterPluginApple: NSObject, FlutterPlugin { let key = arguments?["key"] as? String removeTag(key: key, result: result) + #if !os(tvOS) && !os(watchOS) + case "discardProfiler": + discardProfiler(call, result) + + case "collectProfile": + collectProfile(call, result) + #endif + default: result(FlutterMethodNotImplemented) } @@ -250,7 +260,7 @@ public class SentryFlutterPluginApple: NSObject, FlutterPlugin { } SentrySDK.start { options in - self.updateOptions(arguments: arguments, options: options) + self.sentryFlutter.update(options: options, with: arguments) if arguments["enableAutoPerformanceTracing"] as? Bool ?? false { PrivateSentrySDKOnly.appStartMeasurementHybridSDKMode = true @@ -307,106 +317,6 @@ public class SentryFlutterPluginApple: NSObject, FlutterPlugin { result("") } - // swiftlint:disable:next cyclomatic_complexity - private func updateOptions(arguments: [String: Any], options: Options) { - if let dsn = arguments["dsn"] as? String { - options.dsn = dsn - } - - if let isDebug = arguments["debug"] as? Bool { - options.debug = isDebug - } - - if let environment = arguments["environment"] as? String { - options.environment = environment - } - - if let releaseName = arguments["release"] as? String { - options.releaseName = releaseName - } - - if let enableAutoSessionTracking = arguments["enableAutoSessionTracking"] as? Bool { - options.enableAutoSessionTracking = enableAutoSessionTracking - } - - if let attachStacktrace = arguments["attachStacktrace"] as? Bool { - options.attachStacktrace = attachStacktrace - } - - if let diagnosticLevel = arguments["diagnosticLevel"] as? String, options.debug == true { - options.diagnosticLevel = logLevelFrom(diagnosticLevel: diagnosticLevel) - } - - if let sessionTrackingIntervalMillis = arguments["autoSessionTrackingIntervalMillis"] as? UInt { - options.sessionTrackingIntervalMillis = sessionTrackingIntervalMillis - } - - if let dist = arguments["dist"] as? String { - options.dist = dist - } - - if let enableAutoNativeBreadcrumbs = arguments["enableAutoNativeBreadcrumbs"] as? Bool { - options.enableAutoBreadcrumbTracking = enableAutoNativeBreadcrumbs - } - - if let enableNativeCrashHandling = arguments["enableNativeCrashHandling"] as? Bool { - options.enableCrashHandler = enableNativeCrashHandling - } - - if let maxBreadcrumbs = arguments["maxBreadcrumbs"] as? UInt { - options.maxBreadcrumbs = maxBreadcrumbs - } - - if let sendDefaultPii = arguments["sendDefaultPii"] as? Bool { - options.sendDefaultPii = sendDefaultPii - } - - if let maxCacheItems = arguments["maxCacheItems"] as? UInt { - options.maxCacheItems = maxCacheItems - } - - if let enableWatchdogTerminationTracking = arguments["enableWatchdogTerminationTracking"] as? Bool { - options.enableWatchdogTerminationTracking = enableWatchdogTerminationTracking - } - - if let sendClientReports = arguments["sendClientReports"] as? Bool { - options.sendClientReports = sendClientReports - } - - if let maxAttachmentSize = arguments["maxAttachmentSize"] as? UInt { - options.maxAttachmentSize = maxAttachmentSize - } - - if let captureFailedRequests = arguments["captureFailedRequests"] as? Bool { - options.enableCaptureFailedRequests = captureFailedRequests - } - - if let enableAppHangTracking = arguments["enableAppHangTracking"] as? Bool { - options.enableAppHangTracking = enableAppHangTracking - } - - if let appHangTimeoutIntervalMillis = arguments["appHangTimeoutIntervalMillis"] as? UInt { - options.appHangTimeoutInterval = TimeInterval(appHangTimeoutIntervalMillis) / 1000 - } - } - - private func logLevelFrom(diagnosticLevel: String) -> SentryLevel { - switch diagnosticLevel { - case "fatal": - return .fatal - case "error": - return .error - case "debug": - return .debug - case "warning": - return .warning - case "info": - return .info - default: - return .none - } - } - private func setEventOriginTag(event: Event) { guard let sdk = event.sdk else { return @@ -450,8 +360,8 @@ public class SentryFlutterPluginApple: NSObject, FlutterPlugin { private func captureEnvelope(_ call: FlutterMethodCall, result: @escaping FlutterResult) { guard let arguments = call.arguments as? [Any], !arguments.isEmpty, - let data = (arguments.first as? FlutterStandardTypedData)?.data else { - print("Envelope is null or empty !") + let data = (arguments.first as? FlutterStandardTypedData)?.data else { + print("Envelope is null or empty!") result(FlutterError(code: "2", message: "Envelope is null or empty", details: nil)) return } @@ -483,8 +393,8 @@ public class SentryFlutterPluginApple: NSObject, FlutterPlugin { result(item) #else - print("note: appStartMeasurement not available on this platform") - result(nil) + print("note: appStartMeasurement not available on this platform") + result(nil) #endif } @@ -648,6 +558,42 @@ public class SentryFlutterPluginApple: NSObject, FlutterPlugin { result("") } } + + private func collectProfile(_ call: FlutterMethodCall, _ result: @escaping FlutterResult) { + guard let arguments = call.arguments as? [String: Any], + let traceId = arguments["traceId"] as? String else { + print("Cannot collect profile: trace ID missing") + result(FlutterError(code: "6", message: "Cannot collect profile: trace ID missing", details: nil)) + return + } + + guard let startTime = arguments["startTime"] as? UInt64 else { + print("Cannot collect profile: start time missing") + result(FlutterError(code: "7", message: "Cannot collect profile: start time missing", details: nil)) + return + } + + guard let endTime = arguments["endTime"] as? UInt64 else { + print("Cannot collect profile: end time missing") + result(FlutterError(code: "8", message: "Cannot collect profile: end time missing", details: nil)) + return + } + + let payload = PrivateSentrySDKOnly.collectProfileBetween(startTime, and: endTime, + forTrace: SentryId(uuidString: traceId)) + result(payload) + } + + private func discardProfiler(_ call: FlutterMethodCall, _ result: @escaping FlutterResult) { + guard let traceId = call.arguments as? String else { + print("Cannot discard a profiler: trace ID missing") + result(FlutterError(code: "9", message: "Cannot discard a profiler: trace ID missing", details: nil)) + return + } + + PrivateSentrySDKOnly.discardProfiler(forTrace: SentryId(uuidString: traceId)) + result(nil) + } } // swiftlint:enable function_body_length diff --git a/flutter/ios/sentry_flutter.podspec b/flutter/ios/sentry_flutter.podspec index 0b0351bd44..03220ac7bf 100644 --- a/flutter/ios/sentry_flutter.podspec +++ b/flutter/ios/sentry_flutter.podspec @@ -12,7 +12,7 @@ Sentry SDK for Flutter with support to native through sentry-cocoa. :tag => s.version.to_s } s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' - s.dependency 'Sentry/HybridSDK', '8.10.0' + s.dependency 'Sentry/HybridSDK', '8.19.0' s.ios.dependency 'Flutter' s.osx.dependency 'FlutterMacOS' s.ios.deployment_target = '11.0' diff --git a/flutter/lib/sentry_flutter.dart b/flutter/lib/sentry_flutter.dart index c30ca1f5ad..0f43bf741b 100644 --- a/flutter/lib/sentry_flutter.dart +++ b/flutter/lib/sentry_flutter.dart @@ -1,5 +1,7 @@ -// ignore: invalid_export_of_internal_element /// A Flutter client for Sentry.io crash reporting. +library sentry_flutter; + +// ignore: invalid_export_of_internal_element export 'package:sentry/sentry.dart'; export 'src/integrations/load_release_integration.dart'; @@ -13,3 +15,4 @@ export 'src/screenshot/sentry_screenshot_widget.dart'; export 'src/screenshot/sentry_screenshot_quality.dart'; export 'src/user_interaction/sentry_user_interaction_widget.dart'; export 'src/binding_wrapper.dart'; +export 'src/sentry_widget.dart'; diff --git a/flutter/lib/src/event_processor/android_platform_exception_event_processor.dart b/flutter/lib/src/event_processor/android_platform_exception_event_processor.dart index ce77150c40..6570dedd81 100644 --- a/flutter/lib/src/event_processor/android_platform_exception_event_processor.dart +++ b/flutter/lib/src/event_processor/android_platform_exception_event_processor.dart @@ -15,9 +15,6 @@ class AndroidPlatformExceptionEventProcessor implements EventProcessor { final SentryFlutterOptions _options; - // Because of obfuscation, we need to dynamically get the name - static final _platformExceptionType = (PlatformException).toString(); - @override Future apply(SentryEvent event, Hint hint) async { if (event is SentryTransaction) { @@ -29,19 +26,23 @@ class AndroidPlatformExceptionEventProcessor implements EventProcessor { return event; } - final nativeStackTrace = plaformException.stacktrace; - if (nativeStackTrace == null) { - return event; - } - try { // PackageInfo has an internal cache, so no need to do it ourselves. final packageInfo = await PackageInfo.fromPlatform(); + + final nativeStackTrace = + _tryParse(plaformException.stacktrace, packageInfo.packageName); + final messageStackTrace = + _tryParse(plaformException.message, packageInfo.packageName); + + if (nativeStackTrace == null && messageStackTrace == null) { + return event; + } + return _processPlatformException( event, - plaformException, nativeStackTrace, - packageInfo.packageName, + messageStackTrace, ); } catch (e, stackTrace) { _options.logger( @@ -55,25 +56,35 @@ class AndroidPlatformExceptionEventProcessor implements EventProcessor { } } - SentryEvent _processPlatformException( - SentryEvent event, - PlatformException exception, - String nativeStackTrace, + List>? _tryParse( + String? potentialStackTrace, String packageName, ) { - final jvmException = - _JvmExceptionFactory(packageName).fromJvmStackTrace(nativeStackTrace); + if (potentialStackTrace == null) { + return null; + } - final exceptions = _removePlatformExceptionStackTraceFromValue( - event.exceptions, - exception, - ); + return _JvmExceptionFactory(packageName) + .fromJvmStackTrace(potentialStackTrace); + } + SentryEvent _processPlatformException( + SentryEvent event, + List>? nativeStackTrace, + List>? messageStackTrace, + ) { final threads = _markDartThreadsAsNonCrashed(event.threads); - final jvmExceptions = jvmException.map((e) => e.key); + final jvmExceptions = [ + ...?nativeStackTrace?.map((e) => e.key), + ...?messageStackTrace?.map((e) => e.key) + ]; + + var jvmThreads = [ + ...?nativeStackTrace?.map((e) => e.value), + ...?messageStackTrace?.map((e) => e.value), + ]; - var jvmThreads = jvmException.map((e) => e.value).toList(growable: false); if (jvmThreads.isNotEmpty) { // filter potential duplicated threads final first = jvmThreads.first; @@ -84,13 +95,16 @@ class AndroidPlatformExceptionEventProcessor implements EventProcessor { jvmThreads.add(first); } - return event.copyWith(exceptions: [ - ...?exceptions, - ...jvmExceptions, - ], threads: [ - ...?threads, - if (_options.attachThreads) ...jvmThreads, - ]); + return event.copyWith( + exceptions: [ + ...?event.exceptions, + ...jvmExceptions, + ], + threads: [ + ...?threads, + if (_options.attachThreads) ...jvmThreads, + ], + ); } /// If the crash originated on Android, the Dart side didn't crash. @@ -99,60 +113,16 @@ class AndroidPlatformExceptionEventProcessor implements EventProcessor { List? threads, ) { return threads - ?.map((e) => e.copyWith( - crashed: false, - // Isolate is safe to use directly, - // because Android is only run in the dart:io context. - current: e.name == Isolate.current.debugName, - )) + ?.map( + (e) => e.copyWith( + crashed: false, + // Isolate is safe to use directly, + // because Android is only run in the dart:io context. + current: e.name == Isolate.current.debugName, + ), + ) .toList(growable: false); } - - /// Remove the StackTrace from [PlatformException] so the message on Sentry - /// looks much better. - List? _removePlatformExceptionStackTraceFromValue( - List? exceptions, - PlatformException platformException, - ) { - if (exceptions == null || exceptions.isEmpty) { - return null; - } - final exceptionCopy = List.from(exceptions); - - final sentryExceptions = exceptionCopy - .where((element) => element.type == _platformExceptionType); - if (sentryExceptions.isEmpty) { - return null; - } - var sentryException = sentryExceptions.first; - - final exceptionIndex = exceptionCopy.indexOf(sentryException); - exceptionCopy.remove(sentryException); - - // Remove stacktrace, so that the PlatformException value doesn't - // include the chained exception. - // PlatformException.stackTrace is an empty string so that - // PlatformException.toString() results in - // `PlatformException(error, Exception Message, null, )` - // instead of - // `PlatformException(error, Exception Message, null, null)`. - // While `null` for `PlatformException.stackTrace` is technically correct - // it's semantically wrong. - platformException = PlatformException( - code: platformException.code, - details: platformException.details, - message: platformException.message, - stacktrace: '', - ); - - sentryException = sentryException.copyWith( - value: platformException.toString(), - ); - - exceptionCopy.insert(exceptionIndex, sentryException); - - return exceptionCopy; - } } class _JvmExceptionFactory { @@ -161,7 +131,8 @@ class _JvmExceptionFactory { final String nativePackageName; List> fromJvmStackTrace( - String exceptionAsString) { + String exceptionAsString, + ) { final jvmException = JvmException.parse(exceptionAsString); final jvmExceptions = [ jvmException, diff --git a/flutter/lib/src/event_processor/flutter_enricher_event_processor.dart b/flutter/lib/src/event_processor/flutter_enricher_event_processor.dart index 0df522c379..0ea1b731d6 100644 --- a/flutter/lib/src/event_processor/flutter_enricher_event_processor.dart +++ b/flutter/lib/src/event_processor/flutter_enricher_event_processor.dart @@ -5,6 +5,7 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:sentry/sentry.dart'; +import '../navigation/sentry_navigator_observer.dart'; import '../sentry_flutter_options.dart'; typedef WidgetBindingGetter = WidgetsBinding? Function(); @@ -47,6 +48,11 @@ class FlutterEnricherEventProcessor implements EventProcessor { app: _getApp(event.contexts.app), ); + final app = contexts.app; + if (app != null) { + contexts.app = _appWithCurrentRouteViewName(app); + } + // Flutter has a lot of Accessibility Settings available and exposes them contexts['accessibility'] = _getAccessibilityContext(); @@ -101,7 +107,9 @@ class FlutterEnricherEventProcessor implements EventProcessor { } SentryCulture _getCulture(SentryCulture? culture) { - final languageTag = _window?.locale.toLanguageTag(); + final windowLanguageTag = _window?.locale.toLanguageTag(); + final screenLocale = _retrieveWidgetLocale(_options.navigatorKey); + final languageTag = screenLocale?.toLanguageTag() ?? windowLanguageTag; // Future enhancement: // _window?.locales @@ -126,24 +134,26 @@ class FlutterEnricherEventProcessor implements EventProcessor { // ignore: deprecated_member_use final hasRenderView = _widgetsBinding?.renderViewElement != null; + final renderer = _options.rendererWrapper.getRenderer()?.name; + return { 'has_render_view': hasRenderView.toString(), if (tempDebugBrightnessOverride != null) - 'debug_brightness_override': describeEnum(tempDebugBrightnessOverride), + 'debug_brightness_override': tempDebugBrightnessOverride.name, if (debugPlatformOverride != null) - 'debug_default_target_platform_override': - describeEnum(debugPlatformOverride), + 'debug_default_target_platform_override': debugPlatformOverride.name, if (initialLifecycleState != null && initialLifecycleState.isNotEmpty) 'initial_lifecycle_state': initialLifecycleState, if (defaultRouteName != null && defaultRouteName.isNotEmpty) 'default_route_name': defaultRouteName, if (currentLifecycle != null) - 'current_lifecycle_state': describeEnum(currentLifecycle), + 'current_lifecycle_state': currentLifecycle.name, // Seems to always return false. // Also always fails in tests. // See https://github.com/flutter/flutter/issues/83919 // 'window_is_visible': _window.viewConfiguration.visible, - 'renderer': _options.rendererWrapper.getRenderer().name, + if (renderer != null) 'renderer': renderer, + if (_appFlavor != null) 'appFlavor': _appFlavor!, }; } @@ -237,4 +247,30 @@ class FlutterEnricherEventProcessor implements EventProcessor { inForeground: inForeground, ); } + + SentryApp _appWithCurrentRouteViewName(SentryApp app) { + final currentRouteName = SentryNavigatorObserver.currentRouteName; + if (currentRouteName != null) { + final viewNames = app.viewNames ?? []; + viewNames.add(currentRouteName); + return app.copyWith(viewNames: viewNames); + } else { + return app; + } + } + + Locale? _retrieveWidgetLocale(GlobalKey? navigatorKey) { + final BuildContext? context = navigatorKey?.currentContext; + if (context != null) { + return Localizations.maybeLocaleOf(context); + } + return null; + } } + +/// Copied from https://api.flutter.dev/flutter/services/appFlavor-constant.html +/// As soon as Flutter 3.16 is the minimal supported version of Sentry, this +/// can be replaced with the property from the link above. +const String? _appFlavor = String.fromEnvironment('FLUTTER_APP_FLAVOR') != '' + ? String.fromEnvironment('FLUTTER_APP_FLAVOR') + : null; diff --git a/flutter/lib/src/event_processor/native_app_start_event_processor.dart b/flutter/lib/src/event_processor/native_app_start_event_processor.dart index 0127f36d5a..58ee8fa824 100644 --- a/flutter/lib/src/event_processor/native_app_start_event_processor.dart +++ b/flutter/lib/src/event_processor/native_app_start_event_processor.dart @@ -2,8 +2,7 @@ import 'dart:async'; import 'package:sentry/sentry.dart'; -import '../sentry_native.dart'; -import '../sentry_native_channel.dart'; +import '../native/sentry_native.dart'; /// EventProcessor that enriches [SentryTransaction] objects with app start /// measurement. diff --git a/flutter/lib/src/event_processor/screenshot_event_processor.dart b/flutter/lib/src/event_processor/screenshot_event_processor.dart index 8a68fed1c1..8981afe7b1 100644 --- a/flutter/lib/src/event_processor/screenshot_event_processor.dart +++ b/flutter/lib/src/event_processor/screenshot_event_processor.dart @@ -8,6 +8,7 @@ import '../screenshot/sentry_screenshot_widget.dart'; import '../sentry_flutter_options.dart'; import 'package:flutter/rendering.dart'; import '../renderer/renderer.dart'; +import 'package:flutter/widgets.dart' as widget; class ScreenshotEventProcessor implements EventProcessor { final SentryFlutterOptions _options; @@ -29,12 +30,49 @@ class ScreenshotEventProcessor implements EventProcessor { _hasSentryScreenshotWidget) { return event; } + final beforeScreenshot = _options.beforeScreenshot; + if (beforeScreenshot != null) { + try { + final result = beforeScreenshot(event, hint: hint); + bool takeScreenshot; + if (result is Future) { + takeScreenshot = await result; + } else { + takeScreenshot = result; + } + if (!takeScreenshot) { + return event; + } + } catch (exception, stackTrace) { + _options.logger( + SentryLevel.error, + 'The beforeScreenshot callback threw an exception', + exception: exception, + stackTrace: stackTrace, + ); + // ignore: invalid_use_of_internal_member + if (_options.automatedTestMode) { + rethrow; + } + } + } final renderer = _options.rendererWrapper.getRenderer(); - if (renderer != FlutterRenderer.skia && + + if (_options.platformChecker.isWeb && renderer != FlutterRenderer.canvasKit) { + _options.logger( + SentryLevel.debug, + 'Cannot take screenshot with ${renderer?.name} renderer.', + ); + return event; + } + + if (_options.attachScreenshotOnlyWhenResumed && + widget.WidgetsBinding.instance.lifecycleState != + AppLifecycleState.resumed) { _options.logger(SentryLevel.debug, - 'Cannot take screenshot with ${_options.rendererWrapper.getRenderer().name} renderer.'); + 'Only attaching screenshots when application state is resumed.'); return event; } diff --git a/flutter/lib/src/flutter_sentry_attachment.dart b/flutter/lib/src/flutter_sentry_attachment.dart index 83b75c20bd..2e8d57927a 100644 --- a/flutter/lib/src/flutter_sentry_attachment.dart +++ b/flutter/lib/src/flutter_sentry_attachment.dart @@ -16,8 +16,8 @@ class FlutterSentryAttachment extends SentryAttachment { String? filename, AssetBundle? bundle, String? type, - String? contentType, - bool? addToTransactions, + super.contentType, + super.addToTransactions, }) : super.fromLoader( loader: () async { final data = await (bundle ?? rootBundle).load(key); @@ -28,7 +28,5 @@ class FlutterSentryAttachment extends SentryAttachment { ? Uri.parse(key).pathSegments.last : 'unknown'), attachmentType: type, - contentType: contentType, - addToTransactions: addToTransactions, ); } diff --git a/flutter/lib/src/integrations/connectivity/connectivity_integration.dart b/flutter/lib/src/integrations/connectivity/connectivity_integration.dart new file mode 100644 index 0000000000..c8d0b80c86 --- /dev/null +++ b/flutter/lib/src/integrations/connectivity/connectivity_integration.dart @@ -0,0 +1,36 @@ +import 'package:meta/meta.dart'; +import '../../../sentry_flutter.dart'; +import 'connectivity_provider.dart'; + +class ConnectivityIntegration extends Integration { + Hub? _hub; + ConnectivityProvider? _connectivityProvider; + + @override + void call(Hub hub, SentryFlutterOptions options) { + _hub = hub; + _connectivityProvider = ConnectivityProvider(); + _connectivityProvider?.listen((connectivity) { + addBreadcrumb(connectivity); + }); + options.sdk.addIntegration('connectivityIntegration'); + } + + @override + void close() { + _hub = null; + _connectivityProvider?.cancel(); + } + + @internal + @visibleForTesting + void addBreadcrumb(String connectivity) { + _hub?.addBreadcrumb( + Breadcrumb( + category: 'device.connectivity', + level: SentryLevel.info, + type: 'connectivity', + data: {'connectivity': connectivity}), + ); + } +} diff --git a/flutter/lib/src/integrations/connectivity/connectivity_provider.dart b/flutter/lib/src/integrations/connectivity/connectivity_provider.dart new file mode 100644 index 0000000000..30095dda0d --- /dev/null +++ b/flutter/lib/src/integrations/connectivity/connectivity_provider.dart @@ -0,0 +1,9 @@ +import 'noop_connectivity_provider.dart' + if (dart.library.html) 'web_connectivity_provider.dart'; + +abstract class ConnectivityProvider { + factory ConnectivityProvider() => connectivityProvider(); + + void listen(void Function(String connectivity) onChange); + void cancel(); +} diff --git a/flutter/lib/src/integrations/connectivity/noop_connectivity_provider.dart b/flutter/lib/src/integrations/connectivity/noop_connectivity_provider.dart new file mode 100644 index 0000000000..4276448b7a --- /dev/null +++ b/flutter/lib/src/integrations/connectivity/noop_connectivity_provider.dart @@ -0,0 +1,17 @@ +import 'connectivity_provider.dart'; + +ConnectivityProvider connectivityProvider() { + return NoOpConnectivityProvider(); +} + +class NoOpConnectivityProvider implements ConnectivityProvider { + @override + void listen(void Function(String connectivity) onChange) { + // NoOp + } + + @override + void cancel() { + // NoOp + } +} diff --git a/flutter/lib/src/integrations/connectivity/web_connectivity_provider.dart b/flutter/lib/src/integrations/connectivity/web_connectivity_provider.dart new file mode 100644 index 0000000000..34d0e0ab42 --- /dev/null +++ b/flutter/lib/src/integrations/connectivity/web_connectivity_provider.dart @@ -0,0 +1,32 @@ +import 'dart:async'; +import 'dart:html' as html; + +import 'connectivity_provider.dart'; + +ConnectivityProvider connectivityProvider() { + return WebConnectivityProvider(); +} + +class WebConnectivityProvider implements ConnectivityProvider { + StreamSubscription? _onOnlineSub; + StreamSubscription? _onOfflineSub; + + @override + void listen(void Function(String connectivity) onChange) { + _onOnlineSub = html.window.onOnline.listen((_) { + onChange('wifi'); + }); + _onOfflineSub = html.window.onOffline.listen((_) { + onChange('none'); + }); + } + + @override + void cancel() { + _onOnlineSub?.cancel(); + _onOnlineSub = null; + + _onOfflineSub?.cancel(); + _onOfflineSub = null; + } +} diff --git a/flutter/lib/src/integrations/flutter_error_integration.dart b/flutter/lib/src/integrations/flutter_error_integration.dart index 03f8436bf9..c1a6d57a1d 100644 --- a/flutter/lib/src/integrations/flutter_error_integration.dart +++ b/flutter/lib/src/integrations/flutter_error_integration.dart @@ -60,7 +60,9 @@ class FlutterErrorIntegration implements Integration { var event = SentryEvent( throwable: throwableMechanism, - level: SentryLevel.fatal, + level: options.markAutomaticallyCollectedErrorsAsFatal + ? SentryLevel.fatal + : SentryLevel.error, contexts: flutterErrorDetails.isNotEmpty ? (Contexts()..['flutter_error_details'] = flutterErrorDetails) : null, diff --git a/flutter/lib/src/integrations/load_image_list_integration.dart b/flutter/lib/src/integrations/load_image_list_integration.dart index a06d60d839..ae08d93946 100644 --- a/flutter/lib/src/integrations/load_image_list_integration.dart +++ b/flutter/lib/src/integrations/load_image_list_integration.dart @@ -25,14 +25,25 @@ extension _NeedsSymbolication on SentryEvent { if (this is SentryTransaction) { return false; } - if (exceptions?.isNotEmpty == false) { - return false; - } - final frames = exceptions?.first.stackTrace?.frames; + final frames = _getStacktraceFrames(); if (frames == null) { return false; } - return frames.any((frame) => 'native' == frame.platform); + return frames.any((frame) => 'native' == frame?.platform); + } + + List? _getStacktraceFrames() { + if (exceptions?.isNotEmpty == true) { + return exceptions?.first.stackTrace?.frames; + } + if (threads?.isNotEmpty == true) { + var stacktraces = threads?.map((e) => e.stacktrace); + return stacktraces + ?.where((element) => element != null) + .expand((element) => element!.frames) + .toList(); + } + return null; } } diff --git a/flutter/lib/src/integrations/native_app_start_integration.dart b/flutter/lib/src/integrations/native_app_start_integration.dart index a47eb74717..47bf79dff4 100644 --- a/flutter/lib/src/integrations/native_app_start_integration.dart +++ b/flutter/lib/src/integrations/native_app_start_integration.dart @@ -2,7 +2,7 @@ import 'package:flutter/scheduler.dart'; import 'package:sentry/sentry.dart'; import '../sentry_flutter_options.dart'; -import '../sentry_native.dart'; +import '../native/sentry_native.dart'; import '../event_processor/native_app_start_event_processor.dart'; /// Integration which handles communication with native frameworks in order to diff --git a/flutter/lib/src/jvm/jvm_exception.dart b/flutter/lib/src/jvm/jvm_exception.dart index adaf71cac1..352092b1ed 100644 --- a/flutter/lib/src/jvm/jvm_exception.dart +++ b/flutter/lib/src/jvm/jvm_exception.dart @@ -256,8 +256,12 @@ class JvmException { frames.add(trimmed); } - final thisExceptionFrames = - thisException.map((e) => JvmFrame.parse(e)).toList(growable: false); + final thisExceptionFrames = thisException + // Sometimes stringified exceptions from the native side have + // empty lines. Discard those! + .where((line) => line.trim().isNotEmpty) + .map((e) => JvmFrame.parse(e)) + .toList(growable: false); final suppressedExceptions = supressed .map((e) => JvmException.parse(e.join(_newLine))) diff --git a/flutter/lib/src/native/cocoa/binding.dart b/flutter/lib/src/native/cocoa/binding.dart new file mode 100644 index 0000000000..41350a3a2c --- /dev/null +++ b/flutter/lib/src/native/cocoa/binding.dart @@ -0,0 +1,71894 @@ +// AUTO GENERATED FILE, DO NOT EDIT. +// +// Generated by `package:ffigen`. +// ignore_for_file: type=lint +import 'dart:ffi' as ffi; +import 'package:ffi/ffi.dart' as pkg_ffi; + +/// Sentry Cocoa SDK FFI binding. +class SentryCocoa { + /// Holds the symbol lookup function. + final ffi.Pointer Function(String symbolName) + _lookup; + + /// The symbols are looked up in [dynamicLibrary]. + SentryCocoa(ffi.DynamicLibrary dynamicLibrary) + : _lookup = dynamicLibrary.lookup; + + /// The symbols are looked up with [lookup]. + SentryCocoa.fromLookup( + ffi.Pointer Function(String symbolName) + lookup) + : _lookup = lookup; + + ffi.Pointer _registerName1(String name) { + final cstr = name.toNativeUtf8(); + final sel = _sel_registerName(cstr.cast()); + pkg_ffi.calloc.free(cstr); + return sel; + } + + ffi.Pointer _sel_registerName( + ffi.Pointer str, + ) { + return __sel_registerName( + str, + ); + } + + late final __sel_registerNamePtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer)>>('sel_registerName'); + late final __sel_registerName = __sel_registerNamePtr + .asFunction Function(ffi.Pointer)>(); + + ffi.Pointer _getClass1(String name) { + final cstr = name.toNativeUtf8(); + final clazz = _objc_getClass(cstr.cast()); + pkg_ffi.calloc.free(cstr); + if (clazz == ffi.nullptr) { + throw Exception('Failed to load Objective-C class: $name'); + } + return clazz; + } + + ffi.Pointer _objc_getClass( + ffi.Pointer str, + ) { + return __objc_getClass( + str, + ); + } + + late final __objc_getClassPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer)>>('objc_getClass'); + late final __objc_getClass = __objc_getClassPtr + .asFunction Function(ffi.Pointer)>(); + + ffi.Pointer _objc_retain( + ffi.Pointer value, + ) { + return __objc_retain( + value, + ); + } + + late final __objc_retainPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer)>>('objc_retain'); + late final __objc_retain = __objc_retainPtr + .asFunction Function(ffi.Pointer)>(); + + void _objc_release( + ffi.Pointer value, + ) { + return __objc_release( + value, + ); + } + + late final __objc_releasePtr = + _lookup)>>( + 'objc_release'); + late final __objc_release = + __objc_releasePtr.asFunction)>(); + + late final _objc_releaseFinalizer2 = + ffi.NativeFinalizer(__objc_releasePtr.cast()); + late final _class_NSObject1 = _getClass1("NSObject"); + late final _sel_load1 = _registerName1("load"); + void _objc_msgSend_1( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_1( + obj, + sel, + ); + } + + late final __objc_msgSend_1Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1 = __objc_msgSend_1Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_initialize1 = _registerName1("initialize"); + late final _sel_init1 = _registerName1("init"); + instancetype _objc_msgSend_2( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_2( + obj, + sel, + ); + } + + late final __objc_msgSend_2Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_2 = __objc_msgSend_2Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_new1 = _registerName1("new"); + late final _sel_allocWithZone_1 = _registerName1("allocWithZone:"); + instancetype _objc_msgSend_3( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_NSZone> zone, + ) { + return __objc_msgSend_3( + obj, + sel, + zone, + ); + } + + late final __objc_msgSend_3Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_NSZone>)>>('objc_msgSend'); + late final __objc_msgSend_3 = __objc_msgSend_3Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_NSZone>)>(); + + late final _sel_alloc1 = _registerName1("alloc"); + late final _sel_dealloc1 = _registerName1("dealloc"); + late final _sel_finalize1 = _registerName1("finalize"); + late final _sel_copy1 = _registerName1("copy"); + late final _sel_mutableCopy1 = _registerName1("mutableCopy"); + late final _sel_copyWithZone_1 = _registerName1("copyWithZone:"); + late final _sel_mutableCopyWithZone_1 = + _registerName1("mutableCopyWithZone:"); + late final _sel_instancesRespondToSelector_1 = + _registerName1("instancesRespondToSelector:"); + bool _objc_msgSend_4( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aSelector, + ) { + return __objc_msgSend_4( + obj, + sel, + aSelector, + ); + } + + late final __objc_msgSend_4Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_4 = __objc_msgSend_4Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + bool _objc_msgSend_0( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer clazz, + ) { + return __objc_msgSend_0( + obj, + sel, + clazz, + ); + } + + late final __objc_msgSend_0Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_0 = __objc_msgSend_0Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_isKindOfClass_1 = _registerName1("isKindOfClass:"); + late final _class_Protocol1 = _getClass1("Protocol"); + late final _sel_conformsToProtocol_1 = _registerName1("conformsToProtocol:"); + bool _objc_msgSend_5( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer protocol, + ) { + return __objc_msgSend_5( + obj, + sel, + protocol, + ); + } + + late final __objc_msgSend_5Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_5 = __objc_msgSend_5Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_methodForSelector_1 = _registerName1("methodForSelector:"); + ffi.Pointer> _objc_msgSend_6( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aSelector, + ) { + return __objc_msgSend_6( + obj, + sel, + aSelector, + ); + } + + late final __objc_msgSend_6Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer> Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_6 = __objc_msgSend_6Ptr.asFunction< + ffi.Pointer> Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_instanceMethodForSelector_1 = + _registerName1("instanceMethodForSelector:"); + late final _sel_doesNotRecognizeSelector_1 = + _registerName1("doesNotRecognizeSelector:"); + void _objc_msgSend_7( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aSelector, + ) { + return __objc_msgSend_7( + obj, + sel, + aSelector, + ); + } + + late final __objc_msgSend_7Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_7 = __objc_msgSend_7Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_forwardingTargetForSelector_1 = + _registerName1("forwardingTargetForSelector:"); + ffi.Pointer _objc_msgSend_8( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aSelector, + ) { + return __objc_msgSend_8( + obj, + sel, + aSelector, + ); + } + + late final __objc_msgSend_8Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_8 = __objc_msgSend_8Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _class_NSInvocation1 = _getClass1("NSInvocation"); + late final _class_NSMethodSignature1 = _getClass1("NSMethodSignature"); + late final _sel_signatureWithObjCTypes_1 = + _registerName1("signatureWithObjCTypes:"); + ffi.Pointer _objc_msgSend_9( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer types, + ) { + return __objc_msgSend_9( + obj, + sel, + types, + ); + } + + late final __objc_msgSend_9Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_9 = __objc_msgSend_9Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_numberOfArguments1 = _registerName1("numberOfArguments"); + int _objc_msgSend_10( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_10( + obj, + sel, + ); + } + + late final __objc_msgSend_10Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_10 = __objc_msgSend_10Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_getArgumentTypeAtIndex_1 = + _registerName1("getArgumentTypeAtIndex:"); + ffi.Pointer _objc_msgSend_11( + ffi.Pointer obj, + ffi.Pointer sel, + int idx, + ) { + return __objc_msgSend_11( + obj, + sel, + idx, + ); + } + + late final __objc_msgSend_11Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_11 = __objc_msgSend_11Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_frameLength1 = _registerName1("frameLength"); + late final _sel_isOneway1 = _registerName1("isOneway"); + bool _objc_msgSend_12( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_12( + obj, + sel, + ); + } + + late final __objc_msgSend_12Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_12 = __objc_msgSend_12Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_methodReturnType1 = _registerName1("methodReturnType"); + ffi.Pointer _objc_msgSend_13( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_13( + obj, + sel, + ); + } + + late final __objc_msgSend_13Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_13 = __objc_msgSend_13Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_methodReturnLength1 = _registerName1("methodReturnLength"); + late final _sel_cancelPreviousPerformRequestsWithTarget_selector_object_1 = + _registerName1( + "cancelPreviousPerformRequestsWithTarget:selector:object:"); + void _objc_msgSend_14( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aTarget, + ffi.Pointer aSelector, + ffi.Pointer anArgument, + ) { + return __objc_msgSend_14( + obj, + sel, + aTarget, + aSelector, + anArgument, + ); + } + + late final __objc_msgSend_14Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_14 = __objc_msgSend_14Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_cancelPreviousPerformRequestsWithTarget_1 = + _registerName1("cancelPreviousPerformRequestsWithTarget:"); + void _objc_msgSend_15( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aTarget, + ) { + return __objc_msgSend_15( + obj, + sel, + aTarget, + ); + } + + late final __objc_msgSend_15Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_15 = __objc_msgSend_15Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_accessInstanceVariablesDirectly1 = + _registerName1("accessInstanceVariablesDirectly"); + late final _sel_useStoredAccessor1 = _registerName1("useStoredAccessor"); + late final _class_NSSet1 = _getClass1("NSSet"); + late final _sel_count1 = _registerName1("count"); + late final _sel_member_1 = _registerName1("member:"); + ffi.Pointer _objc_msgSend_16( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer object, + ) { + return __objc_msgSend_16( + obj, + sel, + object, + ); + } + + late final __objc_msgSend_16Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_16 = __objc_msgSend_16Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _class_NSEnumerator1 = _getClass1("NSEnumerator"); + late final _sel_nextObject1 = _registerName1("nextObject"); + late final _sel_allObjects1 = _registerName1("allObjects"); + late final _class_NSString1 = _getClass1("NSString"); + late final _sel_length1 = _registerName1("length"); + late final _sel_characterAtIndex_1 = _registerName1("characterAtIndex:"); + int _objc_msgSend_17( + ffi.Pointer obj, + ffi.Pointer sel, + int index, + ) { + return __objc_msgSend_17( + obj, + sel, + index, + ); + } + + late final __objc_msgSend_17Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedShort Function(ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_17 = __objc_msgSend_17Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _class_NSCoder1 = _getClass1("NSCoder"); + late final _sel_encodeValueOfObjCType_at_1 = + _registerName1("encodeValueOfObjCType:at:"); + void _objc_msgSend_18( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer type, + ffi.Pointer addr, + ) { + return __objc_msgSend_18( + obj, + sel, + type, + addr, + ); + } + + late final __objc_msgSend_18Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_18 = __objc_msgSend_18Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _class_NSData1 = _getClass1("NSData"); + late final _sel_bytes1 = _registerName1("bytes"); + ffi.Pointer _objc_msgSend_19( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_19( + obj, + sel, + ); + } + + late final __objc_msgSend_19Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_19 = __objc_msgSend_19Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_description1 = _registerName1("description"); + ffi.Pointer _objc_msgSend_20( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_20( + obj, + sel, + ); + } + + late final __objc_msgSend_20Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_20 = __objc_msgSend_20Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_getBytes_length_1 = _registerName1("getBytes:length:"); + void _objc_msgSend_21( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer buffer, + int length, + ) { + return __objc_msgSend_21( + obj, + sel, + buffer, + length, + ); + } + + late final __objc_msgSend_21Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_21 = __objc_msgSend_21Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_getBytes_range_1 = _registerName1("getBytes:range:"); + void _objc_msgSend_22( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer buffer, + _NSRange range, + ) { + return __objc_msgSend_22( + obj, + sel, + buffer, + range, + ); + } + + late final __objc_msgSend_22Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_22 = __objc_msgSend_22Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, _NSRange)>(); + + late final _sel_isEqualToData_1 = _registerName1("isEqualToData:"); + bool _objc_msgSend_23( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer other, + ) { + return __objc_msgSend_23( + obj, + sel, + other, + ); + } + + late final __objc_msgSend_23Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_23 = __objc_msgSend_23Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_subdataWithRange_1 = _registerName1("subdataWithRange:"); + ffi.Pointer _objc_msgSend_24( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ) { + return __objc_msgSend_24( + obj, + sel, + range, + ); + } + + late final __objc_msgSend_24Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_24 = __objc_msgSend_24Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, _NSRange)>(); + + late final _sel_writeToFile_atomically_1 = + _registerName1("writeToFile:atomically:"); + bool _objc_msgSend_25( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + bool useAuxiliaryFile, + ) { + return __objc_msgSend_25( + obj, + sel, + path, + useAuxiliaryFile, + ); + } + + late final __objc_msgSend_25Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_25 = __objc_msgSend_25Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, bool)>(); + + late final _class_NSURL1 = _getClass1("NSURL"); + late final _sel_initWithScheme_host_path_1 = + _registerName1("initWithScheme:host:path:"); + instancetype _objc_msgSend_26( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer scheme, + ffi.Pointer host, + ffi.Pointer path, + ) { + return __objc_msgSend_26( + obj, + sel, + scheme, + host, + path, + ); + } + + late final __objc_msgSend_26Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_26 = __objc_msgSend_26Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_initFileURLWithPath_isDirectory_relativeToURL_1 = + _registerName1("initFileURLWithPath:isDirectory:relativeToURL:"); + instancetype _objc_msgSend_27( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + bool isDir, + ffi.Pointer baseURL, + ) { + return __objc_msgSend_27( + obj, + sel, + path, + isDir, + baseURL, + ); + } + + late final __objc_msgSend_27Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_27 = __objc_msgSend_27Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, bool, ffi.Pointer)>(); + + late final _sel_initFileURLWithPath_relativeToURL_1 = + _registerName1("initFileURLWithPath:relativeToURL:"); + instancetype _objc_msgSend_28( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ffi.Pointer baseURL, + ) { + return __objc_msgSend_28( + obj, + sel, + path, + baseURL, + ); + } + + late final __objc_msgSend_28Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_28 = __objc_msgSend_28Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_initFileURLWithPath_isDirectory_1 = + _registerName1("initFileURLWithPath:isDirectory:"); + instancetype _objc_msgSend_29( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + bool isDir, + ) { + return __objc_msgSend_29( + obj, + sel, + path, + isDir, + ); + } + + late final __objc_msgSend_29Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_29 = __objc_msgSend_29Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, bool)>(); + + late final _sel_initFileURLWithPath_1 = + _registerName1("initFileURLWithPath:"); + instancetype _objc_msgSend_30( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ) { + return __objc_msgSend_30( + obj, + sel, + path, + ); + } + + late final __objc_msgSend_30Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_30 = __objc_msgSend_30Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_fileURLWithPath_isDirectory_relativeToURL_1 = + _registerName1("fileURLWithPath:isDirectory:relativeToURL:"); + ffi.Pointer _objc_msgSend_31( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + bool isDir, + ffi.Pointer baseURL, + ) { + return __objc_msgSend_31( + obj, + sel, + path, + isDir, + baseURL, + ); + } + + late final __objc_msgSend_31Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_31 = __objc_msgSend_31Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + bool, + ffi.Pointer)>(); + + late final _sel_fileURLWithPath_relativeToURL_1 = + _registerName1("fileURLWithPath:relativeToURL:"); + ffi.Pointer _objc_msgSend_32( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ffi.Pointer baseURL, + ) { + return __objc_msgSend_32( + obj, + sel, + path, + baseURL, + ); + } + + late final __objc_msgSend_32Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_32 = __objc_msgSend_32Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_fileURLWithPath_isDirectory_1 = + _registerName1("fileURLWithPath:isDirectory:"); + ffi.Pointer _objc_msgSend_33( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + bool isDir, + ) { + return __objc_msgSend_33( + obj, + sel, + path, + isDir, + ); + } + + late final __objc_msgSend_33Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_33 = __objc_msgSend_33Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer, bool)>(); + + late final _sel_fileURLWithPath_1 = _registerName1("fileURLWithPath:"); + ffi.Pointer _objc_msgSend_34( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ) { + return __objc_msgSend_34( + obj, + sel, + path, + ); + } + + late final __objc_msgSend_34Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_34 = __objc_msgSend_34Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_initFileURLWithFileSystemRepresentation_isDirectory_relativeToURL_1 = + _registerName1( + "initFileURLWithFileSystemRepresentation:isDirectory:relativeToURL:"); + instancetype _objc_msgSend_35( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + bool isDir, + ffi.Pointer baseURL, + ) { + return __objc_msgSend_35( + obj, + sel, + path, + isDir, + baseURL, + ); + } + + late final __objc_msgSend_35Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_35 = __objc_msgSend_35Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, bool, ffi.Pointer)>(); + + late final _sel_fileURLWithFileSystemRepresentation_isDirectory_relativeToURL_1 = + _registerName1( + "fileURLWithFileSystemRepresentation:isDirectory:relativeToURL:"); + ffi.Pointer _objc_msgSend_36( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + bool isDir, + ffi.Pointer baseURL, + ) { + return __objc_msgSend_36( + obj, + sel, + path, + isDir, + baseURL, + ); + } + + late final __objc_msgSend_36Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_36 = __objc_msgSend_36Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + bool, + ffi.Pointer)>(); + + late final _sel_initWithString_1 = _registerName1("initWithString:"); + late final _sel_initWithString_relativeToURL_1 = + _registerName1("initWithString:relativeToURL:"); + late final _sel_URLWithString_1 = _registerName1("URLWithString:"); + late final _sel_URLWithString_relativeToURL_1 = + _registerName1("URLWithString:relativeToURL:"); + late final _sel_initWithDataRepresentation_relativeToURL_1 = + _registerName1("initWithDataRepresentation:relativeToURL:"); + instancetype _objc_msgSend_37( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer data, + ffi.Pointer baseURL, + ) { + return __objc_msgSend_37( + obj, + sel, + data, + baseURL, + ); + } + + late final __objc_msgSend_37Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_37 = __objc_msgSend_37Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_URLWithDataRepresentation_relativeToURL_1 = + _registerName1("URLWithDataRepresentation:relativeToURL:"); + ffi.Pointer _objc_msgSend_38( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer data, + ffi.Pointer baseURL, + ) { + return __objc_msgSend_38( + obj, + sel, + data, + baseURL, + ); + } + + late final __objc_msgSend_38Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_38 = __objc_msgSend_38Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_initAbsoluteURLWithDataRepresentation_relativeToURL_1 = + _registerName1("initAbsoluteURLWithDataRepresentation:relativeToURL:"); + late final _sel_absoluteURLWithDataRepresentation_relativeToURL_1 = + _registerName1("absoluteURLWithDataRepresentation:relativeToURL:"); + late final _sel_dataRepresentation1 = _registerName1("dataRepresentation"); + ffi.Pointer _objc_msgSend_39( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_39( + obj, + sel, + ); + } + + late final __objc_msgSend_39Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_39 = __objc_msgSend_39Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_absoluteString1 = _registerName1("absoluteString"); + late final _sel_relativeString1 = _registerName1("relativeString"); + late final _sel_baseURL1 = _registerName1("baseURL"); + ffi.Pointer _objc_msgSend_40( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_40( + obj, + sel, + ); + } + + late final __objc_msgSend_40Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_40 = __objc_msgSend_40Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_absoluteURL1 = _registerName1("absoluteURL"); + late final _sel_scheme1 = _registerName1("scheme"); + late final _sel_resourceSpecifier1 = _registerName1("resourceSpecifier"); + late final _sel_host1 = _registerName1("host"); + late final _class_NSNumber1 = _getClass1("NSNumber"); + late final _class_NSValue1 = _getClass1("NSValue"); + late final _sel_getValue_size_1 = _registerName1("getValue:size:"); + late final _sel_objCType1 = _registerName1("objCType"); + late final _sel_initWithBytes_objCType_1 = + _registerName1("initWithBytes:objCType:"); + instancetype _objc_msgSend_41( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ffi.Pointer type, + ) { + return __objc_msgSend_41( + obj, + sel, + value, + type, + ); + } + + late final __objc_msgSend_41Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_41 = __objc_msgSend_41Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_initWithCoder_1 = _registerName1("initWithCoder:"); + instancetype _objc_msgSend_42( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer coder, + ) { + return __objc_msgSend_42( + obj, + sel, + coder, + ); + } + + late final __objc_msgSend_42Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_42 = __objc_msgSend_42Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_valueWithBytes_objCType_1 = + _registerName1("valueWithBytes:objCType:"); + ffi.Pointer _objc_msgSend_43( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ffi.Pointer type, + ) { + return __objc_msgSend_43( + obj, + sel, + value, + type, + ); + } + + late final __objc_msgSend_43Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_43 = __objc_msgSend_43Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_value_withObjCType_1 = _registerName1("value:withObjCType:"); + late final _sel_valueWithNonretainedObject_1 = + _registerName1("valueWithNonretainedObject:"); + ffi.Pointer _objc_msgSend_44( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer anObject, + ) { + return __objc_msgSend_44( + obj, + sel, + anObject, + ); + } + + late final __objc_msgSend_44Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_44 = __objc_msgSend_44Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_nonretainedObjectValue1 = + _registerName1("nonretainedObjectValue"); + late final _sel_valueWithPointer_1 = _registerName1("valueWithPointer:"); + ffi.Pointer _objc_msgSend_45( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer pointer, + ) { + return __objc_msgSend_45( + obj, + sel, + pointer, + ); + } + + late final __objc_msgSend_45Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_45 = __objc_msgSend_45Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_pointerValue1 = _registerName1("pointerValue"); + late final _sel_isEqualToValue_1 = _registerName1("isEqualToValue:"); + bool _objc_msgSend_46( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_46( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_46Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_46 = __objc_msgSend_46Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_getValue_1 = _registerName1("getValue:"); + void _objc_msgSend_47( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_47( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_47Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_47 = __objc_msgSend_47Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_valueWithRange_1 = _registerName1("valueWithRange:"); + ffi.Pointer _objc_msgSend_48( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ) { + return __objc_msgSend_48( + obj, + sel, + range, + ); + } + + late final __objc_msgSend_48Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_48 = __objc_msgSend_48Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, _NSRange)>(); + + late final _sel_rangeValue1 = _registerName1("rangeValue"); + void _objc_msgSend_49( + ffi.Pointer<_NSRange> stret, + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_49( + stret, + obj, + sel, + ); + } + + late final __objc_msgSend_49Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer<_NSRange>, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend_stret'); + late final __objc_msgSend_49 = __objc_msgSend_49Ptr.asFunction< + void Function(ffi.Pointer<_NSRange>, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_valueWithPoint_1 = _registerName1("valueWithPoint:"); + ffi.Pointer _objc_msgSend_50( + ffi.Pointer obj, + ffi.Pointer sel, + CGPoint point, + ) { + return __objc_msgSend_50( + obj, + sel, + point, + ); + } + + late final __objc_msgSend_50Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, CGPoint)>>('objc_msgSend'); + late final __objc_msgSend_50 = __objc_msgSend_50Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, CGPoint)>(); + + late final _sel_valueWithSize_1 = _registerName1("valueWithSize:"); + ffi.Pointer _objc_msgSend_51( + ffi.Pointer obj, + ffi.Pointer sel, + CGSize size, + ) { + return __objc_msgSend_51( + obj, + sel, + size, + ); + } + + late final __objc_msgSend_51Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, CGSize)>>('objc_msgSend'); + late final __objc_msgSend_51 = __objc_msgSend_51Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, CGSize)>(); + + late final _sel_valueWithRect_1 = _registerName1("valueWithRect:"); + ffi.Pointer _objc_msgSend_52( + ffi.Pointer obj, + ffi.Pointer sel, + CGRect rect, + ) { + return __objc_msgSend_52( + obj, + sel, + rect, + ); + } + + late final __objc_msgSend_52Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, CGRect)>>('objc_msgSend'); + late final __objc_msgSend_52 = __objc_msgSend_52Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, CGRect)>(); + + late final _sel_valueWithEdgeInsets_1 = + _registerName1("valueWithEdgeInsets:"); + ffi.Pointer _objc_msgSend_53( + ffi.Pointer obj, + ffi.Pointer sel, + NSEdgeInsets insets, + ) { + return __objc_msgSend_53( + obj, + sel, + insets, + ); + } + + late final __objc_msgSend_53Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, NSEdgeInsets)>>('objc_msgSend'); + late final __objc_msgSend_53 = __objc_msgSend_53Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, NSEdgeInsets)>(); + + late final _sel_pointValue1 = _registerName1("pointValue"); + void _objc_msgSend_54( + ffi.Pointer stret, + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_54( + stret, + obj, + sel, + ); + } + + late final __objc_msgSend_54Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend_stret'); + late final __objc_msgSend_54 = __objc_msgSend_54Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_sizeValue1 = _registerName1("sizeValue"); + void _objc_msgSend_55( + ffi.Pointer stret, + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_55( + stret, + obj, + sel, + ); + } + + late final __objc_msgSend_55Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend_stret'); + late final __objc_msgSend_55 = __objc_msgSend_55Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_rectValue1 = _registerName1("rectValue"); + void _objc_msgSend_56( + ffi.Pointer stret, + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_56( + stret, + obj, + sel, + ); + } + + late final __objc_msgSend_56Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend_stret'); + late final __objc_msgSend_56 = __objc_msgSend_56Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_edgeInsetsValue1 = _registerName1("edgeInsetsValue"); + void _objc_msgSend_57( + ffi.Pointer stret, + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_57( + stret, + obj, + sel, + ); + } + + late final __objc_msgSend_57Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend_stret'); + late final __objc_msgSend_57 = __objc_msgSend_57Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_keyPathsForValuesAffectingValueForKey_1 = + _registerName1("keyPathsForValuesAffectingValueForKey:"); + ffi.Pointer _objc_msgSend_58( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer key, + ) { + return __objc_msgSend_58( + obj, + sel, + key, + ); + } + + late final __objc_msgSend_58Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_58 = __objc_msgSend_58Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_automaticallyNotifiesObserversForKey_1 = + _registerName1("automaticallyNotifiesObserversForKey:"); + bool _objc_msgSend_59( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer key, + ) { + return __objc_msgSend_59( + obj, + sel, + key, + ); + } + + late final __objc_msgSend_59Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_59 = __objc_msgSend_59Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _class_NSArray1 = _getClass1("NSArray"); + late final _sel_objectAtIndex_1 = _registerName1("objectAtIndex:"); + ffi.Pointer _objc_msgSend_60( + ffi.Pointer obj, + ffi.Pointer sel, + int index, + ) { + return __objc_msgSend_60( + obj, + sel, + index, + ); + } + + late final __objc_msgSend_60Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_60 = __objc_msgSend_60Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_initWithObjects_count_1 = + _registerName1("initWithObjects:count:"); + instancetype _objc_msgSend_61( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer> objects, + int cnt, + ) { + return __objc_msgSend_61( + obj, + sel, + objects, + cnt, + ); + } + + late final __objc_msgSend_61Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_61 = __objc_msgSend_61Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer>, int)>(); + + late final _sel_arrayByAddingObject_1 = + _registerName1("arrayByAddingObject:"); + ffi.Pointer _objc_msgSend_62( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer anObject, + ) { + return __objc_msgSend_62( + obj, + sel, + anObject, + ); + } + + late final __objc_msgSend_62Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_62 = __objc_msgSend_62Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_arrayByAddingObjectsFromArray_1 = + _registerName1("arrayByAddingObjectsFromArray:"); + ffi.Pointer _objc_msgSend_63( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer otherArray, + ) { + return __objc_msgSend_63( + obj, + sel, + otherArray, + ); + } + + late final __objc_msgSend_63Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_63 = __objc_msgSend_63Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_componentsJoinedByString_1 = + _registerName1("componentsJoinedByString:"); + ffi.Pointer _objc_msgSend_64( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer separator, + ) { + return __objc_msgSend_64( + obj, + sel, + separator, + ); + } + + late final __objc_msgSend_64Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_64 = __objc_msgSend_64Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_containsObject_1 = _registerName1("containsObject:"); + late final _sel_descriptionWithLocale_1 = + _registerName1("descriptionWithLocale:"); + ffi.Pointer _objc_msgSend_65( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer locale, + ) { + return __objc_msgSend_65( + obj, + sel, + locale, + ); + } + + late final __objc_msgSend_65Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_65 = __objc_msgSend_65Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_descriptionWithLocale_indent_1 = + _registerName1("descriptionWithLocale:indent:"); + ffi.Pointer _objc_msgSend_66( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer locale, + int level, + ) { + return __objc_msgSend_66( + obj, + sel, + locale, + level, + ); + } + + late final __objc_msgSend_66Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_66 = __objc_msgSend_66Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_firstObjectCommonWithArray_1 = + _registerName1("firstObjectCommonWithArray:"); + ffi.Pointer _objc_msgSend_67( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer otherArray, + ) { + return __objc_msgSend_67( + obj, + sel, + otherArray, + ); + } + + late final __objc_msgSend_67Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_67 = __objc_msgSend_67Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_getObjects_range_1 = _registerName1("getObjects:range:"); + void _objc_msgSend_68( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer> objects, + _NSRange range, + ) { + return __objc_msgSend_68( + obj, + sel, + objects, + range, + ); + } + + late final __objc_msgSend_68Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer>, _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_68 = __objc_msgSend_68Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer>, _NSRange)>(); + + late final _sel_indexOfObject_1 = _registerName1("indexOfObject:"); + int _objc_msgSend_69( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer anObject, + ) { + return __objc_msgSend_69( + obj, + sel, + anObject, + ); + } + + late final __objc_msgSend_69Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedLong Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_69 = __objc_msgSend_69Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_indexOfObject_inRange_1 = + _registerName1("indexOfObject:inRange:"); + int _objc_msgSend_70( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer anObject, + _NSRange range, + ) { + return __objc_msgSend_70( + obj, + sel, + anObject, + range, + ); + } + + late final __objc_msgSend_70Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_70 = __objc_msgSend_70Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, _NSRange)>(); + + late final _sel_indexOfObjectIdenticalTo_1 = + _registerName1("indexOfObjectIdenticalTo:"); + late final _sel_indexOfObjectIdenticalTo_inRange_1 = + _registerName1("indexOfObjectIdenticalTo:inRange:"); + late final _sel_isEqualToArray_1 = _registerName1("isEqualToArray:"); + bool _objc_msgSend_71( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer otherArray, + ) { + return __objc_msgSend_71( + obj, + sel, + otherArray, + ); + } + + late final __objc_msgSend_71Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_71 = __objc_msgSend_71Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_firstObject1 = _registerName1("firstObject"); + late final _sel_lastObject1 = _registerName1("lastObject"); + late final _sel_objectEnumerator1 = _registerName1("objectEnumerator"); + ffi.Pointer _objc_msgSend_72( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_72( + obj, + sel, + ); + } + + late final __objc_msgSend_72Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_72 = __objc_msgSend_72Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_reverseObjectEnumerator1 = + _registerName1("reverseObjectEnumerator"); + late final _sel_sortedArrayHint1 = _registerName1("sortedArrayHint"); + late final _sel_sortedArrayUsingFunction_context_1 = + _registerName1("sortedArrayUsingFunction:context:"); + ffi.Pointer _objc_msgSend_73( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer< + ffi.NativeFunction< + ffi.Long Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>> + comparator, + ffi.Pointer context, + ) { + return __objc_msgSend_73( + obj, + sel, + comparator, + context, + ); + } + + late final __objc_msgSend_73Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.Long Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_73 = __objc_msgSend_73Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.Long Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>, + ffi.Pointer)>(); + + late final _sel_sortedArrayUsingFunction_context_hint_1 = + _registerName1("sortedArrayUsingFunction:context:hint:"); + ffi.Pointer _objc_msgSend_74( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer< + ffi.NativeFunction< + ffi.Long Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>> + comparator, + ffi.Pointer context, + ffi.Pointer hint, + ) { + return __objc_msgSend_74( + obj, + sel, + comparator, + context, + hint, + ); + } + + late final __objc_msgSend_74Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.Long Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_74 = __objc_msgSend_74Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.Long Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_sortedArrayUsingSelector_1 = + _registerName1("sortedArrayUsingSelector:"); + ffi.Pointer _objc_msgSend_75( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer comparator, + ) { + return __objc_msgSend_75( + obj, + sel, + comparator, + ); + } + + late final __objc_msgSend_75Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_75 = __objc_msgSend_75Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_subarrayWithRange_1 = _registerName1("subarrayWithRange:"); + ffi.Pointer _objc_msgSend_76( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ) { + return __objc_msgSend_76( + obj, + sel, + range, + ); + } + + late final __objc_msgSend_76Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_76 = __objc_msgSend_76Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, _NSRange)>(); + + late final _class_NSError1 = _getClass1("NSError"); + late final _sel_initWithDomain_code_userInfo_1 = + _registerName1("initWithDomain:code:userInfo:"); + instancetype _objc_msgSend_77( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer domain, + int code, + ffi.Pointer dict, + ) { + return __objc_msgSend_77( + obj, + sel, + domain, + code, + dict, + ); + } + + late final __objc_msgSend_77Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Long, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_77 = __objc_msgSend_77Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, ffi.Pointer)>(); + + late final _sel_errorWithDomain_code_userInfo_1 = + _registerName1("errorWithDomain:code:userInfo:"); + late final _sel_domain1 = _registerName1("domain"); + late final _sel_code1 = _registerName1("code"); + int _objc_msgSend_78( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_78( + obj, + sel, + ); + } + + late final __objc_msgSend_78Ptr = _lookup< + ffi.NativeFunction< + ffi.Long Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_78 = __objc_msgSend_78Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_userInfo1 = _registerName1("userInfo"); + late final _sel_localizedDescription1 = + _registerName1("localizedDescription"); + late final _sel_localizedFailureReason1 = + _registerName1("localizedFailureReason"); + late final _sel_localizedRecoverySuggestion1 = + _registerName1("localizedRecoverySuggestion"); + late final _sel_localizedRecoveryOptions1 = + _registerName1("localizedRecoveryOptions"); + ffi.Pointer _objc_msgSend_79( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_79( + obj, + sel, + ); + } + + late final __objc_msgSend_79Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_79 = __objc_msgSend_79Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_recoveryAttempter1 = _registerName1("recoveryAttempter"); + late final _sel_helpAnchor1 = _registerName1("helpAnchor"); + late final _sel_underlyingErrors1 = _registerName1("underlyingErrors"); + ffi.Pointer<_ObjCBlockDesc> _newBlockDesc1() { + final d = + pkg_ffi.calloc.allocate<_ObjCBlockDesc>(ffi.sizeOf<_ObjCBlockDesc>()); + d.ref.reserved = 0; + d.ref.size = ffi.sizeOf<_ObjCBlock>(); + d.ref.copy_helper = ffi.nullptr; + d.ref.dispose_helper = ffi.nullptr; + d.ref.signature = ffi.nullptr; + return d; + } + + late final _objc_block_desc1 = _newBlockDesc1(); + late final _objc_concrete_global_block1 = + _lookup('_NSConcreteGlobalBlock'); + ffi.Pointer<_ObjCBlock> _newBlock1( + ffi.Pointer invoke, ffi.Pointer target) { + final b = pkg_ffi.calloc.allocate<_ObjCBlock>(ffi.sizeOf<_ObjCBlock>()); + b.ref.isa = _objc_concrete_global_block1; + b.ref.flags = 0; + b.ref.reserved = 0; + b.ref.invoke = invoke; + b.ref.target = target; + b.ref.descriptor = _objc_block_desc1; + final copy = _Block_copy(b.cast()).cast<_ObjCBlock>(); + pkg_ffi.calloc.free(b); + return copy; + } + + ffi.Pointer _Block_copy( + ffi.Pointer value, + ) { + return __Block_copy( + value, + ); + } + + late final __Block_copyPtr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer)>>('_Block_copy'); + late final __Block_copy = __Block_copyPtr + .asFunction Function(ffi.Pointer)>(); + + void _Block_release( + ffi.Pointer value, + ) { + return __Block_release( + value, + ); + } + + late final __Block_releasePtr = + _lookup)>>( + '_Block_release'); + late final __Block_release = + __Block_releasePtr.asFunction)>(); + + late final _objc_releaseFinalizer11 = + ffi.NativeFinalizer(__Block_releasePtr.cast()); + late final _sel_setUserInfoValueProviderForDomain_provider_1 = + _registerName1("setUserInfoValueProviderForDomain:provider:"); + void _objc_msgSend_80( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer errorDomain, + ffi.Pointer<_ObjCBlock> provider, + ) { + return __objc_msgSend_80( + obj, + sel, + errorDomain, + provider, + ); + } + + late final __objc_msgSend_80Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_80 = __objc_msgSend_80Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_userInfoValueProviderForDomain_1 = + _registerName1("userInfoValueProviderForDomain:"); + ffi.Pointer<_ObjCBlock> _objc_msgSend_81( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer err, + ffi.Pointer userInfoKey, + ffi.Pointer errorDomain, + ) { + return __objc_msgSend_81( + obj, + sel, + err, + userInfoKey, + errorDomain, + ); + } + + late final __objc_msgSend_81Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer<_ObjCBlock> Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_81 = __objc_msgSend_81Ptr.asFunction< + ffi.Pointer<_ObjCBlock> Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_setKeys_triggerChangeNotificationsForDependentKey_1 = + _registerName1("setKeys:triggerChangeNotificationsForDependentKey:"); + void _objc_msgSend_82( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer keys, + ffi.Pointer dependentKey, + ) { + return __objc_msgSend_82( + obj, + sel, + keys, + dependentKey, + ); + } + + late final __objc_msgSend_82Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_82 = __objc_msgSend_82Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_classFallbacksForKeyedArchiver1 = + _registerName1("classFallbacksForKeyedArchiver"); + late final _sel_classForKeyedUnarchiver1 = + _registerName1("classForKeyedUnarchiver"); + late final _sel_writeToURL_error_1 = _registerName1("writeToURL:error:"); + bool _objc_msgSend_83( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ffi.Pointer> error, + ) { + return __objc_msgSend_83( + obj, + sel, + url, + error, + ); + } + + late final __objc_msgSend_83Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_83 = __objc_msgSend_83Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer>)>(); + + late final _sel_makeObjectsPerformSelector_1 = + _registerName1("makeObjectsPerformSelector:"); + late final _sel_makeObjectsPerformSelector_withObject_1 = + _registerName1("makeObjectsPerformSelector:withObject:"); + void _objc_msgSend_84( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aSelector, + ffi.Pointer argument, + ) { + return __objc_msgSend_84( + obj, + sel, + aSelector, + argument, + ); + } + + late final __objc_msgSend_84Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_84 = __objc_msgSend_84Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _class_NSIndexSet1 = _getClass1("NSIndexSet"); + late final _sel_indexSet1 = _registerName1("indexSet"); + late final _sel_indexSetWithIndex_1 = _registerName1("indexSetWithIndex:"); + late final _sel_indexSetWithIndexesInRange_1 = + _registerName1("indexSetWithIndexesInRange:"); + instancetype _objc_msgSend_85( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ) { + return __objc_msgSend_85( + obj, + sel, + range, + ); + } + + late final __objc_msgSend_85Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_85 = __objc_msgSend_85Ptr.asFunction< + instancetype Function( + ffi.Pointer, ffi.Pointer, _NSRange)>(); + + late final _sel_initWithIndexesInRange_1 = + _registerName1("initWithIndexesInRange:"); + late final _sel_initWithIndexSet_1 = _registerName1("initWithIndexSet:"); + instancetype _objc_msgSend_86( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer indexSet, + ) { + return __objc_msgSend_86( + obj, + sel, + indexSet, + ); + } + + late final __objc_msgSend_86Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_86 = __objc_msgSend_86Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_initWithIndex_1 = _registerName1("initWithIndex:"); + late final _sel_isEqualToIndexSet_1 = _registerName1("isEqualToIndexSet:"); + bool _objc_msgSend_87( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer indexSet, + ) { + return __objc_msgSend_87( + obj, + sel, + indexSet, + ); + } + + late final __objc_msgSend_87Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_87 = __objc_msgSend_87Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_firstIndex1 = _registerName1("firstIndex"); + late final _sel_lastIndex1 = _registerName1("lastIndex"); + late final _sel_indexGreaterThanIndex_1 = + _registerName1("indexGreaterThanIndex:"); + int _objc_msgSend_88( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_88( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_88Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedLong Function(ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_88 = __objc_msgSend_88Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_indexLessThanIndex_1 = _registerName1("indexLessThanIndex:"); + late final _sel_indexGreaterThanOrEqualToIndex_1 = + _registerName1("indexGreaterThanOrEqualToIndex:"); + late final _sel_indexLessThanOrEqualToIndex_1 = + _registerName1("indexLessThanOrEqualToIndex:"); + late final _sel_getIndexes_maxCount_inIndexRange_1 = + _registerName1("getIndexes:maxCount:inIndexRange:"); + int _objc_msgSend_89( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer indexBuffer, + int bufferSize, + ffi.Pointer<_NSRange> range, + ) { + return __objc_msgSend_89( + obj, + sel, + indexBuffer, + bufferSize, + range, + ); + } + + late final __objc_msgSend_89Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer<_NSRange>)>>('objc_msgSend'); + late final __objc_msgSend_89 = __objc_msgSend_89Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, ffi.Pointer<_NSRange>)>(); + + late final _sel_countOfIndexesInRange_1 = + _registerName1("countOfIndexesInRange:"); + int _objc_msgSend_90( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ) { + return __objc_msgSend_90( + obj, + sel, + range, + ); + } + + late final __objc_msgSend_90Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedLong Function(ffi.Pointer, + ffi.Pointer, _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_90 = __objc_msgSend_90Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, _NSRange)>(); + + late final _sel_containsIndex_1 = _registerName1("containsIndex:"); + bool _objc_msgSend_91( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_91( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_91Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_91 = __objc_msgSend_91Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_containsIndexesInRange_1 = + _registerName1("containsIndexesInRange:"); + bool _objc_msgSend_92( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ) { + return __objc_msgSend_92( + obj, + sel, + range, + ); + } + + late final __objc_msgSend_92Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_92 = __objc_msgSend_92Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, _NSRange)>(); + + late final _sel_containsIndexes_1 = _registerName1("containsIndexes:"); + late final _sel_intersectsIndexesInRange_1 = + _registerName1("intersectsIndexesInRange:"); + late final _sel_enumerateIndexesUsingBlock_1 = + _registerName1("enumerateIndexesUsingBlock:"); + void _objc_msgSend_93( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_93( + obj, + sel, + block, + ); + } + + late final __objc_msgSend_93Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_93 = __objc_msgSend_93Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_enumerateIndexesWithOptions_usingBlock_1 = + _registerName1("enumerateIndexesWithOptions:usingBlock:"); + void _objc_msgSend_94( + ffi.Pointer obj, + ffi.Pointer sel, + int opts, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_94( + obj, + sel, + opts, + block, + ); + } + + late final __objc_msgSend_94Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_94 = __objc_msgSend_94Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_enumerateIndexesInRange_options_usingBlock_1 = + _registerName1("enumerateIndexesInRange:options:usingBlock:"); + void _objc_msgSend_95( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + int opts, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_95( + obj, + sel, + range, + opts, + block, + ); + } + + late final __objc_msgSend_95Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + _NSRange, ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_95 = __objc_msgSend_95Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, _NSRange, + int, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_indexPassingTest_1 = _registerName1("indexPassingTest:"); + int _objc_msgSend_96( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> predicate, + ) { + return __objc_msgSend_96( + obj, + sel, + predicate, + ); + } + + late final __objc_msgSend_96Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedLong Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_96 = __objc_msgSend_96Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_indexWithOptions_passingTest_1 = + _registerName1("indexWithOptions:passingTest:"); + int _objc_msgSend_97( + ffi.Pointer obj, + ffi.Pointer sel, + int opts, + ffi.Pointer<_ObjCBlock> predicate, + ) { + return __objc_msgSend_97( + obj, + sel, + opts, + predicate, + ); + } + + late final __objc_msgSend_97Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_97 = __objc_msgSend_97Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_indexInRange_options_passingTest_1 = + _registerName1("indexInRange:options:passingTest:"); + int _objc_msgSend_98( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + int opts, + ffi.Pointer<_ObjCBlock> predicate, + ) { + return __objc_msgSend_98( + obj, + sel, + range, + opts, + predicate, + ); + } + + late final __objc_msgSend_98Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer, + _NSRange, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_98 = __objc_msgSend_98Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, _NSRange, int, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_indexesPassingTest_1 = _registerName1("indexesPassingTest:"); + ffi.Pointer _objc_msgSend_99( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> predicate, + ) { + return __objc_msgSend_99( + obj, + sel, + predicate, + ); + } + + late final __objc_msgSend_99Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_99 = __objc_msgSend_99Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_indexesWithOptions_passingTest_1 = + _registerName1("indexesWithOptions:passingTest:"); + ffi.Pointer _objc_msgSend_100( + ffi.Pointer obj, + ffi.Pointer sel, + int opts, + ffi.Pointer<_ObjCBlock> predicate, + ) { + return __objc_msgSend_100( + obj, + sel, + opts, + predicate, + ); + } + + late final __objc_msgSend_100Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_100 = __objc_msgSend_100Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_indexesInRange_options_passingTest_1 = + _registerName1("indexesInRange:options:passingTest:"); + ffi.Pointer _objc_msgSend_101( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + int opts, + ffi.Pointer<_ObjCBlock> predicate, + ) { + return __objc_msgSend_101( + obj, + sel, + range, + opts, + predicate, + ); + } + + late final __objc_msgSend_101Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + _NSRange, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_101 = __objc_msgSend_101Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, _NSRange, int, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_enumerateRangesUsingBlock_1 = + _registerName1("enumerateRangesUsingBlock:"); + void _objc_msgSend_102( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_102( + obj, + sel, + block, + ); + } + + late final __objc_msgSend_102Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_102 = __objc_msgSend_102Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_enumerateRangesWithOptions_usingBlock_1 = + _registerName1("enumerateRangesWithOptions:usingBlock:"); + void _objc_msgSend_103( + ffi.Pointer obj, + ffi.Pointer sel, + int opts, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_103( + obj, + sel, + opts, + block, + ); + } + + late final __objc_msgSend_103Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_103 = __objc_msgSend_103Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_enumerateRangesInRange_options_usingBlock_1 = + _registerName1("enumerateRangesInRange:options:usingBlock:"); + void _objc_msgSend_104( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + int opts, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_104( + obj, + sel, + range, + opts, + block, + ); + } + + late final __objc_msgSend_104Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + _NSRange, ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_104 = __objc_msgSend_104Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, _NSRange, + int, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_objectsAtIndexes_1 = _registerName1("objectsAtIndexes:"); + ffi.Pointer _objc_msgSend_105( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer indexes, + ) { + return __objc_msgSend_105( + obj, + sel, + indexes, + ); + } + + late final __objc_msgSend_105Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_105 = __objc_msgSend_105Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_objectAtIndexedSubscript_1 = + _registerName1("objectAtIndexedSubscript:"); + late final _sel_enumerateObjectsUsingBlock_1 = + _registerName1("enumerateObjectsUsingBlock:"); + void _objc_msgSend_106( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_106( + obj, + sel, + block, + ); + } + + late final __objc_msgSend_106Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_106 = __objc_msgSend_106Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_enumerateObjectsWithOptions_usingBlock_1 = + _registerName1("enumerateObjectsWithOptions:usingBlock:"); + void _objc_msgSend_107( + ffi.Pointer obj, + ffi.Pointer sel, + int opts, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_107( + obj, + sel, + opts, + block, + ); + } + + late final __objc_msgSend_107Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_107 = __objc_msgSend_107Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_enumerateObjectsAtIndexes_options_usingBlock_1 = + _registerName1("enumerateObjectsAtIndexes:options:usingBlock:"); + void _objc_msgSend_108( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer s, + int opts, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_108( + obj, + sel, + s, + opts, + block, + ); + } + + late final __objc_msgSend_108Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_108 = __objc_msgSend_108Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_indexOfObjectPassingTest_1 = + _registerName1("indexOfObjectPassingTest:"); + int _objc_msgSend_109( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> predicate, + ) { + return __objc_msgSend_109( + obj, + sel, + predicate, + ); + } + + late final __objc_msgSend_109Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedLong Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_109 = __objc_msgSend_109Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_indexOfObjectWithOptions_passingTest_1 = + _registerName1("indexOfObjectWithOptions:passingTest:"); + int _objc_msgSend_110( + ffi.Pointer obj, + ffi.Pointer sel, + int opts, + ffi.Pointer<_ObjCBlock> predicate, + ) { + return __objc_msgSend_110( + obj, + sel, + opts, + predicate, + ); + } + + late final __objc_msgSend_110Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_110 = __objc_msgSend_110Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_indexOfObjectAtIndexes_options_passingTest_1 = + _registerName1("indexOfObjectAtIndexes:options:passingTest:"); + int _objc_msgSend_111( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer s, + int opts, + ffi.Pointer<_ObjCBlock> predicate, + ) { + return __objc_msgSend_111( + obj, + sel, + s, + opts, + predicate, + ); + } + + late final __objc_msgSend_111Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_111 = __objc_msgSend_111Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_indexesOfObjectsPassingTest_1 = + _registerName1("indexesOfObjectsPassingTest:"); + ffi.Pointer _objc_msgSend_112( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> predicate, + ) { + return __objc_msgSend_112( + obj, + sel, + predicate, + ); + } + + late final __objc_msgSend_112Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_112 = __objc_msgSend_112Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_indexesOfObjectsWithOptions_passingTest_1 = + _registerName1("indexesOfObjectsWithOptions:passingTest:"); + ffi.Pointer _objc_msgSend_113( + ffi.Pointer obj, + ffi.Pointer sel, + int opts, + ffi.Pointer<_ObjCBlock> predicate, + ) { + return __objc_msgSend_113( + obj, + sel, + opts, + predicate, + ); + } + + late final __objc_msgSend_113Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_113 = __objc_msgSend_113Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_indexesOfObjectsAtIndexes_options_passingTest_1 = + _registerName1("indexesOfObjectsAtIndexes:options:passingTest:"); + ffi.Pointer _objc_msgSend_114( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer s, + int opts, + ffi.Pointer<_ObjCBlock> predicate, + ) { + return __objc_msgSend_114( + obj, + sel, + s, + opts, + predicate, + ); + } + + late final __objc_msgSend_114Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_114 = __objc_msgSend_114Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_sortedArrayUsingComparator_1 = + _registerName1("sortedArrayUsingComparator:"); + ffi.Pointer _objc_msgSend_115( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> cmptr, + ) { + return __objc_msgSend_115( + obj, + sel, + cmptr, + ); + } + + late final __objc_msgSend_115Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_115 = __objc_msgSend_115Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_sortedArrayWithOptions_usingComparator_1 = + _registerName1("sortedArrayWithOptions:usingComparator:"); + ffi.Pointer _objc_msgSend_116( + ffi.Pointer obj, + ffi.Pointer sel, + int opts, + ffi.Pointer<_ObjCBlock> cmptr, + ) { + return __objc_msgSend_116( + obj, + sel, + opts, + cmptr, + ); + } + + late final __objc_msgSend_116Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_116 = __objc_msgSend_116Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_indexOfObject_inSortedRange_options_usingComparator_1 = + _registerName1("indexOfObject:inSortedRange:options:usingComparator:"); + int _objc_msgSend_117( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer obj1, + _NSRange r, + int opts, + ffi.Pointer<_ObjCBlock> cmp, + ) { + return __objc_msgSend_117( + obj, + sel, + obj1, + r, + opts, + cmp, + ); + } + + late final __objc_msgSend_117Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + _NSRange, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_117 = __objc_msgSend_117Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, _NSRange, int, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_array1 = _registerName1("array"); + late final _sel_arrayWithObject_1 = _registerName1("arrayWithObject:"); + late final _sel_arrayWithObjects_count_1 = + _registerName1("arrayWithObjects:count:"); + late final _sel_arrayWithObjects_1 = _registerName1("arrayWithObjects:"); + late final _sel_arrayWithArray_1 = _registerName1("arrayWithArray:"); + late final _sel_initWithObjects_1 = _registerName1("initWithObjects:"); + late final _sel_initWithArray_1 = _registerName1("initWithArray:"); + late final _sel_initWithArray_copyItems_1 = + _registerName1("initWithArray:copyItems:"); + instancetype _objc_msgSend_118( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer array, + bool flag, + ) { + return __objc_msgSend_118( + obj, + sel, + array, + flag, + ); + } + + late final __objc_msgSend_118Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_118 = __objc_msgSend_118Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, bool)>(); + + late final _sel_initWithContentsOfURL_error_1 = + _registerName1("initWithContentsOfURL:error:"); + ffi.Pointer _objc_msgSend_119( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ffi.Pointer> error, + ) { + return __objc_msgSend_119( + obj, + sel, + url, + error, + ); + } + + late final __objc_msgSend_119Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_119 = __objc_msgSend_119Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_arrayWithContentsOfURL_error_1 = + _registerName1("arrayWithContentsOfURL:error:"); + late final _sel_differenceFromArray_withOptions_usingEquivalenceTest_1 = + _registerName1("differenceFromArray:withOptions:usingEquivalenceTest:"); + ffi.Pointer _objc_msgSend_120( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer other, + int options, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_120( + obj, + sel, + other, + options, + block, + ); + } + + late final __objc_msgSend_120Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_120 = __objc_msgSend_120Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_differenceFromArray_withOptions_1 = + _registerName1("differenceFromArray:withOptions:"); + ffi.Pointer _objc_msgSend_121( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer other, + int options, + ) { + return __objc_msgSend_121( + obj, + sel, + other, + options, + ); + } + + late final __objc_msgSend_121Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_121 = __objc_msgSend_121Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_differenceFromArray_1 = + _registerName1("differenceFromArray:"); + late final _sel_arrayByApplyingDifference_1 = + _registerName1("arrayByApplyingDifference:"); + late final _sel_getObjects_1 = _registerName1("getObjects:"); + void _objc_msgSend_122( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer> objects, + ) { + return __objc_msgSend_122( + obj, + sel, + objects, + ); + } + + late final __objc_msgSend_122Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_122 = __objc_msgSend_122Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_arrayWithContentsOfFile_1 = + _registerName1("arrayWithContentsOfFile:"); + ffi.Pointer _objc_msgSend_123( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ) { + return __objc_msgSend_123( + obj, + sel, + path, + ); + } + + late final __objc_msgSend_123Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_123 = __objc_msgSend_123Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_arrayWithContentsOfURL_1 = + _registerName1("arrayWithContentsOfURL:"); + ffi.Pointer _objc_msgSend_124( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ) { + return __objc_msgSend_124( + obj, + sel, + url, + ); + } + + late final __objc_msgSend_124Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_124 = __objc_msgSend_124Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_initWithContentsOfFile_1 = + _registerName1("initWithContentsOfFile:"); + late final _sel_initWithContentsOfURL_1 = + _registerName1("initWithContentsOfURL:"); + late final _sel_writeToURL_atomically_1 = + _registerName1("writeToURL:atomically:"); + bool _objc_msgSend_125( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + bool atomically, + ) { + return __objc_msgSend_125( + obj, + sel, + url, + atomically, + ); + } + + late final __objc_msgSend_125Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_125 = __objc_msgSend_125Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, bool)>(); + + late final _sel_pathsMatchingExtensions_1 = + _registerName1("pathsMatchingExtensions:"); + late final _sel_valueForKey_1 = _registerName1("valueForKey:"); + late final _sel_setValue_forKey_1 = _registerName1("setValue:forKey:"); + void _objc_msgSend_126( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ffi.Pointer key, + ) { + return __objc_msgSend_126( + obj, + sel, + value, + key, + ); + } + + late final __objc_msgSend_126Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_126 = __objc_msgSend_126Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_addObserver_toObjectsAtIndexes_forKeyPath_options_context_1 = + _registerName1( + "addObserver:toObjectsAtIndexes:forKeyPath:options:context:"); + void _objc_msgSend_127( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer observer, + ffi.Pointer indexes, + ffi.Pointer keyPath, + int options, + ffi.Pointer context, + ) { + return __objc_msgSend_127( + obj, + sel, + observer, + indexes, + keyPath, + options, + context, + ); + } + + late final __objc_msgSend_127Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_127 = __objc_msgSend_127Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer)>(); + + late final _sel_removeObserver_fromObjectsAtIndexes_forKeyPath_context_1 = + _registerName1("removeObserver:fromObjectsAtIndexes:forKeyPath:context:"); + void _objc_msgSend_128( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer observer, + ffi.Pointer indexes, + ffi.Pointer keyPath, + ffi.Pointer context, + ) { + return __objc_msgSend_128( + obj, + sel, + observer, + indexes, + keyPath, + context, + ); + } + + late final __objc_msgSend_128Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_128 = __objc_msgSend_128Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_removeObserver_fromObjectsAtIndexes_forKeyPath_1 = + _registerName1("removeObserver:fromObjectsAtIndexes:forKeyPath:"); + void _objc_msgSend_129( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer observer, + ffi.Pointer indexes, + ffi.Pointer keyPath, + ) { + return __objc_msgSend_129( + obj, + sel, + observer, + indexes, + keyPath, + ); + } + + late final __objc_msgSend_129Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_129 = __objc_msgSend_129Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_addObserver_forKeyPath_options_context_1 = + _registerName1("addObserver:forKeyPath:options:context:"); + void _objc_msgSend_130( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer observer, + ffi.Pointer keyPath, + int options, + ffi.Pointer context, + ) { + return __objc_msgSend_130( + obj, + sel, + observer, + keyPath, + options, + context, + ); + } + + late final __objc_msgSend_130Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_130 = __objc_msgSend_130Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer)>(); + + late final _sel_removeObserver_forKeyPath_context_1 = + _registerName1("removeObserver:forKeyPath:context:"); + void _objc_msgSend_131( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer observer, + ffi.Pointer keyPath, + ffi.Pointer context, + ) { + return __objc_msgSend_131( + obj, + sel, + observer, + keyPath, + context, + ); + } + + late final __objc_msgSend_131Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_131 = __objc_msgSend_131Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_removeObserver_forKeyPath_1 = + _registerName1("removeObserver:forKeyPath:"); + void _objc_msgSend_132( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer observer, + ffi.Pointer keyPath, + ) { + return __objc_msgSend_132( + obj, + sel, + observer, + keyPath, + ); + } + + late final __objc_msgSend_132Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_132 = __objc_msgSend_132Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_sortedArrayUsingDescriptors_1 = + _registerName1("sortedArrayUsingDescriptors:"); + late final _class_NSPredicate1 = _getClass1("NSPredicate"); + late final _sel_predicateWithFormat_argumentArray_1 = + _registerName1("predicateWithFormat:argumentArray:"); + ffi.Pointer _objc_msgSend_133( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer predicateFormat, + ffi.Pointer arguments, + ) { + return __objc_msgSend_133( + obj, + sel, + predicateFormat, + arguments, + ); + } + + late final __objc_msgSend_133Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_133 = __objc_msgSend_133Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_predicateWithFormat_1 = + _registerName1("predicateWithFormat:"); + ffi.Pointer _objc_msgSend_134( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer predicateFormat, + ) { + return __objc_msgSend_134( + obj, + sel, + predicateFormat, + ); + } + + late final __objc_msgSend_134Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_134 = __objc_msgSend_134Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_predicateWithFormat_arguments_1 = + _registerName1("predicateWithFormat:arguments:"); + ffi.Pointer _objc_msgSend_135( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer predicateFormat, + ffi.Pointer<__va_list_tag> argList, + ) { + return __objc_msgSend_135( + obj, + sel, + predicateFormat, + argList, + ); + } + + late final __objc_msgSend_135Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<__va_list_tag>)>>('objc_msgSend'); + late final __objc_msgSend_135 = __objc_msgSend_135Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<__va_list_tag>)>(); + + late final _sel_predicateFromMetadataQueryString_1 = + _registerName1("predicateFromMetadataQueryString:"); + late final _sel_predicateWithValue_1 = _registerName1("predicateWithValue:"); + ffi.Pointer _objc_msgSend_136( + ffi.Pointer obj, + ffi.Pointer sel, + bool value, + ) { + return __objc_msgSend_136( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_136Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_136 = __objc_msgSend_136Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, bool)>(); + + late final _class_NSDictionary1 = _getClass1("NSDictionary"); + late final _sel_objectForKey_1 = _registerName1("objectForKey:"); + late final _sel_keyEnumerator1 = _registerName1("keyEnumerator"); + late final _sel_initWithObjects_forKeys_count_1 = + _registerName1("initWithObjects:forKeys:count:"); + instancetype _objc_msgSend_137( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer> objects, + ffi.Pointer> keys, + int cnt, + ) { + return __objc_msgSend_137( + obj, + sel, + objects, + keys, + cnt, + ); + } + + late final __objc_msgSend_137Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer>, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_137 = __objc_msgSend_137Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer>, + int)>(); + + late final _sel_allKeys1 = _registerName1("allKeys"); + late final _sel_allKeysForObject_1 = _registerName1("allKeysForObject:"); + late final _sel_allValues1 = _registerName1("allValues"); + late final _sel_descriptionInStringsFileFormat1 = + _registerName1("descriptionInStringsFileFormat"); + late final _sel_isEqualToDictionary_1 = + _registerName1("isEqualToDictionary:"); + bool _objc_msgSend_138( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer otherDictionary, + ) { + return __objc_msgSend_138( + obj, + sel, + otherDictionary, + ); + } + + late final __objc_msgSend_138Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_138 = __objc_msgSend_138Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_objectsForKeys_notFoundMarker_1 = + _registerName1("objectsForKeys:notFoundMarker:"); + ffi.Pointer _objc_msgSend_139( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer keys, + ffi.Pointer marker, + ) { + return __objc_msgSend_139( + obj, + sel, + keys, + marker, + ); + } + + late final __objc_msgSend_139Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_139 = __objc_msgSend_139Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_keysSortedByValueUsingSelector_1 = + _registerName1("keysSortedByValueUsingSelector:"); + late final _sel_getObjects_andKeys_count_1 = + _registerName1("getObjects:andKeys:count:"); + void _objc_msgSend_140( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer> objects, + ffi.Pointer> keys, + int count, + ) { + return __objc_msgSend_140( + obj, + sel, + objects, + keys, + count, + ); + } + + late final __objc_msgSend_140Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer>, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_140 = __objc_msgSend_140Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer>, + int)>(); + + late final _sel_objectForKeyedSubscript_1 = + _registerName1("objectForKeyedSubscript:"); + late final _sel_enumerateKeysAndObjectsUsingBlock_1 = + _registerName1("enumerateKeysAndObjectsUsingBlock:"); + void _objc_msgSend_141( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_141( + obj, + sel, + block, + ); + } + + late final __objc_msgSend_141Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_141 = __objc_msgSend_141Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_enumerateKeysAndObjectsWithOptions_usingBlock_1 = + _registerName1("enumerateKeysAndObjectsWithOptions:usingBlock:"); + void _objc_msgSend_142( + ffi.Pointer obj, + ffi.Pointer sel, + int opts, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_142( + obj, + sel, + opts, + block, + ); + } + + late final __objc_msgSend_142Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_142 = __objc_msgSend_142Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_keysSortedByValueUsingComparator_1 = + _registerName1("keysSortedByValueUsingComparator:"); + late final _sel_keysSortedByValueWithOptions_usingComparator_1 = + _registerName1("keysSortedByValueWithOptions:usingComparator:"); + late final _sel_keysOfEntriesPassingTest_1 = + _registerName1("keysOfEntriesPassingTest:"); + ffi.Pointer _objc_msgSend_143( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> predicate, + ) { + return __objc_msgSend_143( + obj, + sel, + predicate, + ); + } + + late final __objc_msgSend_143Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_143 = __objc_msgSend_143Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_keysOfEntriesWithOptions_passingTest_1 = + _registerName1("keysOfEntriesWithOptions:passingTest:"); + ffi.Pointer _objc_msgSend_144( + ffi.Pointer obj, + ffi.Pointer sel, + int opts, + ffi.Pointer<_ObjCBlock> predicate, + ) { + return __objc_msgSend_144( + obj, + sel, + opts, + predicate, + ); + } + + late final __objc_msgSend_144Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_144 = __objc_msgSend_144Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_getObjects_andKeys_1 = _registerName1("getObjects:andKeys:"); + void _objc_msgSend_145( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer> objects, + ffi.Pointer> keys, + ) { + return __objc_msgSend_145( + obj, + sel, + objects, + keys, + ); + } + + late final __objc_msgSend_145Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_145 = __objc_msgSend_145Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer>)>(); + + late final _sel_dictionaryWithContentsOfFile_1 = + _registerName1("dictionaryWithContentsOfFile:"); + ffi.Pointer _objc_msgSend_146( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ) { + return __objc_msgSend_146( + obj, + sel, + path, + ); + } + + late final __objc_msgSend_146Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_146 = __objc_msgSend_146Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_dictionaryWithContentsOfURL_1 = + _registerName1("dictionaryWithContentsOfURL:"); + ffi.Pointer _objc_msgSend_147( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ) { + return __objc_msgSend_147( + obj, + sel, + url, + ); + } + + late final __objc_msgSend_147Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_147 = __objc_msgSend_147Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_dictionary1 = _registerName1("dictionary"); + late final _sel_dictionaryWithObject_forKey_1 = + _registerName1("dictionaryWithObject:forKey:"); + instancetype _objc_msgSend_148( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer object, + ffi.Pointer key, + ) { + return __objc_msgSend_148( + obj, + sel, + object, + key, + ); + } + + late final __objc_msgSend_148Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_148 = __objc_msgSend_148Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_dictionaryWithObjects_forKeys_count_1 = + _registerName1("dictionaryWithObjects:forKeys:count:"); + late final _sel_dictionaryWithObjectsAndKeys_1 = + _registerName1("dictionaryWithObjectsAndKeys:"); + late final _sel_dictionaryWithDictionary_1 = + _registerName1("dictionaryWithDictionary:"); + instancetype _objc_msgSend_149( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer dict, + ) { + return __objc_msgSend_149( + obj, + sel, + dict, + ); + } + + late final __objc_msgSend_149Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_149 = __objc_msgSend_149Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_dictionaryWithObjects_forKeys_1 = + _registerName1("dictionaryWithObjects:forKeys:"); + instancetype _objc_msgSend_150( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer objects, + ffi.Pointer keys, + ) { + return __objc_msgSend_150( + obj, + sel, + objects, + keys, + ); + } + + late final __objc_msgSend_150Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_150 = __objc_msgSend_150Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_initWithObjectsAndKeys_1 = + _registerName1("initWithObjectsAndKeys:"); + late final _sel_initWithDictionary_1 = _registerName1("initWithDictionary:"); + late final _sel_initWithDictionary_copyItems_1 = + _registerName1("initWithDictionary:copyItems:"); + instancetype _objc_msgSend_151( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer otherDictionary, + bool flag, + ) { + return __objc_msgSend_151( + obj, + sel, + otherDictionary, + flag, + ); + } + + late final __objc_msgSend_151Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_151 = __objc_msgSend_151Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, bool)>(); + + late final _sel_initWithObjects_forKeys_1 = + _registerName1("initWithObjects:forKeys:"); + ffi.Pointer _objc_msgSend_152( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ffi.Pointer> error, + ) { + return __objc_msgSend_152( + obj, + sel, + url, + error, + ); + } + + late final __objc_msgSend_152Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_152 = __objc_msgSend_152Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_dictionaryWithContentsOfURL_error_1 = + _registerName1("dictionaryWithContentsOfURL:error:"); + late final _sel_sharedKeySetForKeys_1 = + _registerName1("sharedKeySetForKeys:"); + late final _sel_countByEnumeratingWithState_objects_count_1 = + _registerName1("countByEnumeratingWithState:objects:count:"); + int _objc_msgSend_153( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer state, + ffi.Pointer> buffer, + int len, + ) { + return __objc_msgSend_153( + obj, + sel, + state, + buffer, + len, + ); + } + + late final __objc_msgSend_153Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_153 = __objc_msgSend_153Ptr.asFunction< + int Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + int)>(); + + late final _sel_fileSize1 = _registerName1("fileSize"); + int _objc_msgSend_154( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_154( + obj, + sel, + ); + } + + late final __objc_msgSend_154Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedLongLong Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_154 = __objc_msgSend_154Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _class_NSDate1 = _getClass1("NSDate"); + late final _sel_timeIntervalSinceReferenceDate1 = + _registerName1("timeIntervalSinceReferenceDate"); + double _objc_msgSend_155( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_155( + obj, + sel, + ); + } + + late final __objc_msgSend_155Ptr = _lookup< + ffi.NativeFunction< + ffi.Double Function(ffi.Pointer, + ffi.Pointer)>>('objc_msgSend_fpret'); + late final __objc_msgSend_155 = __objc_msgSend_155Ptr.asFunction< + double Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_initWithTimeIntervalSinceReferenceDate_1 = + _registerName1("initWithTimeIntervalSinceReferenceDate:"); + instancetype _objc_msgSend_156( + ffi.Pointer obj, + ffi.Pointer sel, + double ti, + ) { + return __objc_msgSend_156( + obj, + sel, + ti, + ); + } + + late final __objc_msgSend_156Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Double)>>('objc_msgSend'); + late final __objc_msgSend_156 = __objc_msgSend_156Ptr.asFunction< + instancetype Function( + ffi.Pointer, ffi.Pointer, double)>(); + + late final _sel_timeIntervalSinceDate_1 = + _registerName1("timeIntervalSinceDate:"); + double _objc_msgSend_157( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer anotherDate, + ) { + return __objc_msgSend_157( + obj, + sel, + anotherDate, + ); + } + + late final __objc_msgSend_157Ptr = _lookup< + ffi.NativeFunction< + ffi.Double Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend_fpret'); + late final __objc_msgSend_157 = __objc_msgSend_157Ptr.asFunction< + double Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_timeIntervalSinceNow1 = + _registerName1("timeIntervalSinceNow"); + late final _sel_timeIntervalSince19701 = + _registerName1("timeIntervalSince1970"); + late final _sel_addTimeInterval_1 = _registerName1("addTimeInterval:"); + late final _sel_dateByAddingTimeInterval_1 = + _registerName1("dateByAddingTimeInterval:"); + late final _sel_earlierDate_1 = _registerName1("earlierDate:"); + ffi.Pointer _objc_msgSend_158( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer anotherDate, + ) { + return __objc_msgSend_158( + obj, + sel, + anotherDate, + ); + } + + late final __objc_msgSend_158Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_158 = __objc_msgSend_158Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_laterDate_1 = _registerName1("laterDate:"); + late final _sel_compare_1 = _registerName1("compare:"); + int _objc_msgSend_159( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer other, + ) { + return __objc_msgSend_159( + obj, + sel, + other, + ); + } + + late final __objc_msgSend_159Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_159 = __objc_msgSend_159Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_isEqualToDate_1 = _registerName1("isEqualToDate:"); + bool _objc_msgSend_160( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer otherDate, + ) { + return __objc_msgSend_160( + obj, + sel, + otherDate, + ); + } + + late final __objc_msgSend_160Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_160 = __objc_msgSend_160Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_date1 = _registerName1("date"); + late final _sel_dateWithTimeIntervalSinceNow_1 = + _registerName1("dateWithTimeIntervalSinceNow:"); + late final _sel_dateWithTimeIntervalSinceReferenceDate_1 = + _registerName1("dateWithTimeIntervalSinceReferenceDate:"); + late final _sel_dateWithTimeIntervalSince1970_1 = + _registerName1("dateWithTimeIntervalSince1970:"); + late final _sel_dateWithTimeInterval_sinceDate_1 = + _registerName1("dateWithTimeInterval:sinceDate:"); + instancetype _objc_msgSend_161( + ffi.Pointer obj, + ffi.Pointer sel, + double secsToBeAdded, + ffi.Pointer date, + ) { + return __objc_msgSend_161( + obj, + sel, + secsToBeAdded, + date, + ); + } + + late final __objc_msgSend_161Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Double, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_161 = __objc_msgSend_161Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + double, ffi.Pointer)>(); + + late final _sel_distantFuture1 = _registerName1("distantFuture"); + ffi.Pointer _objc_msgSend_162( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_162( + obj, + sel, + ); + } + + late final __objc_msgSend_162Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_162 = __objc_msgSend_162Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_distantPast1 = _registerName1("distantPast"); + late final _sel_now1 = _registerName1("now"); + late final _sel_initWithTimeIntervalSinceNow_1 = + _registerName1("initWithTimeIntervalSinceNow:"); + late final _sel_initWithTimeIntervalSince1970_1 = + _registerName1("initWithTimeIntervalSince1970:"); + late final _sel_initWithTimeInterval_sinceDate_1 = + _registerName1("initWithTimeInterval:sinceDate:"); + late final _sel_dateWithNaturalLanguageString_locale_1 = + _registerName1("dateWithNaturalLanguageString:locale:"); + ffi.Pointer _objc_msgSend_163( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer string, + ffi.Pointer locale, + ) { + return __objc_msgSend_163( + obj, + sel, + string, + locale, + ); + } + + late final __objc_msgSend_163Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_163 = __objc_msgSend_163Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_dateWithNaturalLanguageString_1 = + _registerName1("dateWithNaturalLanguageString:"); + late final _sel_dateWithString_1 = _registerName1("dateWithString:"); + late final _class_NSCalendarDate1 = _getClass1("NSCalendarDate"); + late final _sel_calendarDate1 = _registerName1("calendarDate"); + late final _sel_dateWithString_calendarFormat_locale_1 = + _registerName1("dateWithString:calendarFormat:locale:"); + ffi.Pointer _objc_msgSend_164( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer description, + ffi.Pointer format, + ffi.Pointer locale, + ) { + return __objc_msgSend_164( + obj, + sel, + description, + format, + locale, + ); + } + + late final __objc_msgSend_164Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_164 = __objc_msgSend_164Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_dateWithString_calendarFormat_1 = + _registerName1("dateWithString:calendarFormat:"); + ffi.Pointer _objc_msgSend_165( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer description, + ffi.Pointer format, + ) { + return __objc_msgSend_165( + obj, + sel, + description, + format, + ); + } + + late final __objc_msgSend_165Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_165 = __objc_msgSend_165Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _class_NSTimeZone1 = _getClass1("NSTimeZone"); + late final _sel_name1 = _registerName1("name"); + late final _sel_data1 = _registerName1("data"); + late final _sel_secondsFromGMTForDate_1 = + _registerName1("secondsFromGMTForDate:"); + int _objc_msgSend_166( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aDate, + ) { + return __objc_msgSend_166( + obj, + sel, + aDate, + ); + } + + late final __objc_msgSend_166Ptr = _lookup< + ffi.NativeFunction< + ffi.Long Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_166 = __objc_msgSend_166Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_abbreviationForDate_1 = + _registerName1("abbreviationForDate:"); + ffi.Pointer _objc_msgSend_167( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aDate, + ) { + return __objc_msgSend_167( + obj, + sel, + aDate, + ); + } + + late final __objc_msgSend_167Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_167 = __objc_msgSend_167Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_isDaylightSavingTimeForDate_1 = + _registerName1("isDaylightSavingTimeForDate:"); + late final _sel_daylightSavingTimeOffsetForDate_1 = + _registerName1("daylightSavingTimeOffsetForDate:"); + late final _sel_nextDaylightSavingTimeTransitionAfterDate_1 = + _registerName1("nextDaylightSavingTimeTransitionAfterDate:"); + late final _sel_systemTimeZone1 = _registerName1("systemTimeZone"); + ffi.Pointer _objc_msgSend_168( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_168( + obj, + sel, + ); + } + + late final __objc_msgSend_168Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_168 = __objc_msgSend_168Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_resetSystemTimeZone1 = _registerName1("resetSystemTimeZone"); + late final _sel_defaultTimeZone1 = _registerName1("defaultTimeZone"); + late final _sel_setDefaultTimeZone_1 = _registerName1("setDefaultTimeZone:"); + void _objc_msgSend_169( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_169( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_169Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_169 = __objc_msgSend_169Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_localTimeZone1 = _registerName1("localTimeZone"); + late final _sel_knownTimeZoneNames1 = _registerName1("knownTimeZoneNames"); + late final _sel_abbreviationDictionary1 = + _registerName1("abbreviationDictionary"); + ffi.Pointer _objc_msgSend_170( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_170( + obj, + sel, + ); + } + + late final __objc_msgSend_170Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_170 = __objc_msgSend_170Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setAbbreviationDictionary_1 = + _registerName1("setAbbreviationDictionary:"); + void _objc_msgSend_171( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_171( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_171Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_171 = __objc_msgSend_171Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_timeZoneDataVersion1 = _registerName1("timeZoneDataVersion"); + late final _sel_secondsFromGMT1 = _registerName1("secondsFromGMT"); + late final _sel_abbreviation1 = _registerName1("abbreviation"); + late final _sel_isDaylightSavingTime1 = + _registerName1("isDaylightSavingTime"); + late final _sel_daylightSavingTimeOffset1 = + _registerName1("daylightSavingTimeOffset"); + late final _sel_nextDaylightSavingTimeTransition1 = + _registerName1("nextDaylightSavingTimeTransition"); + late final _sel_isEqualToTimeZone_1 = _registerName1("isEqualToTimeZone:"); + bool _objc_msgSend_172( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aTimeZone, + ) { + return __objc_msgSend_172( + obj, + sel, + aTimeZone, + ); + } + + late final __objc_msgSend_172Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_172 = __objc_msgSend_172Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _class_NSLocale1 = _getClass1("NSLocale"); + late final _sel_displayNameForKey_value_1 = + _registerName1("displayNameForKey:value:"); + ffi.Pointer _objc_msgSend_173( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer key, + ffi.Pointer value, + ) { + return __objc_msgSend_173( + obj, + sel, + key, + value, + ); + } + + late final __objc_msgSend_173Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_173 = __objc_msgSend_173Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_initWithLocaleIdentifier_1 = + _registerName1("initWithLocaleIdentifier:"); + late final _sel_localeIdentifier1 = _registerName1("localeIdentifier"); + late final _sel_localizedStringForLocaleIdentifier_1 = + _registerName1("localizedStringForLocaleIdentifier:"); + late final _sel_languageCode1 = _registerName1("languageCode"); + late final _sel_localizedStringForLanguageCode_1 = + _registerName1("localizedStringForLanguageCode:"); + late final _sel_countryCode1 = _registerName1("countryCode"); + late final _sel_localizedStringForCountryCode_1 = + _registerName1("localizedStringForCountryCode:"); + late final _sel_scriptCode1 = _registerName1("scriptCode"); + late final _sel_localizedStringForScriptCode_1 = + _registerName1("localizedStringForScriptCode:"); + late final _sel_variantCode1 = _registerName1("variantCode"); + late final _sel_localizedStringForVariantCode_1 = + _registerName1("localizedStringForVariantCode:"); + late final _class_NSCharacterSet1 = _getClass1("NSCharacterSet"); + late final _sel_controlCharacterSet1 = _registerName1("controlCharacterSet"); + ffi.Pointer _objc_msgSend_174( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_174( + obj, + sel, + ); + } + + late final __objc_msgSend_174Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_174 = __objc_msgSend_174Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_whitespaceCharacterSet1 = + _registerName1("whitespaceCharacterSet"); + late final _sel_whitespaceAndNewlineCharacterSet1 = + _registerName1("whitespaceAndNewlineCharacterSet"); + late final _sel_decimalDigitCharacterSet1 = + _registerName1("decimalDigitCharacterSet"); + late final _sel_letterCharacterSet1 = _registerName1("letterCharacterSet"); + late final _sel_lowercaseLetterCharacterSet1 = + _registerName1("lowercaseLetterCharacterSet"); + late final _sel_uppercaseLetterCharacterSet1 = + _registerName1("uppercaseLetterCharacterSet"); + late final _sel_nonBaseCharacterSet1 = _registerName1("nonBaseCharacterSet"); + late final _sel_alphanumericCharacterSet1 = + _registerName1("alphanumericCharacterSet"); + late final _sel_decomposableCharacterSet1 = + _registerName1("decomposableCharacterSet"); + late final _sel_illegalCharacterSet1 = _registerName1("illegalCharacterSet"); + late final _sel_punctuationCharacterSet1 = + _registerName1("punctuationCharacterSet"); + late final _sel_capitalizedLetterCharacterSet1 = + _registerName1("capitalizedLetterCharacterSet"); + late final _sel_symbolCharacterSet1 = _registerName1("symbolCharacterSet"); + late final _sel_newlineCharacterSet1 = _registerName1("newlineCharacterSet"); + late final _sel_characterSetWithRange_1 = + _registerName1("characterSetWithRange:"); + ffi.Pointer _objc_msgSend_175( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange aRange, + ) { + return __objc_msgSend_175( + obj, + sel, + aRange, + ); + } + + late final __objc_msgSend_175Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_175 = __objc_msgSend_175Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, _NSRange)>(); + + late final _sel_characterSetWithCharactersInString_1 = + _registerName1("characterSetWithCharactersInString:"); + ffi.Pointer _objc_msgSend_176( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aString, + ) { + return __objc_msgSend_176( + obj, + sel, + aString, + ); + } + + late final __objc_msgSend_176Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_176 = __objc_msgSend_176Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_characterSetWithBitmapRepresentation_1 = + _registerName1("characterSetWithBitmapRepresentation:"); + ffi.Pointer _objc_msgSend_177( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer data, + ) { + return __objc_msgSend_177( + obj, + sel, + data, + ); + } + + late final __objc_msgSend_177Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_177 = __objc_msgSend_177Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_characterSetWithContentsOfFile_1 = + _registerName1("characterSetWithContentsOfFile:"); + late final _sel_characterIsMember_1 = _registerName1("characterIsMember:"); + bool _objc_msgSend_178( + ffi.Pointer obj, + ffi.Pointer sel, + int aCharacter, + ) { + return __objc_msgSend_178( + obj, + sel, + aCharacter, + ); + } + + late final __objc_msgSend_178Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.UnsignedShort)>>('objc_msgSend'); + late final __objc_msgSend_178 = __objc_msgSend_178Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_bitmapRepresentation1 = + _registerName1("bitmapRepresentation"); + late final _sel_invertedSet1 = _registerName1("invertedSet"); + late final _sel_longCharacterIsMember_1 = + _registerName1("longCharacterIsMember:"); + bool _objc_msgSend_179( + ffi.Pointer obj, + ffi.Pointer sel, + int theLongChar, + ) { + return __objc_msgSend_179( + obj, + sel, + theLongChar, + ); + } + + late final __objc_msgSend_179Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.UnsignedInt)>>('objc_msgSend'); + late final __objc_msgSend_179 = __objc_msgSend_179Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_isSupersetOfSet_1 = _registerName1("isSupersetOfSet:"); + bool _objc_msgSend_180( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer theOtherSet, + ) { + return __objc_msgSend_180( + obj, + sel, + theOtherSet, + ); + } + + late final __objc_msgSend_180Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_180 = __objc_msgSend_180Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_hasMemberInPlane_1 = _registerName1("hasMemberInPlane:"); + bool _objc_msgSend_181( + ffi.Pointer obj, + ffi.Pointer sel, + int thePlane, + ) { + return __objc_msgSend_181( + obj, + sel, + thePlane, + ); + } + + late final __objc_msgSend_181Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Uint8)>>('objc_msgSend'); + late final __objc_msgSend_181 = __objc_msgSend_181Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_URLUserAllowedCharacterSet1 = + _registerName1("URLUserAllowedCharacterSet"); + late final _sel_URLPasswordAllowedCharacterSet1 = + _registerName1("URLPasswordAllowedCharacterSet"); + late final _sel_URLHostAllowedCharacterSet1 = + _registerName1("URLHostAllowedCharacterSet"); + late final _sel_URLPathAllowedCharacterSet1 = + _registerName1("URLPathAllowedCharacterSet"); + late final _sel_URLQueryAllowedCharacterSet1 = + _registerName1("URLQueryAllowedCharacterSet"); + late final _sel_URLFragmentAllowedCharacterSet1 = + _registerName1("URLFragmentAllowedCharacterSet"); + late final _sel_exemplarCharacterSet1 = + _registerName1("exemplarCharacterSet"); + late final _sel_calendarIdentifier1 = _registerName1("calendarIdentifier"); + late final _sel_localizedStringForCalendarIdentifier_1 = + _registerName1("localizedStringForCalendarIdentifier:"); + late final _sel_collationIdentifier1 = _registerName1("collationIdentifier"); + late final _sel_localizedStringForCollationIdentifier_1 = + _registerName1("localizedStringForCollationIdentifier:"); + late final _sel_usesMetricSystem1 = _registerName1("usesMetricSystem"); + late final _sel_decimalSeparator1 = _registerName1("decimalSeparator"); + late final _sel_groupingSeparator1 = _registerName1("groupingSeparator"); + late final _sel_currencySymbol1 = _registerName1("currencySymbol"); + late final _sel_currencyCode1 = _registerName1("currencyCode"); + late final _sel_localizedStringForCurrencyCode_1 = + _registerName1("localizedStringForCurrencyCode:"); + late final _sel_collatorIdentifier1 = _registerName1("collatorIdentifier"); + late final _sel_localizedStringForCollatorIdentifier_1 = + _registerName1("localizedStringForCollatorIdentifier:"); + late final _sel_quotationBeginDelimiter1 = + _registerName1("quotationBeginDelimiter"); + late final _sel_quotationEndDelimiter1 = + _registerName1("quotationEndDelimiter"); + late final _sel_alternateQuotationBeginDelimiter1 = + _registerName1("alternateQuotationBeginDelimiter"); + late final _sel_alternateQuotationEndDelimiter1 = + _registerName1("alternateQuotationEndDelimiter"); + late final _sel_autoupdatingCurrentLocale1 = + _registerName1("autoupdatingCurrentLocale"); + ffi.Pointer _objc_msgSend_182( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_182( + obj, + sel, + ); + } + + late final __objc_msgSend_182Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_182 = __objc_msgSend_182Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_currentLocale1 = _registerName1("currentLocale"); + late final _sel_systemLocale1 = _registerName1("systemLocale"); + late final _sel_localeWithLocaleIdentifier_1 = + _registerName1("localeWithLocaleIdentifier:"); + late final _sel_availableLocaleIdentifiers1 = + _registerName1("availableLocaleIdentifiers"); + late final _sel_ISOLanguageCodes1 = _registerName1("ISOLanguageCodes"); + late final _sel_ISOCountryCodes1 = _registerName1("ISOCountryCodes"); + late final _sel_ISOCurrencyCodes1 = _registerName1("ISOCurrencyCodes"); + late final _sel_commonISOCurrencyCodes1 = + _registerName1("commonISOCurrencyCodes"); + late final _sel_preferredLanguages1 = _registerName1("preferredLanguages"); + late final _sel_componentsFromLocaleIdentifier_1 = + _registerName1("componentsFromLocaleIdentifier:"); + late final _sel_localeIdentifierFromComponents_1 = + _registerName1("localeIdentifierFromComponents:"); + ffi.Pointer _objc_msgSend_183( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer dict, + ) { + return __objc_msgSend_183( + obj, + sel, + dict, + ); + } + + late final __objc_msgSend_183Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_183 = __objc_msgSend_183Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_canonicalLocaleIdentifierFromString_1 = + _registerName1("canonicalLocaleIdentifierFromString:"); + late final _sel_canonicalLanguageIdentifierFromString_1 = + _registerName1("canonicalLanguageIdentifierFromString:"); + late final _sel_localeIdentifierFromWindowsLocaleCode_1 = + _registerName1("localeIdentifierFromWindowsLocaleCode:"); + ffi.Pointer _objc_msgSend_184( + ffi.Pointer obj, + ffi.Pointer sel, + int lcid, + ) { + return __objc_msgSend_184( + obj, + sel, + lcid, + ); + } + + late final __objc_msgSend_184Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Uint32)>>('objc_msgSend'); + late final __objc_msgSend_184 = __objc_msgSend_184Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_windowsLocaleCodeFromLocaleIdentifier_1 = + _registerName1("windowsLocaleCodeFromLocaleIdentifier:"); + int _objc_msgSend_185( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer localeIdentifier, + ) { + return __objc_msgSend_185( + obj, + sel, + localeIdentifier, + ); + } + + late final __objc_msgSend_185Ptr = _lookup< + ffi.NativeFunction< + ffi.Uint32 Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_185 = __objc_msgSend_185Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_characterDirectionForLanguage_1 = + _registerName1("characterDirectionForLanguage:"); + int _objc_msgSend_186( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer isoLangCode, + ) { + return __objc_msgSend_186( + obj, + sel, + isoLangCode, + ); + } + + late final __objc_msgSend_186Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_186 = __objc_msgSend_186Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_lineDirectionForLanguage_1 = + _registerName1("lineDirectionForLanguage:"); + late final _sel_localizedName_locale_1 = + _registerName1("localizedName:locale:"); + ffi.Pointer _objc_msgSend_187( + ffi.Pointer obj, + ffi.Pointer sel, + int style, + ffi.Pointer locale, + ) { + return __objc_msgSend_187( + obj, + sel, + style, + locale, + ); + } + + late final __objc_msgSend_187Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_187 = __objc_msgSend_187Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, ffi.Pointer)>(); + + late final _sel_timeZoneWithName_1 = _registerName1("timeZoneWithName:"); + late final _sel_timeZoneWithName_data_1 = + _registerName1("timeZoneWithName:data:"); + instancetype _objc_msgSend_188( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer tzName, + ffi.Pointer aData, + ) { + return __objc_msgSend_188( + obj, + sel, + tzName, + aData, + ); + } + + late final __objc_msgSend_188Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_188 = __objc_msgSend_188Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_initWithName_1 = _registerName1("initWithName:"); + late final _sel_initWithName_data_1 = _registerName1("initWithName:data:"); + late final _sel_timeZoneForSecondsFromGMT_1 = + _registerName1("timeZoneForSecondsFromGMT:"); + instancetype _objc_msgSend_189( + ffi.Pointer obj, + ffi.Pointer sel, + int seconds, + ) { + return __objc_msgSend_189( + obj, + sel, + seconds, + ); + } + + late final __objc_msgSend_189Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Long)>>('objc_msgSend'); + late final __objc_msgSend_189 = __objc_msgSend_189Ptr.asFunction< + instancetype Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_timeZoneWithAbbreviation_1 = + _registerName1("timeZoneWithAbbreviation:"); + late final _sel_dateWithYear_month_day_hour_minute_second_timeZone_1 = + _registerName1("dateWithYear:month:day:hour:minute:second:timeZone:"); + ffi.Pointer _objc_msgSend_190( + ffi.Pointer obj, + ffi.Pointer sel, + int year, + int month, + int day, + int hour, + int minute, + int second, + ffi.Pointer aTimeZone, + ) { + return __objc_msgSend_190( + obj, + sel, + year, + month, + day, + hour, + minute, + second, + aTimeZone, + ); + } + + late final __objc_msgSend_190Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Long, + ffi.UnsignedLong, + ffi.UnsignedLong, + ffi.UnsignedLong, + ffi.UnsignedLong, + ffi.UnsignedLong, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_190 = __objc_msgSend_190Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + int, + int, + int, + int, + int, + int, + ffi.Pointer)>(); + + late final _sel_dateByAddingYears_months_days_hours_minutes_seconds_1 = + _registerName1("dateByAddingYears:months:days:hours:minutes:seconds:"); + ffi.Pointer _objc_msgSend_191( + ffi.Pointer obj, + ffi.Pointer sel, + int year, + int month, + int day, + int hour, + int minute, + int second, + ) { + return __objc_msgSend_191( + obj, + sel, + year, + month, + day, + hour, + minute, + second, + ); + } + + late final __objc_msgSend_191Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Long, + ffi.Long, + ffi.Long, + ffi.Long, + ffi.Long, + ffi.Long)>>('objc_msgSend'); + late final __objc_msgSend_191 = __objc_msgSend_191Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, int, int, int, int, int)>(); + + late final _sel_dayOfCommonEra1 = _registerName1("dayOfCommonEra"); + late final _sel_dayOfMonth1 = _registerName1("dayOfMonth"); + late final _sel_dayOfWeek1 = _registerName1("dayOfWeek"); + late final _sel_dayOfYear1 = _registerName1("dayOfYear"); + late final _sel_hourOfDay1 = _registerName1("hourOfDay"); + late final _sel_minuteOfHour1 = _registerName1("minuteOfHour"); + late final _sel_monthOfYear1 = _registerName1("monthOfYear"); + late final _sel_secondOfMinute1 = _registerName1("secondOfMinute"); + late final _sel_yearOfCommonEra1 = _registerName1("yearOfCommonEra"); + late final _sel_calendarFormat1 = _registerName1("calendarFormat"); + late final _sel_descriptionWithCalendarFormat_locale_1 = + _registerName1("descriptionWithCalendarFormat:locale:"); + late final _sel_descriptionWithCalendarFormat_1 = + _registerName1("descriptionWithCalendarFormat:"); + late final _sel_timeZone1 = _registerName1("timeZone"); + late final _sel_initWithString_calendarFormat_locale_1 = + _registerName1("initWithString:calendarFormat:locale:"); + late final _sel_initWithString_calendarFormat_1 = + _registerName1("initWithString:calendarFormat:"); + late final _sel_initWithYear_month_day_hour_minute_second_timeZone_1 = + _registerName1("initWithYear:month:day:hour:minute:second:timeZone:"); + late final _sel_setCalendarFormat_1 = _registerName1("setCalendarFormat:"); + void _objc_msgSend_192( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer format, + ) { + return __objc_msgSend_192( + obj, + sel, + format, + ); + } + + late final __objc_msgSend_192Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_192 = __objc_msgSend_192Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_setTimeZone_1 = _registerName1("setTimeZone:"); + void _objc_msgSend_193( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aTimeZone, + ) { + return __objc_msgSend_193( + obj, + sel, + aTimeZone, + ); + } + + late final __objc_msgSend_193Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_193 = __objc_msgSend_193Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_years_months_days_hours_minutes_seconds_sinceDate_1 = + _registerName1("years:months:days:hours:minutes:seconds:sinceDate:"); + void _objc_msgSend_194( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer yp, + ffi.Pointer mop, + ffi.Pointer dp, + ffi.Pointer hp, + ffi.Pointer mip, + ffi.Pointer sp, + ffi.Pointer date, + ) { + return __objc_msgSend_194( + obj, + sel, + yp, + mop, + dp, + hp, + mip, + sp, + date, + ); + } + + late final __objc_msgSend_194Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_194 = __objc_msgSend_194Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_dateWithCalendarFormat_timeZone_1 = + _registerName1("dateWithCalendarFormat:timeZone:"); + ffi.Pointer _objc_msgSend_195( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer format, + ffi.Pointer aTimeZone, + ) { + return __objc_msgSend_195( + obj, + sel, + format, + aTimeZone, + ); + } + + late final __objc_msgSend_195Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_195 = __objc_msgSend_195Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_descriptionWithCalendarFormat_timeZone_locale_1 = + _registerName1("descriptionWithCalendarFormat:timeZone:locale:"); + ffi.Pointer _objc_msgSend_196( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer format, + ffi.Pointer aTimeZone, + ffi.Pointer locale, + ) { + return __objc_msgSend_196( + obj, + sel, + format, + aTimeZone, + locale, + ); + } + + late final __objc_msgSend_196Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_196 = __objc_msgSend_196Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_fileModificationDate1 = + _registerName1("fileModificationDate"); + late final _sel_fileType1 = _registerName1("fileType"); + late final _sel_filePosixPermissions1 = + _registerName1("filePosixPermissions"); + late final _sel_fileOwnerAccountName1 = + _registerName1("fileOwnerAccountName"); + late final _sel_fileGroupOwnerAccountName1 = + _registerName1("fileGroupOwnerAccountName"); + late final _sel_fileSystemNumber1 = _registerName1("fileSystemNumber"); + late final _sel_fileSystemFileNumber1 = + _registerName1("fileSystemFileNumber"); + late final _sel_fileExtensionHidden1 = _registerName1("fileExtensionHidden"); + late final _sel_fileHFSCreatorCode1 = _registerName1("fileHFSCreatorCode"); + int _objc_msgSend_197( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_197( + obj, + sel, + ); + } + + late final __objc_msgSend_197Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedInt Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_197 = __objc_msgSend_197Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_fileHFSTypeCode1 = _registerName1("fileHFSTypeCode"); + late final _sel_fileIsImmutable1 = _registerName1("fileIsImmutable"); + late final _sel_fileIsAppendOnly1 = _registerName1("fileIsAppendOnly"); + late final _sel_fileCreationDate1 = _registerName1("fileCreationDate"); + late final _sel_fileOwnerAccountID1 = _registerName1("fileOwnerAccountID"); + ffi.Pointer _objc_msgSend_198( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_198( + obj, + sel, + ); + } + + late final __objc_msgSend_198Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_198 = __objc_msgSend_198Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_fileGroupOwnerAccountID1 = + _registerName1("fileGroupOwnerAccountID"); + late final _sel_predicateWithBlock_1 = _registerName1("predicateWithBlock:"); + ffi.Pointer _objc_msgSend_199( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_199( + obj, + sel, + block, + ); + } + + late final __objc_msgSend_199Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_199 = __objc_msgSend_199Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_predicateFormat1 = _registerName1("predicateFormat"); + late final _sel_predicateWithSubstitutionVariables_1 = + _registerName1("predicateWithSubstitutionVariables:"); + late final _sel_evaluateWithObject_1 = _registerName1("evaluateWithObject:"); + late final _sel_evaluateWithObject_substitutionVariables_1 = + _registerName1("evaluateWithObject:substitutionVariables:"); + bool _objc_msgSend_200( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer object, + ffi.Pointer bindings, + ) { + return __objc_msgSend_200( + obj, + sel, + object, + bindings, + ); + } + + late final __objc_msgSend_200Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_200 = __objc_msgSend_200Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_allowEvaluation1 = _registerName1("allowEvaluation"); + late final _sel_filteredArrayUsingPredicate_1 = + _registerName1("filteredArrayUsingPredicate:"); + ffi.Pointer _objc_msgSend_201( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer predicate, + ) { + return __objc_msgSend_201( + obj, + sel, + predicate, + ); + } + + late final __objc_msgSend_201Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_201 = __objc_msgSend_201Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_initWithChar_1 = _registerName1("initWithChar:"); + ffi.Pointer _objc_msgSend_202( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_202( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_202Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Char)>>('objc_msgSend'); + late final __objc_msgSend_202 = __objc_msgSend_202Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_initWithUnsignedChar_1 = + _registerName1("initWithUnsignedChar:"); + ffi.Pointer _objc_msgSend_203( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_203( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_203Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.UnsignedChar)>>('objc_msgSend'); + late final __objc_msgSend_203 = __objc_msgSend_203Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_initWithShort_1 = _registerName1("initWithShort:"); + ffi.Pointer _objc_msgSend_204( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_204( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_204Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Short)>>('objc_msgSend'); + late final __objc_msgSend_204 = __objc_msgSend_204Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_initWithUnsignedShort_1 = + _registerName1("initWithUnsignedShort:"); + ffi.Pointer _objc_msgSend_205( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_205( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_205Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.UnsignedShort)>>('objc_msgSend'); + late final __objc_msgSend_205 = __objc_msgSend_205Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_initWithInt_1 = _registerName1("initWithInt:"); + ffi.Pointer _objc_msgSend_206( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_206( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_206Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Int)>>('objc_msgSend'); + late final __objc_msgSend_206 = __objc_msgSend_206Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_initWithUnsignedInt_1 = + _registerName1("initWithUnsignedInt:"); + ffi.Pointer _objc_msgSend_207( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_207( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_207Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.UnsignedInt)>>('objc_msgSend'); + late final __objc_msgSend_207 = __objc_msgSend_207Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_initWithLong_1 = _registerName1("initWithLong:"); + ffi.Pointer _objc_msgSend_208( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_208( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_208Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Long)>>('objc_msgSend'); + late final __objc_msgSend_208 = __objc_msgSend_208Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_initWithUnsignedLong_1 = + _registerName1("initWithUnsignedLong:"); + ffi.Pointer _objc_msgSend_209( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_209( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_209Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_209 = __objc_msgSend_209Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_initWithLongLong_1 = _registerName1("initWithLongLong:"); + ffi.Pointer _objc_msgSend_210( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_210( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_210Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.LongLong)>>('objc_msgSend'); + late final __objc_msgSend_210 = __objc_msgSend_210Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_initWithUnsignedLongLong_1 = + _registerName1("initWithUnsignedLongLong:"); + ffi.Pointer _objc_msgSend_211( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_211( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_211Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.UnsignedLongLong)>>('objc_msgSend'); + late final __objc_msgSend_211 = __objc_msgSend_211Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_initWithFloat_1 = _registerName1("initWithFloat:"); + ffi.Pointer _objc_msgSend_212( + ffi.Pointer obj, + ffi.Pointer sel, + double value, + ) { + return __objc_msgSend_212( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_212Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Float)>>('objc_msgSend'); + late final __objc_msgSend_212 = __objc_msgSend_212Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, double)>(); + + late final _sel_initWithDouble_1 = _registerName1("initWithDouble:"); + ffi.Pointer _objc_msgSend_213( + ffi.Pointer obj, + ffi.Pointer sel, + double value, + ) { + return __objc_msgSend_213( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_213Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Double)>>('objc_msgSend'); + late final __objc_msgSend_213 = __objc_msgSend_213Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, double)>(); + + late final _sel_initWithBool_1 = _registerName1("initWithBool:"); + ffi.Pointer _objc_msgSend_214( + ffi.Pointer obj, + ffi.Pointer sel, + bool value, + ) { + return __objc_msgSend_214( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_214Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_214 = __objc_msgSend_214Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, bool)>(); + + late final _sel_initWithInteger_1 = _registerName1("initWithInteger:"); + late final _sel_initWithUnsignedInteger_1 = + _registerName1("initWithUnsignedInteger:"); + late final _sel_charValue1 = _registerName1("charValue"); + int _objc_msgSend_215( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_215( + obj, + sel, + ); + } + + late final __objc_msgSend_215Ptr = _lookup< + ffi.NativeFunction< + ffi.Char Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_215 = __objc_msgSend_215Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_unsignedCharValue1 = _registerName1("unsignedCharValue"); + int _objc_msgSend_216( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_216( + obj, + sel, + ); + } + + late final __objc_msgSend_216Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedChar Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_216 = __objc_msgSend_216Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_shortValue1 = _registerName1("shortValue"); + int _objc_msgSend_217( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_217( + obj, + sel, + ); + } + + late final __objc_msgSend_217Ptr = _lookup< + ffi.NativeFunction< + ffi.Short Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_217 = __objc_msgSend_217Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_unsignedShortValue1 = _registerName1("unsignedShortValue"); + int _objc_msgSend_218( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_218( + obj, + sel, + ); + } + + late final __objc_msgSend_218Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedShort Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_218 = __objc_msgSend_218Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_intValue1 = _registerName1("intValue"); + int _objc_msgSend_219( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_219( + obj, + sel, + ); + } + + late final __objc_msgSend_219Ptr = _lookup< + ffi.NativeFunction< + ffi.Int Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_219 = __objc_msgSend_219Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_unsignedIntValue1 = _registerName1("unsignedIntValue"); + late final _sel_longValue1 = _registerName1("longValue"); + late final _sel_unsignedLongValue1 = _registerName1("unsignedLongValue"); + late final _sel_longLongValue1 = _registerName1("longLongValue"); + int _objc_msgSend_220( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_220( + obj, + sel, + ); + } + + late final __objc_msgSend_220Ptr = _lookup< + ffi.NativeFunction< + ffi.LongLong Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_220 = __objc_msgSend_220Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_unsignedLongLongValue1 = + _registerName1("unsignedLongLongValue"); + late final _sel_floatValue1 = _registerName1("floatValue"); + double _objc_msgSend_221( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_221( + obj, + sel, + ); + } + + late final __objc_msgSend_221Ptr = _lookup< + ffi.NativeFunction< + ffi.Float Function(ffi.Pointer, + ffi.Pointer)>>('objc_msgSend_fpret'); + late final __objc_msgSend_221 = __objc_msgSend_221Ptr.asFunction< + double Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_doubleValue1 = _registerName1("doubleValue"); + late final _sel_boolValue1 = _registerName1("boolValue"); + late final _sel_integerValue1 = _registerName1("integerValue"); + late final _sel_unsignedIntegerValue1 = + _registerName1("unsignedIntegerValue"); + late final _sel_stringValue1 = _registerName1("stringValue"); + int _objc_msgSend_222( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer otherNumber, + ) { + return __objc_msgSend_222( + obj, + sel, + otherNumber, + ); + } + + late final __objc_msgSend_222Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_222 = __objc_msgSend_222Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_isEqualToNumber_1 = _registerName1("isEqualToNumber:"); + bool _objc_msgSend_223( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer number, + ) { + return __objc_msgSend_223( + obj, + sel, + number, + ); + } + + late final __objc_msgSend_223Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_223 = __objc_msgSend_223Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_numberWithChar_1 = _registerName1("numberWithChar:"); + late final _sel_numberWithUnsignedChar_1 = + _registerName1("numberWithUnsignedChar:"); + late final _sel_numberWithShort_1 = _registerName1("numberWithShort:"); + late final _sel_numberWithUnsignedShort_1 = + _registerName1("numberWithUnsignedShort:"); + late final _sel_numberWithInt_1 = _registerName1("numberWithInt:"); + late final _sel_numberWithUnsignedInt_1 = + _registerName1("numberWithUnsignedInt:"); + late final _sel_numberWithLong_1 = _registerName1("numberWithLong:"); + late final _sel_numberWithUnsignedLong_1 = + _registerName1("numberWithUnsignedLong:"); + late final _sel_numberWithLongLong_1 = _registerName1("numberWithLongLong:"); + late final _sel_numberWithUnsignedLongLong_1 = + _registerName1("numberWithUnsignedLongLong:"); + late final _sel_numberWithFloat_1 = _registerName1("numberWithFloat:"); + late final _sel_numberWithDouble_1 = _registerName1("numberWithDouble:"); + late final _sel_numberWithBool_1 = _registerName1("numberWithBool:"); + late final _sel_numberWithInteger_1 = _registerName1("numberWithInteger:"); + late final _sel_numberWithUnsignedInteger_1 = + _registerName1("numberWithUnsignedInteger:"); + late final _sel_port1 = _registerName1("port"); + late final _sel_user1 = _registerName1("user"); + late final _sel_password1 = _registerName1("password"); + late final _sel_path1 = _registerName1("path"); + late final _sel_fragment1 = _registerName1("fragment"); + late final _sel_parameterString1 = _registerName1("parameterString"); + late final _sel_query1 = _registerName1("query"); + late final _sel_relativePath1 = _registerName1("relativePath"); + late final _sel_hasDirectoryPath1 = _registerName1("hasDirectoryPath"); + late final _sel_getFileSystemRepresentation_maxLength_1 = + _registerName1("getFileSystemRepresentation:maxLength:"); + bool _objc_msgSend_224( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer buffer, + int maxBufferLength, + ) { + return __objc_msgSend_224( + obj, + sel, + buffer, + maxBufferLength, + ); + } + + late final __objc_msgSend_224Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_224 = __objc_msgSend_224Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_fileSystemRepresentation1 = + _registerName1("fileSystemRepresentation"); + late final _sel_isFileURL1 = _registerName1("isFileURL"); + late final _sel_standardizedURL1 = _registerName1("standardizedURL"); + late final _sel_checkResourceIsReachableAndReturnError_1 = + _registerName1("checkResourceIsReachableAndReturnError:"); + bool _objc_msgSend_225( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer> error, + ) { + return __objc_msgSend_225( + obj, + sel, + error, + ); + } + + late final __objc_msgSend_225Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_225 = __objc_msgSend_225Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_isFileReferenceURL1 = _registerName1("isFileReferenceURL"); + late final _sel_fileReferenceURL1 = _registerName1("fileReferenceURL"); + late final _sel_filePathURL1 = _registerName1("filePathURL"); + late final _sel_getResourceValue_forKey_error_1 = + _registerName1("getResourceValue:forKey:error:"); + bool _objc_msgSend_226( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer> value, + ffi.Pointer key, + ffi.Pointer> error, + ) { + return __objc_msgSend_226( + obj, + sel, + value, + key, + error, + ); + } + + late final __objc_msgSend_226Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_226 = __objc_msgSend_226Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_resourceValuesForKeys_error_1 = + _registerName1("resourceValuesForKeys:error:"); + ffi.Pointer _objc_msgSend_227( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer keys, + ffi.Pointer> error, + ) { + return __objc_msgSend_227( + obj, + sel, + keys, + error, + ); + } + + late final __objc_msgSend_227Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_227 = __objc_msgSend_227Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_setResourceValue_forKey_error_1 = + _registerName1("setResourceValue:forKey:error:"); + bool _objc_msgSend_228( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ffi.Pointer key, + ffi.Pointer> error, + ) { + return __objc_msgSend_228( + obj, + sel, + value, + key, + error, + ); + } + + late final __objc_msgSend_228Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_228 = __objc_msgSend_228Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_setResourceValues_error_1 = + _registerName1("setResourceValues:error:"); + bool _objc_msgSend_229( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer keyedValues, + ffi.Pointer> error, + ) { + return __objc_msgSend_229( + obj, + sel, + keyedValues, + error, + ); + } + + late final __objc_msgSend_229Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_229 = __objc_msgSend_229Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer>)>(); + + late final _sel_removeCachedResourceValueForKey_1 = + _registerName1("removeCachedResourceValueForKey:"); + late final _sel_removeAllCachedResourceValues1 = + _registerName1("removeAllCachedResourceValues"); + late final _sel_setTemporaryResourceValue_forKey_1 = + _registerName1("setTemporaryResourceValue:forKey:"); + late final _sel_bookmarkDataWithOptions_includingResourceValuesForKeys_relativeToURL_error_1 = + _registerName1( + "bookmarkDataWithOptions:includingResourceValuesForKeys:relativeToURL:error:"); + ffi.Pointer _objc_msgSend_230( + ffi.Pointer obj, + ffi.Pointer sel, + int options, + ffi.Pointer keys, + ffi.Pointer relativeURL, + ffi.Pointer> error, + ) { + return __objc_msgSend_230( + obj, + sel, + options, + keys, + relativeURL, + error, + ); + } + + late final __objc_msgSend_230Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_230 = __objc_msgSend_230Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_initByResolvingBookmarkData_options_relativeToURL_bookmarkDataIsStale_error_1 = + _registerName1( + "initByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:"); + instancetype _objc_msgSend_231( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer bookmarkData, + int options, + ffi.Pointer relativeURL, + ffi.Pointer isStale, + ffi.Pointer> error, + ) { + return __objc_msgSend_231( + obj, + sel, + bookmarkData, + options, + relativeURL, + isStale, + error, + ); + } + + late final __objc_msgSend_231Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_231 = __objc_msgSend_231Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_URLByResolvingBookmarkData_options_relativeToURL_bookmarkDataIsStale_error_1 = + _registerName1( + "URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:"); + late final _sel_resourceValuesForKeys_fromBookmarkData_1 = + _registerName1("resourceValuesForKeys:fromBookmarkData:"); + ffi.Pointer _objc_msgSend_232( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer keys, + ffi.Pointer bookmarkData, + ) { + return __objc_msgSend_232( + obj, + sel, + keys, + bookmarkData, + ); + } + + late final __objc_msgSend_232Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_232 = __objc_msgSend_232Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_writeBookmarkData_toURL_options_error_1 = + _registerName1("writeBookmarkData:toURL:options:error:"); + bool _objc_msgSend_233( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer bookmarkData, + ffi.Pointer bookmarkFileURL, + int options, + ffi.Pointer> error, + ) { + return __objc_msgSend_233( + obj, + sel, + bookmarkData, + bookmarkFileURL, + options, + error, + ); + } + + late final __objc_msgSend_233Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_233 = __objc_msgSend_233Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer>)>(); + + late final _sel_bookmarkDataWithContentsOfURL_error_1 = + _registerName1("bookmarkDataWithContentsOfURL:error:"); + ffi.Pointer _objc_msgSend_234( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer bookmarkFileURL, + ffi.Pointer> error, + ) { + return __objc_msgSend_234( + obj, + sel, + bookmarkFileURL, + error, + ); + } + + late final __objc_msgSend_234Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_234 = __objc_msgSend_234Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_URLByResolvingAliasFileAtURL_options_error_1 = + _registerName1("URLByResolvingAliasFileAtURL:options:error:"); + instancetype _objc_msgSend_235( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + int options, + ffi.Pointer> error, + ) { + return __objc_msgSend_235( + obj, + sel, + url, + options, + error, + ); + } + + late final __objc_msgSend_235Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_235 = __objc_msgSend_235Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer>)>(); + + late final _sel_startAccessingSecurityScopedResource1 = + _registerName1("startAccessingSecurityScopedResource"); + late final _sel_stopAccessingSecurityScopedResource1 = + _registerName1("stopAccessingSecurityScopedResource"); + late final _sel_getPromisedItemResourceValue_forKey_error_1 = + _registerName1("getPromisedItemResourceValue:forKey:error:"); + late final _sel_promisedItemResourceValuesForKeys_error_1 = + _registerName1("promisedItemResourceValuesForKeys:error:"); + ffi.Pointer _objc_msgSend_236( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer keys, + ffi.Pointer> error, + ) { + return __objc_msgSend_236( + obj, + sel, + keys, + error, + ); + } + + late final __objc_msgSend_236Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_236 = __objc_msgSend_236Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_checkPromisedItemIsReachableAndReturnError_1 = + _registerName1("checkPromisedItemIsReachableAndReturnError:"); + late final _sel_fileURLWithPathComponents_1 = + _registerName1("fileURLWithPathComponents:"); + ffi.Pointer _objc_msgSend_237( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer components, + ) { + return __objc_msgSend_237( + obj, + sel, + components, + ); + } + + late final __objc_msgSend_237Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_237 = __objc_msgSend_237Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_pathComponents1 = _registerName1("pathComponents"); + late final _sel_lastPathComponent1 = _registerName1("lastPathComponent"); + late final _sel_pathExtension1 = _registerName1("pathExtension"); + late final _sel_URLByAppendingPathComponent_1 = + _registerName1("URLByAppendingPathComponent:"); + late final _sel_URLByAppendingPathComponent_isDirectory_1 = + _registerName1("URLByAppendingPathComponent:isDirectory:"); + late final _sel_URLByDeletingLastPathComponent1 = + _registerName1("URLByDeletingLastPathComponent"); + late final _sel_URLByAppendingPathExtension_1 = + _registerName1("URLByAppendingPathExtension:"); + late final _sel_URLByDeletingPathExtension1 = + _registerName1("URLByDeletingPathExtension"); + late final _sel_URLByStandardizingPath1 = + _registerName1("URLByStandardizingPath"); + late final _sel_URLByResolvingSymlinksInPath1 = + _registerName1("URLByResolvingSymlinksInPath"); + late final _sel_resourceDataUsingCache_1 = + _registerName1("resourceDataUsingCache:"); + ffi.Pointer _objc_msgSend_238( + ffi.Pointer obj, + ffi.Pointer sel, + bool shouldUseCache, + ) { + return __objc_msgSend_238( + obj, + sel, + shouldUseCache, + ); + } + + late final __objc_msgSend_238Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_238 = __objc_msgSend_238Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, bool)>(); + + late final _sel_loadResourceDataNotifyingClient_usingCache_1 = + _registerName1("loadResourceDataNotifyingClient:usingCache:"); + void _objc_msgSend_239( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer client, + bool shouldUseCache, + ) { + return __objc_msgSend_239( + obj, + sel, + client, + shouldUseCache, + ); + } + + late final __objc_msgSend_239Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_239 = __objc_msgSend_239Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, bool)>(); + + late final _sel_propertyForKey_1 = _registerName1("propertyForKey:"); + late final _sel_setResourceData_1 = _registerName1("setResourceData:"); + late final _sel_setProperty_forKey_1 = _registerName1("setProperty:forKey:"); + bool _objc_msgSend_240( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer property, + ffi.Pointer propertyKey, + ) { + return __objc_msgSend_240( + obj, + sel, + property, + propertyKey, + ); + } + + late final __objc_msgSend_240Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_240 = __objc_msgSend_240Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _class_NSURLHandle1 = _getClass1("NSURLHandle"); + late final _sel_registerURLHandleClass_1 = + _registerName1("registerURLHandleClass:"); + late final _sel_URLHandleClassForURL_1 = + _registerName1("URLHandleClassForURL:"); + ffi.Pointer _objc_msgSend_241( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer anURL, + ) { + return __objc_msgSend_241( + obj, + sel, + anURL, + ); + } + + late final __objc_msgSend_241Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_241 = __objc_msgSend_241Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_status1 = _registerName1("status"); + int _objc_msgSend_242( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_242( + obj, + sel, + ); + } + + late final __objc_msgSend_242Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_242 = __objc_msgSend_242Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_failureReason1 = _registerName1("failureReason"); + late final _sel_addClient_1 = _registerName1("addClient:"); + late final _sel_removeClient_1 = _registerName1("removeClient:"); + late final _sel_loadInBackground1 = _registerName1("loadInBackground"); + late final _sel_cancelLoadInBackground1 = + _registerName1("cancelLoadInBackground"); + late final _sel_resourceData1 = _registerName1("resourceData"); + late final _sel_availableResourceData1 = + _registerName1("availableResourceData"); + late final _sel_expectedResourceDataSize1 = + _registerName1("expectedResourceDataSize"); + late final _sel_flushCachedData1 = _registerName1("flushCachedData"); + late final _sel_backgroundLoadDidFailWithReason_1 = + _registerName1("backgroundLoadDidFailWithReason:"); + late final _sel_didLoadBytes_loadComplete_1 = + _registerName1("didLoadBytes:loadComplete:"); + void _objc_msgSend_243( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer newBytes, + bool yorn, + ) { + return __objc_msgSend_243( + obj, + sel, + newBytes, + yorn, + ); + } + + late final __objc_msgSend_243Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_243 = __objc_msgSend_243Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, bool)>(); + + late final _sel_canInitWithURL_1 = _registerName1("canInitWithURL:"); + bool _objc_msgSend_244( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer anURL, + ) { + return __objc_msgSend_244( + obj, + sel, + anURL, + ); + } + + late final __objc_msgSend_244Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_244 = __objc_msgSend_244Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_cachedHandleForURL_1 = _registerName1("cachedHandleForURL:"); + ffi.Pointer _objc_msgSend_245( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer anURL, + ) { + return __objc_msgSend_245( + obj, + sel, + anURL, + ); + } + + late final __objc_msgSend_245Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_245 = __objc_msgSend_245Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_initWithURL_cached_1 = _registerName1("initWithURL:cached:"); + ffi.Pointer _objc_msgSend_246( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer anURL, + bool willCache, + ) { + return __objc_msgSend_246( + obj, + sel, + anURL, + willCache, + ); + } + + late final __objc_msgSend_246Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_246 = __objc_msgSend_246Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer, bool)>(); + + late final _sel_propertyForKeyIfAvailable_1 = + _registerName1("propertyForKeyIfAvailable:"); + late final _sel_writeProperty_forKey_1 = + _registerName1("writeProperty:forKey:"); + late final _sel_writeData_1 = _registerName1("writeData:"); + late final _sel_loadInForeground1 = _registerName1("loadInForeground"); + late final _sel_beginLoadInBackground1 = + _registerName1("beginLoadInBackground"); + late final _sel_endLoadInBackground1 = _registerName1("endLoadInBackground"); + late final _sel_URLHandleUsingCache_1 = + _registerName1("URLHandleUsingCache:"); + ffi.Pointer _objc_msgSend_247( + ffi.Pointer obj, + ffi.Pointer sel, + bool shouldUseCache, + ) { + return __objc_msgSend_247( + obj, + sel, + shouldUseCache, + ); + } + + late final __objc_msgSend_247Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_247 = __objc_msgSend_247Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, bool)>(); + + late final _sel_writeToFile_options_error_1 = + _registerName1("writeToFile:options:error:"); + bool _objc_msgSend_248( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + int writeOptionsMask, + ffi.Pointer> errorPtr, + ) { + return __objc_msgSend_248( + obj, + sel, + path, + writeOptionsMask, + errorPtr, + ); + } + + late final __objc_msgSend_248Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_248 = __objc_msgSend_248Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer>)>(); + + late final _sel_writeToURL_options_error_1 = + _registerName1("writeToURL:options:error:"); + bool _objc_msgSend_249( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + int writeOptionsMask, + ffi.Pointer> errorPtr, + ) { + return __objc_msgSend_249( + obj, + sel, + url, + writeOptionsMask, + errorPtr, + ); + } + + late final __objc_msgSend_249Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_249 = __objc_msgSend_249Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer>)>(); + + late final _sel_rangeOfData_options_range_1 = + _registerName1("rangeOfData:options:range:"); + void _objc_msgSend_250( + ffi.Pointer<_NSRange> stret, + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer dataToFind, + int mask, + _NSRange searchRange, + ) { + return __objc_msgSend_250( + stret, + obj, + sel, + dataToFind, + mask, + searchRange, + ); + } + + late final __objc_msgSend_250Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_NSRange>, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + _NSRange)>>('objc_msgSend_stret'); + late final __objc_msgSend_250 = __objc_msgSend_250Ptr.asFunction< + void Function(ffi.Pointer<_NSRange>, ffi.Pointer, + ffi.Pointer, ffi.Pointer, int, _NSRange)>(); + + late final _sel_enumerateByteRangesUsingBlock_1 = + _registerName1("enumerateByteRangesUsingBlock:"); + void _objc_msgSend_251( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_251( + obj, + sel, + block, + ); + } + + late final __objc_msgSend_251Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_251 = __objc_msgSend_251Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_dataWithBytes_length_1 = + _registerName1("dataWithBytes:length:"); + instancetype _objc_msgSend_252( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer bytes, + int length, + ) { + return __objc_msgSend_252( + obj, + sel, + bytes, + length, + ); + } + + late final __objc_msgSend_252Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_252 = __objc_msgSend_252Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_dataWithBytesNoCopy_length_1 = + _registerName1("dataWithBytesNoCopy:length:"); + late final _sel_dataWithBytesNoCopy_length_freeWhenDone_1 = + _registerName1("dataWithBytesNoCopy:length:freeWhenDone:"); + instancetype _objc_msgSend_253( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer bytes, + int length, + bool b, + ) { + return __objc_msgSend_253( + obj, + sel, + bytes, + length, + b, + ); + } + + late final __objc_msgSend_253Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_253 = __objc_msgSend_253Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, bool)>(); + + late final _sel_dataWithContentsOfFile_options_error_1 = + _registerName1("dataWithContentsOfFile:options:error:"); + instancetype _objc_msgSend_254( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + int readOptionsMask, + ffi.Pointer> errorPtr, + ) { + return __objc_msgSend_254( + obj, + sel, + path, + readOptionsMask, + errorPtr, + ); + } + + late final __objc_msgSend_254Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_254 = __objc_msgSend_254Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer>)>(); + + late final _sel_dataWithContentsOfURL_options_error_1 = + _registerName1("dataWithContentsOfURL:options:error:"); + instancetype _objc_msgSend_255( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + int readOptionsMask, + ffi.Pointer> errorPtr, + ) { + return __objc_msgSend_255( + obj, + sel, + url, + readOptionsMask, + errorPtr, + ); + } + + late final __objc_msgSend_255Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_255 = __objc_msgSend_255Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer>)>(); + + late final _sel_dataWithContentsOfFile_1 = + _registerName1("dataWithContentsOfFile:"); + late final _sel_dataWithContentsOfURL_1 = + _registerName1("dataWithContentsOfURL:"); + late final _sel_initWithBytes_length_1 = + _registerName1("initWithBytes:length:"); + late final _sel_initWithBytesNoCopy_length_1 = + _registerName1("initWithBytesNoCopy:length:"); + late final _sel_initWithBytesNoCopy_length_freeWhenDone_1 = + _registerName1("initWithBytesNoCopy:length:freeWhenDone:"); + late final _sel_initWithBytesNoCopy_length_deallocator_1 = + _registerName1("initWithBytesNoCopy:length:deallocator:"); + instancetype _objc_msgSend_256( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer bytes, + int length, + ffi.Pointer<_ObjCBlock> deallocator, + ) { + return __objc_msgSend_256( + obj, + sel, + bytes, + length, + deallocator, + ); + } + + late final __objc_msgSend_256Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_256 = __objc_msgSend_256Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_initWithContentsOfFile_options_error_1 = + _registerName1("initWithContentsOfFile:options:error:"); + late final _sel_initWithContentsOfURL_options_error_1 = + _registerName1("initWithContentsOfURL:options:error:"); + late final _sel_initWithData_1 = _registerName1("initWithData:"); + instancetype _objc_msgSend_257( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer data, + ) { + return __objc_msgSend_257( + obj, + sel, + data, + ); + } + + late final __objc_msgSend_257Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_257 = __objc_msgSend_257Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_dataWithData_1 = _registerName1("dataWithData:"); + late final _sel_initWithBase64EncodedString_options_1 = + _registerName1("initWithBase64EncodedString:options:"); + instancetype _objc_msgSend_258( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer base64String, + int options, + ) { + return __objc_msgSend_258( + obj, + sel, + base64String, + options, + ); + } + + late final __objc_msgSend_258Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_258 = __objc_msgSend_258Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_base64EncodedStringWithOptions_1 = + _registerName1("base64EncodedStringWithOptions:"); + ffi.Pointer _objc_msgSend_259( + ffi.Pointer obj, + ffi.Pointer sel, + int options, + ) { + return __objc_msgSend_259( + obj, + sel, + options, + ); + } + + late final __objc_msgSend_259Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_259 = __objc_msgSend_259Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_initWithBase64EncodedData_options_1 = + _registerName1("initWithBase64EncodedData:options:"); + instancetype _objc_msgSend_260( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer base64Data, + int options, + ) { + return __objc_msgSend_260( + obj, + sel, + base64Data, + options, + ); + } + + late final __objc_msgSend_260Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_260 = __objc_msgSend_260Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_base64EncodedDataWithOptions_1 = + _registerName1("base64EncodedDataWithOptions:"); + ffi.Pointer _objc_msgSend_261( + ffi.Pointer obj, + ffi.Pointer sel, + int options, + ) { + return __objc_msgSend_261( + obj, + sel, + options, + ); + } + + late final __objc_msgSend_261Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_261 = __objc_msgSend_261Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_decompressedDataUsingAlgorithm_error_1 = + _registerName1("decompressedDataUsingAlgorithm:error:"); + instancetype _objc_msgSend_262( + ffi.Pointer obj, + ffi.Pointer sel, + int algorithm, + ffi.Pointer> error, + ) { + return __objc_msgSend_262( + obj, + sel, + algorithm, + error, + ); + } + + late final __objc_msgSend_262Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_262 = __objc_msgSend_262Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer>)>(); + + late final _sel_compressedDataUsingAlgorithm_error_1 = + _registerName1("compressedDataUsingAlgorithm:error:"); + late final _sel_getBytes_1 = _registerName1("getBytes:"); + late final _sel_dataWithContentsOfMappedFile_1 = + _registerName1("dataWithContentsOfMappedFile:"); + late final _sel_initWithContentsOfMappedFile_1 = + _registerName1("initWithContentsOfMappedFile:"); + late final _sel_initWithBase64Encoding_1 = + _registerName1("initWithBase64Encoding:"); + late final _sel_base64Encoding1 = _registerName1("base64Encoding"); + late final _sel_encodeDataObject_1 = _registerName1("encodeDataObject:"); + void _objc_msgSend_263( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer data, + ) { + return __objc_msgSend_263( + obj, + sel, + data, + ); + } + + late final __objc_msgSend_263Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_263 = __objc_msgSend_263Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_decodeDataObject1 = _registerName1("decodeDataObject"); + late final _sel_decodeValueOfObjCType_at_size_1 = + _registerName1("decodeValueOfObjCType:at:size:"); + void _objc_msgSend_264( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer type, + ffi.Pointer data, + int size, + ) { + return __objc_msgSend_264( + obj, + sel, + type, + data, + size, + ); + } + + late final __objc_msgSend_264Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_264 = __objc_msgSend_264Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_versionForClassName_1 = + _registerName1("versionForClassName:"); + int _objc_msgSend_265( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer className, + ) { + return __objc_msgSend_265( + obj, + sel, + className, + ); + } + + late final __objc_msgSend_265Ptr = _lookup< + ffi.NativeFunction< + ffi.Long Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_265 = __objc_msgSend_265Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_encodeObject_1 = _registerName1("encodeObject:"); + late final _sel_encodeRootObject_1 = _registerName1("encodeRootObject:"); + late final _sel_encodeBycopyObject_1 = _registerName1("encodeBycopyObject:"); + late final _sel_encodeByrefObject_1 = _registerName1("encodeByrefObject:"); + late final _sel_encodeConditionalObject_1 = + _registerName1("encodeConditionalObject:"); + late final _sel_encodeValuesOfObjCTypes_1 = + _registerName1("encodeValuesOfObjCTypes:"); + void _objc_msgSend_266( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer types, + ) { + return __objc_msgSend_266( + obj, + sel, + types, + ); + } + + late final __objc_msgSend_266Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_266 = __objc_msgSend_266Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_encodeArrayOfObjCType_count_at_1 = + _registerName1("encodeArrayOfObjCType:count:at:"); + void _objc_msgSend_267( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer type, + int count, + ffi.Pointer array, + ) { + return __objc_msgSend_267( + obj, + sel, + type, + count, + array, + ); + } + + late final __objc_msgSend_267Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_267 = __objc_msgSend_267Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, ffi.Pointer)>(); + + late final _sel_encodeBytes_length_1 = _registerName1("encodeBytes:length:"); + late final _sel_decodeObject1 = _registerName1("decodeObject"); + late final _sel_decodeTopLevelObjectAndReturnError_1 = + _registerName1("decodeTopLevelObjectAndReturnError:"); + ffi.Pointer _objc_msgSend_268( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer> error, + ) { + return __objc_msgSend_268( + obj, + sel, + error, + ); + } + + late final __objc_msgSend_268Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_268 = __objc_msgSend_268Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer>)>(); + + late final _sel_decodeValuesOfObjCTypes_1 = + _registerName1("decodeValuesOfObjCTypes:"); + late final _sel_decodeArrayOfObjCType_count_at_1 = + _registerName1("decodeArrayOfObjCType:count:at:"); + late final _sel_decodeBytesWithReturnedLength_1 = + _registerName1("decodeBytesWithReturnedLength:"); + ffi.Pointer _objc_msgSend_269( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer lengthp, + ) { + return __objc_msgSend_269( + obj, + sel, + lengthp, + ); + } + + late final __objc_msgSend_269Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_269 = __objc_msgSend_269Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_encodePropertyList_1 = _registerName1("encodePropertyList:"); + late final _sel_decodePropertyList1 = _registerName1("decodePropertyList"); + late final _sel_setObjectZone_1 = _registerName1("setObjectZone:"); + void _objc_msgSend_270( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_NSZone> zone, + ) { + return __objc_msgSend_270( + obj, + sel, + zone, + ); + } + + late final __objc_msgSend_270Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_NSZone>)>>('objc_msgSend'); + late final __objc_msgSend_270 = __objc_msgSend_270Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_NSZone>)>(); + + late final _sel_objectZone1 = _registerName1("objectZone"); + ffi.Pointer<_NSZone> _objc_msgSend_271( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_271( + obj, + sel, + ); + } + + late final __objc_msgSend_271Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer<_NSZone> Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_271 = __objc_msgSend_271Ptr.asFunction< + ffi.Pointer<_NSZone> Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_systemVersion1 = _registerName1("systemVersion"); + late final _sel_allowsKeyedCoding1 = _registerName1("allowsKeyedCoding"); + late final _sel_encodeObject_forKey_1 = + _registerName1("encodeObject:forKey:"); + late final _sel_encodeConditionalObject_forKey_1 = + _registerName1("encodeConditionalObject:forKey:"); + late final _sel_encodeBool_forKey_1 = _registerName1("encodeBool:forKey:"); + void _objc_msgSend_272( + ffi.Pointer obj, + ffi.Pointer sel, + bool value, + ffi.Pointer key, + ) { + return __objc_msgSend_272( + obj, + sel, + value, + key, + ); + } + + late final __objc_msgSend_272Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Bool, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_272 = __objc_msgSend_272Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, bool, + ffi.Pointer)>(); + + late final _sel_encodeInt_forKey_1 = _registerName1("encodeInt:forKey:"); + void _objc_msgSend_273( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ffi.Pointer key, + ) { + return __objc_msgSend_273( + obj, + sel, + value, + key, + ); + } + + late final __objc_msgSend_273Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_273 = __objc_msgSend_273Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer)>(); + + late final _sel_encodeInt32_forKey_1 = _registerName1("encodeInt32:forKey:"); + void _objc_msgSend_274( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ffi.Pointer key, + ) { + return __objc_msgSend_274( + obj, + sel, + value, + key, + ); + } + + late final __objc_msgSend_274Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_274 = __objc_msgSend_274Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer)>(); + + late final _sel_encodeInt64_forKey_1 = _registerName1("encodeInt64:forKey:"); + void _objc_msgSend_275( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ffi.Pointer key, + ) { + return __objc_msgSend_275( + obj, + sel, + value, + key, + ); + } + + late final __objc_msgSend_275Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int64, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_275 = __objc_msgSend_275Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer)>(); + + late final _sel_encodeFloat_forKey_1 = _registerName1("encodeFloat:forKey:"); + void _objc_msgSend_276( + ffi.Pointer obj, + ffi.Pointer sel, + double value, + ffi.Pointer key, + ) { + return __objc_msgSend_276( + obj, + sel, + value, + key, + ); + } + + late final __objc_msgSend_276Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Float, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_276 = __objc_msgSend_276Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, double, + ffi.Pointer)>(); + + late final _sel_encodeDouble_forKey_1 = + _registerName1("encodeDouble:forKey:"); + void _objc_msgSend_277( + ffi.Pointer obj, + ffi.Pointer sel, + double value, + ffi.Pointer key, + ) { + return __objc_msgSend_277( + obj, + sel, + value, + key, + ); + } + + late final __objc_msgSend_277Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Double, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_277 = __objc_msgSend_277Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, double, + ffi.Pointer)>(); + + late final _sel_encodeBytes_length_forKey_1 = + _registerName1("encodeBytes:length:forKey:"); + void _objc_msgSend_278( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer bytes, + int length, + ffi.Pointer key, + ) { + return __objc_msgSend_278( + obj, + sel, + bytes, + length, + key, + ); + } + + late final __objc_msgSend_278Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_278 = __objc_msgSend_278Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, ffi.Pointer)>(); + + late final _sel_containsValueForKey_1 = + _registerName1("containsValueForKey:"); + late final _sel_decodeObjectForKey_1 = _registerName1("decodeObjectForKey:"); + late final _sel_decodeTopLevelObjectForKey_error_1 = + _registerName1("decodeTopLevelObjectForKey:error:"); + ffi.Pointer _objc_msgSend_279( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer key, + ffi.Pointer> error, + ) { + return __objc_msgSend_279( + obj, + sel, + key, + error, + ); + } + + late final __objc_msgSend_279Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_279 = __objc_msgSend_279Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_decodeBoolForKey_1 = _registerName1("decodeBoolForKey:"); + late final _sel_decodeIntForKey_1 = _registerName1("decodeIntForKey:"); + int _objc_msgSend_280( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer key, + ) { + return __objc_msgSend_280( + obj, + sel, + key, + ); + } + + late final __objc_msgSend_280Ptr = _lookup< + ffi.NativeFunction< + ffi.Int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_280 = __objc_msgSend_280Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_decodeInt32ForKey_1 = _registerName1("decodeInt32ForKey:"); + int _objc_msgSend_281( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer key, + ) { + return __objc_msgSend_281( + obj, + sel, + key, + ); + } + + late final __objc_msgSend_281Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_281 = __objc_msgSend_281Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_decodeInt64ForKey_1 = _registerName1("decodeInt64ForKey:"); + int _objc_msgSend_282( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer key, + ) { + return __objc_msgSend_282( + obj, + sel, + key, + ); + } + + late final __objc_msgSend_282Ptr = _lookup< + ffi.NativeFunction< + ffi.Int64 Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_282 = __objc_msgSend_282Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_decodeFloatForKey_1 = _registerName1("decodeFloatForKey:"); + double _objc_msgSend_283( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer key, + ) { + return __objc_msgSend_283( + obj, + sel, + key, + ); + } + + late final __objc_msgSend_283Ptr = _lookup< + ffi.NativeFunction< + ffi.Float Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend_fpret'); + late final __objc_msgSend_283 = __objc_msgSend_283Ptr.asFunction< + double Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_decodeDoubleForKey_1 = _registerName1("decodeDoubleForKey:"); + double _objc_msgSend_284( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer key, + ) { + return __objc_msgSend_284( + obj, + sel, + key, + ); + } + + late final __objc_msgSend_284Ptr = _lookup< + ffi.NativeFunction< + ffi.Double Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend_fpret'); + late final __objc_msgSend_284 = __objc_msgSend_284Ptr.asFunction< + double Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_decodeBytesForKey_returnedLength_1 = + _registerName1("decodeBytesForKey:returnedLength:"); + ffi.Pointer _objc_msgSend_285( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer key, + ffi.Pointer lengthp, + ) { + return __objc_msgSend_285( + obj, + sel, + key, + lengthp, + ); + } + + late final __objc_msgSend_285Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_285 = __objc_msgSend_285Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_encodeInteger_forKey_1 = + _registerName1("encodeInteger:forKey:"); + void _objc_msgSend_286( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ffi.Pointer key, + ) { + return __objc_msgSend_286( + obj, + sel, + value, + key, + ); + } + + late final __objc_msgSend_286Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Long, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_286 = __objc_msgSend_286Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer)>(); + + late final _sel_decodeIntegerForKey_1 = + _registerName1("decodeIntegerForKey:"); + late final _sel_requiresSecureCoding1 = + _registerName1("requiresSecureCoding"); + late final _sel_decodeObjectOfClass_forKey_1 = + _registerName1("decodeObjectOfClass:forKey:"); + ffi.Pointer _objc_msgSend_287( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aClass, + ffi.Pointer key, + ) { + return __objc_msgSend_287( + obj, + sel, + aClass, + key, + ); + } + + late final __objc_msgSend_287Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_287 = __objc_msgSend_287Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_decodeTopLevelObjectOfClass_forKey_error_1 = + _registerName1("decodeTopLevelObjectOfClass:forKey:error:"); + ffi.Pointer _objc_msgSend_288( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aClass, + ffi.Pointer key, + ffi.Pointer> error, + ) { + return __objc_msgSend_288( + obj, + sel, + aClass, + key, + error, + ); + } + + late final __objc_msgSend_288Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_288 = __objc_msgSend_288Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_decodeArrayOfObjectsOfClass_forKey_1 = + _registerName1("decodeArrayOfObjectsOfClass:forKey:"); + ffi.Pointer _objc_msgSend_289( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer cls, + ffi.Pointer key, + ) { + return __objc_msgSend_289( + obj, + sel, + cls, + key, + ); + } + + late final __objc_msgSend_289Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_289 = __objc_msgSend_289Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_decodeDictionaryWithKeysOfClass_objectsOfClass_forKey_1 = + _registerName1("decodeDictionaryWithKeysOfClass:objectsOfClass:forKey:"); + ffi.Pointer _objc_msgSend_290( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer keyCls, + ffi.Pointer objectCls, + ffi.Pointer key, + ) { + return __objc_msgSend_290( + obj, + sel, + keyCls, + objectCls, + key, + ); + } + + late final __objc_msgSend_290Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_290 = __objc_msgSend_290Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_decodeObjectOfClasses_forKey_1 = + _registerName1("decodeObjectOfClasses:forKey:"); + ffi.Pointer _objc_msgSend_291( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer classes, + ffi.Pointer key, + ) { + return __objc_msgSend_291( + obj, + sel, + classes, + key, + ); + } + + late final __objc_msgSend_291Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_291 = __objc_msgSend_291Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_decodeTopLevelObjectOfClasses_forKey_error_1 = + _registerName1("decodeTopLevelObjectOfClasses:forKey:error:"); + ffi.Pointer _objc_msgSend_292( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer classes, + ffi.Pointer key, + ffi.Pointer> error, + ) { + return __objc_msgSend_292( + obj, + sel, + classes, + key, + error, + ); + } + + late final __objc_msgSend_292Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_292 = __objc_msgSend_292Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_decodeArrayOfObjectsOfClasses_forKey_1 = + _registerName1("decodeArrayOfObjectsOfClasses:forKey:"); + ffi.Pointer _objc_msgSend_293( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer classes, + ffi.Pointer key, + ) { + return __objc_msgSend_293( + obj, + sel, + classes, + key, + ); + } + + late final __objc_msgSend_293Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_293 = __objc_msgSend_293Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_decodeDictionaryWithKeysOfClasses_objectsOfClasses_forKey_1 = + _registerName1( + "decodeDictionaryWithKeysOfClasses:objectsOfClasses:forKey:"); + ffi.Pointer _objc_msgSend_294( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer keyClasses, + ffi.Pointer objectClasses, + ffi.Pointer key, + ) { + return __objc_msgSend_294( + obj, + sel, + keyClasses, + objectClasses, + key, + ); + } + + late final __objc_msgSend_294Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_294 = __objc_msgSend_294Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_decodePropertyListForKey_1 = + _registerName1("decodePropertyListForKey:"); + late final _sel_allowedClasses1 = _registerName1("allowedClasses"); + ffi.Pointer _objc_msgSend_295( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_295( + obj, + sel, + ); + } + + late final __objc_msgSend_295Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_295 = __objc_msgSend_295Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_failWithError_1 = _registerName1("failWithError:"); + void _objc_msgSend_296( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer error, + ) { + return __objc_msgSend_296( + obj, + sel, + error, + ); + } + + late final __objc_msgSend_296Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_296 = __objc_msgSend_296Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_decodingFailurePolicy1 = + _registerName1("decodingFailurePolicy"); + int _objc_msgSend_297( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_297( + obj, + sel, + ); + } + + late final __objc_msgSend_297Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_297 = __objc_msgSend_297Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_error1 = _registerName1("error"); + ffi.Pointer _objc_msgSend_298( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_298( + obj, + sel, + ); + } + + late final __objc_msgSend_298Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_298 = __objc_msgSend_298Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_encodeNXObject_1 = _registerName1("encodeNXObject:"); + late final _sel_decodeNXObject1 = _registerName1("decodeNXObject"); + late final _sel_decodeValueOfObjCType_at_1 = + _registerName1("decodeValueOfObjCType:at:"); + late final _sel_encodePoint_1 = _registerName1("encodePoint:"); + void _objc_msgSend_299( + ffi.Pointer obj, + ffi.Pointer sel, + CGPoint point, + ) { + return __objc_msgSend_299( + obj, + sel, + point, + ); + } + + late final __objc_msgSend_299Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + CGPoint)>>('objc_msgSend'); + late final __objc_msgSend_299 = __objc_msgSend_299Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, CGPoint)>(); + + late final _sel_decodePoint1 = _registerName1("decodePoint"); + late final _sel_encodeSize_1 = _registerName1("encodeSize:"); + void _objc_msgSend_300( + ffi.Pointer obj, + ffi.Pointer sel, + CGSize size, + ) { + return __objc_msgSend_300( + obj, + sel, + size, + ); + } + + late final __objc_msgSend_300Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + CGSize)>>('objc_msgSend'); + late final __objc_msgSend_300 = __objc_msgSend_300Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, CGSize)>(); + + late final _sel_decodeSize1 = _registerName1("decodeSize"); + late final _sel_encodeRect_1 = _registerName1("encodeRect:"); + void _objc_msgSend_301( + ffi.Pointer obj, + ffi.Pointer sel, + CGRect rect, + ) { + return __objc_msgSend_301( + obj, + sel, + rect, + ); + } + + late final __objc_msgSend_301Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + CGRect)>>('objc_msgSend'); + late final __objc_msgSend_301 = __objc_msgSend_301Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, CGRect)>(); + + late final _sel_decodeRect1 = _registerName1("decodeRect"); + late final _sel_encodePoint_forKey_1 = _registerName1("encodePoint:forKey:"); + void _objc_msgSend_302( + ffi.Pointer obj, + ffi.Pointer sel, + CGPoint point, + ffi.Pointer key, + ) { + return __objc_msgSend_302( + obj, + sel, + point, + key, + ); + } + + late final __objc_msgSend_302Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + CGPoint, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_302 = __objc_msgSend_302Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, CGPoint, + ffi.Pointer)>(); + + late final _sel_encodeSize_forKey_1 = _registerName1("encodeSize:forKey:"); + void _objc_msgSend_303( + ffi.Pointer obj, + ffi.Pointer sel, + CGSize size, + ffi.Pointer key, + ) { + return __objc_msgSend_303( + obj, + sel, + size, + key, + ); + } + + late final __objc_msgSend_303Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + CGSize, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_303 = __objc_msgSend_303Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, CGSize, + ffi.Pointer)>(); + + late final _sel_encodeRect_forKey_1 = _registerName1("encodeRect:forKey:"); + void _objc_msgSend_304( + ffi.Pointer obj, + ffi.Pointer sel, + CGRect rect, + ffi.Pointer key, + ) { + return __objc_msgSend_304( + obj, + sel, + rect, + key, + ); + } + + late final __objc_msgSend_304Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + CGRect, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_304 = __objc_msgSend_304Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, CGRect, + ffi.Pointer)>(); + + late final _sel_decodePointForKey_1 = _registerName1("decodePointForKey:"); + void _objc_msgSend_305( + ffi.Pointer stret, + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer key, + ) { + return __objc_msgSend_305( + stret, + obj, + sel, + key, + ); + } + + late final __objc_msgSend_305Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend_stret'); + late final __objc_msgSend_305 = __objc_msgSend_305Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_decodeSizeForKey_1 = _registerName1("decodeSizeForKey:"); + void _objc_msgSend_306( + ffi.Pointer stret, + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer key, + ) { + return __objc_msgSend_306( + stret, + obj, + sel, + key, + ); + } + + late final __objc_msgSend_306Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend_stret'); + late final __objc_msgSend_306 = __objc_msgSend_306Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_decodeRectForKey_1 = _registerName1("decodeRectForKey:"); + void _objc_msgSend_307( + ffi.Pointer stret, + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer key, + ) { + return __objc_msgSend_307( + stret, + obj, + sel, + key, + ); + } + + late final __objc_msgSend_307Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend_stret'); + late final __objc_msgSend_307 = __objc_msgSend_307Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_substringFromIndex_1 = _registerName1("substringFromIndex:"); + ffi.Pointer _objc_msgSend_308( + ffi.Pointer obj, + ffi.Pointer sel, + int from, + ) { + return __objc_msgSend_308( + obj, + sel, + from, + ); + } + + late final __objc_msgSend_308Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_308 = __objc_msgSend_308Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_substringToIndex_1 = _registerName1("substringToIndex:"); + late final _sel_substringWithRange_1 = _registerName1("substringWithRange:"); + ffi.Pointer _objc_msgSend_309( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ) { + return __objc_msgSend_309( + obj, + sel, + range, + ); + } + + late final __objc_msgSend_309Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_309 = __objc_msgSend_309Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, _NSRange)>(); + + late final _sel_getCharacters_range_1 = + _registerName1("getCharacters:range:"); + void _objc_msgSend_310( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer buffer, + _NSRange range, + ) { + return __objc_msgSend_310( + obj, + sel, + buffer, + range, + ); + } + + late final __objc_msgSend_310Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_310 = __objc_msgSend_310Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, _NSRange)>(); + + int _objc_msgSend_311( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer string, + ) { + return __objc_msgSend_311( + obj, + sel, + string, + ); + } + + late final __objc_msgSend_311Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_311 = __objc_msgSend_311Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_compare_options_1 = _registerName1("compare:options:"); + int _objc_msgSend_312( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer string, + int mask, + ) { + return __objc_msgSend_312( + obj, + sel, + string, + mask, + ); + } + + late final __objc_msgSend_312Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_312 = __objc_msgSend_312Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_compare_options_range_1 = + _registerName1("compare:options:range:"); + int _objc_msgSend_313( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer string, + int mask, + _NSRange rangeOfReceiverToCompare, + ) { + return __objc_msgSend_313( + obj, + sel, + string, + mask, + rangeOfReceiverToCompare, + ); + } + + late final __objc_msgSend_313Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Int32, _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_313 = __objc_msgSend_313Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, _NSRange)>(); + + late final _sel_compare_options_range_locale_1 = + _registerName1("compare:options:range:locale:"); + int _objc_msgSend_314( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer string, + int mask, + _NSRange rangeOfReceiverToCompare, + ffi.Pointer locale, + ) { + return __objc_msgSend_314( + obj, + sel, + string, + mask, + rangeOfReceiverToCompare, + locale, + ); + } + + late final __objc_msgSend_314Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + _NSRange, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_314 = __objc_msgSend_314Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, _NSRange, ffi.Pointer)>(); + + late final _sel_caseInsensitiveCompare_1 = + _registerName1("caseInsensitiveCompare:"); + late final _sel_localizedCompare_1 = _registerName1("localizedCompare:"); + late final _sel_localizedCaseInsensitiveCompare_1 = + _registerName1("localizedCaseInsensitiveCompare:"); + late final _sel_localizedStandardCompare_1 = + _registerName1("localizedStandardCompare:"); + late final _sel_isEqualToString_1 = _registerName1("isEqualToString:"); + late final _sel_hasPrefix_1 = _registerName1("hasPrefix:"); + late final _sel_hasSuffix_1 = _registerName1("hasSuffix:"); + late final _sel_commonPrefixWithString_options_1 = + _registerName1("commonPrefixWithString:options:"); + ffi.Pointer _objc_msgSend_315( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer str, + int mask, + ) { + return __objc_msgSend_315( + obj, + sel, + str, + mask, + ); + } + + late final __objc_msgSend_315Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_315 = __objc_msgSend_315Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_containsString_1 = _registerName1("containsString:"); + late final _sel_localizedCaseInsensitiveContainsString_1 = + _registerName1("localizedCaseInsensitiveContainsString:"); + late final _sel_localizedStandardContainsString_1 = + _registerName1("localizedStandardContainsString:"); + late final _sel_localizedStandardRangeOfString_1 = + _registerName1("localizedStandardRangeOfString:"); + void _objc_msgSend_316( + ffi.Pointer<_NSRange> stret, + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer str, + ) { + return __objc_msgSend_316( + stret, + obj, + sel, + str, + ); + } + + late final __objc_msgSend_316Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_NSRange>, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend_stret'); + late final __objc_msgSend_316 = __objc_msgSend_316Ptr.asFunction< + void Function(ffi.Pointer<_NSRange>, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_rangeOfString_1 = _registerName1("rangeOfString:"); + late final _sel_rangeOfString_options_1 = + _registerName1("rangeOfString:options:"); + void _objc_msgSend_317( + ffi.Pointer<_NSRange> stret, + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer searchString, + int mask, + ) { + return __objc_msgSend_317( + stret, + obj, + sel, + searchString, + mask, + ); + } + + late final __objc_msgSend_317Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_NSRange>, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32)>>('objc_msgSend_stret'); + late final __objc_msgSend_317 = __objc_msgSend_317Ptr.asFunction< + void Function(ffi.Pointer<_NSRange>, ffi.Pointer, + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_rangeOfString_options_range_1 = + _registerName1("rangeOfString:options:range:"); + void _objc_msgSend_318( + ffi.Pointer<_NSRange> stret, + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer searchString, + int mask, + _NSRange rangeOfReceiverToSearch, + ) { + return __objc_msgSend_318( + stret, + obj, + sel, + searchString, + mask, + rangeOfReceiverToSearch, + ); + } + + late final __objc_msgSend_318Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_NSRange>, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + _NSRange)>>('objc_msgSend_stret'); + late final __objc_msgSend_318 = __objc_msgSend_318Ptr.asFunction< + void Function(ffi.Pointer<_NSRange>, ffi.Pointer, + ffi.Pointer, ffi.Pointer, int, _NSRange)>(); + + late final _sel_rangeOfString_options_range_locale_1 = + _registerName1("rangeOfString:options:range:locale:"); + void _objc_msgSend_319( + ffi.Pointer<_NSRange> stret, + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer searchString, + int mask, + _NSRange rangeOfReceiverToSearch, + ffi.Pointer locale, + ) { + return __objc_msgSend_319( + stret, + obj, + sel, + searchString, + mask, + rangeOfReceiverToSearch, + locale, + ); + } + + late final __objc_msgSend_319Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_NSRange>, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + _NSRange, + ffi.Pointer)>>('objc_msgSend_stret'); + late final __objc_msgSend_319 = __objc_msgSend_319Ptr.asFunction< + void Function( + ffi.Pointer<_NSRange>, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + _NSRange, + ffi.Pointer)>(); + + late final _sel_rangeOfCharacterFromSet_1 = + _registerName1("rangeOfCharacterFromSet:"); + void _objc_msgSend_320( + ffi.Pointer<_NSRange> stret, + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer searchSet, + ) { + return __objc_msgSend_320( + stret, + obj, + sel, + searchSet, + ); + } + + late final __objc_msgSend_320Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_NSRange>, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend_stret'); + late final __objc_msgSend_320 = __objc_msgSend_320Ptr.asFunction< + void Function(ffi.Pointer<_NSRange>, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_rangeOfCharacterFromSet_options_1 = + _registerName1("rangeOfCharacterFromSet:options:"); + void _objc_msgSend_321( + ffi.Pointer<_NSRange> stret, + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer searchSet, + int mask, + ) { + return __objc_msgSend_321( + stret, + obj, + sel, + searchSet, + mask, + ); + } + + late final __objc_msgSend_321Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_NSRange>, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32)>>('objc_msgSend_stret'); + late final __objc_msgSend_321 = __objc_msgSend_321Ptr.asFunction< + void Function(ffi.Pointer<_NSRange>, ffi.Pointer, + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_rangeOfCharacterFromSet_options_range_1 = + _registerName1("rangeOfCharacterFromSet:options:range:"); + void _objc_msgSend_322( + ffi.Pointer<_NSRange> stret, + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer searchSet, + int mask, + _NSRange rangeOfReceiverToSearch, + ) { + return __objc_msgSend_322( + stret, + obj, + sel, + searchSet, + mask, + rangeOfReceiverToSearch, + ); + } + + late final __objc_msgSend_322Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_NSRange>, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + _NSRange)>>('objc_msgSend_stret'); + late final __objc_msgSend_322 = __objc_msgSend_322Ptr.asFunction< + void Function(ffi.Pointer<_NSRange>, ffi.Pointer, + ffi.Pointer, ffi.Pointer, int, _NSRange)>(); + + late final _sel_rangeOfComposedCharacterSequenceAtIndex_1 = + _registerName1("rangeOfComposedCharacterSequenceAtIndex:"); + void _objc_msgSend_323( + ffi.Pointer<_NSRange> stret, + ffi.Pointer obj, + ffi.Pointer sel, + int index, + ) { + return __objc_msgSend_323( + stret, + obj, + sel, + index, + ); + } + + late final __objc_msgSend_323Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer<_NSRange>, ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend_stret'); + late final __objc_msgSend_323 = __objc_msgSend_323Ptr.asFunction< + void Function(ffi.Pointer<_NSRange>, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_rangeOfComposedCharacterSequencesForRange_1 = + _registerName1("rangeOfComposedCharacterSequencesForRange:"); + void _objc_msgSend_324( + ffi.Pointer<_NSRange> stret, + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ) { + return __objc_msgSend_324( + stret, + obj, + sel, + range, + ); + } + + late final __objc_msgSend_324Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer<_NSRange>, ffi.Pointer, + ffi.Pointer, _NSRange)>>('objc_msgSend_stret'); + late final __objc_msgSend_324 = __objc_msgSend_324Ptr.asFunction< + void Function(ffi.Pointer<_NSRange>, ffi.Pointer, + ffi.Pointer, _NSRange)>(); + + late final _sel_stringByAppendingString_1 = + _registerName1("stringByAppendingString:"); + late final _sel_stringByAppendingFormat_1 = + _registerName1("stringByAppendingFormat:"); + late final _sel_uppercaseString1 = _registerName1("uppercaseString"); + late final _sel_lowercaseString1 = _registerName1("lowercaseString"); + late final _sel_capitalizedString1 = _registerName1("capitalizedString"); + late final _sel_localizedUppercaseString1 = + _registerName1("localizedUppercaseString"); + late final _sel_localizedLowercaseString1 = + _registerName1("localizedLowercaseString"); + late final _sel_localizedCapitalizedString1 = + _registerName1("localizedCapitalizedString"); + late final _sel_uppercaseStringWithLocale_1 = + _registerName1("uppercaseStringWithLocale:"); + ffi.Pointer _objc_msgSend_325( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer locale, + ) { + return __objc_msgSend_325( + obj, + sel, + locale, + ); + } + + late final __objc_msgSend_325Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_325 = __objc_msgSend_325Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_lowercaseStringWithLocale_1 = + _registerName1("lowercaseStringWithLocale:"); + late final _sel_capitalizedStringWithLocale_1 = + _registerName1("capitalizedStringWithLocale:"); + late final _sel_getLineStart_end_contentsEnd_forRange_1 = + _registerName1("getLineStart:end:contentsEnd:forRange:"); + void _objc_msgSend_326( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer startPtr, + ffi.Pointer lineEndPtr, + ffi.Pointer contentsEndPtr, + _NSRange range, + ) { + return __objc_msgSend_326( + obj, + sel, + startPtr, + lineEndPtr, + contentsEndPtr, + range, + ); + } + + late final __objc_msgSend_326Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_326 = __objc_msgSend_326Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + _NSRange)>(); + + late final _sel_lineRangeForRange_1 = _registerName1("lineRangeForRange:"); + late final _sel_getParagraphStart_end_contentsEnd_forRange_1 = + _registerName1("getParagraphStart:end:contentsEnd:forRange:"); + late final _sel_paragraphRangeForRange_1 = + _registerName1("paragraphRangeForRange:"); + late final _sel_enumerateSubstringsInRange_options_usingBlock_1 = + _registerName1("enumerateSubstringsInRange:options:usingBlock:"); + void _objc_msgSend_327( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + int opts, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_327( + obj, + sel, + range, + opts, + block, + ); + } + + late final __objc_msgSend_327Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + _NSRange, ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_327 = __objc_msgSend_327Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, _NSRange, + int, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_enumerateLinesUsingBlock_1 = + _registerName1("enumerateLinesUsingBlock:"); + void _objc_msgSend_328( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_328( + obj, + sel, + block, + ); + } + + late final __objc_msgSend_328Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_328 = __objc_msgSend_328Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_UTF8String1 = _registerName1("UTF8String"); + late final _sel_fastestEncoding1 = _registerName1("fastestEncoding"); + late final _sel_smallestEncoding1 = _registerName1("smallestEncoding"); + late final _sel_dataUsingEncoding_allowLossyConversion_1 = + _registerName1("dataUsingEncoding:allowLossyConversion:"); + ffi.Pointer _objc_msgSend_329( + ffi.Pointer obj, + ffi.Pointer sel, + int encoding, + bool lossy, + ) { + return __objc_msgSend_329( + obj, + sel, + encoding, + lossy, + ); + } + + late final __objc_msgSend_329Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_329 = __objc_msgSend_329Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int, bool)>(); + + late final _sel_dataUsingEncoding_1 = _registerName1("dataUsingEncoding:"); + ffi.Pointer _objc_msgSend_330( + ffi.Pointer obj, + ffi.Pointer sel, + int encoding, + ) { + return __objc_msgSend_330( + obj, + sel, + encoding, + ); + } + + late final __objc_msgSend_330Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_330 = __objc_msgSend_330Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_canBeConvertedToEncoding_1 = + _registerName1("canBeConvertedToEncoding:"); + late final _sel_cStringUsingEncoding_1 = + _registerName1("cStringUsingEncoding:"); + late final _sel_getCString_maxLength_encoding_1 = + _registerName1("getCString:maxLength:encoding:"); + bool _objc_msgSend_331( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer buffer, + int maxBufferCount, + int encoding, + ) { + return __objc_msgSend_331( + obj, + sel, + buffer, + maxBufferCount, + encoding, + ); + } + + late final __objc_msgSend_331Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_331 = __objc_msgSend_331Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, int)>(); + + late final _sel_getBytes_maxLength_usedLength_encoding_options_range_remainingRange_1 = + _registerName1( + "getBytes:maxLength:usedLength:encoding:options:range:remainingRange:"); + bool _objc_msgSend_332( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer buffer, + int maxBufferCount, + ffi.Pointer usedBufferCount, + int encoding, + int options, + _NSRange range, + ffi.Pointer<_NSRange> leftover, + ) { + return __objc_msgSend_332( + obj, + sel, + buffer, + maxBufferCount, + usedBufferCount, + encoding, + options, + range, + leftover, + ); + } + + late final __objc_msgSend_332Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Int32, + _NSRange, + ffi.Pointer<_NSRange>)>>('objc_msgSend'); + late final __objc_msgSend_332 = __objc_msgSend_332Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer, + int, + int, + _NSRange, + ffi.Pointer<_NSRange>)>(); + + late final _sel_maximumLengthOfBytesUsingEncoding_1 = + _registerName1("maximumLengthOfBytesUsingEncoding:"); + late final _sel_lengthOfBytesUsingEncoding_1 = + _registerName1("lengthOfBytesUsingEncoding:"); + late final _sel_availableStringEncodings1 = + _registerName1("availableStringEncodings"); + ffi.Pointer _objc_msgSend_333( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_333( + obj, + sel, + ); + } + + late final __objc_msgSend_333Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_333 = __objc_msgSend_333Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_localizedNameOfStringEncoding_1 = + _registerName1("localizedNameOfStringEncoding:"); + late final _sel_defaultCStringEncoding1 = + _registerName1("defaultCStringEncoding"); + late final _sel_decomposedStringWithCanonicalMapping1 = + _registerName1("decomposedStringWithCanonicalMapping"); + late final _sel_precomposedStringWithCanonicalMapping1 = + _registerName1("precomposedStringWithCanonicalMapping"); + late final _sel_decomposedStringWithCompatibilityMapping1 = + _registerName1("decomposedStringWithCompatibilityMapping"); + late final _sel_precomposedStringWithCompatibilityMapping1 = + _registerName1("precomposedStringWithCompatibilityMapping"); + late final _sel_componentsSeparatedByString_1 = + _registerName1("componentsSeparatedByString:"); + late final _sel_componentsSeparatedByCharactersInSet_1 = + _registerName1("componentsSeparatedByCharactersInSet:"); + ffi.Pointer _objc_msgSend_334( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer separator, + ) { + return __objc_msgSend_334( + obj, + sel, + separator, + ); + } + + late final __objc_msgSend_334Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_334 = __objc_msgSend_334Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_stringByTrimmingCharactersInSet_1 = + _registerName1("stringByTrimmingCharactersInSet:"); + ffi.Pointer _objc_msgSend_335( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer set1, + ) { + return __objc_msgSend_335( + obj, + sel, + set1, + ); + } + + late final __objc_msgSend_335Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_335 = __objc_msgSend_335Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_stringByPaddingToLength_withString_startingAtIndex_1 = + _registerName1("stringByPaddingToLength:withString:startingAtIndex:"); + ffi.Pointer _objc_msgSend_336( + ffi.Pointer obj, + ffi.Pointer sel, + int newLength, + ffi.Pointer padString, + int padIndex, + ) { + return __objc_msgSend_336( + obj, + sel, + newLength, + padString, + padIndex, + ); + } + + late final __objc_msgSend_336Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_336 = __objc_msgSend_336Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, ffi.Pointer, int)>(); + + late final _sel_stringByFoldingWithOptions_locale_1 = + _registerName1("stringByFoldingWithOptions:locale:"); + ffi.Pointer _objc_msgSend_337( + ffi.Pointer obj, + ffi.Pointer sel, + int options, + ffi.Pointer locale, + ) { + return __objc_msgSend_337( + obj, + sel, + options, + locale, + ); + } + + late final __objc_msgSend_337Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_337 = __objc_msgSend_337Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, ffi.Pointer)>(); + + late final _sel_stringByReplacingOccurrencesOfString_withString_options_range_1 = + _registerName1( + "stringByReplacingOccurrencesOfString:withString:options:range:"); + ffi.Pointer _objc_msgSend_338( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer target, + ffi.Pointer replacement, + int options, + _NSRange searchRange, + ) { + return __objc_msgSend_338( + obj, + sel, + target, + replacement, + options, + searchRange, + ); + } + + late final __objc_msgSend_338Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_338 = __objc_msgSend_338Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + _NSRange)>(); + + late final _sel_stringByReplacingOccurrencesOfString_withString_1 = + _registerName1("stringByReplacingOccurrencesOfString:withString:"); + ffi.Pointer _objc_msgSend_339( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer target, + ffi.Pointer replacement, + ) { + return __objc_msgSend_339( + obj, + sel, + target, + replacement, + ); + } + + late final __objc_msgSend_339Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_339 = __objc_msgSend_339Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_stringByReplacingCharactersInRange_withString_1 = + _registerName1("stringByReplacingCharactersInRange:withString:"); + ffi.Pointer _objc_msgSend_340( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ffi.Pointer replacement, + ) { + return __objc_msgSend_340( + obj, + sel, + range, + replacement, + ); + } + + late final __objc_msgSend_340Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + _NSRange, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_340 = __objc_msgSend_340Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, _NSRange, ffi.Pointer)>(); + + late final _sel_stringByApplyingTransform_reverse_1 = + _registerName1("stringByApplyingTransform:reverse:"); + ffi.Pointer _objc_msgSend_341( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer transform, + bool reverse, + ) { + return __objc_msgSend_341( + obj, + sel, + transform, + reverse, + ); + } + + late final __objc_msgSend_341Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_341 = __objc_msgSend_341Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer, bool)>(); + + late final _sel_writeToURL_atomically_encoding_error_1 = + _registerName1("writeToURL:atomically:encoding:error:"); + bool _objc_msgSend_342( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + bool useAuxiliaryFile, + int enc, + ffi.Pointer> error, + ) { + return __objc_msgSend_342( + obj, + sel, + url, + useAuxiliaryFile, + enc, + error, + ); + } + + late final __objc_msgSend_342Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool, + ffi.UnsignedLong, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_342 = __objc_msgSend_342Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + bool, + int, + ffi.Pointer>)>(); + + late final _sel_writeToFile_atomically_encoding_error_1 = + _registerName1("writeToFile:atomically:encoding:error:"); + bool _objc_msgSend_343( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + bool useAuxiliaryFile, + int enc, + ffi.Pointer> error, + ) { + return __objc_msgSend_343( + obj, + sel, + path, + useAuxiliaryFile, + enc, + error, + ); + } + + late final __objc_msgSend_343Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool, + ffi.UnsignedLong, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_343 = __objc_msgSend_343Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + bool, + int, + ffi.Pointer>)>(); + + late final _sel_hash1 = _registerName1("hash"); + late final _sel_initWithCharactersNoCopy_length_freeWhenDone_1 = + _registerName1("initWithCharactersNoCopy:length:freeWhenDone:"); + instancetype _objc_msgSend_344( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer characters, + int length, + bool freeBuffer, + ) { + return __objc_msgSend_344( + obj, + sel, + characters, + length, + freeBuffer, + ); + } + + late final __objc_msgSend_344Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_344 = __objc_msgSend_344Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, bool)>(); + + late final _sel_initWithCharactersNoCopy_length_deallocator_1 = + _registerName1("initWithCharactersNoCopy:length:deallocator:"); + instancetype _objc_msgSend_345( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer chars, + int len, + ffi.Pointer<_ObjCBlock> deallocator, + ) { + return __objc_msgSend_345( + obj, + sel, + chars, + len, + deallocator, + ); + } + + late final __objc_msgSend_345Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_345 = __objc_msgSend_345Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_initWithCharacters_length_1 = + _registerName1("initWithCharacters:length:"); + instancetype _objc_msgSend_346( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer characters, + int length, + ) { + return __objc_msgSend_346( + obj, + sel, + characters, + length, + ); + } + + late final __objc_msgSend_346Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_346 = __objc_msgSend_346Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_initWithUTF8String_1 = _registerName1("initWithUTF8String:"); + instancetype _objc_msgSend_347( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer nullTerminatedCString, + ) { + return __objc_msgSend_347( + obj, + sel, + nullTerminatedCString, + ); + } + + late final __objc_msgSend_347Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_347 = __objc_msgSend_347Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_initWithFormat_1 = _registerName1("initWithFormat:"); + late final _sel_initWithFormat_arguments_1 = + _registerName1("initWithFormat:arguments:"); + instancetype _objc_msgSend_348( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer format, + ffi.Pointer<__va_list_tag> argList, + ) { + return __objc_msgSend_348( + obj, + sel, + format, + argList, + ); + } + + late final __objc_msgSend_348Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<__va_list_tag>)>>('objc_msgSend'); + late final __objc_msgSend_348 = __objc_msgSend_348Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer<__va_list_tag>)>(); + + late final _sel_initWithFormat_locale_1 = + _registerName1("initWithFormat:locale:"); + late final _sel_initWithFormat_locale_arguments_1 = + _registerName1("initWithFormat:locale:arguments:"); + instancetype _objc_msgSend_349( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer format, + ffi.Pointer locale, + ffi.Pointer<__va_list_tag> argList, + ) { + return __objc_msgSend_349( + obj, + sel, + format, + locale, + argList, + ); + } + + late final __objc_msgSend_349Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<__va_list_tag>)>>('objc_msgSend'); + late final __objc_msgSend_349 = __objc_msgSend_349Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<__va_list_tag>)>(); + + late final _sel_initWithValidatedFormat_validFormatSpecifiers_error_1 = + _registerName1("initWithValidatedFormat:validFormatSpecifiers:error:"); + instancetype _objc_msgSend_350( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer format, + ffi.Pointer validFormatSpecifiers, + ffi.Pointer> error, + ) { + return __objc_msgSend_350( + obj, + sel, + format, + validFormatSpecifiers, + error, + ); + } + + late final __objc_msgSend_350Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_350 = __objc_msgSend_350Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_initWithValidatedFormat_validFormatSpecifiers_locale_error_1 = + _registerName1( + "initWithValidatedFormat:validFormatSpecifiers:locale:error:"); + instancetype _objc_msgSend_351( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer format, + ffi.Pointer validFormatSpecifiers, + ffi.Pointer locale, + ffi.Pointer> error, + ) { + return __objc_msgSend_351( + obj, + sel, + format, + validFormatSpecifiers, + locale, + error, + ); + } + + late final __objc_msgSend_351Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_351 = __objc_msgSend_351Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_initWithValidatedFormat_validFormatSpecifiers_arguments_error_1 = + _registerName1( + "initWithValidatedFormat:validFormatSpecifiers:arguments:error:"); + instancetype _objc_msgSend_352( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer format, + ffi.Pointer validFormatSpecifiers, + ffi.Pointer<__va_list_tag> argList, + ffi.Pointer> error, + ) { + return __objc_msgSend_352( + obj, + sel, + format, + validFormatSpecifiers, + argList, + error, + ); + } + + late final __objc_msgSend_352Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<__va_list_tag>, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_352 = __objc_msgSend_352Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<__va_list_tag>, + ffi.Pointer>)>(); + + late final _sel_initWithValidatedFormat_validFormatSpecifiers_locale_arguments_error_1 = + _registerName1( + "initWithValidatedFormat:validFormatSpecifiers:locale:arguments:error:"); + instancetype _objc_msgSend_353( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer format, + ffi.Pointer validFormatSpecifiers, + ffi.Pointer locale, + ffi.Pointer<__va_list_tag> argList, + ffi.Pointer> error, + ) { + return __objc_msgSend_353( + obj, + sel, + format, + validFormatSpecifiers, + locale, + argList, + error, + ); + } + + late final __objc_msgSend_353Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<__va_list_tag>, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_353 = __objc_msgSend_353Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<__va_list_tag>, + ffi.Pointer>)>(); + + late final _sel_initWithData_encoding_1 = + _registerName1("initWithData:encoding:"); + instancetype _objc_msgSend_354( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer data, + int encoding, + ) { + return __objc_msgSend_354( + obj, + sel, + data, + encoding, + ); + } + + late final __objc_msgSend_354Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_354 = __objc_msgSend_354Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_initWithBytes_length_encoding_1 = + _registerName1("initWithBytes:length:encoding:"); + instancetype _objc_msgSend_355( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer bytes, + int len, + int encoding, + ) { + return __objc_msgSend_355( + obj, + sel, + bytes, + len, + encoding, + ); + } + + late final __objc_msgSend_355Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_355 = __objc_msgSend_355Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, int)>(); + + late final _sel_initWithBytesNoCopy_length_encoding_freeWhenDone_1 = + _registerName1("initWithBytesNoCopy:length:encoding:freeWhenDone:"); + instancetype _objc_msgSend_356( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer bytes, + int len, + int encoding, + bool freeBuffer, + ) { + return __objc_msgSend_356( + obj, + sel, + bytes, + len, + encoding, + freeBuffer, + ); + } + + late final __objc_msgSend_356Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.UnsignedLong, + ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_356 = __objc_msgSend_356Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, int, bool)>(); + + late final _sel_initWithBytesNoCopy_length_encoding_deallocator_1 = + _registerName1("initWithBytesNoCopy:length:encoding:deallocator:"); + instancetype _objc_msgSend_357( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer bytes, + int len, + int encoding, + ffi.Pointer<_ObjCBlock> deallocator, + ) { + return __objc_msgSend_357( + obj, + sel, + bytes, + len, + encoding, + deallocator, + ); + } + + late final __objc_msgSend_357Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.UnsignedLong, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_357 = __objc_msgSend_357Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, int, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_string1 = _registerName1("string"); + late final _sel_stringWithString_1 = _registerName1("stringWithString:"); + late final _sel_stringWithCharacters_length_1 = + _registerName1("stringWithCharacters:length:"); + late final _sel_stringWithUTF8String_1 = + _registerName1("stringWithUTF8String:"); + late final _sel_stringWithFormat_1 = _registerName1("stringWithFormat:"); + late final _sel_localizedStringWithFormat_1 = + _registerName1("localizedStringWithFormat:"); + late final _sel_stringWithValidatedFormat_validFormatSpecifiers_error_1 = + _registerName1("stringWithValidatedFormat:validFormatSpecifiers:error:"); + late final _sel_localizedStringWithValidatedFormat_validFormatSpecifiers_error_1 = + _registerName1( + "localizedStringWithValidatedFormat:validFormatSpecifiers:error:"); + late final _sel_initWithCString_encoding_1 = + _registerName1("initWithCString:encoding:"); + instancetype _objc_msgSend_358( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer nullTerminatedCString, + int encoding, + ) { + return __objc_msgSend_358( + obj, + sel, + nullTerminatedCString, + encoding, + ); + } + + late final __objc_msgSend_358Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_358 = __objc_msgSend_358Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_stringWithCString_encoding_1 = + _registerName1("stringWithCString:encoding:"); + late final _sel_initWithContentsOfURL_encoding_error_1 = + _registerName1("initWithContentsOfURL:encoding:error:"); + instancetype _objc_msgSend_359( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + int enc, + ffi.Pointer> error, + ) { + return __objc_msgSend_359( + obj, + sel, + url, + enc, + error, + ); + } + + late final __objc_msgSend_359Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_359 = __objc_msgSend_359Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer>)>(); + + late final _sel_initWithContentsOfFile_encoding_error_1 = + _registerName1("initWithContentsOfFile:encoding:error:"); + instancetype _objc_msgSend_360( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + int enc, + ffi.Pointer> error, + ) { + return __objc_msgSend_360( + obj, + sel, + path, + enc, + error, + ); + } + + late final __objc_msgSend_360Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_360 = __objc_msgSend_360Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer>)>(); + + late final _sel_stringWithContentsOfURL_encoding_error_1 = + _registerName1("stringWithContentsOfURL:encoding:error:"); + late final _sel_stringWithContentsOfFile_encoding_error_1 = + _registerName1("stringWithContentsOfFile:encoding:error:"); + late final _sel_initWithContentsOfURL_usedEncoding_error_1 = + _registerName1("initWithContentsOfURL:usedEncoding:error:"); + instancetype _objc_msgSend_361( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ffi.Pointer enc, + ffi.Pointer> error, + ) { + return __objc_msgSend_361( + obj, + sel, + url, + enc, + error, + ); + } + + late final __objc_msgSend_361Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_361 = __objc_msgSend_361Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_initWithContentsOfFile_usedEncoding_error_1 = + _registerName1("initWithContentsOfFile:usedEncoding:error:"); + instancetype _objc_msgSend_362( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ffi.Pointer enc, + ffi.Pointer> error, + ) { + return __objc_msgSend_362( + obj, + sel, + path, + enc, + error, + ); + } + + late final __objc_msgSend_362Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_362 = __objc_msgSend_362Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_stringWithContentsOfURL_usedEncoding_error_1 = + _registerName1("stringWithContentsOfURL:usedEncoding:error:"); + late final _sel_stringWithContentsOfFile_usedEncoding_error_1 = + _registerName1("stringWithContentsOfFile:usedEncoding:error:"); + late final _sel_stringEncodingForData_encodingOptions_convertedString_usedLossyConversion_1 = + _registerName1( + "stringEncodingForData:encodingOptions:convertedString:usedLossyConversion:"); + int _objc_msgSend_363( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer data, + ffi.Pointer opts, + ffi.Pointer> string, + ffi.Pointer usedLossyConversion, + ) { + return __objc_msgSend_363( + obj, + sel, + data, + opts, + string, + usedLossyConversion, + ); + } + + late final __objc_msgSend_363Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_363 = __objc_msgSend_363Ptr.asFunction< + int Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer)>(); + + late final _sel_propertyList1 = _registerName1("propertyList"); + late final _sel_propertyListFromStringsFileFormat1 = + _registerName1("propertyListFromStringsFileFormat"); + late final _sel_cString1 = _registerName1("cString"); + late final _sel_lossyCString1 = _registerName1("lossyCString"); + late final _sel_cStringLength1 = _registerName1("cStringLength"); + late final _sel_getCString_1 = _registerName1("getCString:"); + late final _sel_getCString_maxLength_1 = + _registerName1("getCString:maxLength:"); + void _objc_msgSend_364( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer bytes, + int maxLength, + ) { + return __objc_msgSend_364( + obj, + sel, + bytes, + maxLength, + ); + } + + late final __objc_msgSend_364Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_364 = __objc_msgSend_364Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_getCString_maxLength_range_remainingRange_1 = + _registerName1("getCString:maxLength:range:remainingRange:"); + void _objc_msgSend_365( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer bytes, + int maxLength, + _NSRange aRange, + ffi.Pointer<_NSRange> leftoverRange, + ) { + return __objc_msgSend_365( + obj, + sel, + bytes, + maxLength, + aRange, + leftoverRange, + ); + } + + late final __objc_msgSend_365Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + _NSRange, + ffi.Pointer<_NSRange>)>>('objc_msgSend'); + late final __objc_msgSend_365 = __objc_msgSend_365Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, _NSRange, ffi.Pointer<_NSRange>)>(); + + late final _sel_stringWithContentsOfFile_1 = + _registerName1("stringWithContentsOfFile:"); + late final _sel_stringWithContentsOfURL_1 = + _registerName1("stringWithContentsOfURL:"); + late final _sel_initWithCStringNoCopy_length_freeWhenDone_1 = + _registerName1("initWithCStringNoCopy:length:freeWhenDone:"); + ffi.Pointer _objc_msgSend_366( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer bytes, + int length, + bool freeBuffer, + ) { + return __objc_msgSend_366( + obj, + sel, + bytes, + length, + freeBuffer, + ); + } + + late final __objc_msgSend_366Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_366 = __objc_msgSend_366Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer, int, bool)>(); + + late final _sel_initWithCString_length_1 = + _registerName1("initWithCString:length:"); + late final _sel_initWithCString_1 = _registerName1("initWithCString:"); + late final _sel_stringWithCString_length_1 = + _registerName1("stringWithCString:length:"); + late final _sel_stringWithCString_1 = _registerName1("stringWithCString:"); + late final _sel_getCharacters_1 = _registerName1("getCharacters:"); + void _objc_msgSend_367( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer buffer, + ) { + return __objc_msgSend_367( + obj, + sel, + buffer, + ); + } + + late final __objc_msgSend_367Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_367 = __objc_msgSend_367Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_variantFittingPresentationWidth_1 = + _registerName1("variantFittingPresentationWidth:"); + ffi.Pointer _objc_msgSend_368( + ffi.Pointer obj, + ffi.Pointer sel, + int width, + ) { + return __objc_msgSend_368( + obj, + sel, + width, + ); + } + + late final __objc_msgSend_368Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Long)>>('objc_msgSend'); + late final __objc_msgSend_368 = __objc_msgSend_368Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_pathWithComponents_1 = _registerName1("pathWithComponents:"); + ffi.Pointer _objc_msgSend_369( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer components, + ) { + return __objc_msgSend_369( + obj, + sel, + components, + ); + } + + late final __objc_msgSend_369Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_369 = __objc_msgSend_369Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_isAbsolutePath1 = _registerName1("isAbsolutePath"); + late final _sel_stringByDeletingLastPathComponent1 = + _registerName1("stringByDeletingLastPathComponent"); + late final _sel_stringByAppendingPathComponent_1 = + _registerName1("stringByAppendingPathComponent:"); + late final _sel_stringByDeletingPathExtension1 = + _registerName1("stringByDeletingPathExtension"); + late final _sel_stringByAppendingPathExtension_1 = + _registerName1("stringByAppendingPathExtension:"); + late final _sel_stringByAbbreviatingWithTildeInPath1 = + _registerName1("stringByAbbreviatingWithTildeInPath"); + late final _sel_stringByExpandingTildeInPath1 = + _registerName1("stringByExpandingTildeInPath"); + late final _sel_stringByStandardizingPath1 = + _registerName1("stringByStandardizingPath"); + late final _sel_stringByResolvingSymlinksInPath1 = + _registerName1("stringByResolvingSymlinksInPath"); + late final _sel_stringsByAppendingPaths_1 = + _registerName1("stringsByAppendingPaths:"); + late final _sel_completePathIntoString_caseSensitive_matchesIntoArray_filterTypes_1 = + _registerName1( + "completePathIntoString:caseSensitive:matchesIntoArray:filterTypes:"); + int _objc_msgSend_370( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer> outputName, + bool flag, + ffi.Pointer> outputArray, + ffi.Pointer filterTypes, + ) { + return __objc_msgSend_370( + obj, + sel, + outputName, + flag, + outputArray, + filterTypes, + ); + } + + late final __objc_msgSend_370Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Bool, + ffi.Pointer>, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_370 = __objc_msgSend_370Ptr.asFunction< + int Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + bool, + ffi.Pointer>, + ffi.Pointer)>(); + + late final _sel_stringByAddingPercentEncodingWithAllowedCharacters_1 = + _registerName1("stringByAddingPercentEncodingWithAllowedCharacters:"); + late final _sel_stringByRemovingPercentEncoding1 = + _registerName1("stringByRemovingPercentEncoding"); + late final _sel_stringByAddingPercentEscapesUsingEncoding_1 = + _registerName1("stringByAddingPercentEscapesUsingEncoding:"); + late final _sel_stringByReplacingPercentEscapesUsingEncoding_1 = + _registerName1("stringByReplacingPercentEscapesUsingEncoding:"); + late final _class_NSOrthography1 = _getClass1("NSOrthography"); + late final _sel_dominantScript1 = _registerName1("dominantScript"); + late final _sel_languageMap1 = _registerName1("languageMap"); + late final _sel_initWithDominantScript_languageMap_1 = + _registerName1("initWithDominantScript:languageMap:"); + instancetype _objc_msgSend_371( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer script, + ffi.Pointer map, + ) { + return __objc_msgSend_371( + obj, + sel, + script, + map, + ); + } + + late final __objc_msgSend_371Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_371 = __objc_msgSend_371Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_languagesForScript_1 = _registerName1("languagesForScript:"); + late final _sel_dominantLanguageForScript_1 = + _registerName1("dominantLanguageForScript:"); + late final _sel_dominantLanguage1 = _registerName1("dominantLanguage"); + late final _sel_allScripts1 = _registerName1("allScripts"); + late final _sel_allLanguages1 = _registerName1("allLanguages"); + late final _sel_defaultOrthographyForLanguage_1 = + _registerName1("defaultOrthographyForLanguage:"); + late final _sel_orthographyWithDominantScript_languageMap_1 = + _registerName1("orthographyWithDominantScript:languageMap:"); + late final _sel_linguisticTagsInRange_scheme_options_orthography_tokenRanges_1 = + _registerName1( + "linguisticTagsInRange:scheme:options:orthography:tokenRanges:"); + ffi.Pointer _objc_msgSend_372( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ffi.Pointer scheme, + int options, + ffi.Pointer orthography, + ffi.Pointer> tokenRanges, + ) { + return __objc_msgSend_372( + obj, + sel, + range, + scheme, + options, + orthography, + tokenRanges, + ); + } + + late final __objc_msgSend_372Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + _NSRange, + ffi.Pointer, + ffi.Int32, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_372 = __objc_msgSend_372Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + _NSRange, + ffi.Pointer, + int, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_enumerateLinguisticTagsInRange_scheme_options_orthography_usingBlock_1 = + _registerName1( + "enumerateLinguisticTagsInRange:scheme:options:orthography:usingBlock:"); + void _objc_msgSend_373( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ffi.Pointer scheme, + int options, + ffi.Pointer orthography, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_373( + obj, + sel, + range, + scheme, + options, + orthography, + block, + ); + } + + late final __objc_msgSend_373Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + _NSRange, + ffi.Pointer, + ffi.Int32, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_373 = __objc_msgSend_373Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + _NSRange, + ffi.Pointer, + int, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_anyObject1 = _registerName1("anyObject"); + late final _sel_intersectsSet_1 = _registerName1("intersectsSet:"); + bool _objc_msgSend_374( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer otherSet, + ) { + return __objc_msgSend_374( + obj, + sel, + otherSet, + ); + } + + late final __objc_msgSend_374Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_374 = __objc_msgSend_374Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_isEqualToSet_1 = _registerName1("isEqualToSet:"); + late final _sel_isSubsetOfSet_1 = _registerName1("isSubsetOfSet:"); + late final _sel_setByAddingObject_1 = _registerName1("setByAddingObject:"); + ffi.Pointer _objc_msgSend_375( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer anObject, + ) { + return __objc_msgSend_375( + obj, + sel, + anObject, + ); + } + + late final __objc_msgSend_375Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_375 = __objc_msgSend_375Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setByAddingObjectsFromSet_1 = + _registerName1("setByAddingObjectsFromSet:"); + ffi.Pointer _objc_msgSend_376( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer other, + ) { + return __objc_msgSend_376( + obj, + sel, + other, + ); + } + + late final __objc_msgSend_376Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_376 = __objc_msgSend_376Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setByAddingObjectsFromArray_1 = + _registerName1("setByAddingObjectsFromArray:"); + ffi.Pointer _objc_msgSend_377( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer other, + ) { + return __objc_msgSend_377( + obj, + sel, + other, + ); + } + + late final __objc_msgSend_377Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_377 = __objc_msgSend_377Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + void _objc_msgSend_378( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_378( + obj, + sel, + block, + ); + } + + late final __objc_msgSend_378Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_378 = __objc_msgSend_378Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + void _objc_msgSend_379( + ffi.Pointer obj, + ffi.Pointer sel, + int opts, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_379( + obj, + sel, + opts, + block, + ); + } + + late final __objc_msgSend_379Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_379 = __objc_msgSend_379Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_objectsPassingTest_1 = _registerName1("objectsPassingTest:"); + ffi.Pointer _objc_msgSend_380( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> predicate, + ) { + return __objc_msgSend_380( + obj, + sel, + predicate, + ); + } + + late final __objc_msgSend_380Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_380 = __objc_msgSend_380Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_objectsWithOptions_passingTest_1 = + _registerName1("objectsWithOptions:passingTest:"); + ffi.Pointer _objc_msgSend_381( + ffi.Pointer obj, + ffi.Pointer sel, + int opts, + ffi.Pointer<_ObjCBlock> predicate, + ) { + return __objc_msgSend_381( + obj, + sel, + opts, + predicate, + ); + } + + late final __objc_msgSend_381Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_381 = __objc_msgSend_381Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_set1 = _registerName1("set"); + late final _sel_setWithObject_1 = _registerName1("setWithObject:"); + late final _sel_setWithObjects_count_1 = + _registerName1("setWithObjects:count:"); + late final _sel_setWithObjects_1 = _registerName1("setWithObjects:"); + late final _sel_setWithSet_1 = _registerName1("setWithSet:"); + instancetype _objc_msgSend_382( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer set1, + ) { + return __objc_msgSend_382( + obj, + sel, + set1, + ); + } + + late final __objc_msgSend_382Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_382 = __objc_msgSend_382Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_setWithArray_1 = _registerName1("setWithArray:"); + late final _sel_initWithSet_1 = _registerName1("initWithSet:"); + late final _sel_initWithSet_copyItems_1 = + _registerName1("initWithSet:copyItems:"); + instancetype _objc_msgSend_383( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer set1, + bool flag, + ) { + return __objc_msgSend_383( + obj, + sel, + set1, + flag, + ); + } + + late final __objc_msgSend_383Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_383 = __objc_msgSend_383Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, bool)>(); + + late final _sel_filteredSetUsingPredicate_1 = + _registerName1("filteredSetUsingPredicate:"); + ffi.Pointer _objc_msgSend_384( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer predicate, + ) { + return __objc_msgSend_384( + obj, + sel, + predicate, + ); + } + + late final __objc_msgSend_384Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_384 = __objc_msgSend_384Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_invocationWithMethodSignature_1 = + _registerName1("invocationWithMethodSignature:"); + ffi.Pointer _objc_msgSend_385( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer sig, + ) { + return __objc_msgSend_385( + obj, + sel, + sig, + ); + } + + late final __objc_msgSend_385Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_385 = __objc_msgSend_385Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_methodSignature1 = _registerName1("methodSignature"); + ffi.Pointer _objc_msgSend_386( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_386( + obj, + sel, + ); + } + + late final __objc_msgSend_386Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_386 = __objc_msgSend_386Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_retainArguments1 = _registerName1("retainArguments"); + late final _sel_argumentsRetained1 = _registerName1("argumentsRetained"); + late final _sel_target1 = _registerName1("target"); + late final _sel_setTarget_1 = _registerName1("setTarget:"); + void _objc_msgSend_387( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_387( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_387Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_387 = __objc_msgSend_387Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_selector1 = _registerName1("selector"); + ffi.Pointer _objc_msgSend_388( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_388( + obj, + sel, + ); + } + + late final __objc_msgSend_388Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_388 = __objc_msgSend_388Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setSelector_1 = _registerName1("setSelector:"); + void _objc_msgSend_389( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_389( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_389Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_389 = __objc_msgSend_389Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_getReturnValue_1 = _registerName1("getReturnValue:"); + late final _sel_setReturnValue_1 = _registerName1("setReturnValue:"); + late final _sel_getArgument_atIndex_1 = + _registerName1("getArgument:atIndex:"); + void _objc_msgSend_390( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer argumentLocation, + int idx, + ) { + return __objc_msgSend_390( + obj, + sel, + argumentLocation, + idx, + ); + } + + late final __objc_msgSend_390Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Long)>>('objc_msgSend'); + late final __objc_msgSend_390 = __objc_msgSend_390Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_setArgument_atIndex_1 = + _registerName1("setArgument:atIndex:"); + late final _sel_invoke1 = _registerName1("invoke"); + late final _sel_invokeWithTarget_1 = _registerName1("invokeWithTarget:"); + late final _sel_invokeUsingIMP_1 = _registerName1("invokeUsingIMP:"); + void _objc_msgSend_391( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer> imp, + ) { + return __objc_msgSend_391( + obj, + sel, + imp, + ); + } + + late final __objc_msgSend_391Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer>)>>( + 'objc_msgSend'); + late final __objc_msgSend_391 = __objc_msgSend_391Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_forwardInvocation_1 = _registerName1("forwardInvocation:"); + void _objc_msgSend_392( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer anInvocation, + ) { + return __objc_msgSend_392( + obj, + sel, + anInvocation, + ); + } + + late final __objc_msgSend_392Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_392 = __objc_msgSend_392Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_methodSignatureForSelector_1 = + _registerName1("methodSignatureForSelector:"); + ffi.Pointer _objc_msgSend_393( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aSelector, + ) { + return __objc_msgSend_393( + obj, + sel, + aSelector, + ); + } + + late final __objc_msgSend_393Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_393 = __objc_msgSend_393Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_instanceMethodSignatureForSelector_1 = + _registerName1("instanceMethodSignatureForSelector:"); + late final _sel_allowsWeakReference1 = _registerName1("allowsWeakReference"); + late final _sel_retainWeakReference1 = _registerName1("retainWeakReference"); + late final _sel_isSubclassOfClass_1 = _registerName1("isSubclassOfClass:"); + late final _sel_resolveClassMethod_1 = _registerName1("resolveClassMethod:"); + late final _sel_resolveInstanceMethod_1 = + _registerName1("resolveInstanceMethod:"); + late final _sel_superclass1 = _registerName1("superclass"); + late final _sel_class1 = _registerName1("class"); + late final _sel_debugDescription1 = _registerName1("debugDescription"); + late final _sel_version1 = _registerName1("version"); + late final _sel_setVersion_1 = _registerName1("setVersion:"); + void _objc_msgSend_394( + ffi.Pointer obj, + ffi.Pointer sel, + int aVersion, + ) { + return __objc_msgSend_394( + obj, + sel, + aVersion, + ); + } + + late final __objc_msgSend_394Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Long)>>('objc_msgSend'); + late final __objc_msgSend_394 = __objc_msgSend_394Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_classForCoder1 = _registerName1("classForCoder"); + late final _sel_replacementObjectForCoder_1 = + _registerName1("replacementObjectForCoder:"); + late final _sel_awakeAfterUsingCoder_1 = + _registerName1("awakeAfterUsingCoder:"); + late final _sel_poseAsClass_1 = _registerName1("poseAsClass:"); + late final _sel_autoContentAccessingProxy1 = + _registerName1("autoContentAccessingProxy"); + late final _sel_attemptRecoveryFromError_optionIndex_delegate_didRecoverSelector_contextInfo_1 = + _registerName1( + "attemptRecoveryFromError:optionIndex:delegate:didRecoverSelector:contextInfo:"); + void _objc_msgSend_395( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer error, + int recoveryOptionIndex, + ffi.Pointer delegate, + ffi.Pointer didRecoverSelector, + ffi.Pointer contextInfo, + ) { + return __objc_msgSend_395( + obj, + sel, + error, + recoveryOptionIndex, + delegate, + didRecoverSelector, + contextInfo, + ); + } + + late final __objc_msgSend_395Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_395 = __objc_msgSend_395Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_attemptRecoveryFromError_optionIndex_1 = + _registerName1("attemptRecoveryFromError:optionIndex:"); + bool _objc_msgSend_396( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer error, + int recoveryOptionIndex, + ) { + return __objc_msgSend_396( + obj, + sel, + error, + recoveryOptionIndex, + ); + } + + late final __objc_msgSend_396Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_396 = __objc_msgSend_396Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_performSelector_withObject_afterDelay_inModes_1 = + _registerName1("performSelector:withObject:afterDelay:inModes:"); + void _objc_msgSend_397( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aSelector, + ffi.Pointer anArgument, + double delay, + ffi.Pointer modes, + ) { + return __objc_msgSend_397( + obj, + sel, + aSelector, + anArgument, + delay, + modes, + ); + } + + late final __objc_msgSend_397Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Double, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_397 = __objc_msgSend_397Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + double, + ffi.Pointer)>(); + + late final _sel_performSelector_withObject_afterDelay_1 = + _registerName1("performSelector:withObject:afterDelay:"); + void _objc_msgSend_398( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aSelector, + ffi.Pointer anArgument, + double delay, + ) { + return __objc_msgSend_398( + obj, + sel, + aSelector, + anArgument, + delay, + ); + } + + late final __objc_msgSend_398Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Double)>>('objc_msgSend'); + late final __objc_msgSend_398 = __objc_msgSend_398Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer, double)>(); + + late final _sel_URL_resourceDataDidBecomeAvailable_1 = + _registerName1("URL:resourceDataDidBecomeAvailable:"); + void _objc_msgSend_399( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer sender, + ffi.Pointer newBytes, + ) { + return __objc_msgSend_399( + obj, + sel, + sender, + newBytes, + ); + } + + late final __objc_msgSend_399Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_399 = __objc_msgSend_399Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_URLResourceDidFinishLoading_1 = + _registerName1("URLResourceDidFinishLoading:"); + void _objc_msgSend_400( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer sender, + ) { + return __objc_msgSend_400( + obj, + sel, + sender, + ); + } + + late final __objc_msgSend_400Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_400 = __objc_msgSend_400Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_URLResourceDidCancelLoading_1 = + _registerName1("URLResourceDidCancelLoading:"); + late final _sel_URL_resourceDidFailLoadingWithReason_1 = + _registerName1("URL:resourceDidFailLoadingWithReason:"); + void _objc_msgSend_401( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer sender, + ffi.Pointer reason, + ) { + return __objc_msgSend_401( + obj, + sel, + sender, + reason, + ); + } + + late final __objc_msgSend_401Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_401 = __objc_msgSend_401Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _class_NSFileManager1 = _getClass1("NSFileManager"); + late final _sel_defaultManager1 = _registerName1("defaultManager"); + ffi.Pointer _objc_msgSend_402( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_402( + obj, + sel, + ); + } + + late final __objc_msgSend_402Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_402 = __objc_msgSend_402Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_mountedVolumeURLsIncludingResourceValuesForKeys_options_1 = + _registerName1( + "mountedVolumeURLsIncludingResourceValuesForKeys:options:"); + ffi.Pointer _objc_msgSend_403( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer propertyKeys, + int options, + ) { + return __objc_msgSend_403( + obj, + sel, + propertyKeys, + options, + ); + } + + late final __objc_msgSend_403Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_403 = __objc_msgSend_403Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_unmountVolumeAtURL_options_completionHandler_1 = + _registerName1("unmountVolumeAtURL:options:completionHandler:"); + void _objc_msgSend_404( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + int mask, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_404( + obj, + sel, + url, + mask, + completionHandler, + ); + } + + late final __objc_msgSend_404Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_404 = __objc_msgSend_404Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_contentsOfDirectoryAtURL_includingPropertiesForKeys_options_error_1 = + _registerName1( + "contentsOfDirectoryAtURL:includingPropertiesForKeys:options:error:"); + ffi.Pointer _objc_msgSend_405( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ffi.Pointer keys, + int mask, + ffi.Pointer> error, + ) { + return __objc_msgSend_405( + obj, + sel, + url, + keys, + mask, + error, + ); + } + + late final __objc_msgSend_405Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_405 = __objc_msgSend_405Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer>)>(); + + late final _sel_URLsForDirectory_inDomains_1 = + _registerName1("URLsForDirectory:inDomains:"); + ffi.Pointer _objc_msgSend_406( + ffi.Pointer obj, + ffi.Pointer sel, + int directory, + int domainMask, + ) { + return __objc_msgSend_406( + obj, + sel, + directory, + domainMask, + ); + } + + late final __objc_msgSend_406Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Int32, ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_406 = __objc_msgSend_406Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int, int)>(); + + late final _sel_URLForDirectory_inDomain_appropriateForURL_create_error_1 = + _registerName1( + "URLForDirectory:inDomain:appropriateForURL:create:error:"); + ffi.Pointer _objc_msgSend_407( + ffi.Pointer obj, + ffi.Pointer sel, + int directory, + int domain, + ffi.Pointer url, + bool shouldCreate, + ffi.Pointer> error, + ) { + return __objc_msgSend_407( + obj, + sel, + directory, + domain, + url, + shouldCreate, + error, + ); + } + + late final __objc_msgSend_407Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Int32, + ffi.Pointer, + ffi.Bool, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_407 = __objc_msgSend_407Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + int, + int, + ffi.Pointer, + bool, + ffi.Pointer>)>(); + + late final _sel_getRelationship_ofDirectoryAtURL_toItemAtURL_error_1 = + _registerName1("getRelationship:ofDirectoryAtURL:toItemAtURL:error:"); + bool _objc_msgSend_408( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer outRelationship, + ffi.Pointer directoryURL, + ffi.Pointer otherURL, + ffi.Pointer> error, + ) { + return __objc_msgSend_408( + obj, + sel, + outRelationship, + directoryURL, + otherURL, + error, + ); + } + + late final __objc_msgSend_408Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_408 = __objc_msgSend_408Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_getRelationship_ofDirectory_inDomain_toItemAtURL_error_1 = + _registerName1("getRelationship:ofDirectory:inDomain:toItemAtURL:error:"); + bool _objc_msgSend_409( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer outRelationship, + int directory, + int domainMask, + ffi.Pointer url, + ffi.Pointer> error, + ) { + return __objc_msgSend_409( + obj, + sel, + outRelationship, + directory, + domainMask, + url, + error, + ); + } + + late final __objc_msgSend_409Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Int32, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_409 = __objc_msgSend_409Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + int, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_createDirectoryAtURL_withIntermediateDirectories_attributes_error_1 = + _registerName1( + "createDirectoryAtURL:withIntermediateDirectories:attributes:error:"); + bool _objc_msgSend_410( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + bool createIntermediates, + ffi.Pointer attributes, + ffi.Pointer> error, + ) { + return __objc_msgSend_410( + obj, + sel, + url, + createIntermediates, + attributes, + error, + ); + } + + late final __objc_msgSend_410Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_410 = __objc_msgSend_410Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + bool, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_createSymbolicLinkAtURL_withDestinationURL_error_1 = + _registerName1("createSymbolicLinkAtURL:withDestinationURL:error:"); + bool _objc_msgSend_411( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ffi.Pointer destURL, + ffi.Pointer> error, + ) { + return __objc_msgSend_411( + obj, + sel, + url, + destURL, + error, + ); + } + + late final __objc_msgSend_411Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_411 = __objc_msgSend_411Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_delegate1 = _registerName1("delegate"); + late final _sel_setDelegate_1 = _registerName1("setDelegate:"); + late final _sel_setAttributes_ofItemAtPath_error_1 = + _registerName1("setAttributes:ofItemAtPath:error:"); + bool _objc_msgSend_412( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer attributes, + ffi.Pointer path, + ffi.Pointer> error, + ) { + return __objc_msgSend_412( + obj, + sel, + attributes, + path, + error, + ); + } + + late final __objc_msgSend_412Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_412 = __objc_msgSend_412Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_createDirectoryAtPath_withIntermediateDirectories_attributes_error_1 = + _registerName1( + "createDirectoryAtPath:withIntermediateDirectories:attributes:error:"); + bool _objc_msgSend_413( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + bool createIntermediates, + ffi.Pointer attributes, + ffi.Pointer> error, + ) { + return __objc_msgSend_413( + obj, + sel, + path, + createIntermediates, + attributes, + error, + ); + } + + late final __objc_msgSend_413Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_413 = __objc_msgSend_413Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + bool, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_contentsOfDirectoryAtPath_error_1 = + _registerName1("contentsOfDirectoryAtPath:error:"); + ffi.Pointer _objc_msgSend_414( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ffi.Pointer> error, + ) { + return __objc_msgSend_414( + obj, + sel, + path, + error, + ); + } + + late final __objc_msgSend_414Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_414 = __objc_msgSend_414Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_subpathsOfDirectoryAtPath_error_1 = + _registerName1("subpathsOfDirectoryAtPath:error:"); + late final _sel_attributesOfItemAtPath_error_1 = + _registerName1("attributesOfItemAtPath:error:"); + ffi.Pointer _objc_msgSend_415( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ffi.Pointer> error, + ) { + return __objc_msgSend_415( + obj, + sel, + path, + error, + ); + } + + late final __objc_msgSend_415Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_415 = __objc_msgSend_415Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_attributesOfFileSystemForPath_error_1 = + _registerName1("attributesOfFileSystemForPath:error:"); + late final _sel_createSymbolicLinkAtPath_withDestinationPath_error_1 = + _registerName1("createSymbolicLinkAtPath:withDestinationPath:error:"); + bool _objc_msgSend_416( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ffi.Pointer destPath, + ffi.Pointer> error, + ) { + return __objc_msgSend_416( + obj, + sel, + path, + destPath, + error, + ); + } + + late final __objc_msgSend_416Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_416 = __objc_msgSend_416Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_destinationOfSymbolicLinkAtPath_error_1 = + _registerName1("destinationOfSymbolicLinkAtPath:error:"); + ffi.Pointer _objc_msgSend_417( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ffi.Pointer> error, + ) { + return __objc_msgSend_417( + obj, + sel, + path, + error, + ); + } + + late final __objc_msgSend_417Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_417 = __objc_msgSend_417Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_copyItemAtPath_toPath_error_1 = + _registerName1("copyItemAtPath:toPath:error:"); + late final _sel_moveItemAtPath_toPath_error_1 = + _registerName1("moveItemAtPath:toPath:error:"); + late final _sel_linkItemAtPath_toPath_error_1 = + _registerName1("linkItemAtPath:toPath:error:"); + late final _sel_removeItemAtPath_error_1 = + _registerName1("removeItemAtPath:error:"); + bool _objc_msgSend_418( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ffi.Pointer> error, + ) { + return __objc_msgSend_418( + obj, + sel, + path, + error, + ); + } + + late final __objc_msgSend_418Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_418 = __objc_msgSend_418Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer>)>(); + + late final _sel_copyItemAtURL_toURL_error_1 = + _registerName1("copyItemAtURL:toURL:error:"); + late final _sel_moveItemAtURL_toURL_error_1 = + _registerName1("moveItemAtURL:toURL:error:"); + late final _sel_linkItemAtURL_toURL_error_1 = + _registerName1("linkItemAtURL:toURL:error:"); + late final _sel_removeItemAtURL_error_1 = + _registerName1("removeItemAtURL:error:"); + late final _sel_trashItemAtURL_resultingItemURL_error_1 = + _registerName1("trashItemAtURL:resultingItemURL:error:"); + bool _objc_msgSend_419( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ffi.Pointer> outResultingURL, + ffi.Pointer> error, + ) { + return __objc_msgSend_419( + obj, + sel, + url, + outResultingURL, + error, + ); + } + + late final __objc_msgSend_419Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_419 = __objc_msgSend_419Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer>)>(); + + late final _sel_fileAttributesAtPath_traverseLink_1 = + _registerName1("fileAttributesAtPath:traverseLink:"); + ffi.Pointer _objc_msgSend_420( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + bool yorn, + ) { + return __objc_msgSend_420( + obj, + sel, + path, + yorn, + ); + } + + late final __objc_msgSend_420Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_420 = __objc_msgSend_420Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer, bool)>(); + + late final _sel_changeFileAttributes_atPath_1 = + _registerName1("changeFileAttributes:atPath:"); + bool _objc_msgSend_421( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer attributes, + ffi.Pointer path, + ) { + return __objc_msgSend_421( + obj, + sel, + attributes, + path, + ); + } + + late final __objc_msgSend_421Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_421 = __objc_msgSend_421Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_directoryContentsAtPath_1 = + _registerName1("directoryContentsAtPath:"); + late final _sel_fileSystemAttributesAtPath_1 = + _registerName1("fileSystemAttributesAtPath:"); + late final _sel_pathContentOfSymbolicLinkAtPath_1 = + _registerName1("pathContentOfSymbolicLinkAtPath:"); + late final _sel_createSymbolicLinkAtPath_pathContent_1 = + _registerName1("createSymbolicLinkAtPath:pathContent:"); + bool _objc_msgSend_422( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ffi.Pointer otherpath, + ) { + return __objc_msgSend_422( + obj, + sel, + path, + otherpath, + ); + } + + late final __objc_msgSend_422Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_422 = __objc_msgSend_422Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_createDirectoryAtPath_attributes_1 = + _registerName1("createDirectoryAtPath:attributes:"); + bool _objc_msgSend_423( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ffi.Pointer attributes, + ) { + return __objc_msgSend_423( + obj, + sel, + path, + attributes, + ); + } + + late final __objc_msgSend_423Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_423 = __objc_msgSend_423Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_linkPath_toPath_handler_1 = + _registerName1("linkPath:toPath:handler:"); + bool _objc_msgSend_424( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer src, + ffi.Pointer dest, + ffi.Pointer handler, + ) { + return __objc_msgSend_424( + obj, + sel, + src, + dest, + handler, + ); + } + + late final __objc_msgSend_424Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_424 = __objc_msgSend_424Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_copyPath_toPath_handler_1 = + _registerName1("copyPath:toPath:handler:"); + late final _sel_movePath_toPath_handler_1 = + _registerName1("movePath:toPath:handler:"); + late final _sel_removeFileAtPath_handler_1 = + _registerName1("removeFileAtPath:handler:"); + bool _objc_msgSend_425( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ffi.Pointer handler, + ) { + return __objc_msgSend_425( + obj, + sel, + path, + handler, + ); + } + + late final __objc_msgSend_425Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_425 = __objc_msgSend_425Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_currentDirectoryPath1 = + _registerName1("currentDirectoryPath"); + late final _sel_changeCurrentDirectoryPath_1 = + _registerName1("changeCurrentDirectoryPath:"); + late final _sel_fileExistsAtPath_1 = _registerName1("fileExistsAtPath:"); + late final _sel_fileExistsAtPath_isDirectory_1 = + _registerName1("fileExistsAtPath:isDirectory:"); + bool _objc_msgSend_426( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ffi.Pointer isDirectory, + ) { + return __objc_msgSend_426( + obj, + sel, + path, + isDirectory, + ); + } + + late final __objc_msgSend_426Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_426 = __objc_msgSend_426Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_isReadableFileAtPath_1 = + _registerName1("isReadableFileAtPath:"); + late final _sel_isWritableFileAtPath_1 = + _registerName1("isWritableFileAtPath:"); + late final _sel_isExecutableFileAtPath_1 = + _registerName1("isExecutableFileAtPath:"); + late final _sel_isDeletableFileAtPath_1 = + _registerName1("isDeletableFileAtPath:"); + late final _sel_contentsEqualAtPath_andPath_1 = + _registerName1("contentsEqualAtPath:andPath:"); + late final _sel_displayNameAtPath_1 = _registerName1("displayNameAtPath:"); + late final _sel_componentsToDisplayForPath_1 = + _registerName1("componentsToDisplayForPath:"); + late final _sel_enumeratorAtPath_1 = _registerName1("enumeratorAtPath:"); + late final _sel_enumeratorAtURL_includingPropertiesForKeys_options_errorHandler_1 = + _registerName1( + "enumeratorAtURL:includingPropertiesForKeys:options:errorHandler:"); + ffi.Pointer _objc_msgSend_427( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ffi.Pointer keys, + int mask, + ffi.Pointer<_ObjCBlock> handler, + ) { + return __objc_msgSend_427( + obj, + sel, + url, + keys, + mask, + handler, + ); + } + + late final __objc_msgSend_427Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_427 = __objc_msgSend_427Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_subpathsAtPath_1 = _registerName1("subpathsAtPath:"); + late final _sel_contentsAtPath_1 = _registerName1("contentsAtPath:"); + ffi.Pointer _objc_msgSend_428( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ) { + return __objc_msgSend_428( + obj, + sel, + path, + ); + } + + late final __objc_msgSend_428Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_428 = __objc_msgSend_428Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_createFileAtPath_contents_attributes_1 = + _registerName1("createFileAtPath:contents:attributes:"); + bool _objc_msgSend_429( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ffi.Pointer data, + ffi.Pointer attr, + ) { + return __objc_msgSend_429( + obj, + sel, + path, + data, + attr, + ); + } + + late final __objc_msgSend_429Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_429 = __objc_msgSend_429Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_fileSystemRepresentationWithPath_1 = + _registerName1("fileSystemRepresentationWithPath:"); + ffi.Pointer _objc_msgSend_430( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ) { + return __objc_msgSend_430( + obj, + sel, + path, + ); + } + + late final __objc_msgSend_430Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_430 = __objc_msgSend_430Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_stringWithFileSystemRepresentation_length_1 = + _registerName1("stringWithFileSystemRepresentation:length:"); + ffi.Pointer _objc_msgSend_431( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer str, + int len, + ) { + return __objc_msgSend_431( + obj, + sel, + str, + len, + ); + } + + late final __objc_msgSend_431Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_431 = __objc_msgSend_431Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_replaceItemAtURL_withItemAtURL_backupItemName_options_resultingItemURL_error_1 = + _registerName1( + "replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error:"); + bool _objc_msgSend_432( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer originalItemURL, + ffi.Pointer newItemURL, + ffi.Pointer backupItemName, + int options, + ffi.Pointer> resultingURL, + ffi.Pointer> error, + ) { + return __objc_msgSend_432( + obj, + sel, + originalItemURL, + newItemURL, + backupItemName, + options, + resultingURL, + error, + ); + } + + late final __objc_msgSend_432Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer>, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_432 = __objc_msgSend_432Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer>, + ffi.Pointer>)>(); + + late final _sel_setUbiquitous_itemAtURL_destinationURL_error_1 = + _registerName1("setUbiquitous:itemAtURL:destinationURL:error:"); + bool _objc_msgSend_433( + ffi.Pointer obj, + ffi.Pointer sel, + bool flag, + ffi.Pointer url, + ffi.Pointer destinationURL, + ffi.Pointer> error, + ) { + return __objc_msgSend_433( + obj, + sel, + flag, + url, + destinationURL, + error, + ); + } + + late final __objc_msgSend_433Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Bool, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_433 = __objc_msgSend_433Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + bool, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_isUbiquitousItemAtURL_1 = + _registerName1("isUbiquitousItemAtURL:"); + late final _sel_startDownloadingUbiquitousItemAtURL_error_1 = + _registerName1("startDownloadingUbiquitousItemAtURL:error:"); + late final _sel_evictUbiquitousItemAtURL_error_1 = + _registerName1("evictUbiquitousItemAtURL:error:"); + late final _sel_URLForUbiquityContainerIdentifier_1 = + _registerName1("URLForUbiquityContainerIdentifier:"); + late final _sel_URLForPublishingUbiquitousItemAtURL_expirationDate_error_1 = + _registerName1( + "URLForPublishingUbiquitousItemAtURL:expirationDate:error:"); + ffi.Pointer _objc_msgSend_434( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ffi.Pointer> outDate, + ffi.Pointer> error, + ) { + return __objc_msgSend_434( + obj, + sel, + url, + outDate, + error, + ); + } + + late final __objc_msgSend_434Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_434 = __objc_msgSend_434Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer>)>(); + + late final _sel_ubiquityIdentityToken1 = + _registerName1("ubiquityIdentityToken"); + late final _sel_getFileProviderServicesForItemAtURL_completionHandler_1 = + _registerName1("getFileProviderServicesForItemAtURL:completionHandler:"); + void _objc_msgSend_435( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_435( + obj, + sel, + url, + completionHandler, + ); + } + + late final __objc_msgSend_435Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_435 = __objc_msgSend_435Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_containerURLForSecurityApplicationGroupIdentifier_1 = + _registerName1("containerURLForSecurityApplicationGroupIdentifier:"); + late final _sel_homeDirectoryForCurrentUser1 = + _registerName1("homeDirectoryForCurrentUser"); + late final _sel_temporaryDirectory1 = _registerName1("temporaryDirectory"); + late final _sel_homeDirectoryForUser_1 = + _registerName1("homeDirectoryForUser:"); + late final _sel_fileManager_shouldProceedAfterError_1 = + _registerName1("fileManager:shouldProceedAfterError:"); + bool _objc_msgSend_436( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer fm, + ffi.Pointer errorInfo, + ) { + return __objc_msgSend_436( + obj, + sel, + fm, + errorInfo, + ); + } + + late final __objc_msgSend_436Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_436 = __objc_msgSend_436Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_fileManager_willProcessPath_1 = + _registerName1("fileManager:willProcessPath:"); + void _objc_msgSend_437( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer fm, + ffi.Pointer path, + ) { + return __objc_msgSend_437( + obj, + sel, + fm, + path, + ); + } + + late final __objc_msgSend_437Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_437 = __objc_msgSend_437Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_validateValue_forKey_error_1 = + _registerName1("validateValue:forKey:error:"); + late final _class_NSMutableArray1 = _getClass1("NSMutableArray"); + late final _sel_addObject_1 = _registerName1("addObject:"); + late final _sel_insertObject_atIndex_1 = + _registerName1("insertObject:atIndex:"); + void _objc_msgSend_438( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer anObject, + int index, + ) { + return __objc_msgSend_438( + obj, + sel, + anObject, + index, + ); + } + + late final __objc_msgSend_438Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_438 = __objc_msgSend_438Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_removeLastObject1 = _registerName1("removeLastObject"); + late final _sel_removeObjectAtIndex_1 = + _registerName1("removeObjectAtIndex:"); + void _objc_msgSend_439( + ffi.Pointer obj, + ffi.Pointer sel, + int index, + ) { + return __objc_msgSend_439( + obj, + sel, + index, + ); + } + + late final __objc_msgSend_439Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_439 = __objc_msgSend_439Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_replaceObjectAtIndex_withObject_1 = + _registerName1("replaceObjectAtIndex:withObject:"); + void _objc_msgSend_440( + ffi.Pointer obj, + ffi.Pointer sel, + int index, + ffi.Pointer anObject, + ) { + return __objc_msgSend_440( + obj, + sel, + index, + anObject, + ); + } + + late final __objc_msgSend_440Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.UnsignedLong, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_440 = __objc_msgSend_440Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer)>(); + + late final _sel_initWithCapacity_1 = _registerName1("initWithCapacity:"); + late final _sel_addObjectsFromArray_1 = + _registerName1("addObjectsFromArray:"); + void _objc_msgSend_441( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer otherArray, + ) { + return __objc_msgSend_441( + obj, + sel, + otherArray, + ); + } + + late final __objc_msgSend_441Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_441 = __objc_msgSend_441Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_exchangeObjectAtIndex_withObjectAtIndex_1 = + _registerName1("exchangeObjectAtIndex:withObjectAtIndex:"); + void _objc_msgSend_442( + ffi.Pointer obj, + ffi.Pointer sel, + int idx1, + int idx2, + ) { + return __objc_msgSend_442( + obj, + sel, + idx1, + idx2, + ); + } + + late final __objc_msgSend_442Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.UnsignedLong, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_442 = __objc_msgSend_442Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, int)>(); + + late final _sel_removeAllObjects1 = _registerName1("removeAllObjects"); + late final _sel_removeObject_inRange_1 = + _registerName1("removeObject:inRange:"); + void _objc_msgSend_443( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer anObject, + _NSRange range, + ) { + return __objc_msgSend_443( + obj, + sel, + anObject, + range, + ); + } + + late final __objc_msgSend_443Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_443 = __objc_msgSend_443Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, _NSRange)>(); + + late final _sel_removeObject_1 = _registerName1("removeObject:"); + late final _sel_removeObjectIdenticalTo_inRange_1 = + _registerName1("removeObjectIdenticalTo:inRange:"); + late final _sel_removeObjectIdenticalTo_1 = + _registerName1("removeObjectIdenticalTo:"); + late final _sel_removeObjectsFromIndices_numIndices_1 = + _registerName1("removeObjectsFromIndices:numIndices:"); + void _objc_msgSend_444( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer indices, + int cnt, + ) { + return __objc_msgSend_444( + obj, + sel, + indices, + cnt, + ); + } + + late final __objc_msgSend_444Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_444 = __objc_msgSend_444Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_removeObjectsInArray_1 = + _registerName1("removeObjectsInArray:"); + late final _sel_removeObjectsInRange_1 = + _registerName1("removeObjectsInRange:"); + void _objc_msgSend_445( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ) { + return __objc_msgSend_445( + obj, + sel, + range, + ); + } + + late final __objc_msgSend_445Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_445 = __objc_msgSend_445Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, _NSRange)>(); + + late final _sel_replaceObjectsInRange_withObjectsFromArray_range_1 = + _registerName1("replaceObjectsInRange:withObjectsFromArray:range:"); + void _objc_msgSend_446( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ffi.Pointer otherArray, + _NSRange otherRange, + ) { + return __objc_msgSend_446( + obj, + sel, + range, + otherArray, + otherRange, + ); + } + + late final __objc_msgSend_446Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + _NSRange, ffi.Pointer, _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_446 = __objc_msgSend_446Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, _NSRange, + ffi.Pointer, _NSRange)>(); + + late final _sel_replaceObjectsInRange_withObjectsFromArray_1 = + _registerName1("replaceObjectsInRange:withObjectsFromArray:"); + void _objc_msgSend_447( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ffi.Pointer otherArray, + ) { + return __objc_msgSend_447( + obj, + sel, + range, + otherArray, + ); + } + + late final __objc_msgSend_447Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + _NSRange, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_447 = __objc_msgSend_447Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, _NSRange, + ffi.Pointer)>(); + + late final _sel_setArray_1 = _registerName1("setArray:"); + late final _sel_sortUsingFunction_context_1 = + _registerName1("sortUsingFunction:context:"); + void _objc_msgSend_448( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer< + ffi.NativeFunction< + ffi.Long Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>> + compare, + ffi.Pointer context, + ) { + return __objc_msgSend_448( + obj, + sel, + compare, + context, + ); + } + + late final __objc_msgSend_448Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.Long Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_448 = __objc_msgSend_448Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.Long Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>, + ffi.Pointer)>(); + + late final _sel_sortUsingSelector_1 = _registerName1("sortUsingSelector:"); + late final _sel_insertObjects_atIndexes_1 = + _registerName1("insertObjects:atIndexes:"); + void _objc_msgSend_449( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer objects, + ffi.Pointer indexes, + ) { + return __objc_msgSend_449( + obj, + sel, + objects, + indexes, + ); + } + + late final __objc_msgSend_449Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_449 = __objc_msgSend_449Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_removeObjectsAtIndexes_1 = + _registerName1("removeObjectsAtIndexes:"); + void _objc_msgSend_450( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer indexes, + ) { + return __objc_msgSend_450( + obj, + sel, + indexes, + ); + } + + late final __objc_msgSend_450Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_450 = __objc_msgSend_450Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_replaceObjectsAtIndexes_withObjects_1 = + _registerName1("replaceObjectsAtIndexes:withObjects:"); + void _objc_msgSend_451( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer indexes, + ffi.Pointer objects, + ) { + return __objc_msgSend_451( + obj, + sel, + indexes, + objects, + ); + } + + late final __objc_msgSend_451Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_451 = __objc_msgSend_451Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setObject_atIndexedSubscript_1 = + _registerName1("setObject:atIndexedSubscript:"); + late final _sel_sortUsingComparator_1 = + _registerName1("sortUsingComparator:"); + void _objc_msgSend_452( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> cmptr, + ) { + return __objc_msgSend_452( + obj, + sel, + cmptr, + ); + } + + late final __objc_msgSend_452Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_452 = __objc_msgSend_452Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_sortWithOptions_usingComparator_1 = + _registerName1("sortWithOptions:usingComparator:"); + void _objc_msgSend_453( + ffi.Pointer obj, + ffi.Pointer sel, + int opts, + ffi.Pointer<_ObjCBlock> cmptr, + ) { + return __objc_msgSend_453( + obj, + sel, + opts, + cmptr, + ); + } + + late final __objc_msgSend_453Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_453 = __objc_msgSend_453Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_arrayWithCapacity_1 = _registerName1("arrayWithCapacity:"); + ffi.Pointer _objc_msgSend_454( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ) { + return __objc_msgSend_454( + obj, + sel, + path, + ); + } + + late final __objc_msgSend_454Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_454 = __objc_msgSend_454Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + ffi.Pointer _objc_msgSend_455( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ) { + return __objc_msgSend_455( + obj, + sel, + url, + ); + } + + late final __objc_msgSend_455Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_455 = __objc_msgSend_455Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_applyDifference_1 = _registerName1("applyDifference:"); + late final _sel_sortUsingDescriptors_1 = + _registerName1("sortUsingDescriptors:"); + late final _sel_filterUsingPredicate_1 = + _registerName1("filterUsingPredicate:"); + void _objc_msgSend_456( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer predicate, + ) { + return __objc_msgSend_456( + obj, + sel, + predicate, + ); + } + + late final __objc_msgSend_456Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_456 = __objc_msgSend_456Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_mutableArrayValueForKey_1 = + _registerName1("mutableArrayValueForKey:"); + late final _class_NSMutableOrderedSet1 = _getClass1("NSMutableOrderedSet"); + late final _class_NSOrderedSet1 = _getClass1("NSOrderedSet"); + late final _sel_isEqualToOrderedSet_1 = + _registerName1("isEqualToOrderedSet:"); + bool _objc_msgSend_457( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer other, + ) { + return __objc_msgSend_457( + obj, + sel, + other, + ); + } + + late final __objc_msgSend_457Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_457 = __objc_msgSend_457Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_intersectsOrderedSet_1 = + _registerName1("intersectsOrderedSet:"); + late final _sel_isSubsetOfOrderedSet_1 = + _registerName1("isSubsetOfOrderedSet:"); + late final _sel_reversedOrderedSet1 = _registerName1("reversedOrderedSet"); + ffi.Pointer _objc_msgSend_458( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_458( + obj, + sel, + ); + } + + late final __objc_msgSend_458Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_458 = __objc_msgSend_458Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_orderedSet1 = _registerName1("orderedSet"); + late final _sel_orderedSetWithObject_1 = + _registerName1("orderedSetWithObject:"); + late final _sel_orderedSetWithObjects_count_1 = + _registerName1("orderedSetWithObjects:count:"); + late final _sel_orderedSetWithObjects_1 = + _registerName1("orderedSetWithObjects:"); + late final _sel_orderedSetWithOrderedSet_1 = + _registerName1("orderedSetWithOrderedSet:"); + instancetype _objc_msgSend_459( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer set1, + ) { + return __objc_msgSend_459( + obj, + sel, + set1, + ); + } + + late final __objc_msgSend_459Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_459 = __objc_msgSend_459Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_orderedSetWithOrderedSet_range_copyItems_1 = + _registerName1("orderedSetWithOrderedSet:range:copyItems:"); + instancetype _objc_msgSend_460( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer set1, + _NSRange range, + bool flag, + ) { + return __objc_msgSend_460( + obj, + sel, + set1, + range, + flag, + ); + } + + late final __objc_msgSend_460Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, _NSRange, ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_460 = __objc_msgSend_460Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, _NSRange, bool)>(); + + late final _sel_orderedSetWithArray_1 = + _registerName1("orderedSetWithArray:"); + late final _sel_orderedSetWithArray_range_copyItems_1 = + _registerName1("orderedSetWithArray:range:copyItems:"); + instancetype _objc_msgSend_461( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer array, + _NSRange range, + bool flag, + ) { + return __objc_msgSend_461( + obj, + sel, + array, + range, + flag, + ); + } + + late final __objc_msgSend_461Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, _NSRange, ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_461 = __objc_msgSend_461Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, _NSRange, bool)>(); + + late final _sel_orderedSetWithSet_1 = _registerName1("orderedSetWithSet:"); + late final _sel_orderedSetWithSet_copyItems_1 = + _registerName1("orderedSetWithSet:copyItems:"); + late final _sel_initWithObject_1 = _registerName1("initWithObject:"); + late final _sel_initWithOrderedSet_1 = _registerName1("initWithOrderedSet:"); + late final _sel_initWithOrderedSet_copyItems_1 = + _registerName1("initWithOrderedSet:copyItems:"); + instancetype _objc_msgSend_462( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer set1, + bool flag, + ) { + return __objc_msgSend_462( + obj, + sel, + set1, + flag, + ); + } + + late final __objc_msgSend_462Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_462 = __objc_msgSend_462Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, bool)>(); + + late final _sel_initWithOrderedSet_range_copyItems_1 = + _registerName1("initWithOrderedSet:range:copyItems:"); + late final _sel_initWithArray_range_copyItems_1 = + _registerName1("initWithArray:range:copyItems:"); + late final _sel_differenceFromOrderedSet_withOptions_usingEquivalenceTest_1 = + _registerName1( + "differenceFromOrderedSet:withOptions:usingEquivalenceTest:"); + ffi.Pointer _objc_msgSend_463( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer other, + int options, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_463( + obj, + sel, + other, + options, + block, + ); + } + + late final __objc_msgSend_463Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_463 = __objc_msgSend_463Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_differenceFromOrderedSet_withOptions_1 = + _registerName1("differenceFromOrderedSet:withOptions:"); + ffi.Pointer _objc_msgSend_464( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer other, + int options, + ) { + return __objc_msgSend_464( + obj, + sel, + other, + options, + ); + } + + late final __objc_msgSend_464Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_464 = __objc_msgSend_464Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_differenceFromOrderedSet_1 = + _registerName1("differenceFromOrderedSet:"); + late final _sel_orderedSetByApplyingDifference_1 = + _registerName1("orderedSetByApplyingDifference:"); + ffi.Pointer _objc_msgSend_465( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer difference, + ) { + return __objc_msgSend_465( + obj, + sel, + difference, + ); + } + + late final __objc_msgSend_465Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_465 = __objc_msgSend_465Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_filteredOrderedSetUsingPredicate_1 = + _registerName1("filteredOrderedSetUsingPredicate:"); + ffi.Pointer _objc_msgSend_466( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer p, + ) { + return __objc_msgSend_466( + obj, + sel, + p, + ); + } + + late final __objc_msgSend_466Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_466 = __objc_msgSend_466Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_addObjects_count_1 = _registerName1("addObjects:count:"); + void _objc_msgSend_467( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer> objects, + int count, + ) { + return __objc_msgSend_467( + obj, + sel, + objects, + count, + ); + } + + late final __objc_msgSend_467Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_467 = __objc_msgSend_467Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer>, int)>(); + + late final _sel_moveObjectsAtIndexes_toIndex_1 = + _registerName1("moveObjectsAtIndexes:toIndex:"); + void _objc_msgSend_468( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer indexes, + int idx, + ) { + return __objc_msgSend_468( + obj, + sel, + indexes, + idx, + ); + } + + late final __objc_msgSend_468Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_468 = __objc_msgSend_468Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_setObject_atIndex_1 = _registerName1("setObject:atIndex:"); + late final _sel_replaceObjectsInRange_withObjects_count_1 = + _registerName1("replaceObjectsInRange:withObjects:count:"); + void _objc_msgSend_469( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ffi.Pointer> objects, + int count, + ) { + return __objc_msgSend_469( + obj, + sel, + range, + objects, + count, + ); + } + + late final __objc_msgSend_469Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + _NSRange, + ffi.Pointer>, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_469 = __objc_msgSend_469Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, _NSRange, + ffi.Pointer>, int)>(); + + late final _sel_intersectOrderedSet_1 = + _registerName1("intersectOrderedSet:"); + void _objc_msgSend_470( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer other, + ) { + return __objc_msgSend_470( + obj, + sel, + other, + ); + } + + late final __objc_msgSend_470Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_470 = __objc_msgSend_470Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_minusOrderedSet_1 = _registerName1("minusOrderedSet:"); + late final _sel_unionOrderedSet_1 = _registerName1("unionOrderedSet:"); + late final _sel_intersectSet_1 = _registerName1("intersectSet:"); + void _objc_msgSend_471( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer other, + ) { + return __objc_msgSend_471( + obj, + sel, + other, + ); + } + + late final __objc_msgSend_471Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_471 = __objc_msgSend_471Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_minusSet_1 = _registerName1("minusSet:"); + late final _sel_unionSet_1 = _registerName1("unionSet:"); + late final _sel_sortRange_options_usingComparator_1 = + _registerName1("sortRange:options:usingComparator:"); + void _objc_msgSend_472( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + int opts, + ffi.Pointer<_ObjCBlock> cmptr, + ) { + return __objc_msgSend_472( + obj, + sel, + range, + opts, + cmptr, + ); + } + + late final __objc_msgSend_472Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + _NSRange, ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_472 = __objc_msgSend_472Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, _NSRange, + int, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_orderedSetWithCapacity_1 = + _registerName1("orderedSetWithCapacity:"); + late final _sel_mutableOrderedSetValueForKey_1 = + _registerName1("mutableOrderedSetValueForKey:"); + ffi.Pointer _objc_msgSend_473( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer key, + ) { + return __objc_msgSend_473( + obj, + sel, + key, + ); + } + + late final __objc_msgSend_473Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_473 = __objc_msgSend_473Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _class_NSMutableSet1 = _getClass1("NSMutableSet"); + late final _sel_setSet_1 = _registerName1("setSet:"); + late final _sel_setWithCapacity_1 = _registerName1("setWithCapacity:"); + late final _sel_mutableSetValueForKey_1 = + _registerName1("mutableSetValueForKey:"); + ffi.Pointer _objc_msgSend_474( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer key, + ) { + return __objc_msgSend_474( + obj, + sel, + key, + ); + } + + late final __objc_msgSend_474Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_474 = __objc_msgSend_474Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_valueForKeyPath_1 = _registerName1("valueForKeyPath:"); + late final _sel_setValue_forKeyPath_1 = + _registerName1("setValue:forKeyPath:"); + late final _sel_validateValue_forKeyPath_error_1 = + _registerName1("validateValue:forKeyPath:error:"); + late final _sel_mutableArrayValueForKeyPath_1 = + _registerName1("mutableArrayValueForKeyPath:"); + late final _sel_mutableOrderedSetValueForKeyPath_1 = + _registerName1("mutableOrderedSetValueForKeyPath:"); + late final _sel_mutableSetValueForKeyPath_1 = + _registerName1("mutableSetValueForKeyPath:"); + late final _sel_valueForUndefinedKey_1 = + _registerName1("valueForUndefinedKey:"); + late final _sel_setValue_forUndefinedKey_1 = + _registerName1("setValue:forUndefinedKey:"); + late final _sel_setNilValueForKey_1 = _registerName1("setNilValueForKey:"); + late final _sel_dictionaryWithValuesForKeys_1 = + _registerName1("dictionaryWithValuesForKeys:"); + ffi.Pointer _objc_msgSend_475( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer keys, + ) { + return __objc_msgSend_475( + obj, + sel, + keys, + ); + } + + late final __objc_msgSend_475Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_475 = __objc_msgSend_475Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setValuesForKeysWithDictionary_1 = + _registerName1("setValuesForKeysWithDictionary:"); + void _objc_msgSend_476( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer keyedValues, + ) { + return __objc_msgSend_476( + obj, + sel, + keyedValues, + ); + } + + late final __objc_msgSend_476Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_476 = __objc_msgSend_476Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_storedValueForKey_1 = _registerName1("storedValueForKey:"); + late final _sel_takeStoredValue_forKey_1 = + _registerName1("takeStoredValue:forKey:"); + late final _sel_takeValue_forKey_1 = _registerName1("takeValue:forKey:"); + late final _sel_takeValue_forKeyPath_1 = + _registerName1("takeValue:forKeyPath:"); + late final _sel_handleQueryWithUnboundKey_1 = + _registerName1("handleQueryWithUnboundKey:"); + late final _sel_handleTakeValue_forUnboundKey_1 = + _registerName1("handleTakeValue:forUnboundKey:"); + late final _sel_unableToSetNilForKey_1 = + _registerName1("unableToSetNilForKey:"); + late final _sel_valuesForKeys_1 = _registerName1("valuesForKeys:"); + late final _sel_takeValuesFromDictionary_1 = + _registerName1("takeValuesFromDictionary:"); + late final _sel_observeValueForKeyPath_ofObject_change_context_1 = + _registerName1("observeValueForKeyPath:ofObject:change:context:"); + void _objc_msgSend_477( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer keyPath, + ffi.Pointer object, + ffi.Pointer change, + ffi.Pointer context, + ) { + return __objc_msgSend_477( + obj, + sel, + keyPath, + object, + change, + context, + ); + } + + late final __objc_msgSend_477Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_477 = __objc_msgSend_477Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_willChangeValueForKey_1 = + _registerName1("willChangeValueForKey:"); + late final _sel_didChangeValueForKey_1 = + _registerName1("didChangeValueForKey:"); + late final _sel_willChange_valuesAtIndexes_forKey_1 = + _registerName1("willChange:valuesAtIndexes:forKey:"); + void _objc_msgSend_478( + ffi.Pointer obj, + ffi.Pointer sel, + int changeKind, + ffi.Pointer indexes, + ffi.Pointer key, + ) { + return __objc_msgSend_478( + obj, + sel, + changeKind, + indexes, + key, + ); + } + + late final __objc_msgSend_478Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_478 = __objc_msgSend_478Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_didChange_valuesAtIndexes_forKey_1 = + _registerName1("didChange:valuesAtIndexes:forKey:"); + late final _sel_willChangeValueForKey_withSetMutation_usingObjects_1 = + _registerName1("willChangeValueForKey:withSetMutation:usingObjects:"); + void _objc_msgSend_479( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer key, + int mutationKind, + ffi.Pointer objects, + ) { + return __objc_msgSend_479( + obj, + sel, + key, + mutationKind, + objects, + ); + } + + late final __objc_msgSend_479Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_479 = __objc_msgSend_479Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, ffi.Pointer)>(); + + late final _sel_didChangeValueForKey_withSetMutation_usingObjects_1 = + _registerName1("didChangeValueForKey:withSetMutation:usingObjects:"); + late final _sel_observationInfo1 = _registerName1("observationInfo"); + late final _sel_setObservationInfo_1 = _registerName1("setObservationInfo:"); + void _objc_msgSend_480( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_480( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_480Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_480 = __objc_msgSend_480Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_classForKeyedArchiver1 = + _registerName1("classForKeyedArchiver"); + late final _class_NSKeyedArchiver1 = _getClass1("NSKeyedArchiver"); + late final _sel_initRequiringSecureCoding_1 = + _registerName1("initRequiringSecureCoding:"); + instancetype _objc_msgSend_481( + ffi.Pointer obj, + ffi.Pointer sel, + bool requiresSecureCoding, + ) { + return __objc_msgSend_481( + obj, + sel, + requiresSecureCoding, + ); + } + + late final __objc_msgSend_481Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_481 = __objc_msgSend_481Ptr.asFunction< + instancetype Function( + ffi.Pointer, ffi.Pointer, bool)>(); + + late final _sel_archivedDataWithRootObject_requiringSecureCoding_error_1 = + _registerName1("archivedDataWithRootObject:requiringSecureCoding:error:"); + ffi.Pointer _objc_msgSend_482( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer object, + bool requiresSecureCoding, + ffi.Pointer> error, + ) { + return __objc_msgSend_482( + obj, + sel, + object, + requiresSecureCoding, + error, + ); + } + + late final __objc_msgSend_482Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_482 = __objc_msgSend_482Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + bool, + ffi.Pointer>)>(); + + late final _class_NSMutableData1 = _getClass1("NSMutableData"); + late final _sel_mutableBytes1 = _registerName1("mutableBytes"); + late final _sel_setLength_1 = _registerName1("setLength:"); + void _objc_msgSend_483( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_483( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_483Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_483 = __objc_msgSend_483Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_appendBytes_length_1 = _registerName1("appendBytes:length:"); + late final _sel_appendData_1 = _registerName1("appendData:"); + late final _sel_increaseLengthBy_1 = _registerName1("increaseLengthBy:"); + late final _sel_replaceBytesInRange_withBytes_1 = + _registerName1("replaceBytesInRange:withBytes:"); + void _objc_msgSend_484( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ffi.Pointer bytes, + ) { + return __objc_msgSend_484( + obj, + sel, + range, + bytes, + ); + } + + late final __objc_msgSend_484Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + _NSRange, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_484 = __objc_msgSend_484Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, _NSRange, + ffi.Pointer)>(); + + late final _sel_resetBytesInRange_1 = _registerName1("resetBytesInRange:"); + late final _sel_setData_1 = _registerName1("setData:"); + late final _sel_replaceBytesInRange_withBytes_length_1 = + _registerName1("replaceBytesInRange:withBytes:length:"); + void _objc_msgSend_485( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ffi.Pointer replacementBytes, + int replacementLength, + ) { + return __objc_msgSend_485( + obj, + sel, + range, + replacementBytes, + replacementLength, + ); + } + + late final __objc_msgSend_485Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + _NSRange, + ffi.Pointer, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_485 = __objc_msgSend_485Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, _NSRange, + ffi.Pointer, int)>(); + + late final _sel_dataWithCapacity_1 = _registerName1("dataWithCapacity:"); + late final _sel_dataWithLength_1 = _registerName1("dataWithLength:"); + late final _sel_initWithLength_1 = _registerName1("initWithLength:"); + late final _sel_decompressUsingAlgorithm_error_1 = + _registerName1("decompressUsingAlgorithm:error:"); + bool _objc_msgSend_486( + ffi.Pointer obj, + ffi.Pointer sel, + int algorithm, + ffi.Pointer> error, + ) { + return __objc_msgSend_486( + obj, + sel, + algorithm, + error, + ); + } + + late final __objc_msgSend_486Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_486 = __objc_msgSend_486Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer>)>(); + + late final _sel_compressUsingAlgorithm_error_1 = + _registerName1("compressUsingAlgorithm:error:"); + late final _sel_initForWritingWithMutableData_1 = + _registerName1("initForWritingWithMutableData:"); + instancetype _objc_msgSend_487( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer data, + ) { + return __objc_msgSend_487( + obj, + sel, + data, + ); + } + + late final __objc_msgSend_487Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_487 = __objc_msgSend_487Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_archivedDataWithRootObject_1 = + _registerName1("archivedDataWithRootObject:"); + ffi.Pointer _objc_msgSend_488( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer rootObject, + ) { + return __objc_msgSend_488( + obj, + sel, + rootObject, + ); + } + + late final __objc_msgSend_488Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_488 = __objc_msgSend_488Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_archiveRootObject_toFile_1 = + _registerName1("archiveRootObject:toFile:"); + late final _sel_outputFormat1 = _registerName1("outputFormat"); + int _objc_msgSend_489( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_489( + obj, + sel, + ); + } + + late final __objc_msgSend_489Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_489 = __objc_msgSend_489Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setOutputFormat_1 = _registerName1("setOutputFormat:"); + void _objc_msgSend_490( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_490( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_490Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_490 = __objc_msgSend_490Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_encodedData1 = _registerName1("encodedData"); + late final _sel_finishEncoding1 = _registerName1("finishEncoding"); + late final _sel_setClassName_forClass_1 = + _registerName1("setClassName:forClass:"); + void _objc_msgSend_491( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer codedName, + ffi.Pointer cls, + ) { + return __objc_msgSend_491( + obj, + sel, + codedName, + cls, + ); + } + + late final __objc_msgSend_491Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_491 = __objc_msgSend_491Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_classNameForClass_1 = _registerName1("classNameForClass:"); + late final _sel_setRequiresSecureCoding_1 = + _registerName1("setRequiresSecureCoding:"); + void _objc_msgSend_492( + ffi.Pointer obj, + ffi.Pointer sel, + bool value, + ) { + return __objc_msgSend_492( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_492Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_492 = __objc_msgSend_492Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, bool)>(); + + late final _sel_replacementObjectForKeyedArchiver_1 = + _registerName1("replacementObjectForKeyedArchiver:"); + ffi.Pointer _objc_msgSend_493( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer archiver, + ) { + return __objc_msgSend_493( + obj, + sel, + archiver, + ); + } + + late final __objc_msgSend_493Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_493 = __objc_msgSend_493Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_performSelectorOnMainThread_withObject_waitUntilDone_modes_1 = + _registerName1( + "performSelectorOnMainThread:withObject:waitUntilDone:modes:"); + void _objc_msgSend_494( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aSelector, + ffi.Pointer arg, + bool wait, + ffi.Pointer array, + ) { + return __objc_msgSend_494( + obj, + sel, + aSelector, + arg, + wait, + array, + ); + } + + late final __objc_msgSend_494Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_494 = __objc_msgSend_494Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + bool, + ffi.Pointer)>(); + + late final _sel_performSelectorOnMainThread_withObject_waitUntilDone_1 = + _registerName1("performSelectorOnMainThread:withObject:waitUntilDone:"); + void _objc_msgSend_495( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aSelector, + ffi.Pointer arg, + bool wait, + ) { + return __objc_msgSend_495( + obj, + sel, + aSelector, + arg, + wait, + ); + } + + late final __objc_msgSend_495Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_495 = __objc_msgSend_495Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer, bool)>(); + + late final _class_NSThread1 = _getClass1("NSThread"); + late final _sel_currentThread1 = _registerName1("currentThread"); + ffi.Pointer _objc_msgSend_496( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_496( + obj, + sel, + ); + } + + late final __objc_msgSend_496Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_496 = __objc_msgSend_496Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_detachNewThreadWithBlock_1 = + _registerName1("detachNewThreadWithBlock:"); + void _objc_msgSend_497( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_497( + obj, + sel, + block, + ); + } + + late final __objc_msgSend_497Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_497 = __objc_msgSend_497Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_detachNewThreadSelector_toTarget_withObject_1 = + _registerName1("detachNewThreadSelector:toTarget:withObject:"); + void _objc_msgSend_498( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer selector, + ffi.Pointer target, + ffi.Pointer argument, + ) { + return __objc_msgSend_498( + obj, + sel, + selector, + target, + argument, + ); + } + + late final __objc_msgSend_498Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_498 = __objc_msgSend_498Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_isMultiThreaded1 = _registerName1("isMultiThreaded"); + late final _class_NSMutableDictionary1 = _getClass1("NSMutableDictionary"); + late final _sel_removeObjectForKey_1 = _registerName1("removeObjectForKey:"); + late final _sel_setObject_forKey_1 = _registerName1("setObject:forKey:"); + void _objc_msgSend_499( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer anObject, + ffi.Pointer aKey, + ) { + return __objc_msgSend_499( + obj, + sel, + anObject, + aKey, + ); + } + + late final __objc_msgSend_499Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_499 = __objc_msgSend_499Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_addEntriesFromDictionary_1 = + _registerName1("addEntriesFromDictionary:"); + late final _sel_removeObjectsForKeys_1 = + _registerName1("removeObjectsForKeys:"); + late final _sel_setDictionary_1 = _registerName1("setDictionary:"); + late final _sel_setObject_forKeyedSubscript_1 = + _registerName1("setObject:forKeyedSubscript:"); + late final _sel_dictionaryWithCapacity_1 = + _registerName1("dictionaryWithCapacity:"); + ffi.Pointer _objc_msgSend_500( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ) { + return __objc_msgSend_500( + obj, + sel, + path, + ); + } + + late final __objc_msgSend_500Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_500 = __objc_msgSend_500Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + ffi.Pointer _objc_msgSend_501( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ) { + return __objc_msgSend_501( + obj, + sel, + url, + ); + } + + late final __objc_msgSend_501Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_501 = __objc_msgSend_501Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_dictionaryWithSharedKeySet_1 = + _registerName1("dictionaryWithSharedKeySet:"); + ffi.Pointer _objc_msgSend_502( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer keyset, + ) { + return __objc_msgSend_502( + obj, + sel, + keyset, + ); + } + + late final __objc_msgSend_502Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_502 = __objc_msgSend_502Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_threadDictionary1 = _registerName1("threadDictionary"); + ffi.Pointer _objc_msgSend_503( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_503( + obj, + sel, + ); + } + + late final __objc_msgSend_503Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_503 = __objc_msgSend_503Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_sleepUntilDate_1 = _registerName1("sleepUntilDate:"); + void _objc_msgSend_504( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer date, + ) { + return __objc_msgSend_504( + obj, + sel, + date, + ); + } + + late final __objc_msgSend_504Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_504 = __objc_msgSend_504Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_sleepForTimeInterval_1 = + _registerName1("sleepForTimeInterval:"); + void _objc_msgSend_505( + ffi.Pointer obj, + ffi.Pointer sel, + double ti, + ) { + return __objc_msgSend_505( + obj, + sel, + ti, + ); + } + + late final __objc_msgSend_505Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Double)>>('objc_msgSend'); + late final __objc_msgSend_505 = __objc_msgSend_505Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, double)>(); + + late final _sel_exit1 = _registerName1("exit"); + late final _sel_threadPriority1 = _registerName1("threadPriority"); + late final _sel_setThreadPriority_1 = _registerName1("setThreadPriority:"); + void _objc_msgSend_506( + ffi.Pointer obj, + ffi.Pointer sel, + double value, + ) { + return __objc_msgSend_506( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_506Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Double)>>('objc_msgSend'); + late final __objc_msgSend_506 = __objc_msgSend_506Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, double)>(); + + late final _sel_qualityOfService1 = _registerName1("qualityOfService"); + int _objc_msgSend_507( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_507( + obj, + sel, + ); + } + + late final __objc_msgSend_507Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_507 = __objc_msgSend_507Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setQualityOfService_1 = + _registerName1("setQualityOfService:"); + void _objc_msgSend_508( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_508( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_508Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_508 = __objc_msgSend_508Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_callStackReturnAddresses1 = + _registerName1("callStackReturnAddresses"); + late final _sel_callStackSymbols1 = _registerName1("callStackSymbols"); + late final _sel_setName_1 = _registerName1("setName:"); + void _objc_msgSend_509( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_509( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_509Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_509 = __objc_msgSend_509Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_stackSize1 = _registerName1("stackSize"); + late final _sel_setStackSize_1 = _registerName1("setStackSize:"); + late final _sel_isMainThread1 = _registerName1("isMainThread"); + late final _sel_mainThread1 = _registerName1("mainThread"); + late final _sel_initWithTarget_selector_object_1 = + _registerName1("initWithTarget:selector:object:"); + instancetype _objc_msgSend_510( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer target, + ffi.Pointer selector, + ffi.Pointer argument, + ) { + return __objc_msgSend_510( + obj, + sel, + target, + selector, + argument, + ); + } + + late final __objc_msgSend_510Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_510 = __objc_msgSend_510Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_initWithBlock_1 = _registerName1("initWithBlock:"); + instancetype _objc_msgSend_511( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_511( + obj, + sel, + block, + ); + } + + late final __objc_msgSend_511Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_511 = __objc_msgSend_511Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_isExecuting1 = _registerName1("isExecuting"); + late final _sel_isFinished1 = _registerName1("isFinished"); + late final _sel_isCancelled1 = _registerName1("isCancelled"); + late final _sel_cancel1 = _registerName1("cancel"); + late final _sel_start1 = _registerName1("start"); + late final _sel_main1 = _registerName1("main"); + late final _sel_performSelector_onThread_withObject_waitUntilDone_modes_1 = + _registerName1( + "performSelector:onThread:withObject:waitUntilDone:modes:"); + void _objc_msgSend_512( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aSelector, + ffi.Pointer thr, + ffi.Pointer arg, + bool wait, + ffi.Pointer array, + ) { + return __objc_msgSend_512( + obj, + sel, + aSelector, + thr, + arg, + wait, + array, + ); + } + + late final __objc_msgSend_512Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_512 = __objc_msgSend_512Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + bool, + ffi.Pointer)>(); + + late final _sel_performSelector_onThread_withObject_waitUntilDone_1 = + _registerName1("performSelector:onThread:withObject:waitUntilDone:"); + void _objc_msgSend_513( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aSelector, + ffi.Pointer thr, + ffi.Pointer arg, + bool wait, + ) { + return __objc_msgSend_513( + obj, + sel, + aSelector, + thr, + arg, + wait, + ); + } + + late final __objc_msgSend_513Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_513 = __objc_msgSend_513Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + bool)>(); + + late final _sel_performSelectorInBackground_withObject_1 = + _registerName1("performSelectorInBackground:withObject:"); + late final _sel_classForArchiver1 = _registerName1("classForArchiver"); + late final _class_NSArchiver1 = _getClass1("NSArchiver"); + late final _sel_archiverData1 = _registerName1("archiverData"); + ffi.Pointer _objc_msgSend_514( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_514( + obj, + sel, + ); + } + + late final __objc_msgSend_514Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_514 = __objc_msgSend_514Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_encodeClassName_intoClassName_1 = + _registerName1("encodeClassName:intoClassName:"); + void _objc_msgSend_515( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer trueName, + ffi.Pointer inArchiveName, + ) { + return __objc_msgSend_515( + obj, + sel, + trueName, + inArchiveName, + ); + } + + late final __objc_msgSend_515Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_515 = __objc_msgSend_515Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_classNameEncodedForTrueClassName_1 = + _registerName1("classNameEncodedForTrueClassName:"); + late final _sel_replaceObject_withObject_1 = + _registerName1("replaceObject:withObject:"); + late final _sel_replacementObjectForArchiver_1 = + _registerName1("replacementObjectForArchiver:"); + ffi.Pointer _objc_msgSend_516( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer archiver, + ) { + return __objc_msgSend_516( + obj, + sel, + archiver, + ); + } + + late final __objc_msgSend_516Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_516 = __objc_msgSend_516Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_classForPortCoder1 = _registerName1("classForPortCoder"); + late final _class_NSPortCoder1 = _getClass1("NSPortCoder"); + late final _sel_isBycopy1 = _registerName1("isBycopy"); + late final _sel_isByref1 = _registerName1("isByref"); + late final _class_NSPort1 = _getClass1("NSPort"); + ffi.Pointer _objc_msgSend_517( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_517( + obj, + sel, + ); + } + + late final __objc_msgSend_517Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_517 = __objc_msgSend_517Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_invalidate1 = _registerName1("invalidate"); + late final _sel_isValid1 = _registerName1("isValid"); + late final _class_NSRunLoop1 = _getClass1("NSRunLoop"); + late final _sel_currentRunLoop1 = _registerName1("currentRunLoop"); + ffi.Pointer _objc_msgSend_518( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_518( + obj, + sel, + ); + } + + late final __objc_msgSend_518Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_518 = __objc_msgSend_518Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_mainRunLoop1 = _registerName1("mainRunLoop"); + late final _sel_currentMode1 = _registerName1("currentMode"); + late final _sel_getCFRunLoop1 = _registerName1("getCFRunLoop"); + ffi.Pointer<__CFRunLoop> _objc_msgSend_519( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_519( + obj, + sel, + ); + } + + late final __objc_msgSend_519Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer<__CFRunLoop> Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_519 = __objc_msgSend_519Ptr.asFunction< + ffi.Pointer<__CFRunLoop> Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _class_NSTimer1 = _getClass1("NSTimer"); + late final _sel_timerWithTimeInterval_invocation_repeats_1 = + _registerName1("timerWithTimeInterval:invocation:repeats:"); + ffi.Pointer _objc_msgSend_520( + ffi.Pointer obj, + ffi.Pointer sel, + double ti, + ffi.Pointer invocation, + bool yesOrNo, + ) { + return __objc_msgSend_520( + obj, + sel, + ti, + invocation, + yesOrNo, + ); + } + + late final __objc_msgSend_520Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Double, + ffi.Pointer, + ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_520 = __objc_msgSend_520Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, double, ffi.Pointer, bool)>(); + + late final _sel_scheduledTimerWithTimeInterval_invocation_repeats_1 = + _registerName1("scheduledTimerWithTimeInterval:invocation:repeats:"); + late final _sel_timerWithTimeInterval_target_selector_userInfo_repeats_1 = + _registerName1("timerWithTimeInterval:target:selector:userInfo:repeats:"); + ffi.Pointer _objc_msgSend_521( + ffi.Pointer obj, + ffi.Pointer sel, + double ti, + ffi.Pointer aTarget, + ffi.Pointer aSelector, + ffi.Pointer userInfo, + bool yesOrNo, + ) { + return __objc_msgSend_521( + obj, + sel, + ti, + aTarget, + aSelector, + userInfo, + yesOrNo, + ); + } + + late final __objc_msgSend_521Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Double, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_521 = __objc_msgSend_521Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + double, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + bool)>(); + + late final _sel_scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_1 = + _registerName1( + "scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:"); + late final _sel_timerWithTimeInterval_repeats_block_1 = + _registerName1("timerWithTimeInterval:repeats:block:"); + ffi.Pointer _objc_msgSend_522( + ffi.Pointer obj, + ffi.Pointer sel, + double interval, + bool repeats, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_522( + obj, + sel, + interval, + repeats, + block, + ); + } + + late final __objc_msgSend_522Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Double, + ffi.Bool, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_522 = __objc_msgSend_522Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, double, bool, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_scheduledTimerWithTimeInterval_repeats_block_1 = + _registerName1("scheduledTimerWithTimeInterval:repeats:block:"); + late final _sel_initWithFireDate_interval_repeats_block_1 = + _registerName1("initWithFireDate:interval:repeats:block:"); + instancetype _objc_msgSend_523( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer date, + double interval, + bool repeats, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_523( + obj, + sel, + date, + interval, + repeats, + block, + ); + } + + late final __objc_msgSend_523Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Double, + ffi.Bool, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_523 = __objc_msgSend_523Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, double, bool, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_initWithFireDate_interval_target_selector_userInfo_repeats_1 = + _registerName1( + "initWithFireDate:interval:target:selector:userInfo:repeats:"); + instancetype _objc_msgSend_524( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer date, + double ti, + ffi.Pointer t, + ffi.Pointer s, + ffi.Pointer ui, + bool rep, + ) { + return __objc_msgSend_524( + obj, + sel, + date, + ti, + t, + s, + ui, + rep, + ); + } + + late final __objc_msgSend_524Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Double, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_524 = __objc_msgSend_524Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + double, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + bool)>(); + + late final _sel_fire1 = _registerName1("fire"); + late final _sel_fireDate1 = _registerName1("fireDate"); + late final _sel_setFireDate_1 = _registerName1("setFireDate:"); + void _objc_msgSend_525( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_525( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_525Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_525 = __objc_msgSend_525Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_timeInterval1 = _registerName1("timeInterval"); + late final _sel_tolerance1 = _registerName1("tolerance"); + late final _sel_setTolerance_1 = _registerName1("setTolerance:"); + late final _sel_addTimer_forMode_1 = _registerName1("addTimer:forMode:"); + void _objc_msgSend_526( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer timer, + ffi.Pointer mode, + ) { + return __objc_msgSend_526( + obj, + sel, + timer, + mode, + ); + } + + late final __objc_msgSend_526Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_526 = __objc_msgSend_526Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_addPort_forMode_1 = _registerName1("addPort:forMode:"); + void _objc_msgSend_527( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aPort, + ffi.Pointer mode, + ) { + return __objc_msgSend_527( + obj, + sel, + aPort, + mode, + ); + } + + late final __objc_msgSend_527Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_527 = __objc_msgSend_527Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_removePort_forMode_1 = _registerName1("removePort:forMode:"); + late final _sel_limitDateForMode_1 = _registerName1("limitDateForMode:"); + ffi.Pointer _objc_msgSend_528( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer mode, + ) { + return __objc_msgSend_528( + obj, + sel, + mode, + ); + } + + late final __objc_msgSend_528Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_528 = __objc_msgSend_528Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_acceptInputForMode_beforeDate_1 = + _registerName1("acceptInputForMode:beforeDate:"); + void _objc_msgSend_529( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer mode, + ffi.Pointer limitDate, + ) { + return __objc_msgSend_529( + obj, + sel, + mode, + limitDate, + ); + } + + late final __objc_msgSend_529Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_529 = __objc_msgSend_529Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_run1 = _registerName1("run"); + late final _sel_runUntilDate_1 = _registerName1("runUntilDate:"); + late final _sel_runMode_beforeDate_1 = _registerName1("runMode:beforeDate:"); + bool _objc_msgSend_530( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer mode, + ffi.Pointer limitDate, + ) { + return __objc_msgSend_530( + obj, + sel, + mode, + limitDate, + ); + } + + late final __objc_msgSend_530Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_530 = __objc_msgSend_530Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_configureAsServer1 = _registerName1("configureAsServer"); + late final _sel_performInModes_block_1 = + _registerName1("performInModes:block:"); + void _objc_msgSend_531( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer modes, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_531( + obj, + sel, + modes, + block, + ); + } + + late final __objc_msgSend_531Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_531 = __objc_msgSend_531Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_performBlock_1 = _registerName1("performBlock:"); + late final _sel_performSelector_target_argument_order_modes_1 = + _registerName1("performSelector:target:argument:order:modes:"); + void _objc_msgSend_532( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aSelector, + ffi.Pointer target, + ffi.Pointer arg, + int order, + ffi.Pointer modes, + ) { + return __objc_msgSend_532( + obj, + sel, + aSelector, + target, + arg, + order, + modes, + ); + } + + late final __objc_msgSend_532Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_532 = __objc_msgSend_532Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer)>(); + + late final _sel_cancelPerformSelector_target_argument_1 = + _registerName1("cancelPerformSelector:target:argument:"); + late final _sel_cancelPerformSelectorsWithTarget_1 = + _registerName1("cancelPerformSelectorsWithTarget:"); + late final _sel_scheduleInRunLoop_forMode_1 = + _registerName1("scheduleInRunLoop:forMode:"); + void _objc_msgSend_533( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer runLoop, + ffi.Pointer mode, + ) { + return __objc_msgSend_533( + obj, + sel, + runLoop, + mode, + ); + } + + late final __objc_msgSend_533Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_533 = __objc_msgSend_533Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_removeFromRunLoop_forMode_1 = + _registerName1("removeFromRunLoop:forMode:"); + late final _sel_reservedSpaceLength1 = _registerName1("reservedSpaceLength"); + late final _sel_sendBeforeDate_components_from_reserved_1 = + _registerName1("sendBeforeDate:components:from:reserved:"); + bool _objc_msgSend_534( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer limitDate, + ffi.Pointer components, + ffi.Pointer receivePort, + int headerSpaceReserved, + ) { + return __objc_msgSend_534( + obj, + sel, + limitDate, + components, + receivePort, + headerSpaceReserved, + ); + } + + late final __objc_msgSend_534Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_534 = __objc_msgSend_534Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int)>(); + + late final _sel_sendBeforeDate_msgid_components_from_reserved_1 = + _registerName1("sendBeforeDate:msgid:components:from:reserved:"); + bool _objc_msgSend_535( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer limitDate, + int msgID, + ffi.Pointer components, + ffi.Pointer receivePort, + int headerSpaceReserved, + ) { + return __objc_msgSend_535( + obj, + sel, + limitDate, + msgID, + components, + receivePort, + headerSpaceReserved, + ); + } + + late final __objc_msgSend_535Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_535 = __objc_msgSend_535Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer, + ffi.Pointer, + int)>(); + + late final _class_NSConnection1 = _getClass1("NSConnection"); + late final _sel_statistics1 = _registerName1("statistics"); + late final _sel_allConnections1 = _registerName1("allConnections"); + late final _sel_defaultConnection1 = _registerName1("defaultConnection"); + ffi.Pointer _objc_msgSend_536( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_536( + obj, + sel, + ); + } + + late final __objc_msgSend_536Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_536 = __objc_msgSend_536Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_connectionWithRegisteredName_host_1 = + _registerName1("connectionWithRegisteredName:host:"); + late final _class_NSPortNameServer1 = _getClass1("NSPortNameServer"); + late final _sel_systemDefaultPortNameServer1 = + _registerName1("systemDefaultPortNameServer"); + ffi.Pointer _objc_msgSend_537( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_537( + obj, + sel, + ); + } + + late final __objc_msgSend_537Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_537 = __objc_msgSend_537Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_portForName_1 = _registerName1("portForName:"); + ffi.Pointer _objc_msgSend_538( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + ) { + return __objc_msgSend_538( + obj, + sel, + name, + ); + } + + late final __objc_msgSend_538Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_538 = __objc_msgSend_538Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_portForName_host_1 = _registerName1("portForName:host:"); + ffi.Pointer _objc_msgSend_539( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + ffi.Pointer host, + ) { + return __objc_msgSend_539( + obj, + sel, + name, + host, + ); + } + + late final __objc_msgSend_539Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_539 = __objc_msgSend_539Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_registerPort_name_1 = _registerName1("registerPort:name:"); + bool _objc_msgSend_540( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer port, + ffi.Pointer name, + ) { + return __objc_msgSend_540( + obj, + sel, + port, + name, + ); + } + + late final __objc_msgSend_540Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_540 = __objc_msgSend_540Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_removePortForName_1 = _registerName1("removePortForName:"); + late final _sel_connectionWithRegisteredName_host_usingNameServer_1 = + _registerName1("connectionWithRegisteredName:host:usingNameServer:"); + instancetype _objc_msgSend_541( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + ffi.Pointer hostName, + ffi.Pointer server, + ) { + return __objc_msgSend_541( + obj, + sel, + name, + hostName, + server, + ); + } + + late final __objc_msgSend_541Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_541 = __objc_msgSend_541Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _class_NSDistantObject1 = _getClass1("NSDistantObject"); + late final _class_NSProxy1 = _getClass1("NSProxy"); + late final _sel_respondsToSelector_1 = _registerName1("respondsToSelector:"); + late final _sel_proxyWithTarget_connection_1 = + _registerName1("proxyWithTarget:connection:"); + ffi.Pointer _objc_msgSend_542( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer target, + ffi.Pointer connection, + ) { + return __objc_msgSend_542( + obj, + sel, + target, + connection, + ); + } + + late final __objc_msgSend_542Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_542 = __objc_msgSend_542Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_initWithTarget_connection_1 = + _registerName1("initWithTarget:connection:"); + late final _sel_proxyWithLocal_connection_1 = + _registerName1("proxyWithLocal:connection:"); + late final _sel_initWithLocal_connection_1 = + _registerName1("initWithLocal:connection:"); + late final _sel_setProtocolForProxy_1 = + _registerName1("setProtocolForProxy:"); + void _objc_msgSend_543( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer proto, + ) { + return __objc_msgSend_543( + obj, + sel, + proto, + ); + } + + late final __objc_msgSend_543Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_543 = __objc_msgSend_543Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_connectionForProxy1 = _registerName1("connectionForProxy"); + late final _sel_rootProxyForConnectionWithRegisteredName_host_1 = + _registerName1("rootProxyForConnectionWithRegisteredName:host:"); + ffi.Pointer _objc_msgSend_544( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + ffi.Pointer hostName, + ) { + return __objc_msgSend_544( + obj, + sel, + name, + hostName, + ); + } + + late final __objc_msgSend_544Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_544 = __objc_msgSend_544Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_rootProxyForConnectionWithRegisteredName_host_usingNameServer_1 = + _registerName1( + "rootProxyForConnectionWithRegisteredName:host:usingNameServer:"); + ffi.Pointer _objc_msgSend_545( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + ffi.Pointer hostName, + ffi.Pointer server, + ) { + return __objc_msgSend_545( + obj, + sel, + name, + hostName, + server, + ); + } + + late final __objc_msgSend_545Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_545 = __objc_msgSend_545Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_serviceConnectionWithName_rootObject_usingNameServer_1 = + _registerName1("serviceConnectionWithName:rootObject:usingNameServer:"); + instancetype _objc_msgSend_546( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + ffi.Pointer root, + ffi.Pointer server, + ) { + return __objc_msgSend_546( + obj, + sel, + name, + root, + server, + ); + } + + late final __objc_msgSend_546Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_546 = __objc_msgSend_546Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_serviceConnectionWithName_rootObject_1 = + _registerName1("serviceConnectionWithName:rootObject:"); + late final _sel_requestTimeout1 = _registerName1("requestTimeout"); + late final _sel_setRequestTimeout_1 = _registerName1("setRequestTimeout:"); + late final _sel_replyTimeout1 = _registerName1("replyTimeout"); + late final _sel_setReplyTimeout_1 = _registerName1("setReplyTimeout:"); + late final _sel_rootObject1 = _registerName1("rootObject"); + late final _sel_setRootObject_1 = _registerName1("setRootObject:"); + late final _sel_independentConversationQueueing1 = + _registerName1("independentConversationQueueing"); + late final _sel_setIndependentConversationQueueing_1 = + _registerName1("setIndependentConversationQueueing:"); + late final _sel_rootProxy1 = _registerName1("rootProxy"); + ffi.Pointer _objc_msgSend_547( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_547( + obj, + sel, + ); + } + + late final __objc_msgSend_547Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_547 = __objc_msgSend_547Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_addRequestMode_1 = _registerName1("addRequestMode:"); + late final _sel_removeRequestMode_1 = _registerName1("removeRequestMode:"); + late final _sel_requestModes1 = _registerName1("requestModes"); + late final _sel_registerName_1 = _registerName1("registerName:"); + late final _sel_registerName_withNameServer_1 = + _registerName1("registerName:withNameServer:"); + bool _objc_msgSend_548( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + ffi.Pointer server, + ) { + return __objc_msgSend_548( + obj, + sel, + name, + server, + ); + } + + late final __objc_msgSend_548Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_548 = __objc_msgSend_548Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_connectionWithReceivePort_sendPort_1 = + _registerName1("connectionWithReceivePort:sendPort:"); + instancetype _objc_msgSend_549( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer receivePort, + ffi.Pointer sendPort, + ) { + return __objc_msgSend_549( + obj, + sel, + receivePort, + sendPort, + ); + } + + late final __objc_msgSend_549Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_549 = __objc_msgSend_549Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_currentConversation1 = _registerName1("currentConversation"); + late final _sel_initWithReceivePort_sendPort_1 = + _registerName1("initWithReceivePort:sendPort:"); + late final _sel_sendPort1 = _registerName1("sendPort"); + late final _sel_receivePort1 = _registerName1("receivePort"); + late final _sel_enableMultipleThreads1 = + _registerName1("enableMultipleThreads"); + late final _sel_multipleThreadsEnabled1 = + _registerName1("multipleThreadsEnabled"); + late final _sel_addRunLoop_1 = _registerName1("addRunLoop:"); + void _objc_msgSend_550( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer runloop, + ) { + return __objc_msgSend_550( + obj, + sel, + runloop, + ); + } + + late final __objc_msgSend_550Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_550 = __objc_msgSend_550Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_removeRunLoop_1 = _registerName1("removeRunLoop:"); + late final _sel_runInNewThread1 = _registerName1("runInNewThread"); + late final _sel_remoteObjects1 = _registerName1("remoteObjects"); + late final _sel_localObjects1 = _registerName1("localObjects"); + late final _sel_dispatchWithComponents_1 = + _registerName1("dispatchWithComponents:"); + late final _sel_addConnection_toRunLoop_forMode_1 = + _registerName1("addConnection:toRunLoop:forMode:"); + void _objc_msgSend_551( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer conn, + ffi.Pointer runLoop, + ffi.Pointer mode, + ) { + return __objc_msgSend_551( + obj, + sel, + conn, + runLoop, + mode, + ); + } + + late final __objc_msgSend_551Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_551 = __objc_msgSend_551Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_removeConnection_fromRunLoop_forMode_1 = + _registerName1("removeConnection:fromRunLoop:forMode:"); + late final _sel_encodePortObject_1 = _registerName1("encodePortObject:"); + void _objc_msgSend_552( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aport, + ) { + return __objc_msgSend_552( + obj, + sel, + aport, + ); + } + + late final __objc_msgSend_552Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_552 = __objc_msgSend_552Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_decodePortObject1 = _registerName1("decodePortObject"); + late final _sel_connection1 = _registerName1("connection"); + late final _sel_portCoderWithReceivePort_sendPort_components_1 = + _registerName1("portCoderWithReceivePort:sendPort:components:"); + ffi.Pointer _objc_msgSend_553( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer rcvPort, + ffi.Pointer sndPort, + ffi.Pointer comps, + ) { + return __objc_msgSend_553( + obj, + sel, + rcvPort, + sndPort, + comps, + ); + } + + late final __objc_msgSend_553Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_553 = __objc_msgSend_553Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_initWithReceivePort_sendPort_components_1 = + _registerName1("initWithReceivePort:sendPort:components:"); + late final _sel_dispatch1 = _registerName1("dispatch"); + late final _sel_replacementObjectForPortCoder_1 = + _registerName1("replacementObjectForPortCoder:"); + ffi.Pointer _objc_msgSend_554( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer coder, + ) { + return __objc_msgSend_554( + obj, + sel, + coder, + ); + } + + late final __objc_msgSend_554Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_554 = __objc_msgSend_554Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _class_NSClassDescription1 = _getClass1("NSClassDescription"); + late final _sel_registerClassDescription_forClass_1 = + _registerName1("registerClassDescription:forClass:"); + void _objc_msgSend_555( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer description, + ffi.Pointer aClass, + ) { + return __objc_msgSend_555( + obj, + sel, + description, + aClass, + ); + } + + late final __objc_msgSend_555Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_555 = __objc_msgSend_555Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_invalidateClassDescriptionCache1 = + _registerName1("invalidateClassDescriptionCache"); + late final _sel_classDescriptionForClass_1 = + _registerName1("classDescriptionForClass:"); + ffi.Pointer _objc_msgSend_556( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aClass, + ) { + return __objc_msgSend_556( + obj, + sel, + aClass, + ); + } + + late final __objc_msgSend_556Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_556 = __objc_msgSend_556Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_attributeKeys1 = _registerName1("attributeKeys"); + late final _sel_toOneRelationshipKeys1 = + _registerName1("toOneRelationshipKeys"); + late final _sel_toManyRelationshipKeys1 = + _registerName1("toManyRelationshipKeys"); + late final _sel_inverseForRelationshipKey_1 = + _registerName1("inverseForRelationshipKey:"); + late final _sel_classDescription1 = _registerName1("classDescription"); + ffi.Pointer _objc_msgSend_557( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_557( + obj, + sel, + ); + } + + late final __objc_msgSend_557Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_557 = __objc_msgSend_557Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _class_NSScriptObjectSpecifier1 = + _getClass1("NSScriptObjectSpecifier"); + late final _class_NSAppleEventDescriptor1 = + _getClass1("NSAppleEventDescriptor"); + late final _sel_nullDescriptor1 = _registerName1("nullDescriptor"); + ffi.Pointer _objc_msgSend_558( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_558( + obj, + sel, + ); + } + + late final __objc_msgSend_558Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_558 = __objc_msgSend_558Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_descriptorWithDescriptorType_bytes_length_1 = + _registerName1("descriptorWithDescriptorType:bytes:length:"); + ffi.Pointer _objc_msgSend_559( + ffi.Pointer obj, + ffi.Pointer sel, + int descriptorType, + ffi.Pointer bytes, + int byteCount, + ) { + return __objc_msgSend_559( + obj, + sel, + descriptorType, + bytes, + byteCount, + ); + } + + late final __objc_msgSend_559Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedInt, + ffi.Pointer, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_559 = __objc_msgSend_559Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, ffi.Pointer, int)>(); + + late final _sel_descriptorWithDescriptorType_data_1 = + _registerName1("descriptorWithDescriptorType:data:"); + ffi.Pointer _objc_msgSend_560( + ffi.Pointer obj, + ffi.Pointer sel, + int descriptorType, + ffi.Pointer data, + ) { + return __objc_msgSend_560( + obj, + sel, + descriptorType, + data, + ); + } + + late final __objc_msgSend_560Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedInt, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_560 = __objc_msgSend_560Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, ffi.Pointer)>(); + + late final _sel_descriptorWithBoolean_1 = + _registerName1("descriptorWithBoolean:"); + ffi.Pointer _objc_msgSend_561( + ffi.Pointer obj, + ffi.Pointer sel, + int boolean, + ) { + return __objc_msgSend_561( + obj, + sel, + boolean, + ); + } + + late final __objc_msgSend_561Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.UnsignedChar)>>('objc_msgSend'); + late final __objc_msgSend_561 = __objc_msgSend_561Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_descriptorWithEnumCode_1 = + _registerName1("descriptorWithEnumCode:"); + ffi.Pointer _objc_msgSend_562( + ffi.Pointer obj, + ffi.Pointer sel, + int enumerator, + ) { + return __objc_msgSend_562( + obj, + sel, + enumerator, + ); + } + + late final __objc_msgSend_562Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.UnsignedInt)>>('objc_msgSend'); + late final __objc_msgSend_562 = __objc_msgSend_562Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_descriptorWithInt32_1 = + _registerName1("descriptorWithInt32:"); + ffi.Pointer _objc_msgSend_563( + ffi.Pointer obj, + ffi.Pointer sel, + int signedInt, + ) { + return __objc_msgSend_563( + obj, + sel, + signedInt, + ); + } + + late final __objc_msgSend_563Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Int)>>('objc_msgSend'); + late final __objc_msgSend_563 = __objc_msgSend_563Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_descriptorWithDouble_1 = + _registerName1("descriptorWithDouble:"); + ffi.Pointer _objc_msgSend_564( + ffi.Pointer obj, + ffi.Pointer sel, + double doubleValue, + ) { + return __objc_msgSend_564( + obj, + sel, + doubleValue, + ); + } + + late final __objc_msgSend_564Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Double)>>('objc_msgSend'); + late final __objc_msgSend_564 = __objc_msgSend_564Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, double)>(); + + late final _sel_descriptorWithTypeCode_1 = + _registerName1("descriptorWithTypeCode:"); + late final _sel_descriptorWithString_1 = + _registerName1("descriptorWithString:"); + ffi.Pointer _objc_msgSend_565( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer string, + ) { + return __objc_msgSend_565( + obj, + sel, + string, + ); + } + + late final __objc_msgSend_565Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_565 = __objc_msgSend_565Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_descriptorWithDate_1 = _registerName1("descriptorWithDate:"); + ffi.Pointer _objc_msgSend_566( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer date, + ) { + return __objc_msgSend_566( + obj, + sel, + date, + ); + } + + late final __objc_msgSend_566Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_566 = __objc_msgSend_566Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_descriptorWithFileURL_1 = + _registerName1("descriptorWithFileURL:"); + ffi.Pointer _objc_msgSend_567( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer fileURL, + ) { + return __objc_msgSend_567( + obj, + sel, + fileURL, + ); + } + + late final __objc_msgSend_567Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_567 = __objc_msgSend_567Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_appleEventWithEventClass_eventID_targetDescriptor_returnID_transactionID_1 = + _registerName1( + "appleEventWithEventClass:eventID:targetDescriptor:returnID:transactionID:"); + ffi.Pointer _objc_msgSend_568( + ffi.Pointer obj, + ffi.Pointer sel, + int eventClass, + int eventID, + ffi.Pointer targetDescriptor, + int returnID, + int transactionID, + ) { + return __objc_msgSend_568( + obj, + sel, + eventClass, + eventID, + targetDescriptor, + returnID, + transactionID, + ); + } + + late final __objc_msgSend_568Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedInt, + ffi.UnsignedInt, + ffi.Pointer, + ffi.Short, + ffi.Int)>>('objc_msgSend'); + late final __objc_msgSend_568 = __objc_msgSend_568Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, int, ffi.Pointer, int, int)>(); + + late final _sel_listDescriptor1 = _registerName1("listDescriptor"); + late final _sel_recordDescriptor1 = _registerName1("recordDescriptor"); + late final _sel_currentProcessDescriptor1 = + _registerName1("currentProcessDescriptor"); + late final _sel_descriptorWithProcessIdentifier_1 = + _registerName1("descriptorWithProcessIdentifier:"); + late final _sel_descriptorWithBundleIdentifier_1 = + _registerName1("descriptorWithBundleIdentifier:"); + late final _sel_descriptorWithApplicationURL_1 = + _registerName1("descriptorWithApplicationURL:"); + late final _sel_initWithAEDescNoCopy_1 = + _registerName1("initWithAEDescNoCopy:"); + instancetype _objc_msgSend_569( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aeDesc, + ) { + return __objc_msgSend_569( + obj, + sel, + aeDesc, + ); + } + + late final __objc_msgSend_569Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_569 = __objc_msgSend_569Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_initWithDescriptorType_bytes_length_1 = + _registerName1("initWithDescriptorType:bytes:length:"); + instancetype _objc_msgSend_570( + ffi.Pointer obj, + ffi.Pointer sel, + int descriptorType, + ffi.Pointer bytes, + int byteCount, + ) { + return __objc_msgSend_570( + obj, + sel, + descriptorType, + bytes, + byteCount, + ); + } + + late final __objc_msgSend_570Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedInt, + ffi.Pointer, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_570 = __objc_msgSend_570Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer, int)>(); + + late final _sel_initWithDescriptorType_data_1 = + _registerName1("initWithDescriptorType:data:"); + instancetype _objc_msgSend_571( + ffi.Pointer obj, + ffi.Pointer sel, + int descriptorType, + ffi.Pointer data, + ) { + return __objc_msgSend_571( + obj, + sel, + descriptorType, + data, + ); + } + + late final __objc_msgSend_571Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.UnsignedInt, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_571 = __objc_msgSend_571Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer)>(); + + late final _sel_initWithEventClass_eventID_targetDescriptor_returnID_transactionID_1 = + _registerName1( + "initWithEventClass:eventID:targetDescriptor:returnID:transactionID:"); + instancetype _objc_msgSend_572( + ffi.Pointer obj, + ffi.Pointer sel, + int eventClass, + int eventID, + ffi.Pointer targetDescriptor, + int returnID, + int transactionID, + ) { + return __objc_msgSend_572( + obj, + sel, + eventClass, + eventID, + targetDescriptor, + returnID, + transactionID, + ); + } + + late final __objc_msgSend_572Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedInt, + ffi.UnsignedInt, + ffi.Pointer, + ffi.Short, + ffi.Int)>>('objc_msgSend'); + late final __objc_msgSend_572 = __objc_msgSend_572Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, int, + int, ffi.Pointer, int, int)>(); + + late final _sel_initListDescriptor1 = _registerName1("initListDescriptor"); + late final _sel_initRecordDescriptor1 = + _registerName1("initRecordDescriptor"); + late final _sel_aeDesc1 = _registerName1("aeDesc"); + ffi.Pointer _objc_msgSend_573( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_573( + obj, + sel, + ); + } + + late final __objc_msgSend_573Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_573 = __objc_msgSend_573Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_descriptorType1 = _registerName1("descriptorType"); + late final _sel_booleanValue1 = _registerName1("booleanValue"); + late final _sel_enumCodeValue1 = _registerName1("enumCodeValue"); + late final _sel_int32Value1 = _registerName1("int32Value"); + late final _sel_typeCodeValue1 = _registerName1("typeCodeValue"); + late final _sel_dateValue1 = _registerName1("dateValue"); + late final _sel_fileURLValue1 = _registerName1("fileURLValue"); + late final _sel_eventClass1 = _registerName1("eventClass"); + late final _sel_eventID1 = _registerName1("eventID"); + late final _sel_returnID1 = _registerName1("returnID"); + late final _sel_transactionID1 = _registerName1("transactionID"); + late final _sel_setParamDescriptor_forKeyword_1 = + _registerName1("setParamDescriptor:forKeyword:"); + void _objc_msgSend_574( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer descriptor, + int keyword, + ) { + return __objc_msgSend_574( + obj, + sel, + descriptor, + keyword, + ); + } + + late final __objc_msgSend_574Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.UnsignedInt)>>('objc_msgSend'); + late final __objc_msgSend_574 = __objc_msgSend_574Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_paramDescriptorForKeyword_1 = + _registerName1("paramDescriptorForKeyword:"); + late final _sel_removeParamDescriptorWithKeyword_1 = + _registerName1("removeParamDescriptorWithKeyword:"); + void _objc_msgSend_575( + ffi.Pointer obj, + ffi.Pointer sel, + int keyword, + ) { + return __objc_msgSend_575( + obj, + sel, + keyword, + ); + } + + late final __objc_msgSend_575Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.UnsignedInt)>>('objc_msgSend'); + late final __objc_msgSend_575 = __objc_msgSend_575Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_setAttributeDescriptor_forKeyword_1 = + _registerName1("setAttributeDescriptor:forKeyword:"); + late final _sel_attributeDescriptorForKeyword_1 = + _registerName1("attributeDescriptorForKeyword:"); + late final _sel_sendEventWithOptions_timeout_error_1 = + _registerName1("sendEventWithOptions:timeout:error:"); + ffi.Pointer _objc_msgSend_576( + ffi.Pointer obj, + ffi.Pointer sel, + int sendOptions, + double timeoutInSeconds, + ffi.Pointer> error, + ) { + return __objc_msgSend_576( + obj, + sel, + sendOptions, + timeoutInSeconds, + error, + ); + } + + late final __objc_msgSend_576Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Double, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_576 = __objc_msgSend_576Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + int, + double, + ffi.Pointer>)>(); + + late final _sel_isRecordDescriptor1 = _registerName1("isRecordDescriptor"); + late final _sel_numberOfItems1 = _registerName1("numberOfItems"); + late final _sel_insertDescriptor_atIndex_1 = + _registerName1("insertDescriptor:atIndex:"); + void _objc_msgSend_577( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer descriptor, + int index, + ) { + return __objc_msgSend_577( + obj, + sel, + descriptor, + index, + ); + } + + late final __objc_msgSend_577Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Long)>>('objc_msgSend'); + late final __objc_msgSend_577 = __objc_msgSend_577Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_descriptorAtIndex_1 = _registerName1("descriptorAtIndex:"); + ffi.Pointer _objc_msgSend_578( + ffi.Pointer obj, + ffi.Pointer sel, + int index, + ) { + return __objc_msgSend_578( + obj, + sel, + index, + ); + } + + late final __objc_msgSend_578Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Long)>>('objc_msgSend'); + late final __objc_msgSend_578 = __objc_msgSend_578Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_removeDescriptorAtIndex_1 = + _registerName1("removeDescriptorAtIndex:"); + late final _sel_setDescriptor_forKeyword_1 = + _registerName1("setDescriptor:forKeyword:"); + late final _sel_descriptorForKeyword_1 = + _registerName1("descriptorForKeyword:"); + late final _sel_removeDescriptorWithKeyword_1 = + _registerName1("removeDescriptorWithKeyword:"); + late final _sel_keywordForDescriptorAtIndex_1 = + _registerName1("keywordForDescriptorAtIndex:"); + int _objc_msgSend_579( + ffi.Pointer obj, + ffi.Pointer sel, + int index, + ) { + return __objc_msgSend_579( + obj, + sel, + index, + ); + } + + late final __objc_msgSend_579Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedInt Function(ffi.Pointer, + ffi.Pointer, ffi.Long)>>('objc_msgSend'); + late final __objc_msgSend_579 = __objc_msgSend_579Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_coerceToDescriptorType_1 = + _registerName1("coerceToDescriptorType:"); + late final _sel_objectSpecifierWithDescriptor_1 = + _registerName1("objectSpecifierWithDescriptor:"); + ffi.Pointer _objc_msgSend_580( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer descriptor, + ) { + return __objc_msgSend_580( + obj, + sel, + descriptor, + ); + } + + late final __objc_msgSend_580Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_580 = __objc_msgSend_580Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_initWithContainerSpecifier_key_1 = + _registerName1("initWithContainerSpecifier:key:"); + instancetype _objc_msgSend_581( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer container, + ffi.Pointer property, + ) { + return __objc_msgSend_581( + obj, + sel, + container, + property, + ); + } + + late final __objc_msgSend_581Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_581 = __objc_msgSend_581Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _class_NSScriptClassDescription1 = + _getClass1("NSScriptClassDescription"); + ffi.Pointer _objc_msgSend_582( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aClass, + ) { + return __objc_msgSend_582( + obj, + sel, + aClass, + ); + } + + late final __objc_msgSend_582Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_582 = __objc_msgSend_582Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_initWithSuiteName_className_dictionary_1 = + _registerName1("initWithSuiteName:className:dictionary:"); + instancetype _objc_msgSend_583( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer suiteName, + ffi.Pointer className, + ffi.Pointer classDeclaration, + ) { + return __objc_msgSend_583( + obj, + sel, + suiteName, + className, + classDeclaration, + ); + } + + late final __objc_msgSend_583Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_583 = __objc_msgSend_583Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_suiteName1 = _registerName1("suiteName"); + late final _sel_className1 = _registerName1("className"); + late final _sel_implementationClassName1 = + _registerName1("implementationClassName"); + late final _sel_superclassDescription1 = + _registerName1("superclassDescription"); + ffi.Pointer _objc_msgSend_584( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_584( + obj, + sel, + ); + } + + late final __objc_msgSend_584Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_584 = __objc_msgSend_584Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_appleEventCode1 = _registerName1("appleEventCode"); + late final _sel_matchesAppleEventCode_1 = + _registerName1("matchesAppleEventCode:"); + late final _class_NSScriptCommandDescription1 = + _getClass1("NSScriptCommandDescription"); + late final _sel_initWithSuiteName_commandName_dictionary_1 = + _registerName1("initWithSuiteName:commandName:dictionary:"); + late final _sel_commandName1 = _registerName1("commandName"); + late final _sel_appleEventClassCode1 = _registerName1("appleEventClassCode"); + late final _sel_commandClassName1 = _registerName1("commandClassName"); + late final _sel_returnType1 = _registerName1("returnType"); + late final _sel_appleEventCodeForReturnType1 = + _registerName1("appleEventCodeForReturnType"); + late final _sel_argumentNames1 = _registerName1("argumentNames"); + late final _sel_typeForArgumentWithName_1 = + _registerName1("typeForArgumentWithName:"); + late final _sel_appleEventCodeForArgumentWithName_1 = + _registerName1("appleEventCodeForArgumentWithName:"); + int _objc_msgSend_585( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer argumentName, + ) { + return __objc_msgSend_585( + obj, + sel, + argumentName, + ); + } + + late final __objc_msgSend_585Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedInt Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_585 = __objc_msgSend_585Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_isOptionalArgumentWithName_1 = + _registerName1("isOptionalArgumentWithName:"); + late final _class_NSScriptCommand1 = _getClass1("NSScriptCommand"); + late final _sel_initWithCommandDescription_1 = + _registerName1("initWithCommandDescription:"); + instancetype _objc_msgSend_586( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer commandDef, + ) { + return __objc_msgSend_586( + obj, + sel, + commandDef, + ); + } + + late final __objc_msgSend_586Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_586 = __objc_msgSend_586Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_commandDescription1 = _registerName1("commandDescription"); + ffi.Pointer _objc_msgSend_587( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_587( + obj, + sel, + ); + } + + late final __objc_msgSend_587Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_587 = __objc_msgSend_587Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_directParameter1 = _registerName1("directParameter"); + late final _sel_setDirectParameter_1 = _registerName1("setDirectParameter:"); + late final _sel_receiversSpecifier1 = _registerName1("receiversSpecifier"); + ffi.Pointer _objc_msgSend_588( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_588( + obj, + sel, + ); + } + + late final __objc_msgSend_588Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_588 = __objc_msgSend_588Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setReceiversSpecifier_1 = + _registerName1("setReceiversSpecifier:"); + void _objc_msgSend_589( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_589( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_589Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_589 = __objc_msgSend_589Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_evaluatedReceivers1 = _registerName1("evaluatedReceivers"); + late final _sel_arguments1 = _registerName1("arguments"); + late final _sel_setArguments_1 = _registerName1("setArguments:"); + late final _sel_evaluatedArguments1 = _registerName1("evaluatedArguments"); + late final _sel_isWellFormed1 = _registerName1("isWellFormed"); + late final _sel_performDefaultImplementation1 = + _registerName1("performDefaultImplementation"); + late final _sel_executeCommand1 = _registerName1("executeCommand"); + late final _sel_scriptErrorNumber1 = _registerName1("scriptErrorNumber"); + late final _sel_setScriptErrorNumber_1 = + _registerName1("setScriptErrorNumber:"); + void _objc_msgSend_590( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_590( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_590Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Long)>>('objc_msgSend'); + late final __objc_msgSend_590 = __objc_msgSend_590Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_scriptErrorOffendingObjectDescriptor1 = + _registerName1("scriptErrorOffendingObjectDescriptor"); + late final _sel_setScriptErrorOffendingObjectDescriptor_1 = + _registerName1("setScriptErrorOffendingObjectDescriptor:"); + void _objc_msgSend_591( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_591( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_591Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_591 = __objc_msgSend_591Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_scriptErrorExpectedTypeDescriptor1 = + _registerName1("scriptErrorExpectedTypeDescriptor"); + late final _sel_setScriptErrorExpectedTypeDescriptor_1 = + _registerName1("setScriptErrorExpectedTypeDescriptor:"); + late final _sel_scriptErrorString1 = _registerName1("scriptErrorString"); + late final _sel_setScriptErrorString_1 = + _registerName1("setScriptErrorString:"); + late final _sel_currentCommand1 = _registerName1("currentCommand"); + ffi.Pointer _objc_msgSend_592( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_592( + obj, + sel, + ); + } + + late final __objc_msgSend_592Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_592 = __objc_msgSend_592Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_appleEvent1 = _registerName1("appleEvent"); + late final _sel_suspendExecution1 = _registerName1("suspendExecution"); + late final _sel_resumeExecutionWithResult_1 = + _registerName1("resumeExecutionWithResult:"); + late final _sel_createCommandInstance1 = + _registerName1("createCommandInstance"); + late final _sel_createCommandInstanceWithZone_1 = + _registerName1("createCommandInstanceWithZone:"); + ffi.Pointer _objc_msgSend_593( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_NSZone> zone, + ) { + return __objc_msgSend_593( + obj, + sel, + zone, + ); + } + + late final __objc_msgSend_593Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer<_NSZone>)>>('objc_msgSend'); + late final __objc_msgSend_593 = __objc_msgSend_593Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer<_NSZone>)>(); + + late final _sel_supportsCommand_1 = _registerName1("supportsCommand:"); + bool _objc_msgSend_594( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer commandDescription, + ) { + return __objc_msgSend_594( + obj, + sel, + commandDescription, + ); + } + + late final __objc_msgSend_594Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_594 = __objc_msgSend_594Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_selectorForCommand_1 = _registerName1("selectorForCommand:"); + ffi.Pointer _objc_msgSend_595( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer commandDescription, + ) { + return __objc_msgSend_595( + obj, + sel, + commandDescription, + ); + } + + late final __objc_msgSend_595Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_595 = __objc_msgSend_595Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_typeForKey_1 = _registerName1("typeForKey:"); + late final _sel_classDescriptionForKey_1 = + _registerName1("classDescriptionForKey:"); + ffi.Pointer _objc_msgSend_596( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer key, + ) { + return __objc_msgSend_596( + obj, + sel, + key, + ); + } + + late final __objc_msgSend_596Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_596 = __objc_msgSend_596Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_appleEventCodeForKey_1 = + _registerName1("appleEventCodeForKey:"); + late final _sel_keyWithAppleEventCode_1 = + _registerName1("keyWithAppleEventCode:"); + ffi.Pointer _objc_msgSend_597( + ffi.Pointer obj, + ffi.Pointer sel, + int appleEventCode, + ) { + return __objc_msgSend_597( + obj, + sel, + appleEventCode, + ); + } + + late final __objc_msgSend_597Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.UnsignedInt)>>('objc_msgSend'); + late final __objc_msgSend_597 = __objc_msgSend_597Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_defaultSubcontainerAttributeKey1 = + _registerName1("defaultSubcontainerAttributeKey"); + late final _sel_isLocationRequiredToCreateForKey_1 = + _registerName1("isLocationRequiredToCreateForKey:"); + late final _sel_hasPropertyForKey_1 = _registerName1("hasPropertyForKey:"); + late final _sel_hasOrderedToManyRelationshipForKey_1 = + _registerName1("hasOrderedToManyRelationshipForKey:"); + late final _sel_hasReadablePropertyForKey_1 = + _registerName1("hasReadablePropertyForKey:"); + late final _sel_hasWritablePropertyForKey_1 = + _registerName1("hasWritablePropertyForKey:"); + late final _sel_isReadOnlyKey_1 = _registerName1("isReadOnlyKey:"); + late final _sel_initWithContainerClassDescription_containerSpecifier_key_1 = + _registerName1( + "initWithContainerClassDescription:containerSpecifier:key:"); + instancetype _objc_msgSend_598( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer classDesc, + ffi.Pointer container, + ffi.Pointer property, + ) { + return __objc_msgSend_598( + obj, + sel, + classDesc, + container, + property, + ); + } + + late final __objc_msgSend_598Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_598 = __objc_msgSend_598Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_childSpecifier1 = _registerName1("childSpecifier"); + late final _sel_setChildSpecifier_1 = _registerName1("setChildSpecifier:"); + late final _sel_containerSpecifier1 = _registerName1("containerSpecifier"); + late final _sel_setContainerSpecifier_1 = + _registerName1("setContainerSpecifier:"); + late final _sel_containerIsObjectBeingTested1 = + _registerName1("containerIsObjectBeingTested"); + late final _sel_setContainerIsObjectBeingTested_1 = + _registerName1("setContainerIsObjectBeingTested:"); + late final _sel_containerIsRangeContainerObject1 = + _registerName1("containerIsRangeContainerObject"); + late final _sel_setContainerIsRangeContainerObject_1 = + _registerName1("setContainerIsRangeContainerObject:"); + late final _sel_key1 = _registerName1("key"); + late final _sel_setKey_1 = _registerName1("setKey:"); + late final _sel_containerClassDescription1 = + _registerName1("containerClassDescription"); + late final _sel_setContainerClassDescription_1 = + _registerName1("setContainerClassDescription:"); + void _objc_msgSend_599( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_599( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_599Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_599 = __objc_msgSend_599Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_keyClassDescription1 = _registerName1("keyClassDescription"); + late final _sel_indicesOfObjectsByEvaluatingWithContainer_count_1 = + _registerName1("indicesOfObjectsByEvaluatingWithContainer:count:"); + ffi.Pointer _objc_msgSend_600( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer container, + ffi.Pointer count, + ) { + return __objc_msgSend_600( + obj, + sel, + container, + count, + ); + } + + late final __objc_msgSend_600Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_600 = __objc_msgSend_600Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_objectsByEvaluatingWithContainers_1 = + _registerName1("objectsByEvaluatingWithContainers:"); + late final _sel_objectsByEvaluatingSpecifier1 = + _registerName1("objectsByEvaluatingSpecifier"); + late final _sel_evaluationErrorNumber1 = + _registerName1("evaluationErrorNumber"); + late final _sel_setEvaluationErrorNumber_1 = + _registerName1("setEvaluationErrorNumber:"); + late final _sel_evaluationErrorSpecifier1 = + _registerName1("evaluationErrorSpecifier"); + late final _sel_descriptor1 = _registerName1("descriptor"); + late final _sel_scriptingValueForSpecifier_1 = + _registerName1("scriptingValueForSpecifier:"); + ffi.Pointer _objc_msgSend_601( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer objectSpecifier, + ) { + return __objc_msgSend_601( + obj, + sel, + objectSpecifier, + ); + } + + late final __objc_msgSend_601Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_601 = __objc_msgSend_601Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_scriptingProperties1 = _registerName1("scriptingProperties"); + late final _sel_setScriptingProperties_1 = + _registerName1("setScriptingProperties:"); + late final _sel_copyScriptingValue_forKey_withProperties_1 = + _registerName1("copyScriptingValue:forKey:withProperties:"); + ffi.Pointer _objc_msgSend_602( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ffi.Pointer key, + ffi.Pointer properties, + ) { + return __objc_msgSend_602( + obj, + sel, + value, + key, + properties, + ); + } + + late final __objc_msgSend_602Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_602 = __objc_msgSend_602Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_newScriptingObjectOfClass_forValueForKey_withContentsValue_properties_1 = + _registerName1( + "newScriptingObjectOfClass:forValueForKey:withContentsValue:properties:"); + ffi.Pointer _objc_msgSend_603( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer objectClass, + ffi.Pointer key, + ffi.Pointer contentsValue, + ffi.Pointer properties, + ) { + return __objc_msgSend_603( + obj, + sel, + objectClass, + key, + contentsValue, + properties, + ); + } + + late final __objc_msgSend_603Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_603 = __objc_msgSend_603Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_classCode1 = _registerName1("classCode"); + late final _sel_valueAtIndex_inPropertyWithKey_1 = + _registerName1("valueAtIndex:inPropertyWithKey:"); + ffi.Pointer _objc_msgSend_604( + ffi.Pointer obj, + ffi.Pointer sel, + int index, + ffi.Pointer key, + ) { + return __objc_msgSend_604( + obj, + sel, + index, + key, + ); + } + + late final __objc_msgSend_604Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_604 = __objc_msgSend_604Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, ffi.Pointer)>(); + + late final _sel_valueWithName_inPropertyWithKey_1 = + _registerName1("valueWithName:inPropertyWithKey:"); + late final _sel_valueWithUniqueID_inPropertyWithKey_1 = + _registerName1("valueWithUniqueID:inPropertyWithKey:"); + late final _sel_insertValue_atIndex_inPropertyWithKey_1 = + _registerName1("insertValue:atIndex:inPropertyWithKey:"); + void _objc_msgSend_605( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + int index, + ffi.Pointer key, + ) { + return __objc_msgSend_605( + obj, + sel, + value, + index, + key, + ); + } + + late final __objc_msgSend_605Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_605 = __objc_msgSend_605Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, ffi.Pointer)>(); + + late final _sel_removeValueAtIndex_fromPropertyWithKey_1 = + _registerName1("removeValueAtIndex:fromPropertyWithKey:"); + void _objc_msgSend_606( + ffi.Pointer obj, + ffi.Pointer sel, + int index, + ffi.Pointer key, + ) { + return __objc_msgSend_606( + obj, + sel, + index, + key, + ); + } + + late final __objc_msgSend_606Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.UnsignedLong, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_606 = __objc_msgSend_606Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer)>(); + + late final _sel_replaceValueAtIndex_inPropertyWithKey_withValue_1 = + _registerName1("replaceValueAtIndex:inPropertyWithKey:withValue:"); + void _objc_msgSend_607( + ffi.Pointer obj, + ffi.Pointer sel, + int index, + ffi.Pointer key, + ffi.Pointer value, + ) { + return __objc_msgSend_607( + obj, + sel, + index, + key, + value, + ); + } + + late final __objc_msgSend_607Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_607 = __objc_msgSend_607Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_insertValue_inPropertyWithKey_1 = + _registerName1("insertValue:inPropertyWithKey:"); + late final _sel_coerceValue_forKey_1 = _registerName1("coerceValue:forKey:"); + late final _sel_objectSpecifier1 = _registerName1("objectSpecifier"); + late final _sel_indicesOfObjectsByEvaluatingObjectSpecifier_1 = + _registerName1("indicesOfObjectsByEvaluatingObjectSpecifier:"); + ffi.Pointer _objc_msgSend_608( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer specifier, + ) { + return __objc_msgSend_608( + obj, + sel, + specifier, + ); + } + + late final __objc_msgSend_608Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_608 = __objc_msgSend_608Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_isEqualTo_1 = _registerName1("isEqualTo:"); + late final _sel_isLessThanOrEqualTo_1 = + _registerName1("isLessThanOrEqualTo:"); + late final _sel_isLessThan_1 = _registerName1("isLessThan:"); + late final _sel_isGreaterThanOrEqualTo_1 = + _registerName1("isGreaterThanOrEqualTo:"); + late final _sel_isGreaterThan_1 = _registerName1("isGreaterThan:"); + late final _sel_isNotEqualTo_1 = _registerName1("isNotEqualTo:"); + late final _sel_doesContain_1 = _registerName1("doesContain:"); + late final _sel_isLike_1 = _registerName1("isLike:"); + late final _sel_isCaseInsensitiveLike_1 = + _registerName1("isCaseInsensitiveLike:"); + late final _sel_scriptingIsEqualTo_1 = _registerName1("scriptingIsEqualTo:"); + late final _sel_scriptingIsLessThanOrEqualTo_1 = + _registerName1("scriptingIsLessThanOrEqualTo:"); + late final _sel_scriptingIsLessThan_1 = + _registerName1("scriptingIsLessThan:"); + late final _sel_scriptingIsGreaterThanOrEqualTo_1 = + _registerName1("scriptingIsGreaterThanOrEqualTo:"); + late final _sel_scriptingIsGreaterThan_1 = + _registerName1("scriptingIsGreaterThan:"); + late final _sel_scriptingBeginsWith_1 = + _registerName1("scriptingBeginsWith:"); + late final _sel_scriptingEndsWith_1 = _registerName1("scriptingEndsWith:"); + late final _sel_scriptingContains_1 = _registerName1("scriptingContains:"); + late final _class_NSItemProvider1 = _getClass1("NSItemProvider"); + late final _class_NSProgress1 = _getClass1("NSProgress"); + late final _sel_currentProgress1 = _registerName1("currentProgress"); + ffi.Pointer _objc_msgSend_609( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_609( + obj, + sel, + ); + } + + late final __objc_msgSend_609Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_609 = __objc_msgSend_609Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_progressWithTotalUnitCount_1 = + _registerName1("progressWithTotalUnitCount:"); + ffi.Pointer _objc_msgSend_610( + ffi.Pointer obj, + ffi.Pointer sel, + int unitCount, + ) { + return __objc_msgSend_610( + obj, + sel, + unitCount, + ); + } + + late final __objc_msgSend_610Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Int64)>>('objc_msgSend'); + late final __objc_msgSend_610 = __objc_msgSend_610Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_discreteProgressWithTotalUnitCount_1 = + _registerName1("discreteProgressWithTotalUnitCount:"); + late final _sel_progressWithTotalUnitCount_parent_pendingUnitCount_1 = + _registerName1("progressWithTotalUnitCount:parent:pendingUnitCount:"); + ffi.Pointer _objc_msgSend_611( + ffi.Pointer obj, + ffi.Pointer sel, + int unitCount, + ffi.Pointer parent, + int portionOfParentTotalUnitCount, + ) { + return __objc_msgSend_611( + obj, + sel, + unitCount, + parent, + portionOfParentTotalUnitCount, + ); + } + + late final __objc_msgSend_611Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int64, + ffi.Pointer, + ffi.Int64)>>('objc_msgSend'); + late final __objc_msgSend_611 = __objc_msgSend_611Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, ffi.Pointer, int)>(); + + late final _sel_initWithParent_userInfo_1 = + _registerName1("initWithParent:userInfo:"); + instancetype _objc_msgSend_612( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer parentProgressOrNil, + ffi.Pointer userInfoOrNil, + ) { + return __objc_msgSend_612( + obj, + sel, + parentProgressOrNil, + userInfoOrNil, + ); + } + + late final __objc_msgSend_612Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_612 = __objc_msgSend_612Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_becomeCurrentWithPendingUnitCount_1 = + _registerName1("becomeCurrentWithPendingUnitCount:"); + void _objc_msgSend_613( + ffi.Pointer obj, + ffi.Pointer sel, + int unitCount, + ) { + return __objc_msgSend_613( + obj, + sel, + unitCount, + ); + } + + late final __objc_msgSend_613Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int64)>>('objc_msgSend'); + late final __objc_msgSend_613 = __objc_msgSend_613Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_performAsCurrentWithPendingUnitCount_usingBlock_1 = + _registerName1("performAsCurrentWithPendingUnitCount:usingBlock:"); + void _objc_msgSend_614( + ffi.Pointer obj, + ffi.Pointer sel, + int unitCount, + ffi.Pointer<_ObjCBlock> work, + ) { + return __objc_msgSend_614( + obj, + sel, + unitCount, + work, + ); + } + + late final __objc_msgSend_614Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int64, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_614 = __objc_msgSend_614Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_resignCurrent1 = _registerName1("resignCurrent"); + late final _sel_addChild_withPendingUnitCount_1 = + _registerName1("addChild:withPendingUnitCount:"); + void _objc_msgSend_615( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer child, + int inUnitCount, + ) { + return __objc_msgSend_615( + obj, + sel, + child, + inUnitCount, + ); + } + + late final __objc_msgSend_615Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Int64)>>('objc_msgSend'); + late final __objc_msgSend_615 = __objc_msgSend_615Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_totalUnitCount1 = _registerName1("totalUnitCount"); + int _objc_msgSend_616( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_616( + obj, + sel, + ); + } + + late final __objc_msgSend_616Ptr = _lookup< + ffi.NativeFunction< + ffi.Int64 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_616 = __objc_msgSend_616Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setTotalUnitCount_1 = _registerName1("setTotalUnitCount:"); + void _objc_msgSend_617( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_617( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_617Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int64)>>('objc_msgSend'); + late final __objc_msgSend_617 = __objc_msgSend_617Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_completedUnitCount1 = _registerName1("completedUnitCount"); + late final _sel_setCompletedUnitCount_1 = + _registerName1("setCompletedUnitCount:"); + late final _sel_setLocalizedDescription_1 = + _registerName1("setLocalizedDescription:"); + late final _sel_localizedAdditionalDescription1 = + _registerName1("localizedAdditionalDescription"); + late final _sel_setLocalizedAdditionalDescription_1 = + _registerName1("setLocalizedAdditionalDescription:"); + late final _sel_isCancellable1 = _registerName1("isCancellable"); + late final _sel_setCancellable_1 = _registerName1("setCancellable:"); + late final _sel_isPausable1 = _registerName1("isPausable"); + late final _sel_setPausable_1 = _registerName1("setPausable:"); + late final _sel_isPaused1 = _registerName1("isPaused"); + late final _sel_cancellationHandler1 = _registerName1("cancellationHandler"); + ffi.Pointer<_ObjCBlock> _objc_msgSend_618( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_618( + obj, + sel, + ); + } + + late final __objc_msgSend_618Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer<_ObjCBlock> Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_618 = __objc_msgSend_618Ptr.asFunction< + ffi.Pointer<_ObjCBlock> Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setCancellationHandler_1 = + _registerName1("setCancellationHandler:"); + void _objc_msgSend_619( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> value, + ) { + return __objc_msgSend_619( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_619Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_619 = __objc_msgSend_619Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_pausingHandler1 = _registerName1("pausingHandler"); + late final _sel_setPausingHandler_1 = _registerName1("setPausingHandler:"); + late final _sel_resumingHandler1 = _registerName1("resumingHandler"); + late final _sel_setResumingHandler_1 = _registerName1("setResumingHandler:"); + late final _sel_setUserInfoObject_forKey_1 = + _registerName1("setUserInfoObject:forKey:"); + late final _sel_isIndeterminate1 = _registerName1("isIndeterminate"); + late final _sel_fractionCompleted1 = _registerName1("fractionCompleted"); + late final _sel_pause1 = _registerName1("pause"); + late final _sel_resume1 = _registerName1("resume"); + late final _sel_kind1 = _registerName1("kind"); + late final _sel_setKind_1 = _registerName1("setKind:"); + late final _sel_estimatedTimeRemaining1 = + _registerName1("estimatedTimeRemaining"); + late final _sel_setEstimatedTimeRemaining_1 = + _registerName1("setEstimatedTimeRemaining:"); + void _objc_msgSend_620( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_620( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_620Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_620 = __objc_msgSend_620Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_throughput1 = _registerName1("throughput"); + late final _sel_setThroughput_1 = _registerName1("setThroughput:"); + late final _sel_fileOperationKind1 = _registerName1("fileOperationKind"); + late final _sel_setFileOperationKind_1 = + _registerName1("setFileOperationKind:"); + late final _sel_fileURL1 = _registerName1("fileURL"); + late final _sel_setFileURL_1 = _registerName1("setFileURL:"); + void _objc_msgSend_621( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_621( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_621Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_621 = __objc_msgSend_621Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_fileTotalCount1 = _registerName1("fileTotalCount"); + late final _sel_setFileTotalCount_1 = _registerName1("setFileTotalCount:"); + late final _sel_fileCompletedCount1 = _registerName1("fileCompletedCount"); + late final _sel_setFileCompletedCount_1 = + _registerName1("setFileCompletedCount:"); + late final _sel_publish1 = _registerName1("publish"); + late final _sel_unpublish1 = _registerName1("unpublish"); + late final _sel_addSubscriberForFileURL_withPublishingHandler_1 = + _registerName1("addSubscriberForFileURL:withPublishingHandler:"); + ffi.Pointer _objc_msgSend_622( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ffi.Pointer<_ObjCBlock> publishingHandler, + ) { + return __objc_msgSend_622( + obj, + sel, + url, + publishingHandler, + ); + } + + late final __objc_msgSend_622Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_622 = __objc_msgSend_622Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_removeSubscriber_1 = _registerName1("removeSubscriber:"); + late final _sel_isOld1 = _registerName1("isOld"); + late final _sel_registerDataRepresentationForTypeIdentifier_visibility_loadHandler_1 = + _registerName1( + "registerDataRepresentationForTypeIdentifier:visibility:loadHandler:"); + void _objc_msgSend_623( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer typeIdentifier, + int visibility, + ffi.Pointer<_ObjCBlock> loadHandler, + ) { + return __objc_msgSend_623( + obj, + sel, + typeIdentifier, + visibility, + loadHandler, + ); + } + + late final __objc_msgSend_623Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_623 = __objc_msgSend_623Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_registerFileRepresentationForTypeIdentifier_fileOptions_visibility_loadHandler_1 = + _registerName1( + "registerFileRepresentationForTypeIdentifier:fileOptions:visibility:loadHandler:"); + void _objc_msgSend_624( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer typeIdentifier, + int fileOptions, + int visibility, + ffi.Pointer<_ObjCBlock> loadHandler, + ) { + return __objc_msgSend_624( + obj, + sel, + typeIdentifier, + fileOptions, + visibility, + loadHandler, + ); + } + + late final __objc_msgSend_624Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_624 = __objc_msgSend_624Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, int, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_registeredTypeIdentifiers1 = + _registerName1("registeredTypeIdentifiers"); + late final _sel_registeredTypeIdentifiersWithFileOptions_1 = + _registerName1("registeredTypeIdentifiersWithFileOptions:"); + ffi.Pointer _objc_msgSend_625( + ffi.Pointer obj, + ffi.Pointer sel, + int fileOptions, + ) { + return __objc_msgSend_625( + obj, + sel, + fileOptions, + ); + } + + late final __objc_msgSend_625Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_625 = __objc_msgSend_625Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_hasItemConformingToTypeIdentifier_1 = + _registerName1("hasItemConformingToTypeIdentifier:"); + late final _sel_hasRepresentationConformingToTypeIdentifier_fileOptions_1 = + _registerName1( + "hasRepresentationConformingToTypeIdentifier:fileOptions:"); + bool _objc_msgSend_626( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer typeIdentifier, + int fileOptions, + ) { + return __objc_msgSend_626( + obj, + sel, + typeIdentifier, + fileOptions, + ); + } + + late final __objc_msgSend_626Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_626 = __objc_msgSend_626Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_loadDataRepresentationForTypeIdentifier_completionHandler_1 = + _registerName1( + "loadDataRepresentationForTypeIdentifier:completionHandler:"); + ffi.Pointer _objc_msgSend_627( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer typeIdentifier, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_627( + obj, + sel, + typeIdentifier, + completionHandler, + ); + } + + late final __objc_msgSend_627Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_627 = __objc_msgSend_627Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_loadFileRepresentationForTypeIdentifier_completionHandler_1 = + _registerName1( + "loadFileRepresentationForTypeIdentifier:completionHandler:"); + ffi.Pointer _objc_msgSend_628( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer typeIdentifier, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_628( + obj, + sel, + typeIdentifier, + completionHandler, + ); + } + + late final __objc_msgSend_628Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_628 = __objc_msgSend_628Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_loadInPlaceFileRepresentationForTypeIdentifier_completionHandler_1 = + _registerName1( + "loadInPlaceFileRepresentationForTypeIdentifier:completionHandler:"); + ffi.Pointer _objc_msgSend_629( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer typeIdentifier, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_629( + obj, + sel, + typeIdentifier, + completionHandler, + ); + } + + late final __objc_msgSend_629Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_629 = __objc_msgSend_629Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_suggestedName1 = _registerName1("suggestedName"); + late final _sel_setSuggestedName_1 = _registerName1("setSuggestedName:"); + late final _sel_registerObject_visibility_1 = + _registerName1("registerObject:visibility:"); + void _objc_msgSend_630( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer object, + int visibility, + ) { + return __objc_msgSend_630( + obj, + sel, + object, + visibility, + ); + } + + late final __objc_msgSend_630Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_630 = __objc_msgSend_630Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_registerObjectOfClass_visibility_loadHandler_1 = + _registerName1("registerObjectOfClass:visibility:loadHandler:"); + void _objc_msgSend_631( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aClass, + int visibility, + ffi.Pointer<_ObjCBlock> loadHandler, + ) { + return __objc_msgSend_631( + obj, + sel, + aClass, + visibility, + loadHandler, + ); + } + + late final __objc_msgSend_631Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_631 = __objc_msgSend_631Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_canLoadObjectOfClass_1 = + _registerName1("canLoadObjectOfClass:"); + late final _sel_loadObjectOfClass_completionHandler_1 = + _registerName1("loadObjectOfClass:completionHandler:"); + ffi.Pointer _objc_msgSend_632( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aClass, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_632( + obj, + sel, + aClass, + completionHandler, + ); + } + + late final __objc_msgSend_632Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_632 = __objc_msgSend_632Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_initWithItem_typeIdentifier_1 = + _registerName1("initWithItem:typeIdentifier:"); + late final _sel_registerItemForTypeIdentifier_loadHandler_1 = + _registerName1("registerItemForTypeIdentifier:loadHandler:"); + void _objc_msgSend_633( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer typeIdentifier, + ffi.Pointer<_ObjCBlock> loadHandler, + ) { + return __objc_msgSend_633( + obj, + sel, + typeIdentifier, + loadHandler, + ); + } + + late final __objc_msgSend_633Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_633 = __objc_msgSend_633Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_loadItemForTypeIdentifier_options_completionHandler_1 = + _registerName1("loadItemForTypeIdentifier:options:completionHandler:"); + void _objc_msgSend_634( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer typeIdentifier, + ffi.Pointer options, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_634( + obj, + sel, + typeIdentifier, + options, + completionHandler, + ); + } + + late final __objc_msgSend_634Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_634 = __objc_msgSend_634Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_previewImageHandler1 = _registerName1("previewImageHandler"); + ffi.Pointer<_ObjCBlock> _objc_msgSend_635( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_635( + obj, + sel, + ); + } + + late final __objc_msgSend_635Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer<_ObjCBlock> Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_635 = __objc_msgSend_635Ptr.asFunction< + ffi.Pointer<_ObjCBlock> Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setPreviewImageHandler_1 = + _registerName1("setPreviewImageHandler:"); + void _objc_msgSend_636( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> value, + ) { + return __objc_msgSend_636( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_636Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_636 = __objc_msgSend_636Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_loadPreviewImageWithOptions_completionHandler_1 = + _registerName1("loadPreviewImageWithOptions:completionHandler:"); + void _objc_msgSend_637( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer options, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_637( + obj, + sel, + options, + completionHandler, + ); + } + + late final __objc_msgSend_637Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_637 = __objc_msgSend_637Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>(); + + late final _class_NSMutableString1 = _getClass1("NSMutableString"); + late final _sel_replaceCharactersInRange_withString_1 = + _registerName1("replaceCharactersInRange:withString:"); + void _objc_msgSend_638( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ffi.Pointer aString, + ) { + return __objc_msgSend_638( + obj, + sel, + range, + aString, + ); + } + + late final __objc_msgSend_638Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + _NSRange, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_638 = __objc_msgSend_638Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, _NSRange, + ffi.Pointer)>(); + + late final _sel_insertString_atIndex_1 = + _registerName1("insertString:atIndex:"); + void _objc_msgSend_639( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aString, + int loc, + ) { + return __objc_msgSend_639( + obj, + sel, + aString, + loc, + ); + } + + late final __objc_msgSend_639Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_639 = __objc_msgSend_639Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_deleteCharactersInRange_1 = + _registerName1("deleteCharactersInRange:"); + late final _sel_appendString_1 = _registerName1("appendString:"); + late final _sel_appendFormat_1 = _registerName1("appendFormat:"); + late final _sel_setString_1 = _registerName1("setString:"); + late final _sel_replaceOccurrencesOfString_withString_options_range_1 = + _registerName1("replaceOccurrencesOfString:withString:options:range:"); + int _objc_msgSend_640( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer target, + ffi.Pointer replacement, + int options, + _NSRange searchRange, + ) { + return __objc_msgSend_640( + obj, + sel, + target, + replacement, + options, + searchRange, + ); + } + + late final __objc_msgSend_640Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_640 = __objc_msgSend_640Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer, int, _NSRange)>(); + + late final _sel_applyTransform_reverse_range_updatedRange_1 = + _registerName1("applyTransform:reverse:range:updatedRange:"); + bool _objc_msgSend_641( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer transform, + bool reverse, + _NSRange range, + ffi.Pointer<_NSRange> resultingRange, + ) { + return __objc_msgSend_641( + obj, + sel, + transform, + reverse, + range, + resultingRange, + ); + } + + late final __objc_msgSend_641Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool, + _NSRange, + ffi.Pointer<_NSRange>)>>('objc_msgSend'); + late final __objc_msgSend_641 = __objc_msgSend_641Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, bool, _NSRange, ffi.Pointer<_NSRange>)>(); + + ffi.Pointer _objc_msgSend_642( + ffi.Pointer obj, + ffi.Pointer sel, + int capacity, + ) { + return __objc_msgSend_642( + obj, + sel, + capacity, + ); + } + + late final __objc_msgSend_642Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_642 = __objc_msgSend_642Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_stringWithCapacity_1 = _registerName1("stringWithCapacity:"); + late final _class_NSNotification1 = _getClass1("NSNotification"); + late final _sel_object1 = _registerName1("object"); + late final _sel_initWithName_object_userInfo_1 = + _registerName1("initWithName:object:userInfo:"); + instancetype _objc_msgSend_643( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + ffi.Pointer object, + ffi.Pointer userInfo, + ) { + return __objc_msgSend_643( + obj, + sel, + name, + object, + userInfo, + ); + } + + late final __objc_msgSend_643Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_643 = __objc_msgSend_643Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_notificationWithName_object_1 = + _registerName1("notificationWithName:object:"); + late final _sel_notificationWithName_object_userInfo_1 = + _registerName1("notificationWithName:object:userInfo:"); + late final _class_NSBundle1 = _getClass1("NSBundle"); + late final _sel_mainBundle1 = _registerName1("mainBundle"); + ffi.Pointer _objc_msgSend_644( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_644( + obj, + sel, + ); + } + + late final __objc_msgSend_644Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_644 = __objc_msgSend_644Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_bundleWithPath_1 = _registerName1("bundleWithPath:"); + late final _sel_initWithPath_1 = _registerName1("initWithPath:"); + late final _sel_bundleWithURL_1 = _registerName1("bundleWithURL:"); + late final _sel_initWithURL_1 = _registerName1("initWithURL:"); + late final _sel_bundleForClass_1 = _registerName1("bundleForClass:"); + ffi.Pointer _objc_msgSend_645( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aClass, + ) { + return __objc_msgSend_645( + obj, + sel, + aClass, + ); + } + + late final __objc_msgSend_645Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_645 = __objc_msgSend_645Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_bundleWithIdentifier_1 = + _registerName1("bundleWithIdentifier:"); + ffi.Pointer _objc_msgSend_646( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer identifier, + ) { + return __objc_msgSend_646( + obj, + sel, + identifier, + ); + } + + late final __objc_msgSend_646Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_646 = __objc_msgSend_646Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_allBundles1 = _registerName1("allBundles"); + late final _sel_allFrameworks1 = _registerName1("allFrameworks"); + late final _sel_isLoaded1 = _registerName1("isLoaded"); + late final _sel_unload1 = _registerName1("unload"); + late final _sel_preflightAndReturnError_1 = + _registerName1("preflightAndReturnError:"); + late final _sel_loadAndReturnError_1 = _registerName1("loadAndReturnError:"); + late final _sel_bundleURL1 = _registerName1("bundleURL"); + late final _sel_resourceURL1 = _registerName1("resourceURL"); + late final _sel_executableURL1 = _registerName1("executableURL"); + late final _sel_URLForAuxiliaryExecutable_1 = + _registerName1("URLForAuxiliaryExecutable:"); + late final _sel_privateFrameworksURL1 = + _registerName1("privateFrameworksURL"); + late final _sel_sharedFrameworksURL1 = _registerName1("sharedFrameworksURL"); + late final _sel_sharedSupportURL1 = _registerName1("sharedSupportURL"); + late final _sel_builtInPlugInsURL1 = _registerName1("builtInPlugInsURL"); + late final _sel_appStoreReceiptURL1 = _registerName1("appStoreReceiptURL"); + late final _sel_bundlePath1 = _registerName1("bundlePath"); + late final _sel_resourcePath1 = _registerName1("resourcePath"); + late final _sel_executablePath1 = _registerName1("executablePath"); + late final _sel_pathForAuxiliaryExecutable_1 = + _registerName1("pathForAuxiliaryExecutable:"); + late final _sel_privateFrameworksPath1 = + _registerName1("privateFrameworksPath"); + late final _sel_sharedFrameworksPath1 = + _registerName1("sharedFrameworksPath"); + late final _sel_sharedSupportPath1 = _registerName1("sharedSupportPath"); + late final _sel_builtInPlugInsPath1 = _registerName1("builtInPlugInsPath"); + late final _sel_URLForResource_withExtension_subdirectory_inBundleWithURL_1 = + _registerName1( + "URLForResource:withExtension:subdirectory:inBundleWithURL:"); + ffi.Pointer _objc_msgSend_647( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + ffi.Pointer ext, + ffi.Pointer subpath, + ffi.Pointer bundleURL, + ) { + return __objc_msgSend_647( + obj, + sel, + name, + ext, + subpath, + bundleURL, + ); + } + + late final __objc_msgSend_647Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_647 = __objc_msgSend_647Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_URLsForResourcesWithExtension_subdirectory_inBundleWithURL_1 = + _registerName1( + "URLsForResourcesWithExtension:subdirectory:inBundleWithURL:"); + ffi.Pointer _objc_msgSend_648( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer ext, + ffi.Pointer subpath, + ffi.Pointer bundleURL, + ) { + return __objc_msgSend_648( + obj, + sel, + ext, + subpath, + bundleURL, + ); + } + + late final __objc_msgSend_648Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_648 = __objc_msgSend_648Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_URLForResource_withExtension_1 = + _registerName1("URLForResource:withExtension:"); + ffi.Pointer _objc_msgSend_649( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + ffi.Pointer ext, + ) { + return __objc_msgSend_649( + obj, + sel, + name, + ext, + ); + } + + late final __objc_msgSend_649Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_649 = __objc_msgSend_649Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_URLForResource_withExtension_subdirectory_1 = + _registerName1("URLForResource:withExtension:subdirectory:"); + ffi.Pointer _objc_msgSend_650( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + ffi.Pointer ext, + ffi.Pointer subpath, + ) { + return __objc_msgSend_650( + obj, + sel, + name, + ext, + subpath, + ); + } + + late final __objc_msgSend_650Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_650 = __objc_msgSend_650Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_URLForResource_withExtension_subdirectory_localization_1 = + _registerName1("URLForResource:withExtension:subdirectory:localization:"); + ffi.Pointer _objc_msgSend_651( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + ffi.Pointer ext, + ffi.Pointer subpath, + ffi.Pointer localizationName, + ) { + return __objc_msgSend_651( + obj, + sel, + name, + ext, + subpath, + localizationName, + ); + } + + late final __objc_msgSend_651Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_651 = __objc_msgSend_651Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_URLsForResourcesWithExtension_subdirectory_1 = + _registerName1("URLsForResourcesWithExtension:subdirectory:"); + ffi.Pointer _objc_msgSend_652( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer ext, + ffi.Pointer subpath, + ) { + return __objc_msgSend_652( + obj, + sel, + ext, + subpath, + ); + } + + late final __objc_msgSend_652Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_652 = __objc_msgSend_652Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_URLsForResourcesWithExtension_subdirectory_localization_1 = + _registerName1( + "URLsForResourcesWithExtension:subdirectory:localization:"); + ffi.Pointer _objc_msgSend_653( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer ext, + ffi.Pointer subpath, + ffi.Pointer localizationName, + ) { + return __objc_msgSend_653( + obj, + sel, + ext, + subpath, + localizationName, + ); + } + + late final __objc_msgSend_653Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_653 = __objc_msgSend_653Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_pathForResource_ofType_inDirectory_1 = + _registerName1("pathForResource:ofType:inDirectory:"); + ffi.Pointer _objc_msgSend_654( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + ffi.Pointer ext, + ffi.Pointer bundlePath, + ) { + return __objc_msgSend_654( + obj, + sel, + name, + ext, + bundlePath, + ); + } + + late final __objc_msgSend_654Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_654 = __objc_msgSend_654Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_pathsForResourcesOfType_inDirectory_1 = + _registerName1("pathsForResourcesOfType:inDirectory:"); + late final _sel_pathForResource_ofType_1 = + _registerName1("pathForResource:ofType:"); + late final _sel_pathForResource_ofType_inDirectory_forLocalization_1 = + _registerName1("pathForResource:ofType:inDirectory:forLocalization:"); + ffi.Pointer _objc_msgSend_655( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + ffi.Pointer ext, + ffi.Pointer subpath, + ffi.Pointer localizationName, + ) { + return __objc_msgSend_655( + obj, + sel, + name, + ext, + subpath, + localizationName, + ); + } + + late final __objc_msgSend_655Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_655 = __objc_msgSend_655Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_pathsForResourcesOfType_inDirectory_forLocalization_1 = + _registerName1("pathsForResourcesOfType:inDirectory:forLocalization:"); + late final _sel_localizedStringForKey_value_table_1 = + _registerName1("localizedStringForKey:value:table:"); + late final _class_NSAttributedString1 = _getClass1("NSAttributedString"); + late final _sel_attributesAtIndex_effectiveRange_1 = + _registerName1("attributesAtIndex:effectiveRange:"); + ffi.Pointer _objc_msgSend_656( + ffi.Pointer obj, + ffi.Pointer sel, + int location, + ffi.Pointer<_NSRange> range, + ) { + return __objc_msgSend_656( + obj, + sel, + location, + range, + ); + } + + late final __objc_msgSend_656Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer<_NSRange>)>>('objc_msgSend'); + late final __objc_msgSend_656 = __objc_msgSend_656Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, ffi.Pointer<_NSRange>)>(); + + late final _sel_attribute_atIndex_effectiveRange_1 = + _registerName1("attribute:atIndex:effectiveRange:"); + ffi.Pointer _objc_msgSend_657( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer attrName, + int location, + ffi.Pointer<_NSRange> range, + ) { + return __objc_msgSend_657( + obj, + sel, + attrName, + location, + range, + ); + } + + late final __objc_msgSend_657Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer<_NSRange>)>>('objc_msgSend'); + late final __objc_msgSend_657 = __objc_msgSend_657Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer<_NSRange>)>(); + + late final _sel_attributedSubstringFromRange_1 = + _registerName1("attributedSubstringFromRange:"); + ffi.Pointer _objc_msgSend_658( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ) { + return __objc_msgSend_658( + obj, + sel, + range, + ); + } + + late final __objc_msgSend_658Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_658 = __objc_msgSend_658Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, _NSRange)>(); + + late final _sel_attributesAtIndex_longestEffectiveRange_inRange_1 = + _registerName1("attributesAtIndex:longestEffectiveRange:inRange:"); + ffi.Pointer _objc_msgSend_659( + ffi.Pointer obj, + ffi.Pointer sel, + int location, + ffi.Pointer<_NSRange> range, + _NSRange rangeLimit, + ) { + return __objc_msgSend_659( + obj, + sel, + location, + range, + rangeLimit, + ); + } + + late final __objc_msgSend_659Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer<_NSRange>, + _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_659 = __objc_msgSend_659Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, ffi.Pointer<_NSRange>, _NSRange)>(); + + late final _sel_attribute_atIndex_longestEffectiveRange_inRange_1 = + _registerName1("attribute:atIndex:longestEffectiveRange:inRange:"); + ffi.Pointer _objc_msgSend_660( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer attrName, + int location, + ffi.Pointer<_NSRange> range, + _NSRange rangeLimit, + ) { + return __objc_msgSend_660( + obj, + sel, + attrName, + location, + range, + rangeLimit, + ); + } + + late final __objc_msgSend_660Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer<_NSRange>, + _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_660 = __objc_msgSend_660Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer<_NSRange>, + _NSRange)>(); + + late final _sel_isEqualToAttributedString_1 = + _registerName1("isEqualToAttributedString:"); + bool _objc_msgSend_661( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer other, + ) { + return __objc_msgSend_661( + obj, + sel, + other, + ); + } + + late final __objc_msgSend_661Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_661 = __objc_msgSend_661Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_initWithString_attributes_1 = + _registerName1("initWithString:attributes:"); + late final _sel_initWithAttributedString_1 = + _registerName1("initWithAttributedString:"); + instancetype _objc_msgSend_662( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer attrStr, + ) { + return __objc_msgSend_662( + obj, + sel, + attrStr, + ); + } + + late final __objc_msgSend_662Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_662 = __objc_msgSend_662Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_enumerateAttributesInRange_options_usingBlock_1 = + _registerName1("enumerateAttributesInRange:options:usingBlock:"); + void _objc_msgSend_663( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange enumerationRange, + int opts, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_663( + obj, + sel, + enumerationRange, + opts, + block, + ); + } + + late final __objc_msgSend_663Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + _NSRange, ffi.Int32, ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_663 = __objc_msgSend_663Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, _NSRange, + int, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_enumerateAttribute_inRange_options_usingBlock_1 = + _registerName1("enumerateAttribute:inRange:options:usingBlock:"); + void _objc_msgSend_664( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer attrName, + _NSRange enumerationRange, + int opts, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_664( + obj, + sel, + attrName, + enumerationRange, + opts, + block, + ); + } + + late final __objc_msgSend_664Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + _NSRange, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_664 = __objc_msgSend_664Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, _NSRange, int, ffi.Pointer<_ObjCBlock>)>(); + + late final _class_NSAttributedStringMarkdownParsingOptions1 = + _getClass1("NSAttributedStringMarkdownParsingOptions"); + late final _sel_allowsExtendedAttributes1 = + _registerName1("allowsExtendedAttributes"); + late final _sel_setAllowsExtendedAttributes_1 = + _registerName1("setAllowsExtendedAttributes:"); + late final _sel_interpretedSyntax1 = _registerName1("interpretedSyntax"); + int _objc_msgSend_665( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_665( + obj, + sel, + ); + } + + late final __objc_msgSend_665Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_665 = __objc_msgSend_665Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setInterpretedSyntax_1 = + _registerName1("setInterpretedSyntax:"); + void _objc_msgSend_666( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_666( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_666Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_666 = __objc_msgSend_666Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_failurePolicy1 = _registerName1("failurePolicy"); + int _objc_msgSend_667( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_667( + obj, + sel, + ); + } + + late final __objc_msgSend_667Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_667 = __objc_msgSend_667Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setFailurePolicy_1 = _registerName1("setFailurePolicy:"); + void _objc_msgSend_668( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_668( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_668Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_668 = __objc_msgSend_668Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_setLanguageCode_1 = _registerName1("setLanguageCode:"); + late final _sel_appliesSourcePositionAttributes1 = + _registerName1("appliesSourcePositionAttributes"); + late final _sel_setAppliesSourcePositionAttributes_1 = + _registerName1("setAppliesSourcePositionAttributes:"); + late final _sel_initWithContentsOfMarkdownFileAtURL_options_baseURL_error_1 = + _registerName1( + "initWithContentsOfMarkdownFileAtURL:options:baseURL:error:"); + instancetype _objc_msgSend_669( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer markdownFile, + ffi.Pointer options, + ffi.Pointer baseURL, + ffi.Pointer> error, + ) { + return __objc_msgSend_669( + obj, + sel, + markdownFile, + options, + baseURL, + error, + ); + } + + late final __objc_msgSend_669Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_669 = __objc_msgSend_669Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_initWithMarkdown_options_baseURL_error_1 = + _registerName1("initWithMarkdown:options:baseURL:error:"); + instancetype _objc_msgSend_670( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer markdown, + ffi.Pointer options, + ffi.Pointer baseURL, + ffi.Pointer> error, + ) { + return __objc_msgSend_670( + obj, + sel, + markdown, + options, + baseURL, + error, + ); + } + + late final __objc_msgSend_670Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_670 = __objc_msgSend_670Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_initWithMarkdownString_options_baseURL_error_1 = + _registerName1("initWithMarkdownString:options:baseURL:error:"); + instancetype _objc_msgSend_671( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer markdownString, + ffi.Pointer options, + ffi.Pointer baseURL, + ffi.Pointer> error, + ) { + return __objc_msgSend_671( + obj, + sel, + markdownString, + options, + baseURL, + error, + ); + } + + late final __objc_msgSend_671Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_671 = __objc_msgSend_671Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_initWithFormat_options_locale_1 = + _registerName1("initWithFormat:options:locale:"); + instancetype _objc_msgSend_672( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer format, + int options, + ffi.Pointer locale, + ) { + return __objc_msgSend_672( + obj, + sel, + format, + options, + locale, + ); + } + + late final __objc_msgSend_672Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_672 = __objc_msgSend_672Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, ffi.Pointer)>(); + + late final _sel_initWithFormat_options_locale_arguments_1 = + _registerName1("initWithFormat:options:locale:arguments:"); + instancetype _objc_msgSend_673( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer format, + int options, + ffi.Pointer locale, + ffi.Pointer<__va_list_tag> arguments, + ) { + return __objc_msgSend_673( + obj, + sel, + format, + options, + locale, + arguments, + ); + } + + late final __objc_msgSend_673Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer, + ffi.Pointer<__va_list_tag>)>>('objc_msgSend'); + late final __objc_msgSend_673 = __objc_msgSend_673Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer, + ffi.Pointer<__va_list_tag>)>(); + + late final _sel_localizedAttributedStringWithFormat_1 = + _registerName1("localizedAttributedStringWithFormat:"); + late final _sel_localizedAttributedStringWithFormat_options_1 = + _registerName1("localizedAttributedStringWithFormat:options:"); + instancetype _objc_msgSend_674( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer format, + int options, + ) { + return __objc_msgSend_674( + obj, + sel, + format, + options, + ); + } + + late final __objc_msgSend_674Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_674 = __objc_msgSend_674Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_attributedStringByInflectingString1 = + _registerName1("attributedStringByInflectingString"); + ffi.Pointer _objc_msgSend_675( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_675( + obj, + sel, + ); + } + + late final __objc_msgSend_675Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_675 = __objc_msgSend_675Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_localizedAttributedStringForKey_value_table_1 = + _registerName1("localizedAttributedStringForKey:value:table:"); + ffi.Pointer _objc_msgSend_676( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer key, + ffi.Pointer value, + ffi.Pointer tableName, + ) { + return __objc_msgSend_676( + obj, + sel, + key, + value, + tableName, + ); + } + + late final __objc_msgSend_676Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_676 = __objc_msgSend_676Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_bundleIdentifier1 = _registerName1("bundleIdentifier"); + late final _sel_infoDictionary1 = _registerName1("infoDictionary"); + late final _sel_localizedInfoDictionary1 = + _registerName1("localizedInfoDictionary"); + late final _sel_objectForInfoDictionaryKey_1 = + _registerName1("objectForInfoDictionaryKey:"); + late final _sel_classNamed_1 = _registerName1("classNamed:"); + late final _sel_principalClass1 = _registerName1("principalClass"); + late final _sel_preferredLocalizations1 = + _registerName1("preferredLocalizations"); + late final _sel_localizations1 = _registerName1("localizations"); + late final _sel_developmentLocalization1 = + _registerName1("developmentLocalization"); + late final _sel_preferredLocalizationsFromArray_1 = + _registerName1("preferredLocalizationsFromArray:"); + late final _sel_preferredLocalizationsFromArray_forPreferences_1 = + _registerName1("preferredLocalizationsFromArray:forPreferences:"); + ffi.Pointer _objc_msgSend_677( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer localizationsArray, + ffi.Pointer preferencesArray, + ) { + return __objc_msgSend_677( + obj, + sel, + localizationsArray, + preferencesArray, + ); + } + + late final __objc_msgSend_677Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_677 = __objc_msgSend_677Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_executableArchitectures1 = + _registerName1("executableArchitectures"); + late final _sel_setPreservationPriority_forTags_1 = + _registerName1("setPreservationPriority:forTags:"); + void _objc_msgSend_678( + ffi.Pointer obj, + ffi.Pointer sel, + double priority, + ffi.Pointer tags, + ) { + return __objc_msgSend_678( + obj, + sel, + priority, + tags, + ); + } + + late final __objc_msgSend_678Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Double, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_678 = __objc_msgSend_678Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, double, + ffi.Pointer)>(); + + late final _sel_preservationPriorityForTag_1 = + _registerName1("preservationPriorityForTag:"); + late final _class_NSMutableAttributedString1 = + _getClass1("NSMutableAttributedString"); + late final _sel_setAttributes_range_1 = + _registerName1("setAttributes:range:"); + void _objc_msgSend_679( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer attrs, + _NSRange range, + ) { + return __objc_msgSend_679( + obj, + sel, + attrs, + range, + ); + } + + late final __objc_msgSend_679Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_679 = __objc_msgSend_679Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, _NSRange)>(); + + late final _sel_mutableString1 = _registerName1("mutableString"); + ffi.Pointer _objc_msgSend_680( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_680( + obj, + sel, + ); + } + + late final __objc_msgSend_680Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_680 = __objc_msgSend_680Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_addAttribute_value_range_1 = + _registerName1("addAttribute:value:range:"); + void _objc_msgSend_681( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + ffi.Pointer value, + _NSRange range, + ) { + return __objc_msgSend_681( + obj, + sel, + name, + value, + range, + ); + } + + late final __objc_msgSend_681Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_681 = __objc_msgSend_681Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer, _NSRange)>(); + + late final _sel_addAttributes_range_1 = + _registerName1("addAttributes:range:"); + late final _sel_removeAttribute_range_1 = + _registerName1("removeAttribute:range:"); + void _objc_msgSend_682( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + _NSRange range, + ) { + return __objc_msgSend_682( + obj, + sel, + name, + range, + ); + } + + late final __objc_msgSend_682Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_682 = __objc_msgSend_682Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, _NSRange)>(); + + late final _sel_replaceCharactersInRange_withAttributedString_1 = + _registerName1("replaceCharactersInRange:withAttributedString:"); + void _objc_msgSend_683( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ffi.Pointer attrString, + ) { + return __objc_msgSend_683( + obj, + sel, + range, + attrString, + ); + } + + late final __objc_msgSend_683Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + _NSRange, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_683 = __objc_msgSend_683Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, _NSRange, + ffi.Pointer)>(); + + late final _sel_insertAttributedString_atIndex_1 = + _registerName1("insertAttributedString:atIndex:"); + void _objc_msgSend_684( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer attrString, + int loc, + ) { + return __objc_msgSend_684( + obj, + sel, + attrString, + loc, + ); + } + + late final __objc_msgSend_684Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_684 = __objc_msgSend_684Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_appendAttributedString_1 = + _registerName1("appendAttributedString:"); + void _objc_msgSend_685( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer attrString, + ) { + return __objc_msgSend_685( + obj, + sel, + attrString, + ); + } + + late final __objc_msgSend_685Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_685 = __objc_msgSend_685Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_setAttributedString_1 = + _registerName1("setAttributedString:"); + late final _sel_beginEditing1 = _registerName1("beginEditing"); + late final _sel_endEditing1 = _registerName1("endEditing"); + late final _sel_appendLocalizedFormat_1 = + _registerName1("appendLocalizedFormat:"); + late final _class_NSDateFormatter1 = _getClass1("NSDateFormatter"); + late final _class_NSFormatter1 = _getClass1("NSFormatter"); + late final _sel_stringForObjectValue_1 = + _registerName1("stringForObjectValue:"); + late final _sel_attributedStringForObjectValue_withDefaultAttributes_1 = + _registerName1("attributedStringForObjectValue:withDefaultAttributes:"); + ffi.Pointer _objc_msgSend_686( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer obj1, + ffi.Pointer attrs, + ) { + return __objc_msgSend_686( + obj, + sel, + obj1, + attrs, + ); + } + + late final __objc_msgSend_686Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_686 = __objc_msgSend_686Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_editingStringForObjectValue_1 = + _registerName1("editingStringForObjectValue:"); + late final _sel_getObjectValue_forString_errorDescription_1 = + _registerName1("getObjectValue:forString:errorDescription:"); + bool _objc_msgSend_687( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer> obj1, + ffi.Pointer string, + ffi.Pointer> error, + ) { + return __objc_msgSend_687( + obj, + sel, + obj1, + string, + error, + ); + } + + late final __objc_msgSend_687Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_687 = __objc_msgSend_687Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_isPartialStringValid_newEditingString_errorDescription_1 = + _registerName1("isPartialStringValid:newEditingString:errorDescription:"); + bool _objc_msgSend_688( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer partialString, + ffi.Pointer> newString, + ffi.Pointer> error, + ) { + return __objc_msgSend_688( + obj, + sel, + partialString, + newString, + error, + ); + } + + late final __objc_msgSend_688Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_688 = __objc_msgSend_688Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer>)>(); + + late final _sel_isPartialStringValid_proposedSelectedRange_originalString_originalSelectedRange_errorDescription_1 = + _registerName1( + "isPartialStringValid:proposedSelectedRange:originalString:originalSelectedRange:errorDescription:"); + bool _objc_msgSend_689( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer> partialStringPtr, + ffi.Pointer<_NSRange> proposedSelRangePtr, + ffi.Pointer origString, + _NSRange origSelRange, + ffi.Pointer> error, + ) { + return __objc_msgSend_689( + obj, + sel, + partialStringPtr, + proposedSelRangePtr, + origString, + origSelRange, + error, + ); + } + + late final __objc_msgSend_689Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer<_NSRange>, + ffi.Pointer, + _NSRange, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_689 = __objc_msgSend_689Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer<_NSRange>, + ffi.Pointer, + _NSRange, + ffi.Pointer>)>(); + + late final _sel_formattingContext1 = _registerName1("formattingContext"); + int _objc_msgSend_690( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_690( + obj, + sel, + ); + } + + late final __objc_msgSend_690Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_690 = __objc_msgSend_690Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setFormattingContext_1 = + _registerName1("setFormattingContext:"); + void _objc_msgSend_691( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_691( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_691Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_691 = __objc_msgSend_691Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_getObjectValue_forString_range_error_1 = + _registerName1("getObjectValue:forString:range:error:"); + bool _objc_msgSend_692( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer> obj1, + ffi.Pointer string, + ffi.Pointer<_NSRange> rangep, + ffi.Pointer> error, + ) { + return __objc_msgSend_692( + obj, + sel, + obj1, + string, + rangep, + error, + ); + } + + late final __objc_msgSend_692Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer, + ffi.Pointer<_NSRange>, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_692 = __objc_msgSend_692Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer, + ffi.Pointer<_NSRange>, + ffi.Pointer>)>(); + + late final _sel_stringFromDate_1 = _registerName1("stringFromDate:"); + late final _sel_dateFromString_1 = _registerName1("dateFromString:"); + late final _sel_localizedStringFromDate_dateStyle_timeStyle_1 = + _registerName1("localizedStringFromDate:dateStyle:timeStyle:"); + ffi.Pointer _objc_msgSend_693( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer date, + int dstyle, + int tstyle, + ) { + return __objc_msgSend_693( + obj, + sel, + date, + dstyle, + tstyle, + ); + } + + late final __objc_msgSend_693Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_693 = __objc_msgSend_693Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer, int, int)>(); + + late final _sel_dateFormatFromTemplate_options_locale_1 = + _registerName1("dateFormatFromTemplate:options:locale:"); + ffi.Pointer _objc_msgSend_694( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer tmplate, + int opts, + ffi.Pointer locale, + ) { + return __objc_msgSend_694( + obj, + sel, + tmplate, + opts, + locale, + ); + } + + late final __objc_msgSend_694Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_694 = __objc_msgSend_694Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer)>(); + + late final _sel_defaultFormatterBehavior1 = + _registerName1("defaultFormatterBehavior"); + int _objc_msgSend_695( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_695( + obj, + sel, + ); + } + + late final __objc_msgSend_695Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_695 = __objc_msgSend_695Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setDefaultFormatterBehavior_1 = + _registerName1("setDefaultFormatterBehavior:"); + void _objc_msgSend_696( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_696( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_696Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_696 = __objc_msgSend_696Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_setLocalizedDateFormatFromTemplate_1 = + _registerName1("setLocalizedDateFormatFromTemplate:"); + late final _sel_dateFormat1 = _registerName1("dateFormat"); + late final _sel_setDateFormat_1 = _registerName1("setDateFormat:"); + late final _sel_dateStyle1 = _registerName1("dateStyle"); + int _objc_msgSend_697( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_697( + obj, + sel, + ); + } + + late final __objc_msgSend_697Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_697 = __objc_msgSend_697Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setDateStyle_1 = _registerName1("setDateStyle:"); + void _objc_msgSend_698( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_698( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_698Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_698 = __objc_msgSend_698Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_timeStyle1 = _registerName1("timeStyle"); + late final _sel_setTimeStyle_1 = _registerName1("setTimeStyle:"); + late final _sel_locale1 = _registerName1("locale"); + late final _sel_setLocale_1 = _registerName1("setLocale:"); + void _objc_msgSend_699( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_699( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_699Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_699 = __objc_msgSend_699Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_generatesCalendarDates1 = + _registerName1("generatesCalendarDates"); + late final _sel_setGeneratesCalendarDates_1 = + _registerName1("setGeneratesCalendarDates:"); + late final _sel_formatterBehavior1 = _registerName1("formatterBehavior"); + late final _sel_setFormatterBehavior_1 = + _registerName1("setFormatterBehavior:"); + late final _class_NSCalendar1 = _getClass1("NSCalendar"); + late final _sel_currentCalendar1 = _registerName1("currentCalendar"); + ffi.Pointer _objc_msgSend_700( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_700( + obj, + sel, + ); + } + + late final __objc_msgSend_700Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_700 = __objc_msgSend_700Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_autoupdatingCurrentCalendar1 = + _registerName1("autoupdatingCurrentCalendar"); + late final _sel_calendarWithIdentifier_1 = + _registerName1("calendarWithIdentifier:"); + ffi.Pointer _objc_msgSend_701( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer calendarIdentifierConstant, + ) { + return __objc_msgSend_701( + obj, + sel, + calendarIdentifierConstant, + ); + } + + late final __objc_msgSend_701Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_701 = __objc_msgSend_701Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_initWithCalendarIdentifier_1 = + _registerName1("initWithCalendarIdentifier:"); + late final _sel_firstWeekday1 = _registerName1("firstWeekday"); + late final _sel_setFirstWeekday_1 = _registerName1("setFirstWeekday:"); + late final _sel_minimumDaysInFirstWeek1 = + _registerName1("minimumDaysInFirstWeek"); + late final _sel_setMinimumDaysInFirstWeek_1 = + _registerName1("setMinimumDaysInFirstWeek:"); + late final _sel_eraSymbols1 = _registerName1("eraSymbols"); + late final _sel_longEraSymbols1 = _registerName1("longEraSymbols"); + late final _sel_monthSymbols1 = _registerName1("monthSymbols"); + late final _sel_shortMonthSymbols1 = _registerName1("shortMonthSymbols"); + late final _sel_veryShortMonthSymbols1 = + _registerName1("veryShortMonthSymbols"); + late final _sel_standaloneMonthSymbols1 = + _registerName1("standaloneMonthSymbols"); + late final _sel_shortStandaloneMonthSymbols1 = + _registerName1("shortStandaloneMonthSymbols"); + late final _sel_veryShortStandaloneMonthSymbols1 = + _registerName1("veryShortStandaloneMonthSymbols"); + late final _sel_weekdaySymbols1 = _registerName1("weekdaySymbols"); + late final _sel_shortWeekdaySymbols1 = _registerName1("shortWeekdaySymbols"); + late final _sel_veryShortWeekdaySymbols1 = + _registerName1("veryShortWeekdaySymbols"); + late final _sel_standaloneWeekdaySymbols1 = + _registerName1("standaloneWeekdaySymbols"); + late final _sel_shortStandaloneWeekdaySymbols1 = + _registerName1("shortStandaloneWeekdaySymbols"); + late final _sel_veryShortStandaloneWeekdaySymbols1 = + _registerName1("veryShortStandaloneWeekdaySymbols"); + late final _sel_quarterSymbols1 = _registerName1("quarterSymbols"); + late final _sel_shortQuarterSymbols1 = _registerName1("shortQuarterSymbols"); + late final _sel_standaloneQuarterSymbols1 = + _registerName1("standaloneQuarterSymbols"); + late final _sel_shortStandaloneQuarterSymbols1 = + _registerName1("shortStandaloneQuarterSymbols"); + late final _sel_AMSymbol1 = _registerName1("AMSymbol"); + late final _sel_PMSymbol1 = _registerName1("PMSymbol"); + late final _sel_minimumRangeOfUnit_1 = _registerName1("minimumRangeOfUnit:"); + void _objc_msgSend_702( + ffi.Pointer<_NSRange> stret, + ffi.Pointer obj, + ffi.Pointer sel, + int unit, + ) { + return __objc_msgSend_702( + stret, + obj, + sel, + unit, + ); + } + + late final __objc_msgSend_702Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer<_NSRange>, ffi.Pointer, + ffi.Pointer, ffi.Int32)>>('objc_msgSend_stret'); + late final __objc_msgSend_702 = __objc_msgSend_702Ptr.asFunction< + void Function(ffi.Pointer<_NSRange>, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_maximumRangeOfUnit_1 = _registerName1("maximumRangeOfUnit:"); + late final _sel_rangeOfUnit_inUnit_forDate_1 = + _registerName1("rangeOfUnit:inUnit:forDate:"); + void _objc_msgSend_703( + ffi.Pointer<_NSRange> stret, + ffi.Pointer obj, + ffi.Pointer sel, + int smaller, + int larger, + ffi.Pointer date, + ) { + return __objc_msgSend_703( + stret, + obj, + sel, + smaller, + larger, + date, + ); + } + + late final __objc_msgSend_703Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_NSRange>, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Int32, + ffi.Pointer)>>('objc_msgSend_stret'); + late final __objc_msgSend_703 = __objc_msgSend_703Ptr.asFunction< + void Function(ffi.Pointer<_NSRange>, ffi.Pointer, + ffi.Pointer, int, int, ffi.Pointer)>(); + + late final _sel_ordinalityOfUnit_inUnit_forDate_1 = + _registerName1("ordinalityOfUnit:inUnit:forDate:"); + int _objc_msgSend_704( + ffi.Pointer obj, + ffi.Pointer sel, + int smaller, + int larger, + ffi.Pointer date, + ) { + return __objc_msgSend_704( + obj, + sel, + smaller, + larger, + date, + ); + } + + late final __objc_msgSend_704Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Int32, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_704 = __objc_msgSend_704Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, int, int, + ffi.Pointer)>(); + + late final _sel_rangeOfUnit_startDate_interval_forDate_1 = + _registerName1("rangeOfUnit:startDate:interval:forDate:"); + bool _objc_msgSend_705( + ffi.Pointer obj, + ffi.Pointer sel, + int unit, + ffi.Pointer> datep, + ffi.Pointer tip, + ffi.Pointer date, + ) { + return __objc_msgSend_705( + obj, + sel, + unit, + datep, + tip, + date, + ); + } + + late final __objc_msgSend_705Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer>, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_705 = __objc_msgSend_705Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer>, + ffi.Pointer, + ffi.Pointer)>(); + + late final _class_NSDateComponents1 = _getClass1("NSDateComponents"); + late final _sel_calendar1 = _registerName1("calendar"); + late final _sel_setCalendar_1 = _registerName1("setCalendar:"); + void _objc_msgSend_706( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_706( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_706Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_706 = __objc_msgSend_706Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_era1 = _registerName1("era"); + late final _sel_setEra_1 = _registerName1("setEra:"); + late final _sel_year1 = _registerName1("year"); + late final _sel_setYear_1 = _registerName1("setYear:"); + late final _sel_month1 = _registerName1("month"); + late final _sel_setMonth_1 = _registerName1("setMonth:"); + late final _sel_day1 = _registerName1("day"); + late final _sel_setDay_1 = _registerName1("setDay:"); + late final _sel_hour1 = _registerName1("hour"); + late final _sel_setHour_1 = _registerName1("setHour:"); + late final _sel_minute1 = _registerName1("minute"); + late final _sel_setMinute_1 = _registerName1("setMinute:"); + late final _sel_second1 = _registerName1("second"); + late final _sel_setSecond_1 = _registerName1("setSecond:"); + late final _sel_nanosecond1 = _registerName1("nanosecond"); + late final _sel_setNanosecond_1 = _registerName1("setNanosecond:"); + late final _sel_weekday1 = _registerName1("weekday"); + late final _sel_setWeekday_1 = _registerName1("setWeekday:"); + late final _sel_weekdayOrdinal1 = _registerName1("weekdayOrdinal"); + late final _sel_setWeekdayOrdinal_1 = _registerName1("setWeekdayOrdinal:"); + late final _sel_quarter1 = _registerName1("quarter"); + late final _sel_setQuarter_1 = _registerName1("setQuarter:"); + late final _sel_weekOfMonth1 = _registerName1("weekOfMonth"); + late final _sel_setWeekOfMonth_1 = _registerName1("setWeekOfMonth:"); + late final _sel_weekOfYear1 = _registerName1("weekOfYear"); + late final _sel_setWeekOfYear_1 = _registerName1("setWeekOfYear:"); + late final _sel_yearForWeekOfYear1 = _registerName1("yearForWeekOfYear"); + late final _sel_setYearForWeekOfYear_1 = + _registerName1("setYearForWeekOfYear:"); + late final _sel_isLeapMonth1 = _registerName1("isLeapMonth"); + late final _sel_setLeapMonth_1 = _registerName1("setLeapMonth:"); + late final _sel_week1 = _registerName1("week"); + late final _sel_setWeek_1 = _registerName1("setWeek:"); + late final _sel_setValue_forComponent_1 = + _registerName1("setValue:forComponent:"); + void _objc_msgSend_707( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + int unit, + ) { + return __objc_msgSend_707( + obj, + sel, + value, + unit, + ); + } + + late final __objc_msgSend_707Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Long, ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_707 = __objc_msgSend_707Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, int)>(); + + late final _sel_valueForComponent_1 = _registerName1("valueForComponent:"); + int _objc_msgSend_708( + ffi.Pointer obj, + ffi.Pointer sel, + int unit, + ) { + return __objc_msgSend_708( + obj, + sel, + unit, + ); + } + + late final __objc_msgSend_708Ptr = _lookup< + ffi.NativeFunction< + ffi.Long Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_708 = __objc_msgSend_708Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_isValidDate1 = _registerName1("isValidDate"); + late final _sel_isValidDateInCalendar_1 = + _registerName1("isValidDateInCalendar:"); + bool _objc_msgSend_709( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer calendar, + ) { + return __objc_msgSend_709( + obj, + sel, + calendar, + ); + } + + late final __objc_msgSend_709Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_709 = __objc_msgSend_709Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_dateFromComponents_1 = _registerName1("dateFromComponents:"); + ffi.Pointer _objc_msgSend_710( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer comps, + ) { + return __objc_msgSend_710( + obj, + sel, + comps, + ); + } + + late final __objc_msgSend_710Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_710 = __objc_msgSend_710Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_components_fromDate_1 = + _registerName1("components:fromDate:"); + ffi.Pointer _objc_msgSend_711( + ffi.Pointer obj, + ffi.Pointer sel, + int unitFlags, + ffi.Pointer date, + ) { + return __objc_msgSend_711( + obj, + sel, + unitFlags, + date, + ); + } + + late final __objc_msgSend_711Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_711 = __objc_msgSend_711Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, ffi.Pointer)>(); + + late final _sel_dateByAddingComponents_toDate_options_1 = + _registerName1("dateByAddingComponents:toDate:options:"); + ffi.Pointer _objc_msgSend_712( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer comps, + ffi.Pointer date, + int opts, + ) { + return __objc_msgSend_712( + obj, + sel, + comps, + date, + opts, + ); + } + + late final __objc_msgSend_712Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_712 = __objc_msgSend_712Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int)>(); + + late final _sel_components_fromDate_toDate_options_1 = + _registerName1("components:fromDate:toDate:options:"); + ffi.Pointer _objc_msgSend_713( + ffi.Pointer obj, + ffi.Pointer sel, + int unitFlags, + ffi.Pointer startingDate, + ffi.Pointer resultDate, + int opts, + ) { + return __objc_msgSend_713( + obj, + sel, + unitFlags, + startingDate, + resultDate, + opts, + ); + } + + late final __objc_msgSend_713Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer, + ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_713 = __objc_msgSend_713Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer, + ffi.Pointer, + int)>(); + + late final _sel_getEra_year_month_day_fromDate_1 = + _registerName1("getEra:year:month:day:fromDate:"); + void _objc_msgSend_714( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer eraValuePointer, + ffi.Pointer yearValuePointer, + ffi.Pointer monthValuePointer, + ffi.Pointer dayValuePointer, + ffi.Pointer date, + ) { + return __objc_msgSend_714( + obj, + sel, + eraValuePointer, + yearValuePointer, + monthValuePointer, + dayValuePointer, + date, + ); + } + + late final __objc_msgSend_714Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_714 = __objc_msgSend_714Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_getEra_yearForWeekOfYear_weekOfYear_weekday_fromDate_1 = + _registerName1("getEra:yearForWeekOfYear:weekOfYear:weekday:fromDate:"); + late final _sel_getHour_minute_second_nanosecond_fromDate_1 = + _registerName1("getHour:minute:second:nanosecond:fromDate:"); + late final _sel_component_fromDate_1 = _registerName1("component:fromDate:"); + int _objc_msgSend_715( + ffi.Pointer obj, + ffi.Pointer sel, + int unit, + ffi.Pointer date, + ) { + return __objc_msgSend_715( + obj, + sel, + unit, + date, + ); + } + + late final __objc_msgSend_715Ptr = _lookup< + ffi.NativeFunction< + ffi.Long Function(ffi.Pointer, ffi.Pointer, + ffi.Int32, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_715 = __objc_msgSend_715Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer)>(); + + late final _sel_dateWithEra_year_month_day_hour_minute_second_nanosecond_1 = + _registerName1( + "dateWithEra:year:month:day:hour:minute:second:nanosecond:"); + ffi.Pointer _objc_msgSend_716( + ffi.Pointer obj, + ffi.Pointer sel, + int eraValue, + int yearValue, + int monthValue, + int dayValue, + int hourValue, + int minuteValue, + int secondValue, + int nanosecondValue, + ) { + return __objc_msgSend_716( + obj, + sel, + eraValue, + yearValue, + monthValue, + dayValue, + hourValue, + minuteValue, + secondValue, + nanosecondValue, + ); + } + + late final __objc_msgSend_716Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Long, + ffi.Long, + ffi.Long, + ffi.Long, + ffi.Long, + ffi.Long, + ffi.Long, + ffi.Long)>>('objc_msgSend'); + late final __objc_msgSend_716 = __objc_msgSend_716Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, int, int, int, int, int, int, int)>(); + + late final _sel_dateWithEra_yearForWeekOfYear_weekOfYear_weekday_hour_minute_second_nanosecond_1 = + _registerName1( + "dateWithEra:yearForWeekOfYear:weekOfYear:weekday:hour:minute:second:nanosecond:"); + late final _sel_startOfDayForDate_1 = _registerName1("startOfDayForDate:"); + late final _sel_componentsInTimeZone_fromDate_1 = + _registerName1("componentsInTimeZone:fromDate:"); + ffi.Pointer _objc_msgSend_717( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer timezone, + ffi.Pointer date, + ) { + return __objc_msgSend_717( + obj, + sel, + timezone, + date, + ); + } + + late final __objc_msgSend_717Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_717 = __objc_msgSend_717Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_compareDate_toDate_toUnitGranularity_1 = + _registerName1("compareDate:toDate:toUnitGranularity:"); + int _objc_msgSend_718( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer date1, + ffi.Pointer date2, + int unit, + ) { + return __objc_msgSend_718( + obj, + sel, + date1, + date2, + unit, + ); + } + + late final __objc_msgSend_718Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_718 = __objc_msgSend_718Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_isDate_equalToDate_toUnitGranularity_1 = + _registerName1("isDate:equalToDate:toUnitGranularity:"); + bool _objc_msgSend_719( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer date1, + ffi.Pointer date2, + int unit, + ) { + return __objc_msgSend_719( + obj, + sel, + date1, + date2, + unit, + ); + } + + late final __objc_msgSend_719Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_719 = __objc_msgSend_719Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_isDate_inSameDayAsDate_1 = + _registerName1("isDate:inSameDayAsDate:"); + bool _objc_msgSend_720( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer date1, + ffi.Pointer date2, + ) { + return __objc_msgSend_720( + obj, + sel, + date1, + date2, + ); + } + + late final __objc_msgSend_720Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_720 = __objc_msgSend_720Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_isDateInToday_1 = _registerName1("isDateInToday:"); + late final _sel_isDateInYesterday_1 = _registerName1("isDateInYesterday:"); + late final _sel_isDateInTomorrow_1 = _registerName1("isDateInTomorrow:"); + late final _sel_isDateInWeekend_1 = _registerName1("isDateInWeekend:"); + late final _sel_rangeOfWeekendStartDate_interval_containingDate_1 = + _registerName1("rangeOfWeekendStartDate:interval:containingDate:"); + bool _objc_msgSend_721( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer> datep, + ffi.Pointer tip, + ffi.Pointer date, + ) { + return __objc_msgSend_721( + obj, + sel, + datep, + tip, + date, + ); + } + + late final __objc_msgSend_721Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_721 = __objc_msgSend_721Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_nextWeekendStartDate_interval_options_afterDate_1 = + _registerName1("nextWeekendStartDate:interval:options:afterDate:"); + bool _objc_msgSend_722( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer> datep, + ffi.Pointer tip, + int options, + ffi.Pointer date, + ) { + return __objc_msgSend_722( + obj, + sel, + datep, + tip, + options, + date, + ); + } + + late final __objc_msgSend_722Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer, + ffi.Int32, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_722 = __objc_msgSend_722Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer, + int, + ffi.Pointer)>(); + + late final _sel_components_fromDateComponents_toDateComponents_options_1 = + _registerName1("components:fromDateComponents:toDateComponents:options:"); + ffi.Pointer _objc_msgSend_723( + ffi.Pointer obj, + ffi.Pointer sel, + int unitFlags, + ffi.Pointer startingDateComp, + ffi.Pointer resultDateComp, + int options, + ) { + return __objc_msgSend_723( + obj, + sel, + unitFlags, + startingDateComp, + resultDateComp, + options, + ); + } + + late final __objc_msgSend_723Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer, + ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_723 = __objc_msgSend_723Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer, + ffi.Pointer, + int)>(); + + late final _sel_dateByAddingUnit_value_toDate_options_1 = + _registerName1("dateByAddingUnit:value:toDate:options:"); + ffi.Pointer _objc_msgSend_724( + ffi.Pointer obj, + ffi.Pointer sel, + int unit, + int value, + ffi.Pointer date, + int options, + ) { + return __objc_msgSend_724( + obj, + sel, + unit, + value, + date, + options, + ); + } + + late final __objc_msgSend_724Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Long, + ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_724 = __objc_msgSend_724Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, int, ffi.Pointer, int)>(); + + late final _sel_enumerateDatesStartingAfterDate_matchingComponents_options_usingBlock_1 = + _registerName1( + "enumerateDatesStartingAfterDate:matchingComponents:options:usingBlock:"); + void _objc_msgSend_725( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer start, + ffi.Pointer comps, + int opts, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_725( + obj, + sel, + start, + comps, + opts, + block, + ); + } + + late final __objc_msgSend_725Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_725 = __objc_msgSend_725Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_nextDateAfterDate_matchingComponents_options_1 = + _registerName1("nextDateAfterDate:matchingComponents:options:"); + ffi.Pointer _objc_msgSend_726( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer date, + ffi.Pointer comps, + int options, + ) { + return __objc_msgSend_726( + obj, + sel, + date, + comps, + options, + ); + } + + late final __objc_msgSend_726Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_726 = __objc_msgSend_726Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int)>(); + + late final _sel_nextDateAfterDate_matchingUnit_value_options_1 = + _registerName1("nextDateAfterDate:matchingUnit:value:options:"); + ffi.Pointer _objc_msgSend_727( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer date, + int unit, + int value, + int options, + ) { + return __objc_msgSend_727( + obj, + sel, + date, + unit, + value, + options, + ); + } + + late final __objc_msgSend_727Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Long, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_727 = __objc_msgSend_727Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer, int, int, int)>(); + + late final _sel_nextDateAfterDate_matchingHour_minute_second_options_1 = + _registerName1("nextDateAfterDate:matchingHour:minute:second:options:"); + ffi.Pointer _objc_msgSend_728( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer date, + int hourValue, + int minuteValue, + int secondValue, + int options, + ) { + return __objc_msgSend_728( + obj, + sel, + date, + hourValue, + minuteValue, + secondValue, + options, + ); + } + + late final __objc_msgSend_728Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Long, + ffi.Long, + ffi.Long, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_728 = __objc_msgSend_728Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer, int, int, int, int)>(); + + late final _sel_dateBySettingUnit_value_ofDate_options_1 = + _registerName1("dateBySettingUnit:value:ofDate:options:"); + late final _sel_dateBySettingHour_minute_second_ofDate_options_1 = + _registerName1("dateBySettingHour:minute:second:ofDate:options:"); + ffi.Pointer _objc_msgSend_729( + ffi.Pointer obj, + ffi.Pointer sel, + int h, + int m, + int s, + ffi.Pointer date, + int opts, + ) { + return __objc_msgSend_729( + obj, + sel, + h, + m, + s, + date, + opts, + ); + } + + late final __objc_msgSend_729Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Long, + ffi.Long, + ffi.Long, + ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_729 = __objc_msgSend_729Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, int, int, ffi.Pointer, int)>(); + + late final _sel_date_matchesComponents_1 = + _registerName1("date:matchesComponents:"); + bool _objc_msgSend_730( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer date, + ffi.Pointer components, + ) { + return __objc_msgSend_730( + obj, + sel, + date, + components, + ); + } + + late final __objc_msgSend_730Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_730 = __objc_msgSend_730Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_isLenient1 = _registerName1("isLenient"); + late final _sel_setLenient_1 = _registerName1("setLenient:"); + late final _sel_twoDigitStartDate1 = _registerName1("twoDigitStartDate"); + late final _sel_setTwoDigitStartDate_1 = + _registerName1("setTwoDigitStartDate:"); + late final _sel_defaultDate1 = _registerName1("defaultDate"); + late final _sel_setDefaultDate_1 = _registerName1("setDefaultDate:"); + late final _sel_setEraSymbols_1 = _registerName1("setEraSymbols:"); + void _objc_msgSend_731( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_731( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_731Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_731 = __objc_msgSend_731Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_setMonthSymbols_1 = _registerName1("setMonthSymbols:"); + late final _sel_setShortMonthSymbols_1 = + _registerName1("setShortMonthSymbols:"); + late final _sel_setWeekdaySymbols_1 = _registerName1("setWeekdaySymbols:"); + late final _sel_setShortWeekdaySymbols_1 = + _registerName1("setShortWeekdaySymbols:"); + late final _sel_setAMSymbol_1 = _registerName1("setAMSymbol:"); + late final _sel_setPMSymbol_1 = _registerName1("setPMSymbol:"); + late final _sel_setLongEraSymbols_1 = _registerName1("setLongEraSymbols:"); + late final _sel_setVeryShortMonthSymbols_1 = + _registerName1("setVeryShortMonthSymbols:"); + late final _sel_setStandaloneMonthSymbols_1 = + _registerName1("setStandaloneMonthSymbols:"); + late final _sel_setShortStandaloneMonthSymbols_1 = + _registerName1("setShortStandaloneMonthSymbols:"); + late final _sel_setVeryShortStandaloneMonthSymbols_1 = + _registerName1("setVeryShortStandaloneMonthSymbols:"); + late final _sel_setVeryShortWeekdaySymbols_1 = + _registerName1("setVeryShortWeekdaySymbols:"); + late final _sel_setStandaloneWeekdaySymbols_1 = + _registerName1("setStandaloneWeekdaySymbols:"); + late final _sel_setShortStandaloneWeekdaySymbols_1 = + _registerName1("setShortStandaloneWeekdaySymbols:"); + late final _sel_setVeryShortStandaloneWeekdaySymbols_1 = + _registerName1("setVeryShortStandaloneWeekdaySymbols:"); + late final _sel_setQuarterSymbols_1 = _registerName1("setQuarterSymbols:"); + late final _sel_setShortQuarterSymbols_1 = + _registerName1("setShortQuarterSymbols:"); + late final _sel_setStandaloneQuarterSymbols_1 = + _registerName1("setStandaloneQuarterSymbols:"); + late final _sel_setShortStandaloneQuarterSymbols_1 = + _registerName1("setShortStandaloneQuarterSymbols:"); + late final _sel_gregorianStartDate1 = _registerName1("gregorianStartDate"); + late final _sel_setGregorianStartDate_1 = + _registerName1("setGregorianStartDate:"); + late final _sel_doesRelativeDateFormatting1 = + _registerName1("doesRelativeDateFormatting"); + late final _sel_setDoesRelativeDateFormatting_1 = + _registerName1("setDoesRelativeDateFormatting:"); + late final _sel_initWithDateFormat_allowNaturalLanguage_1 = + _registerName1("initWithDateFormat:allowNaturalLanguage:"); + late final _sel_allowsNaturalLanguage1 = + _registerName1("allowsNaturalLanguage"); + late final _class_NSNumberFormatter1 = _getClass1("NSNumberFormatter"); + late final _sel_stringFromNumber_1 = _registerName1("stringFromNumber:"); + ffi.Pointer _objc_msgSend_732( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer number, + ) { + return __objc_msgSend_732( + obj, + sel, + number, + ); + } + + late final __objc_msgSend_732Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_732 = __objc_msgSend_732Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_numberFromString_1 = _registerName1("numberFromString:"); + ffi.Pointer _objc_msgSend_733( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer string, + ) { + return __objc_msgSend_733( + obj, + sel, + string, + ); + } + + late final __objc_msgSend_733Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_733 = __objc_msgSend_733Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_localizedStringFromNumber_numberStyle_1 = + _registerName1("localizedStringFromNumber:numberStyle:"); + ffi.Pointer _objc_msgSend_734( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer num, + int nstyle, + ) { + return __objc_msgSend_734( + obj, + sel, + num, + nstyle, + ); + } + + late final __objc_msgSend_734Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_734 = __objc_msgSend_734Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer, int)>(); + + int _objc_msgSend_735( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_735( + obj, + sel, + ); + } + + late final __objc_msgSend_735Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_735 = __objc_msgSend_735Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + void _objc_msgSend_736( + ffi.Pointer obj, + ffi.Pointer sel, + int behavior, + ) { + return __objc_msgSend_736( + obj, + sel, + behavior, + ); + } + + late final __objc_msgSend_736Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_736 = __objc_msgSend_736Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_numberStyle1 = _registerName1("numberStyle"); + int _objc_msgSend_737( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_737( + obj, + sel, + ); + } + + late final __objc_msgSend_737Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_737 = __objc_msgSend_737Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setNumberStyle_1 = _registerName1("setNumberStyle:"); + void _objc_msgSend_738( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_738( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_738Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_738 = __objc_msgSend_738Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_generatesDecimalNumbers1 = + _registerName1("generatesDecimalNumbers"); + late final _sel_setGeneratesDecimalNumbers_1 = + _registerName1("setGeneratesDecimalNumbers:"); + void _objc_msgSend_739( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_739( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_739Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_739 = __objc_msgSend_739Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_negativeFormat1 = _registerName1("negativeFormat"); + late final _sel_setNegativeFormat_1 = _registerName1("setNegativeFormat:"); + late final _sel_textAttributesForNegativeValues1 = + _registerName1("textAttributesForNegativeValues"); + late final _sel_setTextAttributesForNegativeValues_1 = + _registerName1("setTextAttributesForNegativeValues:"); + late final _sel_positiveFormat1 = _registerName1("positiveFormat"); + late final _sel_setPositiveFormat_1 = _registerName1("setPositiveFormat:"); + late final _sel_textAttributesForPositiveValues1 = + _registerName1("textAttributesForPositiveValues"); + late final _sel_setTextAttributesForPositiveValues_1 = + _registerName1("setTextAttributesForPositiveValues:"); + late final _sel_allowsFloats1 = _registerName1("allowsFloats"); + late final _sel_setAllowsFloats_1 = _registerName1("setAllowsFloats:"); + late final _sel_setDecimalSeparator_1 = + _registerName1("setDecimalSeparator:"); + late final _sel_alwaysShowsDecimalSeparator1 = + _registerName1("alwaysShowsDecimalSeparator"); + late final _sel_setAlwaysShowsDecimalSeparator_1 = + _registerName1("setAlwaysShowsDecimalSeparator:"); + late final _sel_currencyDecimalSeparator1 = + _registerName1("currencyDecimalSeparator"); + late final _sel_setCurrencyDecimalSeparator_1 = + _registerName1("setCurrencyDecimalSeparator:"); + late final _sel_usesGroupingSeparator1 = + _registerName1("usesGroupingSeparator"); + late final _sel_setUsesGroupingSeparator_1 = + _registerName1("setUsesGroupingSeparator:"); + late final _sel_setGroupingSeparator_1 = + _registerName1("setGroupingSeparator:"); + late final _sel_zeroSymbol1 = _registerName1("zeroSymbol"); + late final _sel_setZeroSymbol_1 = _registerName1("setZeroSymbol:"); + late final _sel_textAttributesForZero1 = + _registerName1("textAttributesForZero"); + late final _sel_setTextAttributesForZero_1 = + _registerName1("setTextAttributesForZero:"); + late final _sel_nilSymbol1 = _registerName1("nilSymbol"); + late final _sel_setNilSymbol_1 = _registerName1("setNilSymbol:"); + late final _sel_textAttributesForNil1 = + _registerName1("textAttributesForNil"); + late final _sel_setTextAttributesForNil_1 = + _registerName1("setTextAttributesForNil:"); + late final _sel_notANumberSymbol1 = _registerName1("notANumberSymbol"); + late final _sel_setNotANumberSymbol_1 = + _registerName1("setNotANumberSymbol:"); + late final _sel_textAttributesForNotANumber1 = + _registerName1("textAttributesForNotANumber"); + late final _sel_setTextAttributesForNotANumber_1 = + _registerName1("setTextAttributesForNotANumber:"); + late final _sel_positiveInfinitySymbol1 = + _registerName1("positiveInfinitySymbol"); + late final _sel_setPositiveInfinitySymbol_1 = + _registerName1("setPositiveInfinitySymbol:"); + late final _sel_textAttributesForPositiveInfinity1 = + _registerName1("textAttributesForPositiveInfinity"); + late final _sel_setTextAttributesForPositiveInfinity_1 = + _registerName1("setTextAttributesForPositiveInfinity:"); + late final _sel_negativeInfinitySymbol1 = + _registerName1("negativeInfinitySymbol"); + late final _sel_setNegativeInfinitySymbol_1 = + _registerName1("setNegativeInfinitySymbol:"); + late final _sel_textAttributesForNegativeInfinity1 = + _registerName1("textAttributesForNegativeInfinity"); + late final _sel_setTextAttributesForNegativeInfinity_1 = + _registerName1("setTextAttributesForNegativeInfinity:"); + late final _sel_positivePrefix1 = _registerName1("positivePrefix"); + late final _sel_setPositivePrefix_1 = _registerName1("setPositivePrefix:"); + late final _sel_positiveSuffix1 = _registerName1("positiveSuffix"); + late final _sel_setPositiveSuffix_1 = _registerName1("setPositiveSuffix:"); + late final _sel_negativePrefix1 = _registerName1("negativePrefix"); + late final _sel_setNegativePrefix_1 = _registerName1("setNegativePrefix:"); + late final _sel_negativeSuffix1 = _registerName1("negativeSuffix"); + late final _sel_setNegativeSuffix_1 = _registerName1("setNegativeSuffix:"); + late final _sel_setCurrencyCode_1 = _registerName1("setCurrencyCode:"); + late final _sel_setCurrencySymbol_1 = _registerName1("setCurrencySymbol:"); + late final _sel_internationalCurrencySymbol1 = + _registerName1("internationalCurrencySymbol"); + late final _sel_setInternationalCurrencySymbol_1 = + _registerName1("setInternationalCurrencySymbol:"); + late final _sel_percentSymbol1 = _registerName1("percentSymbol"); + late final _sel_setPercentSymbol_1 = _registerName1("setPercentSymbol:"); + late final _sel_perMillSymbol1 = _registerName1("perMillSymbol"); + late final _sel_setPerMillSymbol_1 = _registerName1("setPerMillSymbol:"); + late final _sel_minusSign1 = _registerName1("minusSign"); + late final _sel_setMinusSign_1 = _registerName1("setMinusSign:"); + late final _sel_plusSign1 = _registerName1("plusSign"); + late final _sel_setPlusSign_1 = _registerName1("setPlusSign:"); + late final _sel_exponentSymbol1 = _registerName1("exponentSymbol"); + late final _sel_setExponentSymbol_1 = _registerName1("setExponentSymbol:"); + late final _sel_groupingSize1 = _registerName1("groupingSize"); + late final _sel_setGroupingSize_1 = _registerName1("setGroupingSize:"); + late final _sel_secondaryGroupingSize1 = + _registerName1("secondaryGroupingSize"); + late final _sel_setSecondaryGroupingSize_1 = + _registerName1("setSecondaryGroupingSize:"); + late final _sel_multiplier1 = _registerName1("multiplier"); + late final _sel_setMultiplier_1 = _registerName1("setMultiplier:"); + late final _sel_formatWidth1 = _registerName1("formatWidth"); + late final _sel_setFormatWidth_1 = _registerName1("setFormatWidth:"); + late final _sel_paddingCharacter1 = _registerName1("paddingCharacter"); + late final _sel_setPaddingCharacter_1 = + _registerName1("setPaddingCharacter:"); + late final _sel_paddingPosition1 = _registerName1("paddingPosition"); + int _objc_msgSend_740( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_740( + obj, + sel, + ); + } + + late final __objc_msgSend_740Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_740 = __objc_msgSend_740Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setPaddingPosition_1 = _registerName1("setPaddingPosition:"); + void _objc_msgSend_741( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_741( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_741Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_741 = __objc_msgSend_741Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_roundingMode1 = _registerName1("roundingMode"); + int _objc_msgSend_742( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_742( + obj, + sel, + ); + } + + late final __objc_msgSend_742Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_742 = __objc_msgSend_742Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setRoundingMode_1 = _registerName1("setRoundingMode:"); + void _objc_msgSend_743( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_743( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_743Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_743 = __objc_msgSend_743Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_roundingIncrement1 = _registerName1("roundingIncrement"); + late final _sel_setRoundingIncrement_1 = + _registerName1("setRoundingIncrement:"); + late final _sel_minimumIntegerDigits1 = + _registerName1("minimumIntegerDigits"); + late final _sel_setMinimumIntegerDigits_1 = + _registerName1("setMinimumIntegerDigits:"); + late final _sel_maximumIntegerDigits1 = + _registerName1("maximumIntegerDigits"); + late final _sel_setMaximumIntegerDigits_1 = + _registerName1("setMaximumIntegerDigits:"); + late final _sel_minimumFractionDigits1 = + _registerName1("minimumFractionDigits"); + late final _sel_setMinimumFractionDigits_1 = + _registerName1("setMinimumFractionDigits:"); + late final _sel_maximumFractionDigits1 = + _registerName1("maximumFractionDigits"); + late final _sel_setMaximumFractionDigits_1 = + _registerName1("setMaximumFractionDigits:"); + late final _sel_minimum1 = _registerName1("minimum"); + late final _sel_setMinimum_1 = _registerName1("setMinimum:"); + late final _sel_maximum1 = _registerName1("maximum"); + late final _sel_setMaximum_1 = _registerName1("setMaximum:"); + late final _sel_currencyGroupingSeparator1 = + _registerName1("currencyGroupingSeparator"); + late final _sel_setCurrencyGroupingSeparator_1 = + _registerName1("setCurrencyGroupingSeparator:"); + late final _sel_usesSignificantDigits1 = + _registerName1("usesSignificantDigits"); + late final _sel_setUsesSignificantDigits_1 = + _registerName1("setUsesSignificantDigits:"); + late final _sel_minimumSignificantDigits1 = + _registerName1("minimumSignificantDigits"); + late final _sel_setMinimumSignificantDigits_1 = + _registerName1("setMinimumSignificantDigits:"); + late final _sel_maximumSignificantDigits1 = + _registerName1("maximumSignificantDigits"); + late final _sel_setMaximumSignificantDigits_1 = + _registerName1("setMaximumSignificantDigits:"); + late final _sel_isPartialStringValidationEnabled1 = + _registerName1("isPartialStringValidationEnabled"); + late final _sel_setPartialStringValidationEnabled_1 = + _registerName1("setPartialStringValidationEnabled:"); + late final _sel_hasThousandSeparators1 = + _registerName1("hasThousandSeparators"); + late final _sel_setHasThousandSeparators_1 = + _registerName1("setHasThousandSeparators:"); + late final _sel_thousandSeparator1 = _registerName1("thousandSeparator"); + late final _sel_setThousandSeparator_1 = + _registerName1("setThousandSeparator:"); + late final _sel_localizesFormat1 = _registerName1("localizesFormat"); + late final _sel_setLocalizesFormat_1 = _registerName1("setLocalizesFormat:"); + late final _sel_format1 = _registerName1("format"); + late final _sel_setFormat_1 = _registerName1("setFormat:"); + late final _sel_attributedStringForZero1 = + _registerName1("attributedStringForZero"); + late final _sel_setAttributedStringForZero_1 = + _registerName1("setAttributedStringForZero:"); + void _objc_msgSend_744( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_744( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_744Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_744 = __objc_msgSend_744Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_attributedStringForNil1 = + _registerName1("attributedStringForNil"); + late final _sel_setAttributedStringForNil_1 = + _registerName1("setAttributedStringForNil:"); + late final _sel_attributedStringForNotANumber1 = + _registerName1("attributedStringForNotANumber"); + late final _sel_setAttributedStringForNotANumber_1 = + _registerName1("setAttributedStringForNotANumber:"); + late final _class_NSDecimalNumberHandler1 = + _getClass1("NSDecimalNumberHandler"); + late final _sel_defaultDecimalNumberHandler1 = + _registerName1("defaultDecimalNumberHandler"); + ffi.Pointer _objc_msgSend_745( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_745( + obj, + sel, + ); + } + + late final __objc_msgSend_745Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_745 = __objc_msgSend_745Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_initWithRoundingMode_scale_raiseOnExactness_raiseOnOverflow_raiseOnUnderflow_raiseOnDivideByZero_1 = + _registerName1( + "initWithRoundingMode:scale:raiseOnExactness:raiseOnOverflow:raiseOnUnderflow:raiseOnDivideByZero:"); + instancetype _objc_msgSend_746( + ffi.Pointer obj, + ffi.Pointer sel, + int roundingMode, + int scale, + bool exact, + bool overflow, + bool underflow, + bool divideByZero, + ) { + return __objc_msgSend_746( + obj, + sel, + roundingMode, + scale, + exact, + overflow, + underflow, + divideByZero, + ); + } + + late final __objc_msgSend_746Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Short, + ffi.Bool, + ffi.Bool, + ffi.Bool, + ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_746 = __objc_msgSend_746Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, int, + int, bool, bool, bool, bool)>(); + + late final _sel_decimalNumberHandlerWithRoundingMode_scale_raiseOnExactness_raiseOnOverflow_raiseOnUnderflow_raiseOnDivideByZero_1 = + _registerName1( + "decimalNumberHandlerWithRoundingMode:scale:raiseOnExactness:raiseOnOverflow:raiseOnUnderflow:raiseOnDivideByZero:"); + late final _sel_roundingBehavior1 = _registerName1("roundingBehavior"); + late final _sel_setRoundingBehavior_1 = + _registerName1("setRoundingBehavior:"); + void _objc_msgSend_747( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_747( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_747Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_747 = __objc_msgSend_747Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _class_NSScanner1 = _getClass1("NSScanner"); + late final _sel_scanLocation1 = _registerName1("scanLocation"); + late final _sel_setScanLocation_1 = _registerName1("setScanLocation:"); + late final _sel_charactersToBeSkipped1 = + _registerName1("charactersToBeSkipped"); + late final _sel_setCharactersToBeSkipped_1 = + _registerName1("setCharactersToBeSkipped:"); + void _objc_msgSend_748( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_748( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_748Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_748 = __objc_msgSend_748Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_caseSensitive1 = _registerName1("caseSensitive"); + late final _sel_setCaseSensitive_1 = _registerName1("setCaseSensitive:"); + late final _sel_scanInt_1 = _registerName1("scanInt:"); + bool _objc_msgSend_749( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer result, + ) { + return __objc_msgSend_749( + obj, + sel, + result, + ); + } + + late final __objc_msgSend_749Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_749 = __objc_msgSend_749Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_scanInteger_1 = _registerName1("scanInteger:"); + bool _objc_msgSend_750( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer result, + ) { + return __objc_msgSend_750( + obj, + sel, + result, + ); + } + + late final __objc_msgSend_750Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_750 = __objc_msgSend_750Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_scanLongLong_1 = _registerName1("scanLongLong:"); + bool _objc_msgSend_751( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer result, + ) { + return __objc_msgSend_751( + obj, + sel, + result, + ); + } + + late final __objc_msgSend_751Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_751 = __objc_msgSend_751Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_scanUnsignedLongLong_1 = + _registerName1("scanUnsignedLongLong:"); + bool _objc_msgSend_752( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer result, + ) { + return __objc_msgSend_752( + obj, + sel, + result, + ); + } + + late final __objc_msgSend_752Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_752 = __objc_msgSend_752Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_scanFloat_1 = _registerName1("scanFloat:"); + bool _objc_msgSend_753( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer result, + ) { + return __objc_msgSend_753( + obj, + sel, + result, + ); + } + + late final __objc_msgSend_753Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_753 = __objc_msgSend_753Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_scanDouble_1 = _registerName1("scanDouble:"); + bool _objc_msgSend_754( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer result, + ) { + return __objc_msgSend_754( + obj, + sel, + result, + ); + } + + late final __objc_msgSend_754Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_754 = __objc_msgSend_754Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_scanHexInt_1 = _registerName1("scanHexInt:"); + bool _objc_msgSend_755( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer result, + ) { + return __objc_msgSend_755( + obj, + sel, + result, + ); + } + + late final __objc_msgSend_755Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_755 = __objc_msgSend_755Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_scanHexLongLong_1 = _registerName1("scanHexLongLong:"); + late final _sel_scanHexFloat_1 = _registerName1("scanHexFloat:"); + late final _sel_scanHexDouble_1 = _registerName1("scanHexDouble:"); + late final _sel_scanString_intoString_1 = + _registerName1("scanString:intoString:"); + bool _objc_msgSend_756( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer string, + ffi.Pointer> result, + ) { + return __objc_msgSend_756( + obj, + sel, + string, + result, + ); + } + + late final __objc_msgSend_756Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_756 = __objc_msgSend_756Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer>)>(); + + late final _sel_scanCharactersFromSet_intoString_1 = + _registerName1("scanCharactersFromSet:intoString:"); + bool _objc_msgSend_757( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer set1, + ffi.Pointer> result, + ) { + return __objc_msgSend_757( + obj, + sel, + set1, + result, + ); + } + + late final __objc_msgSend_757Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_757 = __objc_msgSend_757Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer>)>(); + + late final _sel_scanUpToString_intoString_1 = + _registerName1("scanUpToString:intoString:"); + late final _sel_scanUpToCharactersFromSet_intoString_1 = + _registerName1("scanUpToCharactersFromSet:intoString:"); + late final _sel_isAtEnd1 = _registerName1("isAtEnd"); + late final _sel_scannerWithString_1 = _registerName1("scannerWithString:"); + late final _sel_localizedScannerWithString_1 = + _registerName1("localizedScannerWithString:"); + late final _sel_scanDecimal_1 = _registerName1("scanDecimal:"); + bool _objc_msgSend_758( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer dcm, + ) { + return __objc_msgSend_758( + obj, + sel, + dcm, + ); + } + + late final __objc_msgSend_758Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_758 = __objc_msgSend_758Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _class_NSException1 = _getClass1("NSException"); + late final _sel_exceptionWithName_reason_userInfo_1 = + _registerName1("exceptionWithName:reason:userInfo:"); + ffi.Pointer _objc_msgSend_759( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + ffi.Pointer reason, + ffi.Pointer userInfo, + ) { + return __objc_msgSend_759( + obj, + sel, + name, + reason, + userInfo, + ); + } + + late final __objc_msgSend_759Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_759 = __objc_msgSend_759Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_initWithName_reason_userInfo_1 = + _registerName1("initWithName:reason:userInfo:"); + late final _sel_reason1 = _registerName1("reason"); + late final _sel_raise1 = _registerName1("raise"); + late final _sel_raise_format_1 = _registerName1("raise:format:"); + late final _sel_raise_format_arguments_1 = + _registerName1("raise:format:arguments:"); + void _objc_msgSend_760( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + ffi.Pointer format, + ffi.Pointer<__va_list_tag> argList, + ) { + return __objc_msgSend_760( + obj, + sel, + name, + format, + argList, + ); + } + + late final __objc_msgSend_760Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<__va_list_tag>)>>('objc_msgSend'); + late final __objc_msgSend_760 = __objc_msgSend_760Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<__va_list_tag>)>(); + + late final _class_NSFileHandle1 = _getClass1("NSFileHandle"); + late final _sel_availableData1 = _registerName1("availableData"); + late final _sel_initWithFileDescriptor_closeOnDealloc_1 = + _registerName1("initWithFileDescriptor:closeOnDealloc:"); + instancetype _objc_msgSend_761( + ffi.Pointer obj, + ffi.Pointer sel, + int fd, + bool closeopt, + ) { + return __objc_msgSend_761( + obj, + sel, + fd, + closeopt, + ); + } + + late final __objc_msgSend_761Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Int, ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_761 = __objc_msgSend_761Ptr.asFunction< + instancetype Function( + ffi.Pointer, ffi.Pointer, int, bool)>(); + + late final _sel_readDataToEndOfFileAndReturnError_1 = + _registerName1("readDataToEndOfFileAndReturnError:"); + ffi.Pointer _objc_msgSend_762( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer> error, + ) { + return __objc_msgSend_762( + obj, + sel, + error, + ); + } + + late final __objc_msgSend_762Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_762 = __objc_msgSend_762Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer>)>(); + + late final _sel_readDataUpToLength_error_1 = + _registerName1("readDataUpToLength:error:"); + ffi.Pointer _objc_msgSend_763( + ffi.Pointer obj, + ffi.Pointer sel, + int length, + ffi.Pointer> error, + ) { + return __objc_msgSend_763( + obj, + sel, + length, + error, + ); + } + + late final __objc_msgSend_763Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_763 = __objc_msgSend_763Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, ffi.Pointer>)>(); + + late final _sel_writeData_error_1 = _registerName1("writeData:error:"); + bool _objc_msgSend_764( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer data, + ffi.Pointer> error, + ) { + return __objc_msgSend_764( + obj, + sel, + data, + error, + ); + } + + late final __objc_msgSend_764Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_764 = __objc_msgSend_764Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer>)>(); + + late final _sel_getOffset_error_1 = _registerName1("getOffset:error:"); + bool _objc_msgSend_765( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer offsetInFile, + ffi.Pointer> error, + ) { + return __objc_msgSend_765( + obj, + sel, + offsetInFile, + error, + ); + } + + late final __objc_msgSend_765Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_765 = __objc_msgSend_765Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_seekToEndReturningOffset_error_1 = + _registerName1("seekToEndReturningOffset:error:"); + late final _sel_seekToOffset_error_1 = _registerName1("seekToOffset:error:"); + bool _objc_msgSend_766( + ffi.Pointer obj, + ffi.Pointer sel, + int offset, + ffi.Pointer> error, + ) { + return __objc_msgSend_766( + obj, + sel, + offset, + error, + ); + } + + late final __objc_msgSend_766Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLongLong, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_766 = __objc_msgSend_766Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer>)>(); + + late final _sel_truncateAtOffset_error_1 = + _registerName1("truncateAtOffset:error:"); + late final _sel_synchronizeAndReturnError_1 = + _registerName1("synchronizeAndReturnError:"); + late final _sel_closeAndReturnError_1 = + _registerName1("closeAndReturnError:"); + late final _sel_fileHandleWithStandardInput1 = + _registerName1("fileHandleWithStandardInput"); + ffi.Pointer _objc_msgSend_767( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_767( + obj, + sel, + ); + } + + late final __objc_msgSend_767Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_767 = __objc_msgSend_767Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_fileHandleWithStandardOutput1 = + _registerName1("fileHandleWithStandardOutput"); + late final _sel_fileHandleWithStandardError1 = + _registerName1("fileHandleWithStandardError"); + late final _sel_fileHandleWithNullDevice1 = + _registerName1("fileHandleWithNullDevice"); + late final _sel_fileHandleForReadingAtPath_1 = + _registerName1("fileHandleForReadingAtPath:"); + late final _sel_fileHandleForWritingAtPath_1 = + _registerName1("fileHandleForWritingAtPath:"); + late final _sel_fileHandleForUpdatingAtPath_1 = + _registerName1("fileHandleForUpdatingAtPath:"); + late final _sel_fileHandleForReadingFromURL_error_1 = + _registerName1("fileHandleForReadingFromURL:error:"); + instancetype _objc_msgSend_768( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ffi.Pointer> error, + ) { + return __objc_msgSend_768( + obj, + sel, + url, + error, + ); + } + + late final __objc_msgSend_768Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_768 = __objc_msgSend_768Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer>)>(); + + late final _sel_fileHandleForWritingToURL_error_1 = + _registerName1("fileHandleForWritingToURL:error:"); + late final _sel_fileHandleForUpdatingURL_error_1 = + _registerName1("fileHandleForUpdatingURL:error:"); + late final _sel_readInBackgroundAndNotifyForModes_1 = + _registerName1("readInBackgroundAndNotifyForModes:"); + late final _sel_readInBackgroundAndNotify1 = + _registerName1("readInBackgroundAndNotify"); + late final _sel_readToEndOfFileInBackgroundAndNotifyForModes_1 = + _registerName1("readToEndOfFileInBackgroundAndNotifyForModes:"); + late final _sel_readToEndOfFileInBackgroundAndNotify1 = + _registerName1("readToEndOfFileInBackgroundAndNotify"); + late final _sel_acceptConnectionInBackgroundAndNotifyForModes_1 = + _registerName1("acceptConnectionInBackgroundAndNotifyForModes:"); + late final _sel_acceptConnectionInBackgroundAndNotify1 = + _registerName1("acceptConnectionInBackgroundAndNotify"); + late final _sel_waitForDataInBackgroundAndNotifyForModes_1 = + _registerName1("waitForDataInBackgroundAndNotifyForModes:"); + late final _sel_waitForDataInBackgroundAndNotify1 = + _registerName1("waitForDataInBackgroundAndNotify"); + late final _sel_readabilityHandler1 = _registerName1("readabilityHandler"); + ffi.Pointer<_ObjCBlock> _objc_msgSend_769( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_769( + obj, + sel, + ); + } + + late final __objc_msgSend_769Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer<_ObjCBlock> Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_769 = __objc_msgSend_769Ptr.asFunction< + ffi.Pointer<_ObjCBlock> Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setReadabilityHandler_1 = + _registerName1("setReadabilityHandler:"); + void _objc_msgSend_770( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> value, + ) { + return __objc_msgSend_770( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_770Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_770 = __objc_msgSend_770Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_writeabilityHandler1 = _registerName1("writeabilityHandler"); + late final _sel_setWriteabilityHandler_1 = + _registerName1("setWriteabilityHandler:"); + late final _sel_initWithFileDescriptor_1 = + _registerName1("initWithFileDescriptor:"); + instancetype _objc_msgSend_771( + ffi.Pointer obj, + ffi.Pointer sel, + int fd, + ) { + return __objc_msgSend_771( + obj, + sel, + fd, + ); + } + + late final __objc_msgSend_771Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Int)>>('objc_msgSend'); + late final __objc_msgSend_771 = __objc_msgSend_771Ptr.asFunction< + instancetype Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_fileDescriptor1 = _registerName1("fileDescriptor"); + late final _sel_readDataToEndOfFile1 = _registerName1("readDataToEndOfFile"); + late final _sel_readDataOfLength_1 = _registerName1("readDataOfLength:"); + late final _sel_offsetInFile1 = _registerName1("offsetInFile"); + late final _sel_seekToEndOfFile1 = _registerName1("seekToEndOfFile"); + late final _sel_seekToFileOffset_1 = _registerName1("seekToFileOffset:"); + void _objc_msgSend_772( + ffi.Pointer obj, + ffi.Pointer sel, + int offset, + ) { + return __objc_msgSend_772( + obj, + sel, + offset, + ); + } + + late final __objc_msgSend_772Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.UnsignedLongLong)>>('objc_msgSend'); + late final __objc_msgSend_772 = __objc_msgSend_772Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_truncateFileAtOffset_1 = + _registerName1("truncateFileAtOffset:"); + late final _sel_synchronizeFile1 = _registerName1("synchronizeFile"); + late final _sel_closeFile1 = _registerName1("closeFile"); + late final _class_NSHTTPCookieStorage1 = _getClass1("NSHTTPCookieStorage"); + late final _sel_sharedHTTPCookieStorage1 = + _registerName1("sharedHTTPCookieStorage"); + ffi.Pointer _objc_msgSend_773( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_773( + obj, + sel, + ); + } + + late final __objc_msgSend_773Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_773 = __objc_msgSend_773Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_sharedCookieStorageForGroupContainerIdentifier_1 = + _registerName1("sharedCookieStorageForGroupContainerIdentifier:"); + ffi.Pointer _objc_msgSend_774( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer identifier, + ) { + return __objc_msgSend_774( + obj, + sel, + identifier, + ); + } + + late final __objc_msgSend_774Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_774 = __objc_msgSend_774Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_cookies1 = _registerName1("cookies"); + late final _class_NSHTTPCookie1 = _getClass1("NSHTTPCookie"); + late final _sel_initWithProperties_1 = _registerName1("initWithProperties:"); + late final _sel_cookieWithProperties_1 = + _registerName1("cookieWithProperties:"); + ffi.Pointer _objc_msgSend_775( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer properties, + ) { + return __objc_msgSend_775( + obj, + sel, + properties, + ); + } + + late final __objc_msgSend_775Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_775 = __objc_msgSend_775Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_requestHeaderFieldsWithCookies_1 = + _registerName1("requestHeaderFieldsWithCookies:"); + late final _sel_cookiesWithResponseHeaderFields_forURL_1 = + _registerName1("cookiesWithResponseHeaderFields:forURL:"); + ffi.Pointer _objc_msgSend_776( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer headerFields, + ffi.Pointer URL, + ) { + return __objc_msgSend_776( + obj, + sel, + headerFields, + URL, + ); + } + + late final __objc_msgSend_776Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_776 = __objc_msgSend_776Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_properties1 = _registerName1("properties"); + late final _sel_value1 = _registerName1("value"); + late final _sel_expiresDate1 = _registerName1("expiresDate"); + late final _sel_isSessionOnly1 = _registerName1("isSessionOnly"); + late final _sel_isSecure1 = _registerName1("isSecure"); + late final _sel_isHTTPOnly1 = _registerName1("isHTTPOnly"); + late final _sel_comment1 = _registerName1("comment"); + late final _sel_commentURL1 = _registerName1("commentURL"); + late final _sel_portList1 = _registerName1("portList"); + late final _sel_sameSitePolicy1 = _registerName1("sameSitePolicy"); + late final _sel_setCookie_1 = _registerName1("setCookie:"); + void _objc_msgSend_777( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer cookie, + ) { + return __objc_msgSend_777( + obj, + sel, + cookie, + ); + } + + late final __objc_msgSend_777Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_777 = __objc_msgSend_777Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_deleteCookie_1 = _registerName1("deleteCookie:"); + late final _sel_removeCookiesSinceDate_1 = + _registerName1("removeCookiesSinceDate:"); + late final _sel_cookiesForURL_1 = _registerName1("cookiesForURL:"); + late final _sel_setCookies_forURL_mainDocumentURL_1 = + _registerName1("setCookies:forURL:mainDocumentURL:"); + void _objc_msgSend_778( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer cookies, + ffi.Pointer URL, + ffi.Pointer mainDocumentURL, + ) { + return __objc_msgSend_778( + obj, + sel, + cookies, + URL, + mainDocumentURL, + ); + } + + late final __objc_msgSend_778Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_778 = __objc_msgSend_778Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_cookieAcceptPolicy1 = _registerName1("cookieAcceptPolicy"); + int _objc_msgSend_779( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_779( + obj, + sel, + ); + } + + late final __objc_msgSend_779Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_779 = __objc_msgSend_779Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setCookieAcceptPolicy_1 = + _registerName1("setCookieAcceptPolicy:"); + void _objc_msgSend_780( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_780( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_780Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_780 = __objc_msgSend_780Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_sortedCookiesUsingDescriptors_1 = + _registerName1("sortedCookiesUsingDescriptors:"); + late final _class_NSURLSessionTask1 = _getClass1("NSURLSessionTask"); + late final _sel_taskIdentifier1 = _registerName1("taskIdentifier"); + late final _class_NSURLRequest1 = _getClass1("NSURLRequest"); + late final _sel_requestWithURL_1 = _registerName1("requestWithURL:"); + late final _sel_supportsSecureCoding1 = + _registerName1("supportsSecureCoding"); + late final _sel_requestWithURL_cachePolicy_timeoutInterval_1 = + _registerName1("requestWithURL:cachePolicy:timeoutInterval:"); + instancetype _objc_msgSend_781( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer URL, + int cachePolicy, + double timeoutInterval, + ) { + return __objc_msgSend_781( + obj, + sel, + URL, + cachePolicy, + timeoutInterval, + ); + } + + late final __objc_msgSend_781Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Int32, ffi.Double)>>('objc_msgSend'); + late final __objc_msgSend_781 = __objc_msgSend_781Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, double)>(); + + late final _sel_initWithURL_cachePolicy_timeoutInterval_1 = + _registerName1("initWithURL:cachePolicy:timeoutInterval:"); + late final _sel_URL1 = _registerName1("URL"); + late final _sel_cachePolicy1 = _registerName1("cachePolicy"); + int _objc_msgSend_782( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_782( + obj, + sel, + ); + } + + late final __objc_msgSend_782Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_782 = __objc_msgSend_782Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_timeoutInterval1 = _registerName1("timeoutInterval"); + late final _sel_mainDocumentURL1 = _registerName1("mainDocumentURL"); + late final _sel_networkServiceType1 = _registerName1("networkServiceType"); + int _objc_msgSend_783( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_783( + obj, + sel, + ); + } + + late final __objc_msgSend_783Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_783 = __objc_msgSend_783Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_allowsCellularAccess1 = + _registerName1("allowsCellularAccess"); + late final _sel_allowsExpensiveNetworkAccess1 = + _registerName1("allowsExpensiveNetworkAccess"); + late final _sel_allowsConstrainedNetworkAccess1 = + _registerName1("allowsConstrainedNetworkAccess"); + late final _sel_assumesHTTP3Capable1 = _registerName1("assumesHTTP3Capable"); + late final _sel_attribution1 = _registerName1("attribution"); + int _objc_msgSend_784( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_784( + obj, + sel, + ); + } + + late final __objc_msgSend_784Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_784 = __objc_msgSend_784Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_requiresDNSSECValidation1 = + _registerName1("requiresDNSSECValidation"); + late final _sel_HTTPMethod1 = _registerName1("HTTPMethod"); + late final _sel_allHTTPHeaderFields1 = _registerName1("allHTTPHeaderFields"); + late final _sel_valueForHTTPHeaderField_1 = + _registerName1("valueForHTTPHeaderField:"); + late final _sel_HTTPBody1 = _registerName1("HTTPBody"); + late final _class_NSInputStream1 = _getClass1("NSInputStream"); + late final _class_NSStream1 = _getClass1("NSStream"); + late final _sel_open1 = _registerName1("open"); + late final _sel_close1 = _registerName1("close"); + late final _sel_streamStatus1 = _registerName1("streamStatus"); + int _objc_msgSend_785( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_785( + obj, + sel, + ); + } + + late final __objc_msgSend_785Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_785 = __objc_msgSend_785Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_streamError1 = _registerName1("streamError"); + late final _class_NSOutputStream1 = _getClass1("NSOutputStream"); + late final _sel_write_maxLength_1 = _registerName1("write:maxLength:"); + int _objc_msgSend_786( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer buffer, + int len, + ) { + return __objc_msgSend_786( + obj, + sel, + buffer, + len, + ); + } + + late final __objc_msgSend_786Ptr = _lookup< + ffi.NativeFunction< + ffi.Long Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_786 = __objc_msgSend_786Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_hasSpaceAvailable1 = _registerName1("hasSpaceAvailable"); + late final _sel_initToMemory1 = _registerName1("initToMemory"); + late final _sel_initToBuffer_capacity_1 = + _registerName1("initToBuffer:capacity:"); + instancetype _objc_msgSend_787( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer buffer, + int capacity, + ) { + return __objc_msgSend_787( + obj, + sel, + buffer, + capacity, + ); + } + + late final __objc_msgSend_787Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_787 = __objc_msgSend_787Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_initWithURL_append_1 = _registerName1("initWithURL:append:"); + late final _sel_initToFileAtPath_append_1 = + _registerName1("initToFileAtPath:append:"); + late final _sel_outputStreamToMemory1 = + _registerName1("outputStreamToMemory"); + late final _sel_outputStreamToBuffer_capacity_1 = + _registerName1("outputStreamToBuffer:capacity:"); + late final _sel_outputStreamToFileAtPath_append_1 = + _registerName1("outputStreamToFileAtPath:append:"); + late final _sel_outputStreamWithURL_append_1 = + _registerName1("outputStreamWithURL:append:"); + late final _sel_getStreamsToHostWithName_port_inputStream_outputStream_1 = + _registerName1("getStreamsToHostWithName:port:inputStream:outputStream:"); + void _objc_msgSend_788( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer hostname, + int port, + ffi.Pointer> inputStream, + ffi.Pointer> outputStream, + ) { + return __objc_msgSend_788( + obj, + sel, + hostname, + port, + inputStream, + outputStream, + ); + } + + late final __objc_msgSend_788Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Long, + ffi.Pointer>, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_788 = __objc_msgSend_788Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer>, + ffi.Pointer>)>(); + + late final _class_NSHost1 = _getClass1("NSHost"); + late final _sel_currentHost1 = _registerName1("currentHost"); + late final _sel_hostWithName_1 = _registerName1("hostWithName:"); + late final _sel_hostWithAddress_1 = _registerName1("hostWithAddress:"); + late final _sel_isEqualToHost_1 = _registerName1("isEqualToHost:"); + bool _objc_msgSend_789( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer aHost, + ) { + return __objc_msgSend_789( + obj, + sel, + aHost, + ); + } + + late final __objc_msgSend_789Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_789 = __objc_msgSend_789Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_names1 = _registerName1("names"); + late final _sel_address1 = _registerName1("address"); + late final _sel_addresses1 = _registerName1("addresses"); + late final _sel_localizedName1 = _registerName1("localizedName"); + late final _sel_setHostCacheEnabled_1 = + _registerName1("setHostCacheEnabled:"); + void _objc_msgSend_790( + ffi.Pointer obj, + ffi.Pointer sel, + bool flag, + ) { + return __objc_msgSend_790( + obj, + sel, + flag, + ); + } + + late final __objc_msgSend_790Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_790 = __objc_msgSend_790Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, bool)>(); + + late final _sel_isHostCacheEnabled1 = _registerName1("isHostCacheEnabled"); + late final _sel_flushHostCache1 = _registerName1("flushHostCache"); + late final _sel_getStreamsToHost_port_inputStream_outputStream_1 = + _registerName1("getStreamsToHost:port:inputStream:outputStream:"); + void _objc_msgSend_791( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer host, + int port, + ffi.Pointer> inputStream, + ffi.Pointer> outputStream, + ) { + return __objc_msgSend_791( + obj, + sel, + host, + port, + inputStream, + outputStream, + ); + } + + late final __objc_msgSend_791Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Long, + ffi.Pointer>, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_791 = __objc_msgSend_791Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer>, + ffi.Pointer>)>(); + + late final _sel_getBoundStreamsWithBufferSize_inputStream_outputStream_1 = + _registerName1("getBoundStreamsWithBufferSize:inputStream:outputStream:"); + void _objc_msgSend_792( + ffi.Pointer obj, + ffi.Pointer sel, + int bufferSize, + ffi.Pointer> inputStream, + ffi.Pointer> outputStream, + ) { + return __objc_msgSend_792( + obj, + sel, + bufferSize, + inputStream, + outputStream, + ); + } + + late final __objc_msgSend_792Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.Pointer>, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_792 = __objc_msgSend_792Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer>, + ffi.Pointer>)>(); + + late final _sel_read_maxLength_1 = _registerName1("read:maxLength:"); + late final _sel_getBuffer_length_1 = _registerName1("getBuffer:length:"); + bool _objc_msgSend_793( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer> buffer, + ffi.Pointer len, + ) { + return __objc_msgSend_793( + obj, + sel, + buffer, + len, + ); + } + + late final __objc_msgSend_793Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_793 = __objc_msgSend_793Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer)>(); + + late final _sel_hasBytesAvailable1 = _registerName1("hasBytesAvailable"); + late final _sel_initWithFileAtPath_1 = _registerName1("initWithFileAtPath:"); + late final _sel_inputStreamWithData_1 = + _registerName1("inputStreamWithData:"); + late final _sel_inputStreamWithFileAtPath_1 = + _registerName1("inputStreamWithFileAtPath:"); + late final _sel_inputStreamWithURL_1 = _registerName1("inputStreamWithURL:"); + late final _sel_HTTPBodyStream1 = _registerName1("HTTPBodyStream"); + ffi.Pointer _objc_msgSend_794( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_794( + obj, + sel, + ); + } + + late final __objc_msgSend_794Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_794 = __objc_msgSend_794Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_HTTPShouldHandleCookies1 = + _registerName1("HTTPShouldHandleCookies"); + late final _sel_HTTPShouldUsePipelining1 = + _registerName1("HTTPShouldUsePipelining"); + late final _sel_originalRequest1 = _registerName1("originalRequest"); + ffi.Pointer _objc_msgSend_795( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_795( + obj, + sel, + ); + } + + late final __objc_msgSend_795Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_795 = __objc_msgSend_795Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_currentRequest1 = _registerName1("currentRequest"); + late final _class_NSURLResponse1 = _getClass1("NSURLResponse"); + late final _sel_initWithURL_MIMEType_expectedContentLength_textEncodingName_1 = + _registerName1( + "initWithURL:MIMEType:expectedContentLength:textEncodingName:"); + instancetype _objc_msgSend_796( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer URL, + ffi.Pointer MIMEType, + int length, + ffi.Pointer name, + ) { + return __objc_msgSend_796( + obj, + sel, + URL, + MIMEType, + length, + name, + ); + } + + late final __objc_msgSend_796Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Long, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_796 = __objc_msgSend_796Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer)>(); + + late final _sel_MIMEType1 = _registerName1("MIMEType"); + late final _sel_expectedContentLength1 = + _registerName1("expectedContentLength"); + late final _sel_textEncodingName1 = _registerName1("textEncodingName"); + late final _sel_suggestedFilename1 = _registerName1("suggestedFilename"); + late final _sel_response1 = _registerName1("response"); + ffi.Pointer _objc_msgSend_797( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_797( + obj, + sel, + ); + } + + late final __objc_msgSend_797Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_797 = __objc_msgSend_797Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_progress1 = _registerName1("progress"); + late final _sel_earliestBeginDate1 = _registerName1("earliestBeginDate"); + late final _sel_setEarliestBeginDate_1 = + _registerName1("setEarliestBeginDate:"); + late final _sel_countOfBytesClientExpectsToSend1 = + _registerName1("countOfBytesClientExpectsToSend"); + late final _sel_setCountOfBytesClientExpectsToSend_1 = + _registerName1("setCountOfBytesClientExpectsToSend:"); + late final _sel_countOfBytesClientExpectsToReceive1 = + _registerName1("countOfBytesClientExpectsToReceive"); + late final _sel_setCountOfBytesClientExpectsToReceive_1 = + _registerName1("setCountOfBytesClientExpectsToReceive:"); + late final _sel_countOfBytesSent1 = _registerName1("countOfBytesSent"); + late final _sel_countOfBytesReceived1 = + _registerName1("countOfBytesReceived"); + late final _sel_countOfBytesExpectedToSend1 = + _registerName1("countOfBytesExpectedToSend"); + late final _sel_countOfBytesExpectedToReceive1 = + _registerName1("countOfBytesExpectedToReceive"); + late final _sel_taskDescription1 = _registerName1("taskDescription"); + late final _sel_setTaskDescription_1 = _registerName1("setTaskDescription:"); + late final _sel_state1 = _registerName1("state"); + int _objc_msgSend_798( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_798( + obj, + sel, + ); + } + + late final __objc_msgSend_798Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_798 = __objc_msgSend_798Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_suspend1 = _registerName1("suspend"); + late final _sel_priority1 = _registerName1("priority"); + late final _sel_setPriority_1 = _registerName1("setPriority:"); + void _objc_msgSend_799( + ffi.Pointer obj, + ffi.Pointer sel, + double value, + ) { + return __objc_msgSend_799( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_799Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Float)>>('objc_msgSend'); + late final __objc_msgSend_799 = __objc_msgSend_799Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, double)>(); + + late final _sel_prefersIncrementalDelivery1 = + _registerName1("prefersIncrementalDelivery"); + late final _sel_setPrefersIncrementalDelivery_1 = + _registerName1("setPrefersIncrementalDelivery:"); + late final _sel_storeCookies_forTask_1 = + _registerName1("storeCookies:forTask:"); + void _objc_msgSend_800( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer cookies, + ffi.Pointer task, + ) { + return __objc_msgSend_800( + obj, + sel, + cookies, + task, + ); + } + + late final __objc_msgSend_800Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_800 = __objc_msgSend_800Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_getCookiesForTask_completionHandler_1 = + _registerName1("getCookiesForTask:completionHandler:"); + void _objc_msgSend_801( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer task, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_801( + obj, + sel, + task, + completionHandler, + ); + } + + late final __objc_msgSend_801Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_801 = __objc_msgSend_801Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>(); + + late final _class_NSIndexPath1 = _getClass1("NSIndexPath"); + late final _sel_indexPathWithIndex_1 = _registerName1("indexPathWithIndex:"); + late final _sel_indexPathWithIndexes_length_1 = + _registerName1("indexPathWithIndexes:length:"); + instancetype _objc_msgSend_802( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer indexes, + int length, + ) { + return __objc_msgSend_802( + obj, + sel, + indexes, + length, + ); + } + + late final __objc_msgSend_802Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_802 = __objc_msgSend_802Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_initWithIndexes_length_1 = + _registerName1("initWithIndexes:length:"); + late final _sel_indexPathByAddingIndex_1 = + _registerName1("indexPathByAddingIndex:"); + ffi.Pointer _objc_msgSend_803( + ffi.Pointer obj, + ffi.Pointer sel, + int index, + ) { + return __objc_msgSend_803( + obj, + sel, + index, + ); + } + + late final __objc_msgSend_803Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_803 = __objc_msgSend_803Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_indexPathByRemovingLastIndex1 = + _registerName1("indexPathByRemovingLastIndex"); + ffi.Pointer _objc_msgSend_804( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_804( + obj, + sel, + ); + } + + late final __objc_msgSend_804Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_804 = __objc_msgSend_804Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_indexAtPosition_1 = _registerName1("indexAtPosition:"); + late final _sel_getIndexes_range_1 = _registerName1("getIndexes:range:"); + void _objc_msgSend_805( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer indexes, + _NSRange positionRange, + ) { + return __objc_msgSend_805( + obj, + sel, + indexes, + positionRange, + ); + } + + late final __objc_msgSend_805Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_805 = __objc_msgSend_805Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, _NSRange)>(); + + int _objc_msgSend_806( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer otherObject, + ) { + return __objc_msgSend_806( + obj, + sel, + otherObject, + ); + } + + late final __objc_msgSend_806Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_806 = __objc_msgSend_806Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_getIndexes_1 = _registerName1("getIndexes:"); + void _objc_msgSend_807( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer indexes, + ) { + return __objc_msgSend_807( + obj, + sel, + indexes, + ); + } + + late final __objc_msgSend_807Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_807 = __objc_msgSend_807Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _class_NSInflectionRule1 = _getClass1("NSInflectionRule"); + late final _sel_automaticRule1 = _registerName1("automaticRule"); + ffi.Pointer _objc_msgSend_808( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_808( + obj, + sel, + ); + } + + late final __objc_msgSend_808Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_808 = __objc_msgSend_808Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_canInflectLanguage_1 = _registerName1("canInflectLanguage:"); + late final _sel_canInflectPreferredLocalization1 = + _registerName1("canInflectPreferredLocalization"); + late final _class_NSMorphology1 = _getClass1("NSMorphology"); + late final _sel_grammaticalGender1 = _registerName1("grammaticalGender"); + int _objc_msgSend_809( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_809( + obj, + sel, + ); + } + + late final __objc_msgSend_809Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_809 = __objc_msgSend_809Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setGrammaticalGender_1 = + _registerName1("setGrammaticalGender:"); + void _objc_msgSend_810( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_810( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_810Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_810 = __objc_msgSend_810Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_partOfSpeech1 = _registerName1("partOfSpeech"); + int _objc_msgSend_811( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_811( + obj, + sel, + ); + } + + late final __objc_msgSend_811Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_811 = __objc_msgSend_811Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setPartOfSpeech_1 = _registerName1("setPartOfSpeech:"); + void _objc_msgSend_812( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_812( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_812Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_812 = __objc_msgSend_812Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_number1 = _registerName1("number"); + int _objc_msgSend_813( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_813( + obj, + sel, + ); + } + + late final __objc_msgSend_813Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_813 = __objc_msgSend_813Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setNumber_1 = _registerName1("setNumber:"); + void _objc_msgSend_814( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_814( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_814Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_814 = __objc_msgSend_814Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _class_NSMorphologyCustomPronoun1 = + _getClass1("NSMorphologyCustomPronoun"); + late final _sel_isSupportedForLanguage_1 = + _registerName1("isSupportedForLanguage:"); + late final _sel_requiredKeysForLanguage_1 = + _registerName1("requiredKeysForLanguage:"); + late final _sel_subjectForm1 = _registerName1("subjectForm"); + late final _sel_setSubjectForm_1 = _registerName1("setSubjectForm:"); + late final _sel_objectForm1 = _registerName1("objectForm"); + late final _sel_setObjectForm_1 = _registerName1("setObjectForm:"); + late final _sel_possessiveForm1 = _registerName1("possessiveForm"); + late final _sel_setPossessiveForm_1 = _registerName1("setPossessiveForm:"); + late final _sel_possessiveAdjectiveForm1 = + _registerName1("possessiveAdjectiveForm"); + late final _sel_setPossessiveAdjectiveForm_1 = + _registerName1("setPossessiveAdjectiveForm:"); + late final _sel_reflexiveForm1 = _registerName1("reflexiveForm"); + late final _sel_setReflexiveForm_1 = _registerName1("setReflexiveForm:"); + late final _sel_customPronounForLanguage_1 = + _registerName1("customPronounForLanguage:"); + ffi.Pointer _objc_msgSend_815( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer language, + ) { + return __objc_msgSend_815( + obj, + sel, + language, + ); + } + + late final __objc_msgSend_815Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_815 = __objc_msgSend_815Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setCustomPronoun_forLanguage_error_1 = + _registerName1("setCustomPronoun:forLanguage:error:"); + bool _objc_msgSend_816( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer features, + ffi.Pointer language, + ffi.Pointer> error, + ) { + return __objc_msgSend_816( + obj, + sel, + features, + language, + error, + ); + } + + late final __objc_msgSend_816Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_816 = __objc_msgSend_816Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_isUnspecified1 = _registerName1("isUnspecified"); + late final _sel_userMorphology1 = _registerName1("userMorphology"); + ffi.Pointer _objc_msgSend_817( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_817( + obj, + sel, + ); + } + + late final __objc_msgSend_817Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_817 = __objc_msgSend_817Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _class_NSOperationQueue1 = _getClass1("NSOperationQueue"); + late final _class_NSOperation1 = _getClass1("NSOperation"); + late final _sel_isConcurrent1 = _registerName1("isConcurrent"); + late final _sel_isAsynchronous1 = _registerName1("isAsynchronous"); + late final _sel_isReady1 = _registerName1("isReady"); + late final _sel_addDependency_1 = _registerName1("addDependency:"); + void _objc_msgSend_818( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer op, + ) { + return __objc_msgSend_818( + obj, + sel, + op, + ); + } + + late final __objc_msgSend_818Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_818 = __objc_msgSend_818Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_removeDependency_1 = _registerName1("removeDependency:"); + late final _sel_dependencies1 = _registerName1("dependencies"); + late final _sel_queuePriority1 = _registerName1("queuePriority"); + int _objc_msgSend_819( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_819( + obj, + sel, + ); + } + + late final __objc_msgSend_819Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_819 = __objc_msgSend_819Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setQueuePriority_1 = _registerName1("setQueuePriority:"); + void _objc_msgSend_820( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_820( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_820Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_820 = __objc_msgSend_820Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_completionBlock1 = _registerName1("completionBlock"); + late final _sel_setCompletionBlock_1 = _registerName1("setCompletionBlock:"); + late final _sel_waitUntilFinished1 = _registerName1("waitUntilFinished"); + late final _sel_addOperation_1 = _registerName1("addOperation:"); + late final _sel_addOperations_waitUntilFinished_1 = + _registerName1("addOperations:waitUntilFinished:"); + void _objc_msgSend_821( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer ops, + bool wait, + ) { + return __objc_msgSend_821( + obj, + sel, + ops, + wait, + ); + } + + late final __objc_msgSend_821Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_821 = __objc_msgSend_821Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, bool)>(); + + late final _sel_addOperationWithBlock_1 = + _registerName1("addOperationWithBlock:"); + late final _sel_addBarrierBlock_1 = _registerName1("addBarrierBlock:"); + late final _sel_maxConcurrentOperationCount1 = + _registerName1("maxConcurrentOperationCount"); + late final _sel_setMaxConcurrentOperationCount_1 = + _registerName1("setMaxConcurrentOperationCount:"); + late final _sel_isSuspended1 = _registerName1("isSuspended"); + late final _sel_setSuspended_1 = _registerName1("setSuspended:"); + late final _sel_underlyingQueue1 = _registerName1("underlyingQueue"); + ffi.Pointer _objc_msgSend_822( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_822( + obj, + sel, + ); + } + + late final __objc_msgSend_822Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_822 = __objc_msgSend_822Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setUnderlyingQueue_1 = _registerName1("setUnderlyingQueue:"); + void _objc_msgSend_823( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_823( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_823Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_823 = __objc_msgSend_823Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_cancelAllOperations1 = _registerName1("cancelAllOperations"); + late final _sel_waitUntilAllOperationsAreFinished1 = + _registerName1("waitUntilAllOperationsAreFinished"); + late final _sel_currentQueue1 = _registerName1("currentQueue"); + ffi.Pointer _objc_msgSend_824( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_824( + obj, + sel, + ); + } + + late final __objc_msgSend_824Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_824 = __objc_msgSend_824Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_mainQueue1 = _registerName1("mainQueue"); + late final _sel_operations1 = _registerName1("operations"); + late final _sel_operationCount1 = _registerName1("operationCount"); + late final _class_NSPointerArray1 = _getClass1("NSPointerArray"); + late final _sel_initWithOptions_1 = _registerName1("initWithOptions:"); + instancetype _objc_msgSend_825( + ffi.Pointer obj, + ffi.Pointer sel, + int options, + ) { + return __objc_msgSend_825( + obj, + sel, + options, + ); + } + + late final __objc_msgSend_825Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_825 = __objc_msgSend_825Ptr.asFunction< + instancetype Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _class_NSPointerFunctions1 = _getClass1("NSPointerFunctions"); + late final _sel_pointerFunctionsWithOptions_1 = + _registerName1("pointerFunctionsWithOptions:"); + ffi.Pointer _objc_msgSend_826( + ffi.Pointer obj, + ffi.Pointer sel, + int options, + ) { + return __objc_msgSend_826( + obj, + sel, + options, + ); + } + + late final __objc_msgSend_826Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_826 = __objc_msgSend_826Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_hashFunction1 = _registerName1("hashFunction"); + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function(ffi.Pointer)>>)>> + _objc_msgSend_827( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_827( + obj, + sel, + ); + } + + late final __objc_msgSend_827Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>)>> + Function(ffi.Pointer, ffi.Pointer)>>( + 'objc_msgSend'); + late final __objc_msgSend_827 = __objc_msgSend_827Ptr.asFunction< + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>)>> + Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setHashFunction_1 = _registerName1("setHashFunction:"); + void _objc_msgSend_828( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>)>> + value, + ) { + return __objc_msgSend_828( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_828Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>)>>)>>( + 'objc_msgSend'); + late final __objc_msgSend_828 = __objc_msgSend_828Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>)>>)>(); + + late final _sel_isEqualFunction1 = _registerName1("isEqualFunction"); + ffi.Pointer< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function(ffi.Pointer)>>)>> + _objc_msgSend_829( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_829( + obj, + sel, + ); + } + + late final __objc_msgSend_829Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>)>> + Function(ffi.Pointer, ffi.Pointer)>>( + 'objc_msgSend'); + late final __objc_msgSend_829 = __objc_msgSend_829Ptr.asFunction< + ffi.Pointer< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>)>> + Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setIsEqualFunction_1 = _registerName1("setIsEqualFunction:"); + void _objc_msgSend_830( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>)>> + value, + ) { + return __objc_msgSend_830( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_830Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>)>>)>>( + 'objc_msgSend'); + late final __objc_msgSend_830 = __objc_msgSend_830Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>)>>)>(); + + late final _sel_sizeFunction1 = _registerName1("sizeFunction"); + ffi.Pointer< + ffi.NativeFunction)>> + _objc_msgSend_831( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_831( + obj, + sel, + ); + } + + late final __objc_msgSend_831Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function(ffi.Pointer)>> + Function(ffi.Pointer, ffi.Pointer)>>( + 'objc_msgSend'); + late final __objc_msgSend_831 = __objc_msgSend_831Ptr.asFunction< + ffi.Pointer< + ffi + .NativeFunction)>> + Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setSizeFunction_1 = _registerName1("setSizeFunction:"); + void _objc_msgSend_832( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer< + ffi + .NativeFunction)>> + value, + ) { + return __objc_msgSend_832( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_832Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>)>>('objc_msgSend'); + late final __objc_msgSend_832 = __objc_msgSend_832Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function(ffi.Pointer)>>)>(); + + late final _sel_descriptionFunction1 = _registerName1("descriptionFunction"); + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer)>> + _objc_msgSend_833( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_833( + obj, + sel, + ); + } + + late final __objc_msgSend_833Ptr = + _lookup< + ffi.NativeFunction< + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer)>> + Function(ffi.Pointer, ffi.Pointer)>>( + 'objc_msgSend'); + late final __objc_msgSend_833 = __objc_msgSend_833Ptr.asFunction< + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer)>> + Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setDescriptionFunction_1 = + _registerName1("setDescriptionFunction:"); + void _objc_msgSend_834( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer)>> + value, + ) { + return __objc_msgSend_834( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_834Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer)>>)>>('objc_msgSend'); + late final __objc_msgSend_834 = __objc_msgSend_834Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer)>>)>(); + + late final _sel_relinquishFunction1 = _registerName1("relinquishFunction"); + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function(ffi.Pointer)>>)>> + _objc_msgSend_835( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_835( + obj, + sel, + ); + } + + late final __objc_msgSend_835Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>)>> + Function(ffi.Pointer, ffi.Pointer)>>( + 'objc_msgSend'); + late final __objc_msgSend_835 = __objc_msgSend_835Ptr.asFunction< + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>)>> + Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setRelinquishFunction_1 = + _registerName1("setRelinquishFunction:"); + void _objc_msgSend_836( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>)>> + value, + ) { + return __objc_msgSend_836( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_836Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>)>>)>>( + 'objc_msgSend'); + late final __objc_msgSend_836 = __objc_msgSend_836Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>)>>)>(); + + late final _sel_acquireFunction1 = _registerName1("acquireFunction"); + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function(ffi.Pointer)>>, + ffi.Bool)>> _objc_msgSend_837( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_837( + obj, + sel, + ); + } + + late final __objc_msgSend_837Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>, + ffi.Bool)>> + Function(ffi.Pointer, ffi.Pointer)>>( + 'objc_msgSend'); + late final __objc_msgSend_837 = __objc_msgSend_837Ptr.asFunction< + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>, + ffi.Bool)>> + Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setAcquireFunction_1 = _registerName1("setAcquireFunction:"); + void _objc_msgSend_838( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function(ffi.Pointer)>>, + ffi.Bool)>> + value, + ) { + return __objc_msgSend_838( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_838Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>, + ffi.Bool)>>)>>('objc_msgSend'); + late final __objc_msgSend_838 = __objc_msgSend_838Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>, + ffi.Bool)>>)>(); + + late final _sel_usesStrongWriteBarrier1 = + _registerName1("usesStrongWriteBarrier"); + late final _sel_setUsesStrongWriteBarrier_1 = + _registerName1("setUsesStrongWriteBarrier:"); + late final _sel_usesWeakReadAndWriteBarriers1 = + _registerName1("usesWeakReadAndWriteBarriers"); + late final _sel_setUsesWeakReadAndWriteBarriers_1 = + _registerName1("setUsesWeakReadAndWriteBarriers:"); + late final _sel_initWithPointerFunctions_1 = + _registerName1("initWithPointerFunctions:"); + instancetype _objc_msgSend_839( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer functions, + ) { + return __objc_msgSend_839( + obj, + sel, + functions, + ); + } + + late final __objc_msgSend_839Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_839 = __objc_msgSend_839Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_pointerArrayWithOptions_1 = + _registerName1("pointerArrayWithOptions:"); + ffi.Pointer _objc_msgSend_840( + ffi.Pointer obj, + ffi.Pointer sel, + int options, + ) { + return __objc_msgSend_840( + obj, + sel, + options, + ); + } + + late final __objc_msgSend_840Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_840 = __objc_msgSend_840Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_pointerArrayWithPointerFunctions_1 = + _registerName1("pointerArrayWithPointerFunctions:"); + ffi.Pointer _objc_msgSend_841( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer functions, + ) { + return __objc_msgSend_841( + obj, + sel, + functions, + ); + } + + late final __objc_msgSend_841Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_841 = __objc_msgSend_841Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_pointerFunctions1 = _registerName1("pointerFunctions"); + ffi.Pointer _objc_msgSend_842( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_842( + obj, + sel, + ); + } + + late final __objc_msgSend_842Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_842 = __objc_msgSend_842Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_pointerAtIndex_1 = _registerName1("pointerAtIndex:"); + ffi.Pointer _objc_msgSend_843( + ffi.Pointer obj, + ffi.Pointer sel, + int index, + ) { + return __objc_msgSend_843( + obj, + sel, + index, + ); + } + + late final __objc_msgSend_843Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_843 = __objc_msgSend_843Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_addPointer_1 = _registerName1("addPointer:"); + late final _sel_removePointerAtIndex_1 = + _registerName1("removePointerAtIndex:"); + late final _sel_insertPointer_atIndex_1 = + _registerName1("insertPointer:atIndex:"); + late final _sel_replacePointerAtIndex_withPointer_1 = + _registerName1("replacePointerAtIndex:withPointer:"); + void _objc_msgSend_844( + ffi.Pointer obj, + ffi.Pointer sel, + int index, + ffi.Pointer item, + ) { + return __objc_msgSend_844( + obj, + sel, + index, + item, + ); + } + + late final __objc_msgSend_844Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.UnsignedLong, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_844 = __objc_msgSend_844Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer)>(); + + late final _sel_compact1 = _registerName1("compact"); + late final _sel_setCount_1 = _registerName1("setCount:"); + late final _sel_pointerArrayWithStrongObjects1 = + _registerName1("pointerArrayWithStrongObjects"); + late final _sel_pointerArrayWithWeakObjects1 = + _registerName1("pointerArrayWithWeakObjects"); + late final _sel_strongObjectsPointerArray1 = + _registerName1("strongObjectsPointerArray"); + ffi.Pointer _objc_msgSend_845( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_845( + obj, + sel, + ); + } + + late final __objc_msgSend_845Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_845 = __objc_msgSend_845Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_weakObjectsPointerArray1 = + _registerName1("weakObjectsPointerArray"); + late final _class_NSProcessInfo1 = _getClass1("NSProcessInfo"); + late final _sel_processInfo1 = _registerName1("processInfo"); + ffi.Pointer _objc_msgSend_846( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_846( + obj, + sel, + ); + } + + late final __objc_msgSend_846Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_846 = __objc_msgSend_846Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_environment1 = _registerName1("environment"); + late final _sel_hostName1 = _registerName1("hostName"); + late final _sel_processName1 = _registerName1("processName"); + late final _sel_setProcessName_1 = _registerName1("setProcessName:"); + late final _sel_processIdentifier1 = _registerName1("processIdentifier"); + late final _sel_globallyUniqueString1 = + _registerName1("globallyUniqueString"); + late final _sel_operatingSystem1 = _registerName1("operatingSystem"); + late final _sel_operatingSystemName1 = _registerName1("operatingSystemName"); + late final _sel_operatingSystemVersionString1 = + _registerName1("operatingSystemVersionString"); + late final _sel_operatingSystemVersion1 = + _registerName1("operatingSystemVersion"); + void _objc_msgSend_847( + ffi.Pointer stret, + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_847( + stret, + obj, + sel, + ); + } + + late final __objc_msgSend_847Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend_stret'); + late final __objc_msgSend_847 = __objc_msgSend_847Ptr.asFunction< + void Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_processorCount1 = _registerName1("processorCount"); + late final _sel_activeProcessorCount1 = + _registerName1("activeProcessorCount"); + late final _sel_physicalMemory1 = _registerName1("physicalMemory"); + late final _sel_isOperatingSystemAtLeastVersion_1 = + _registerName1("isOperatingSystemAtLeastVersion:"); + bool _objc_msgSend_848( + ffi.Pointer obj, + ffi.Pointer sel, + NSOperatingSystemVersion version, + ) { + return __objc_msgSend_848( + obj, + sel, + version, + ); + } + + late final __objc_msgSend_848Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + NSOperatingSystemVersion)>>('objc_msgSend'); + late final __objc_msgSend_848 = __objc_msgSend_848Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + NSOperatingSystemVersion)>(); + + late final _sel_systemUptime1 = _registerName1("systemUptime"); + late final _sel_disableSuddenTermination1 = + _registerName1("disableSuddenTermination"); + late final _sel_enableSuddenTermination1 = + _registerName1("enableSuddenTermination"); + late final _sel_disableAutomaticTermination_1 = + _registerName1("disableAutomaticTermination:"); + late final _sel_enableAutomaticTermination_1 = + _registerName1("enableAutomaticTermination:"); + late final _sel_automaticTerminationSupportEnabled1 = + _registerName1("automaticTerminationSupportEnabled"); + late final _sel_setAutomaticTerminationSupportEnabled_1 = + _registerName1("setAutomaticTerminationSupportEnabled:"); + late final _sel_beginActivityWithOptions_reason_1 = + _registerName1("beginActivityWithOptions:reason:"); + ffi.Pointer _objc_msgSend_849( + ffi.Pointer obj, + ffi.Pointer sel, + int options, + ffi.Pointer reason, + ) { + return __objc_msgSend_849( + obj, + sel, + options, + reason, + ); + } + + late final __objc_msgSend_849Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_849 = __objc_msgSend_849Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, ffi.Pointer)>(); + + late final _sel_endActivity_1 = _registerName1("endActivity:"); + late final _sel_performActivityWithOptions_reason_usingBlock_1 = + _registerName1("performActivityWithOptions:reason:usingBlock:"); + void _objc_msgSend_850( + ffi.Pointer obj, + ffi.Pointer sel, + int options, + ffi.Pointer reason, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_850( + obj, + sel, + options, + reason, + block, + ); + } + + late final __objc_msgSend_850Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_850 = __objc_msgSend_850Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_performExpiringActivityWithReason_usingBlock_1 = + _registerName1("performExpiringActivityWithReason:usingBlock:"); + void _objc_msgSend_851( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer reason, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_851( + obj, + sel, + reason, + block, + ); + } + + late final __objc_msgSend_851Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_851 = __objc_msgSend_851Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_userName1 = _registerName1("userName"); + late final _sel_fullUserName1 = _registerName1("fullUserName"); + late final _sel_thermalState1 = _registerName1("thermalState"); + int _objc_msgSend_852( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_852( + obj, + sel, + ); + } + + late final __objc_msgSend_852Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_852 = __objc_msgSend_852Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_isLowPowerModeEnabled1 = + _registerName1("isLowPowerModeEnabled"); + late final _sel_isMacCatalystApp1 = _registerName1("isMacCatalystApp"); + late final _sel_isiOSAppOnMac1 = _registerName1("isiOSAppOnMac"); + late final _class_NSTextCheckingResult1 = _getClass1("NSTextCheckingResult"); + late final _sel_resultType1 = _registerName1("resultType"); + int _objc_msgSend_853( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_853( + obj, + sel, + ); + } + + late final __objc_msgSend_853Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_853 = __objc_msgSend_853Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_range1 = _registerName1("range"); + late final _sel_orthography1 = _registerName1("orthography"); + ffi.Pointer _objc_msgSend_854( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_854( + obj, + sel, + ); + } + + late final __objc_msgSend_854Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_854 = __objc_msgSend_854Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_grammarDetails1 = _registerName1("grammarDetails"); + late final _sel_duration1 = _registerName1("duration"); + late final _sel_components1 = _registerName1("components"); + late final _sel_replacementString1 = _registerName1("replacementString"); + late final _sel_alternativeStrings1 = _registerName1("alternativeStrings"); + late final _class_NSRegularExpression1 = _getClass1("NSRegularExpression"); + late final _sel_regularExpressionWithPattern_options_error_1 = + _registerName1("regularExpressionWithPattern:options:error:"); + ffi.Pointer _objc_msgSend_855( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer pattern, + int options, + ffi.Pointer> error, + ) { + return __objc_msgSend_855( + obj, + sel, + pattern, + options, + error, + ); + } + + late final __objc_msgSend_855Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_855 = __objc_msgSend_855Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer>)>(); + + late final _sel_initWithPattern_options_error_1 = + _registerName1("initWithPattern:options:error:"); + instancetype _objc_msgSend_856( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer pattern, + int options, + ffi.Pointer> error, + ) { + return __objc_msgSend_856( + obj, + sel, + pattern, + options, + error, + ); + } + + late final __objc_msgSend_856Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_856 = __objc_msgSend_856Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer>)>(); + + late final _sel_pattern1 = _registerName1("pattern"); + late final _sel_options1 = _registerName1("options"); + int _objc_msgSend_857( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_857( + obj, + sel, + ); + } + + late final __objc_msgSend_857Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_857 = __objc_msgSend_857Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_numberOfCaptureGroups1 = + _registerName1("numberOfCaptureGroups"); + late final _sel_escapedPatternForString_1 = + _registerName1("escapedPatternForString:"); + late final _sel_enumerateMatchesInString_options_range_usingBlock_1 = + _registerName1("enumerateMatchesInString:options:range:usingBlock:"); + void _objc_msgSend_858( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer string, + int options, + _NSRange range, + ffi.Pointer<_ObjCBlock> block, + ) { + return __objc_msgSend_858( + obj, + sel, + string, + options, + range, + block, + ); + } + + late final __objc_msgSend_858Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + _NSRange, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_858 = __objc_msgSend_858Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, _NSRange, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_matchesInString_options_range_1 = + _registerName1("matchesInString:options:range:"); + ffi.Pointer _objc_msgSend_859( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer string, + int options, + _NSRange range, + ) { + return __objc_msgSend_859( + obj, + sel, + string, + options, + range, + ); + } + + late final __objc_msgSend_859Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_859 = __objc_msgSend_859Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer, int, _NSRange)>(); + + late final _sel_numberOfMatchesInString_options_range_1 = + _registerName1("numberOfMatchesInString:options:range:"); + int _objc_msgSend_860( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer string, + int options, + _NSRange range, + ) { + return __objc_msgSend_860( + obj, + sel, + string, + options, + range, + ); + } + + late final __objc_msgSend_860Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_860 = __objc_msgSend_860Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, _NSRange)>(); + + late final _sel_firstMatchInString_options_range_1 = + _registerName1("firstMatchInString:options:range:"); + ffi.Pointer _objc_msgSend_861( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer string, + int options, + _NSRange range, + ) { + return __objc_msgSend_861( + obj, + sel, + string, + options, + range, + ); + } + + late final __objc_msgSend_861Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_861 = __objc_msgSend_861Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer, int, _NSRange)>(); + + late final _sel_rangeOfFirstMatchInString_options_range_1 = + _registerName1("rangeOfFirstMatchInString:options:range:"); + void _objc_msgSend_862( + ffi.Pointer<_NSRange> stret, + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer string, + int options, + _NSRange range, + ) { + return __objc_msgSend_862( + stret, + obj, + sel, + string, + options, + range, + ); + } + + late final __objc_msgSend_862Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_NSRange>, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + _NSRange)>>('objc_msgSend_stret'); + late final __objc_msgSend_862 = __objc_msgSend_862Ptr.asFunction< + void Function(ffi.Pointer<_NSRange>, ffi.Pointer, + ffi.Pointer, ffi.Pointer, int, _NSRange)>(); + + late final _sel_stringByReplacingMatchesInString_options_range_withTemplate_1 = + _registerName1( + "stringByReplacingMatchesInString:options:range:withTemplate:"); + ffi.Pointer _objc_msgSend_863( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer string, + int options, + _NSRange range, + ffi.Pointer templ, + ) { + return __objc_msgSend_863( + obj, + sel, + string, + options, + range, + templ, + ); + } + + late final __objc_msgSend_863Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + _NSRange, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_863 = __objc_msgSend_863Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + _NSRange, + ffi.Pointer)>(); + + late final _sel_replaceMatchesInString_options_range_withTemplate_1 = + _registerName1("replaceMatchesInString:options:range:withTemplate:"); + int _objc_msgSend_864( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer string, + int options, + _NSRange range, + ffi.Pointer templ, + ) { + return __objc_msgSend_864( + obj, + sel, + string, + options, + range, + templ, + ); + } + + late final __objc_msgSend_864Ptr = _lookup< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + _NSRange, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_864 = __objc_msgSend_864Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int, _NSRange, ffi.Pointer)>(); + + late final _sel_replacementStringForResult_inString_offset_template_1 = + _registerName1("replacementStringForResult:inString:offset:template:"); + ffi.Pointer _objc_msgSend_865( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer result, + ffi.Pointer string, + int offset, + ffi.Pointer templ, + ) { + return __objc_msgSend_865( + obj, + sel, + result, + string, + offset, + templ, + ); + } + + late final __objc_msgSend_865Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Long, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_865 = __objc_msgSend_865Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer)>(); + + late final _sel_escapedTemplateForString_1 = + _registerName1("escapedTemplateForString:"); + late final _sel_regularExpression1 = _registerName1("regularExpression"); + ffi.Pointer _objc_msgSend_866( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_866( + obj, + sel, + ); + } + + late final __objc_msgSend_866Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_866 = __objc_msgSend_866Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_phoneNumber1 = _registerName1("phoneNumber"); + late final _sel_numberOfRanges1 = _registerName1("numberOfRanges"); + late final _sel_rangeAtIndex_1 = _registerName1("rangeAtIndex:"); + late final _sel_rangeWithName_1 = _registerName1("rangeWithName:"); + late final _sel_resultByAdjustingRangesWithOffset_1 = + _registerName1("resultByAdjustingRangesWithOffset:"); + ffi.Pointer _objc_msgSend_867( + ffi.Pointer obj, + ffi.Pointer sel, + int offset, + ) { + return __objc_msgSend_867( + obj, + sel, + offset, + ); + } + + late final __objc_msgSend_867Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Long)>>('objc_msgSend'); + late final __objc_msgSend_867 = __objc_msgSend_867Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_addressComponents1 = _registerName1("addressComponents"); + late final _sel_orthographyCheckingResultWithRange_orthography_1 = + _registerName1("orthographyCheckingResultWithRange:orthography:"); + ffi.Pointer _objc_msgSend_868( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ffi.Pointer orthography, + ) { + return __objc_msgSend_868( + obj, + sel, + range, + orthography, + ); + } + + late final __objc_msgSend_868Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + _NSRange, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_868 = __objc_msgSend_868Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, _NSRange, ffi.Pointer)>(); + + late final _sel_spellCheckingResultWithRange_1 = + _registerName1("spellCheckingResultWithRange:"); + ffi.Pointer _objc_msgSend_869( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ) { + return __objc_msgSend_869( + obj, + sel, + range, + ); + } + + late final __objc_msgSend_869Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, _NSRange)>>('objc_msgSend'); + late final __objc_msgSend_869 = __objc_msgSend_869Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, _NSRange)>(); + + late final _sel_grammarCheckingResultWithRange_details_1 = + _registerName1("grammarCheckingResultWithRange:details:"); + ffi.Pointer _objc_msgSend_870( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ffi.Pointer details, + ) { + return __objc_msgSend_870( + obj, + sel, + range, + details, + ); + } + + late final __objc_msgSend_870Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + _NSRange, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_870 = __objc_msgSend_870Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, _NSRange, ffi.Pointer)>(); + + late final _sel_dateCheckingResultWithRange_date_1 = + _registerName1("dateCheckingResultWithRange:date:"); + ffi.Pointer _objc_msgSend_871( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ffi.Pointer date, + ) { + return __objc_msgSend_871( + obj, + sel, + range, + date, + ); + } + + late final __objc_msgSend_871Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + _NSRange, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_871 = __objc_msgSend_871Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, _NSRange, ffi.Pointer)>(); + + late final _sel_dateCheckingResultWithRange_date_timeZone_duration_1 = + _registerName1("dateCheckingResultWithRange:date:timeZone:duration:"); + ffi.Pointer _objc_msgSend_872( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ffi.Pointer date, + ffi.Pointer timeZone, + double duration, + ) { + return __objc_msgSend_872( + obj, + sel, + range, + date, + timeZone, + duration, + ); + } + + late final __objc_msgSend_872Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + _NSRange, + ffi.Pointer, + ffi.Pointer, + ffi.Double)>>('objc_msgSend'); + late final __objc_msgSend_872 = __objc_msgSend_872Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + _NSRange, + ffi.Pointer, + ffi.Pointer, + double)>(); + + late final _sel_addressCheckingResultWithRange_components_1 = + _registerName1("addressCheckingResultWithRange:components:"); + ffi.Pointer _objc_msgSend_873( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ffi.Pointer components, + ) { + return __objc_msgSend_873( + obj, + sel, + range, + components, + ); + } + + late final __objc_msgSend_873Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + _NSRange, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_873 = __objc_msgSend_873Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, _NSRange, ffi.Pointer)>(); + + late final _sel_linkCheckingResultWithRange_URL_1 = + _registerName1("linkCheckingResultWithRange:URL:"); + ffi.Pointer _objc_msgSend_874( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ffi.Pointer url, + ) { + return __objc_msgSend_874( + obj, + sel, + range, + url, + ); + } + + late final __objc_msgSend_874Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + _NSRange, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_874 = __objc_msgSend_874Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, _NSRange, ffi.Pointer)>(); + + late final _sel_quoteCheckingResultWithRange_replacementString_1 = + _registerName1("quoteCheckingResultWithRange:replacementString:"); + ffi.Pointer _objc_msgSend_875( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ffi.Pointer replacementString, + ) { + return __objc_msgSend_875( + obj, + sel, + range, + replacementString, + ); + } + + late final __objc_msgSend_875Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + _NSRange, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_875 = __objc_msgSend_875Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, _NSRange, ffi.Pointer)>(); + + late final _sel_dashCheckingResultWithRange_replacementString_1 = + _registerName1("dashCheckingResultWithRange:replacementString:"); + late final _sel_replacementCheckingResultWithRange_replacementString_1 = + _registerName1("replacementCheckingResultWithRange:replacementString:"); + late final _sel_correctionCheckingResultWithRange_replacementString_1 = + _registerName1("correctionCheckingResultWithRange:replacementString:"); + late final _sel_correctionCheckingResultWithRange_replacementString_alternativeStrings_1 = + _registerName1( + "correctionCheckingResultWithRange:replacementString:alternativeStrings:"); + ffi.Pointer _objc_msgSend_876( + ffi.Pointer obj, + ffi.Pointer sel, + _NSRange range, + ffi.Pointer replacementString, + ffi.Pointer alternativeStrings, + ) { + return __objc_msgSend_876( + obj, + sel, + range, + replacementString, + alternativeStrings, + ); + } + + late final __objc_msgSend_876Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + _NSRange, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_876 = __objc_msgSend_876Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + _NSRange, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_regularExpressionCheckingResultWithRanges_count_regularExpression_1 = + _registerName1( + "regularExpressionCheckingResultWithRanges:count:regularExpression:"); + ffi.Pointer _objc_msgSend_877( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_NSRange> ranges, + int count, + ffi.Pointer regularExpression, + ) { + return __objc_msgSend_877( + obj, + sel, + ranges, + count, + regularExpression, + ); + } + + late final __objc_msgSend_877Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_NSRange>, + ffi.UnsignedLong, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_877 = __objc_msgSend_877Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_NSRange>, + int, + ffi.Pointer)>(); + + late final _sel_phoneNumberCheckingResultWithRange_phoneNumber_1 = + _registerName1("phoneNumberCheckingResultWithRange:phoneNumber:"); + late final _sel_transitInformationCheckingResultWithRange_components_1 = + _registerName1("transitInformationCheckingResultWithRange:components:"); + late final _class_NSURLCache1 = _getClass1("NSURLCache"); + late final _sel_sharedURLCache1 = _registerName1("sharedURLCache"); + ffi.Pointer _objc_msgSend_878( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_878( + obj, + sel, + ); + } + + late final __objc_msgSend_878Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_878 = __objc_msgSend_878Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setSharedURLCache_1 = _registerName1("setSharedURLCache:"); + void _objc_msgSend_879( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_879( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_879Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_879 = __objc_msgSend_879Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_initWithMemoryCapacity_diskCapacity_diskPath_1 = + _registerName1("initWithMemoryCapacity:diskCapacity:diskPath:"); + instancetype _objc_msgSend_880( + ffi.Pointer obj, + ffi.Pointer sel, + int memoryCapacity, + int diskCapacity, + ffi.Pointer path, + ) { + return __objc_msgSend_880( + obj, + sel, + memoryCapacity, + diskCapacity, + path, + ); + } + + late final __objc_msgSend_880Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.UnsignedLong, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_880 = __objc_msgSend_880Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, int, + int, ffi.Pointer)>(); + + late final _sel_initWithMemoryCapacity_diskCapacity_directoryURL_1 = + _registerName1("initWithMemoryCapacity:diskCapacity:directoryURL:"); + instancetype _objc_msgSend_881( + ffi.Pointer obj, + ffi.Pointer sel, + int memoryCapacity, + int diskCapacity, + ffi.Pointer directoryURL, + ) { + return __objc_msgSend_881( + obj, + sel, + memoryCapacity, + diskCapacity, + directoryURL, + ); + } + + late final __objc_msgSend_881Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.UnsignedLong, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_881 = __objc_msgSend_881Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, int, + int, ffi.Pointer)>(); + + late final _class_NSCachedURLResponse1 = _getClass1("NSCachedURLResponse"); + late final _sel_initWithResponse_data_1 = + _registerName1("initWithResponse:data:"); + instancetype _objc_msgSend_882( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer response, + ffi.Pointer data, + ) { + return __objc_msgSend_882( + obj, + sel, + response, + data, + ); + } + + late final __objc_msgSend_882Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_882 = __objc_msgSend_882Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_initWithResponse_data_userInfo_storagePolicy_1 = + _registerName1("initWithResponse:data:userInfo:storagePolicy:"); + instancetype _objc_msgSend_883( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer response, + ffi.Pointer data, + ffi.Pointer userInfo, + int storagePolicy, + ) { + return __objc_msgSend_883( + obj, + sel, + response, + data, + userInfo, + storagePolicy, + ); + } + + late final __objc_msgSend_883Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_883 = __objc_msgSend_883Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int)>(); + + late final _sel_storagePolicy1 = _registerName1("storagePolicy"); + int _objc_msgSend_884( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_884( + obj, + sel, + ); + } + + late final __objc_msgSend_884Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_884 = __objc_msgSend_884Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_cachedResponseForRequest_1 = + _registerName1("cachedResponseForRequest:"); + ffi.Pointer _objc_msgSend_885( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer request, + ) { + return __objc_msgSend_885( + obj, + sel, + request, + ); + } + + late final __objc_msgSend_885Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_885 = __objc_msgSend_885Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_storeCachedResponse_forRequest_1 = + _registerName1("storeCachedResponse:forRequest:"); + void _objc_msgSend_886( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer cachedResponse, + ffi.Pointer request, + ) { + return __objc_msgSend_886( + obj, + sel, + cachedResponse, + request, + ); + } + + late final __objc_msgSend_886Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_886 = __objc_msgSend_886Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_removeCachedResponseForRequest_1 = + _registerName1("removeCachedResponseForRequest:"); + void _objc_msgSend_887( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer request, + ) { + return __objc_msgSend_887( + obj, + sel, + request, + ); + } + + late final __objc_msgSend_887Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_887 = __objc_msgSend_887Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_removeAllCachedResponses1 = + _registerName1("removeAllCachedResponses"); + late final _sel_removeCachedResponsesSinceDate_1 = + _registerName1("removeCachedResponsesSinceDate:"); + late final _sel_memoryCapacity1 = _registerName1("memoryCapacity"); + late final _sel_setMemoryCapacity_1 = _registerName1("setMemoryCapacity:"); + late final _sel_diskCapacity1 = _registerName1("diskCapacity"); + late final _sel_setDiskCapacity_1 = _registerName1("setDiskCapacity:"); + late final _sel_currentMemoryUsage1 = _registerName1("currentMemoryUsage"); + late final _sel_currentDiskUsage1 = _registerName1("currentDiskUsage"); + late final _class_NSURLSessionDataTask1 = _getClass1("NSURLSessionDataTask"); + late final _sel_storeCachedResponse_forDataTask_1 = + _registerName1("storeCachedResponse:forDataTask:"); + void _objc_msgSend_888( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer cachedResponse, + ffi.Pointer dataTask, + ) { + return __objc_msgSend_888( + obj, + sel, + cachedResponse, + dataTask, + ); + } + + late final __objc_msgSend_888Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_888 = __objc_msgSend_888Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_getCachedResponseForDataTask_completionHandler_1 = + _registerName1("getCachedResponseForDataTask:completionHandler:"); + void _objc_msgSend_889( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer dataTask, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_889( + obj, + sel, + dataTask, + completionHandler, + ); + } + + late final __objc_msgSend_889Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_889 = __objc_msgSend_889Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_removeCachedResponseForDataTask_1 = + _registerName1("removeCachedResponseForDataTask:"); + void _objc_msgSend_890( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer dataTask, + ) { + return __objc_msgSend_890( + obj, + sel, + dataTask, + ); + } + + late final __objc_msgSend_890Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_890 = __objc_msgSend_890Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _class_NSURLConnection1 = _getClass1("NSURLConnection"); + late final _sel_initWithRequest_delegate_startImmediately_1 = + _registerName1("initWithRequest:delegate:startImmediately:"); + instancetype _objc_msgSend_891( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer request, + ffi.Pointer delegate, + bool startImmediately, + ) { + return __objc_msgSend_891( + obj, + sel, + request, + delegate, + startImmediately, + ); + } + + late final __objc_msgSend_891Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_891 = __objc_msgSend_891Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer, bool)>(); + + late final _sel_initWithRequest_delegate_1 = + _registerName1("initWithRequest:delegate:"); + instancetype _objc_msgSend_892( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer request, + ffi.Pointer delegate, + ) { + return __objc_msgSend_892( + obj, + sel, + request, + delegate, + ); + } + + late final __objc_msgSend_892Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_892 = __objc_msgSend_892Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_connectionWithRequest_delegate_1 = + _registerName1("connectionWithRequest:delegate:"); + ffi.Pointer _objc_msgSend_893( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer request, + ffi.Pointer delegate, + ) { + return __objc_msgSend_893( + obj, + sel, + request, + delegate, + ); + } + + late final __objc_msgSend_893Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_893 = __objc_msgSend_893Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_unscheduleFromRunLoop_forMode_1 = + _registerName1("unscheduleFromRunLoop:forMode:"); + late final _sel_setDelegateQueue_1 = _registerName1("setDelegateQueue:"); + void _objc_msgSend_894( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer queue, + ) { + return __objc_msgSend_894( + obj, + sel, + queue, + ); + } + + late final __objc_msgSend_894Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_894 = __objc_msgSend_894Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_canHandleRequest_1 = _registerName1("canHandleRequest:"); + bool _objc_msgSend_895( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer request, + ) { + return __objc_msgSend_895( + obj, + sel, + request, + ); + } + + late final __objc_msgSend_895Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_895 = __objc_msgSend_895Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_sendSynchronousRequest_returningResponse_error_1 = + _registerName1("sendSynchronousRequest:returningResponse:error:"); + ffi.Pointer _objc_msgSend_896( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer request, + ffi.Pointer> response, + ffi.Pointer> error, + ) { + return __objc_msgSend_896( + obj, + sel, + request, + response, + error, + ); + } + + late final __objc_msgSend_896Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_896 = __objc_msgSend_896Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer>)>(); + + late final _sel_sendAsynchronousRequest_queue_completionHandler_1 = + _registerName1("sendAsynchronousRequest:queue:completionHandler:"); + void _objc_msgSend_897( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer request, + ffi.Pointer queue, + ffi.Pointer<_ObjCBlock> handler, + ) { + return __objc_msgSend_897( + obj, + sel, + request, + queue, + handler, + ); + } + + late final __objc_msgSend_897Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_897 = __objc_msgSend_897Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _class_NSURLCredential1 = _getClass1("NSURLCredential"); + late final _sel_persistence1 = _registerName1("persistence"); + int _objc_msgSend_898( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_898( + obj, + sel, + ); + } + + late final __objc_msgSend_898Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_898 = __objc_msgSend_898Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_initWithUser_password_persistence_1 = + _registerName1("initWithUser:password:persistence:"); + instancetype _objc_msgSend_899( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer user, + ffi.Pointer password, + int persistence, + ) { + return __objc_msgSend_899( + obj, + sel, + user, + password, + persistence, + ); + } + + late final __objc_msgSend_899Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_899 = __objc_msgSend_899Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_credentialWithUser_password_persistence_1 = + _registerName1("credentialWithUser:password:persistence:"); + ffi.Pointer _objc_msgSend_900( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer user, + ffi.Pointer password, + int persistence, + ) { + return __objc_msgSend_900( + obj, + sel, + user, + password, + persistence, + ); + } + + late final __objc_msgSend_900Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_900 = __objc_msgSend_900Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int)>(); + + late final _sel_hasPassword1 = _registerName1("hasPassword"); + late final _sel_initWithIdentity_certificates_persistence_1 = + _registerName1("initWithIdentity:certificates:persistence:"); + instancetype _objc_msgSend_901( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<__SecIdentity> identity, + ffi.Pointer certArray, + int persistence, + ) { + return __objc_msgSend_901( + obj, + sel, + identity, + certArray, + persistence, + ); + } + + late final __objc_msgSend_901Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<__SecIdentity>, + ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_901 = __objc_msgSend_901Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<__SecIdentity>, ffi.Pointer, int)>(); + + late final _sel_credentialWithIdentity_certificates_persistence_1 = + _registerName1("credentialWithIdentity:certificates:persistence:"); + ffi.Pointer _objc_msgSend_902( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<__SecIdentity> identity, + ffi.Pointer certArray, + int persistence, + ) { + return __objc_msgSend_902( + obj, + sel, + identity, + certArray, + persistence, + ); + } + + late final __objc_msgSend_902Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<__SecIdentity>, + ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_902 = __objc_msgSend_902Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<__SecIdentity>, + ffi.Pointer, + int)>(); + + late final _sel_identity1 = _registerName1("identity"); + ffi.Pointer<__SecIdentity> _objc_msgSend_903( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_903( + obj, + sel, + ); + } + + late final __objc_msgSend_903Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer<__SecIdentity> Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_903 = __objc_msgSend_903Ptr.asFunction< + ffi.Pointer<__SecIdentity> Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_certificates1 = _registerName1("certificates"); + late final _sel_initWithTrust_1 = _registerName1("initWithTrust:"); + instancetype _objc_msgSend_904( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<__SecTrust> trust, + ) { + return __objc_msgSend_904( + obj, + sel, + trust, + ); + } + + late final __objc_msgSend_904Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<__SecTrust>)>>('objc_msgSend'); + late final __objc_msgSend_904 = __objc_msgSend_904Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<__SecTrust>)>(); + + late final _sel_credentialForTrust_1 = _registerName1("credentialForTrust:"); + ffi.Pointer _objc_msgSend_905( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<__SecTrust> trust, + ) { + return __objc_msgSend_905( + obj, + sel, + trust, + ); + } + + late final __objc_msgSend_905Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer<__SecTrust>)>>('objc_msgSend'); + late final __objc_msgSend_905 = __objc_msgSend_905Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer<__SecTrust>)>(); + + late final _class_NSURLProtectionSpace1 = _getClass1("NSURLProtectionSpace"); + late final _sel_initWithHost_port_protocol_realm_authenticationMethod_1 = + _registerName1("initWithHost:port:protocol:realm:authenticationMethod:"); + instancetype _objc_msgSend_906( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer host, + int port, + ffi.Pointer protocol, + ffi.Pointer realm, + ffi.Pointer authenticationMethod, + ) { + return __objc_msgSend_906( + obj, + sel, + host, + port, + protocol, + realm, + authenticationMethod, + ); + } + + late final __objc_msgSend_906Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Long, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_906 = __objc_msgSend_906Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_initWithProxyHost_port_type_realm_authenticationMethod_1 = + _registerName1("initWithProxyHost:port:type:realm:authenticationMethod:"); + late final _sel_realm1 = _registerName1("realm"); + late final _sel_receivesCredentialSecurely1 = + _registerName1("receivesCredentialSecurely"); + late final _sel_isProxy1 = _registerName1("isProxy"); + late final _sel_proxyType1 = _registerName1("proxyType"); + late final _sel_protocol1 = _registerName1("protocol"); + late final _sel_authenticationMethod1 = + _registerName1("authenticationMethod"); + late final _sel_distinguishedNames1 = _registerName1("distinguishedNames"); + late final _sel_serverTrust1 = _registerName1("serverTrust"); + ffi.Pointer<__SecTrust> _objc_msgSend_907( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_907( + obj, + sel, + ); + } + + late final __objc_msgSend_907Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer<__SecTrust> Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_907 = __objc_msgSend_907Ptr.asFunction< + ffi.Pointer<__SecTrust> Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _class_NSURLCredentialStorage1 = + _getClass1("NSURLCredentialStorage"); + late final _sel_sharedCredentialStorage1 = + _registerName1("sharedCredentialStorage"); + ffi.Pointer _objc_msgSend_908( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_908( + obj, + sel, + ); + } + + late final __objc_msgSend_908Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_908 = __objc_msgSend_908Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_credentialsForProtectionSpace_1 = + _registerName1("credentialsForProtectionSpace:"); + ffi.Pointer _objc_msgSend_909( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer space, + ) { + return __objc_msgSend_909( + obj, + sel, + space, + ); + } + + late final __objc_msgSend_909Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_909 = __objc_msgSend_909Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_allCredentials1 = _registerName1("allCredentials"); + late final _sel_setCredential_forProtectionSpace_1 = + _registerName1("setCredential:forProtectionSpace:"); + void _objc_msgSend_910( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer credential, + ffi.Pointer space, + ) { + return __objc_msgSend_910( + obj, + sel, + credential, + space, + ); + } + + late final __objc_msgSend_910Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_910 = __objc_msgSend_910Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_removeCredential_forProtectionSpace_1 = + _registerName1("removeCredential:forProtectionSpace:"); + late final _sel_removeCredential_forProtectionSpace_options_1 = + _registerName1("removeCredential:forProtectionSpace:options:"); + void _objc_msgSend_911( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer credential, + ffi.Pointer space, + ffi.Pointer options, + ) { + return __objc_msgSend_911( + obj, + sel, + credential, + space, + options, + ); + } + + late final __objc_msgSend_911Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_911 = __objc_msgSend_911Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_defaultCredentialForProtectionSpace_1 = + _registerName1("defaultCredentialForProtectionSpace:"); + ffi.Pointer _objc_msgSend_912( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer space, + ) { + return __objc_msgSend_912( + obj, + sel, + space, + ); + } + + late final __objc_msgSend_912Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_912 = __objc_msgSend_912Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setDefaultCredential_forProtectionSpace_1 = + _registerName1("setDefaultCredential:forProtectionSpace:"); + late final _sel_getCredentialsForProtectionSpace_task_completionHandler_1 = + _registerName1( + "getCredentialsForProtectionSpace:task:completionHandler:"); + void _objc_msgSend_913( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer protectionSpace, + ffi.Pointer task, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_913( + obj, + sel, + protectionSpace, + task, + completionHandler, + ); + } + + late final __objc_msgSend_913Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_913 = __objc_msgSend_913Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_setCredential_forProtectionSpace_task_1 = + _registerName1("setCredential:forProtectionSpace:task:"); + void _objc_msgSend_914( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer credential, + ffi.Pointer protectionSpace, + ffi.Pointer task, + ) { + return __objc_msgSend_914( + obj, + sel, + credential, + protectionSpace, + task, + ); + } + + late final __objc_msgSend_914Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_914 = __objc_msgSend_914Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_removeCredential_forProtectionSpace_options_task_1 = + _registerName1("removeCredential:forProtectionSpace:options:task:"); + void _objc_msgSend_915( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer credential, + ffi.Pointer protectionSpace, + ffi.Pointer options, + ffi.Pointer task, + ) { + return __objc_msgSend_915( + obj, + sel, + credential, + protectionSpace, + options, + task, + ); + } + + late final __objc_msgSend_915Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_915 = __objc_msgSend_915Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_getDefaultCredentialForProtectionSpace_task_completionHandler_1 = + _registerName1( + "getDefaultCredentialForProtectionSpace:task:completionHandler:"); + void _objc_msgSend_916( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer space, + ffi.Pointer task, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_916( + obj, + sel, + space, + task, + completionHandler, + ); + } + + late final __objc_msgSend_916Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_916 = __objc_msgSend_916Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_setDefaultCredential_forProtectionSpace_task_1 = + _registerName1("setDefaultCredential:forProtectionSpace:task:"); + late final _class_NSURLProtocol1 = _getClass1("NSURLProtocol"); + late final _sel_initWithRequest_cachedResponse_client_1 = + _registerName1("initWithRequest:cachedResponse:client:"); + instancetype _objc_msgSend_917( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer request, + ffi.Pointer cachedResponse, + ffi.Pointer client, + ) { + return __objc_msgSend_917( + obj, + sel, + request, + cachedResponse, + client, + ); + } + + late final __objc_msgSend_917Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_917 = __objc_msgSend_917Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_client1 = _registerName1("client"); + late final _sel_request1 = _registerName1("request"); + late final _sel_cachedResponse1 = _registerName1("cachedResponse"); + ffi.Pointer _objc_msgSend_918( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_918( + obj, + sel, + ); + } + + late final __objc_msgSend_918Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_918 = __objc_msgSend_918Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_canInitWithRequest_1 = _registerName1("canInitWithRequest:"); + late final _sel_canonicalRequestForRequest_1 = + _registerName1("canonicalRequestForRequest:"); + ffi.Pointer _objc_msgSend_919( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer request, + ) { + return __objc_msgSend_919( + obj, + sel, + request, + ); + } + + late final __objc_msgSend_919Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_919 = __objc_msgSend_919Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_requestIsCacheEquivalent_toRequest_1 = + _registerName1("requestIsCacheEquivalent:toRequest:"); + bool _objc_msgSend_920( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer a, + ffi.Pointer b, + ) { + return __objc_msgSend_920( + obj, + sel, + a, + b, + ); + } + + late final __objc_msgSend_920Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_920 = __objc_msgSend_920Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_startLoading1 = _registerName1("startLoading"); + late final _sel_stopLoading1 = _registerName1("stopLoading"); + late final _sel_propertyForKey_inRequest_1 = + _registerName1("propertyForKey:inRequest:"); + ffi.Pointer _objc_msgSend_921( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer key, + ffi.Pointer request, + ) { + return __objc_msgSend_921( + obj, + sel, + key, + request, + ); + } + + late final __objc_msgSend_921Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_921 = __objc_msgSend_921Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _class_NSMutableURLRequest1 = _getClass1("NSMutableURLRequest"); + late final _sel_setURL_1 = _registerName1("setURL:"); + late final _sel_setCachePolicy_1 = _registerName1("setCachePolicy:"); + void _objc_msgSend_922( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_922( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_922Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_922 = __objc_msgSend_922Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_setTimeoutInterval_1 = _registerName1("setTimeoutInterval:"); + late final _sel_setMainDocumentURL_1 = _registerName1("setMainDocumentURL:"); + late final _sel_setNetworkServiceType_1 = + _registerName1("setNetworkServiceType:"); + void _objc_msgSend_923( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_923( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_923Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_923 = __objc_msgSend_923Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_setAllowsCellularAccess_1 = + _registerName1("setAllowsCellularAccess:"); + late final _sel_setAllowsExpensiveNetworkAccess_1 = + _registerName1("setAllowsExpensiveNetworkAccess:"); + late final _sel_setAllowsConstrainedNetworkAccess_1 = + _registerName1("setAllowsConstrainedNetworkAccess:"); + late final _sel_setAssumesHTTP3Capable_1 = + _registerName1("setAssumesHTTP3Capable:"); + late final _sel_setAttribution_1 = _registerName1("setAttribution:"); + void _objc_msgSend_924( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_924( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_924Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_924 = __objc_msgSend_924Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_setRequiresDNSSECValidation_1 = + _registerName1("setRequiresDNSSECValidation:"); + late final _sel_setHTTPMethod_1 = _registerName1("setHTTPMethod:"); + late final _sel_setAllHTTPHeaderFields_1 = + _registerName1("setAllHTTPHeaderFields:"); + late final _sel_setValue_forHTTPHeaderField_1 = + _registerName1("setValue:forHTTPHeaderField:"); + late final _sel_addValue_forHTTPHeaderField_1 = + _registerName1("addValue:forHTTPHeaderField:"); + late final _sel_setHTTPBody_1 = _registerName1("setHTTPBody:"); + void _objc_msgSend_925( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_925( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_925Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_925 = __objc_msgSend_925Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_setHTTPBodyStream_1 = _registerName1("setHTTPBodyStream:"); + void _objc_msgSend_926( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_926( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_926Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_926 = __objc_msgSend_926Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_setHTTPShouldHandleCookies_1 = + _registerName1("setHTTPShouldHandleCookies:"); + late final _sel_setHTTPShouldUsePipelining_1 = + _registerName1("setHTTPShouldUsePipelining:"); + late final _sel_setProperty_forKey_inRequest_1 = + _registerName1("setProperty:forKey:inRequest:"); + void _objc_msgSend_927( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ffi.Pointer key, + ffi.Pointer request, + ) { + return __objc_msgSend_927( + obj, + sel, + value, + key, + request, + ); + } + + late final __objc_msgSend_927Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_927 = __objc_msgSend_927Ptr.asFunction< + void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_removePropertyForKey_inRequest_1 = + _registerName1("removePropertyForKey:inRequest:"); + void _objc_msgSend_928( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer key, + ffi.Pointer request, + ) { + return __objc_msgSend_928( + obj, + sel, + key, + request, + ); + } + + late final __objc_msgSend_928Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_928 = __objc_msgSend_928Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_registerClass_1 = _registerName1("registerClass:"); + late final _sel_unregisterClass_1 = _registerName1("unregisterClass:"); + late final _sel_canInitWithTask_1 = _registerName1("canInitWithTask:"); + bool _objc_msgSend_929( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer task, + ) { + return __objc_msgSend_929( + obj, + sel, + task, + ); + } + + late final __objc_msgSend_929Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_929 = __objc_msgSend_929Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_initWithTask_cachedResponse_client_1 = + _registerName1("initWithTask:cachedResponse:client:"); + instancetype _objc_msgSend_930( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer task, + ffi.Pointer cachedResponse, + ffi.Pointer client, + ) { + return __objc_msgSend_930( + obj, + sel, + task, + cachedResponse, + client, + ); + } + + late final __objc_msgSend_930Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_930 = __objc_msgSend_930Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_task1 = _registerName1("task"); + ffi.Pointer _objc_msgSend_931( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_931( + obj, + sel, + ); + } + + late final __objc_msgSend_931Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_931 = __objc_msgSend_931Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _class_NSXMLParser1 = _getClass1("NSXMLParser"); + late final _sel_initWithStream_1 = _registerName1("initWithStream:"); + instancetype _objc_msgSend_932( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer stream, + ) { + return __objc_msgSend_932( + obj, + sel, + stream, + ); + } + + late final __objc_msgSend_932Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_932 = __objc_msgSend_932Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_shouldProcessNamespaces1 = + _registerName1("shouldProcessNamespaces"); + late final _sel_setShouldProcessNamespaces_1 = + _registerName1("setShouldProcessNamespaces:"); + late final _sel_shouldReportNamespacePrefixes1 = + _registerName1("shouldReportNamespacePrefixes"); + late final _sel_setShouldReportNamespacePrefixes_1 = + _registerName1("setShouldReportNamespacePrefixes:"); + late final _sel_externalEntityResolvingPolicy1 = + _registerName1("externalEntityResolvingPolicy"); + int _objc_msgSend_933( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_933( + obj, + sel, + ); + } + + late final __objc_msgSend_933Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_933 = __objc_msgSend_933Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setExternalEntityResolvingPolicy_1 = + _registerName1("setExternalEntityResolvingPolicy:"); + void _objc_msgSend_934( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_934( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_934Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_934 = __objc_msgSend_934Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_allowedExternalEntityURLs1 = + _registerName1("allowedExternalEntityURLs"); + late final _sel_setAllowedExternalEntityURLs_1 = + _registerName1("setAllowedExternalEntityURLs:"); + void _objc_msgSend_935( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_935( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_935Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_935 = __objc_msgSend_935Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_parse1 = _registerName1("parse"); + late final _sel_abortParsing1 = _registerName1("abortParsing"); + late final _sel_parserError1 = _registerName1("parserError"); + late final _sel_shouldResolveExternalEntities1 = + _registerName1("shouldResolveExternalEntities"); + late final _sel_setShouldResolveExternalEntities_1 = + _registerName1("setShouldResolveExternalEntities:"); + late final _sel_publicID1 = _registerName1("publicID"); + late final _sel_systemID1 = _registerName1("systemID"); + late final _sel_lineNumber1 = _registerName1("lineNumber"); + late final _sel_columnNumber1 = _registerName1("columnNumber"); + late final _class_NSFileWrapper1 = _getClass1("NSFileWrapper"); + late final _sel_initWithURL_options_error_1 = + _registerName1("initWithURL:options:error:"); + instancetype _objc_msgSend_936( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + int options, + ffi.Pointer> outError, + ) { + return __objc_msgSend_936( + obj, + sel, + url, + options, + outError, + ); + } + + late final __objc_msgSend_936Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_936 = __objc_msgSend_936Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer>)>(); + + late final _sel_initDirectoryWithFileWrappers_1 = + _registerName1("initDirectoryWithFileWrappers:"); + late final _sel_initRegularFileWithContents_1 = + _registerName1("initRegularFileWithContents:"); + late final _sel_initSymbolicLinkWithDestinationURL_1 = + _registerName1("initSymbolicLinkWithDestinationURL:"); + late final _sel_initWithSerializedRepresentation_1 = + _registerName1("initWithSerializedRepresentation:"); + late final _sel_isDirectory1 = _registerName1("isDirectory"); + late final _sel_isRegularFile1 = _registerName1("isRegularFile"); + late final _sel_isSymbolicLink1 = _registerName1("isSymbolicLink"); + late final _sel_preferredFilename1 = _registerName1("preferredFilename"); + late final _sel_setPreferredFilename_1 = + _registerName1("setPreferredFilename:"); + late final _sel_filename1 = _registerName1("filename"); + late final _sel_setFilename_1 = _registerName1("setFilename:"); + late final _sel_fileAttributes1 = _registerName1("fileAttributes"); + late final _sel_setFileAttributes_1 = _registerName1("setFileAttributes:"); + late final _sel_matchesContentsOfURL_1 = + _registerName1("matchesContentsOfURL:"); + late final _sel_readFromURL_options_error_1 = + _registerName1("readFromURL:options:error:"); + bool _objc_msgSend_937( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + int options, + ffi.Pointer> outError, + ) { + return __objc_msgSend_937( + obj, + sel, + url, + options, + outError, + ); + } + + late final __objc_msgSend_937Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_937 = __objc_msgSend_937Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer>)>(); + + late final _sel_writeToURL_options_originalContentsURL_error_1 = + _registerName1("writeToURL:options:originalContentsURL:error:"); + bool _objc_msgSend_938( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + int options, + ffi.Pointer originalContentsURL, + ffi.Pointer> outError, + ) { + return __objc_msgSend_938( + obj, + sel, + url, + options, + originalContentsURL, + outError, + ); + } + + late final __objc_msgSend_938Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_938 = __objc_msgSend_938Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_serializedRepresentation1 = + _registerName1("serializedRepresentation"); + late final _sel_addFileWrapper_1 = _registerName1("addFileWrapper:"); + ffi.Pointer _objc_msgSend_939( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer child, + ) { + return __objc_msgSend_939( + obj, + sel, + child, + ); + } + + late final __objc_msgSend_939Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_939 = __objc_msgSend_939Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_addRegularFileWithContents_preferredFilename_1 = + _registerName1("addRegularFileWithContents:preferredFilename:"); + ffi.Pointer _objc_msgSend_940( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer data, + ffi.Pointer fileName, + ) { + return __objc_msgSend_940( + obj, + sel, + data, + fileName, + ); + } + + late final __objc_msgSend_940Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_940 = __objc_msgSend_940Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_removeFileWrapper_1 = _registerName1("removeFileWrapper:"); + void _objc_msgSend_941( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer child, + ) { + return __objc_msgSend_941( + obj, + sel, + child, + ); + } + + late final __objc_msgSend_941Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_941 = __objc_msgSend_941Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_fileWrappers1 = _registerName1("fileWrappers"); + late final _sel_keyForFileWrapper_1 = _registerName1("keyForFileWrapper:"); + late final _sel_regularFileContents1 = _registerName1("regularFileContents"); + late final _sel_symbolicLinkDestinationURL1 = + _registerName1("symbolicLinkDestinationURL"); + late final _sel_initSymbolicLinkWithDestination_1 = + _registerName1("initSymbolicLinkWithDestination:"); + late final _sel_needsToBeUpdatedFromPath_1 = + _registerName1("needsToBeUpdatedFromPath:"); + late final _sel_updateFromPath_1 = _registerName1("updateFromPath:"); + late final _sel_writeToFile_atomically_updateFilenames_1 = + _registerName1("writeToFile:atomically:updateFilenames:"); + bool _objc_msgSend_942( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + bool atomicFlag, + bool updateFilenamesFlag, + ) { + return __objc_msgSend_942( + obj, + sel, + path, + atomicFlag, + updateFilenamesFlag, + ); + } + + late final __objc_msgSend_942Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Bool, ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_942 = __objc_msgSend_942Ptr.asFunction< + bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, bool, bool)>(); + + late final _sel_addFileWithPath_1 = _registerName1("addFileWithPath:"); + late final _sel_addSymbolicLinkWithDestination_preferredFilename_1 = + _registerName1("addSymbolicLinkWithDestination:preferredFilename:"); + late final _sel_symbolicLinkDestination1 = + _registerName1("symbolicLinkDestination"); + late final _class_NSURLSession1 = _getClass1("NSURLSession"); + late final _sel_sharedSession1 = _registerName1("sharedSession"); + ffi.Pointer _objc_msgSend_943( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_943( + obj, + sel, + ); + } + + late final __objc_msgSend_943Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_943 = __objc_msgSend_943Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _class_NSURLSessionConfiguration1 = + _getClass1("NSURLSessionConfiguration"); + late final _sel_defaultSessionConfiguration1 = + _registerName1("defaultSessionConfiguration"); + ffi.Pointer _objc_msgSend_944( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_944( + obj, + sel, + ); + } + + late final __objc_msgSend_944Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_944 = __objc_msgSend_944Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_ephemeralSessionConfiguration1 = + _registerName1("ephemeralSessionConfiguration"); + late final _sel_backgroundSessionConfigurationWithIdentifier_1 = + _registerName1("backgroundSessionConfigurationWithIdentifier:"); + ffi.Pointer _objc_msgSend_945( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer identifier, + ) { + return __objc_msgSend_945( + obj, + sel, + identifier, + ); + } + + late final __objc_msgSend_945Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_945 = __objc_msgSend_945Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_identifier1 = _registerName1("identifier"); + late final _sel_requestCachePolicy1 = _registerName1("requestCachePolicy"); + late final _sel_setRequestCachePolicy_1 = + _registerName1("setRequestCachePolicy:"); + late final _sel_timeoutIntervalForRequest1 = + _registerName1("timeoutIntervalForRequest"); + late final _sel_setTimeoutIntervalForRequest_1 = + _registerName1("setTimeoutIntervalForRequest:"); + late final _sel_timeoutIntervalForResource1 = + _registerName1("timeoutIntervalForResource"); + late final _sel_setTimeoutIntervalForResource_1 = + _registerName1("setTimeoutIntervalForResource:"); + late final _sel_waitsForConnectivity1 = + _registerName1("waitsForConnectivity"); + late final _sel_setWaitsForConnectivity_1 = + _registerName1("setWaitsForConnectivity:"); + late final _sel_isDiscretionary1 = _registerName1("isDiscretionary"); + late final _sel_setDiscretionary_1 = _registerName1("setDiscretionary:"); + late final _sel_sharedContainerIdentifier1 = + _registerName1("sharedContainerIdentifier"); + late final _sel_setSharedContainerIdentifier_1 = + _registerName1("setSharedContainerIdentifier:"); + late final _sel_sessionSendsLaunchEvents1 = + _registerName1("sessionSendsLaunchEvents"); + late final _sel_setSessionSendsLaunchEvents_1 = + _registerName1("setSessionSendsLaunchEvents:"); + late final _sel_connectionProxyDictionary1 = + _registerName1("connectionProxyDictionary"); + late final _sel_setConnectionProxyDictionary_1 = + _registerName1("setConnectionProxyDictionary:"); + late final _sel_TLSMinimumSupportedProtocol1 = + _registerName1("TLSMinimumSupportedProtocol"); + int _objc_msgSend_946( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_946( + obj, + sel, + ); + } + + late final __objc_msgSend_946Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_946 = __objc_msgSend_946Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setTLSMinimumSupportedProtocol_1 = + _registerName1("setTLSMinimumSupportedProtocol:"); + void _objc_msgSend_947( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_947( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_947Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_947 = __objc_msgSend_947Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_TLSMaximumSupportedProtocol1 = + _registerName1("TLSMaximumSupportedProtocol"); + late final _sel_setTLSMaximumSupportedProtocol_1 = + _registerName1("setTLSMaximumSupportedProtocol:"); + late final _sel_TLSMinimumSupportedProtocolVersion1 = + _registerName1("TLSMinimumSupportedProtocolVersion"); + int _objc_msgSend_948( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_948( + obj, + sel, + ); + } + + late final __objc_msgSend_948Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_948 = __objc_msgSend_948Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setTLSMinimumSupportedProtocolVersion_1 = + _registerName1("setTLSMinimumSupportedProtocolVersion:"); + void _objc_msgSend_949( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_949( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_949Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_949 = __objc_msgSend_949Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_TLSMaximumSupportedProtocolVersion1 = + _registerName1("TLSMaximumSupportedProtocolVersion"); + late final _sel_setTLSMaximumSupportedProtocolVersion_1 = + _registerName1("setTLSMaximumSupportedProtocolVersion:"); + late final _sel_HTTPShouldSetCookies1 = + _registerName1("HTTPShouldSetCookies"); + late final _sel_setHTTPShouldSetCookies_1 = + _registerName1("setHTTPShouldSetCookies:"); + late final _sel_HTTPCookieAcceptPolicy1 = + _registerName1("HTTPCookieAcceptPolicy"); + late final _sel_setHTTPCookieAcceptPolicy_1 = + _registerName1("setHTTPCookieAcceptPolicy:"); + late final _sel_HTTPAdditionalHeaders1 = + _registerName1("HTTPAdditionalHeaders"); + late final _sel_setHTTPAdditionalHeaders_1 = + _registerName1("setHTTPAdditionalHeaders:"); + late final _sel_HTTPMaximumConnectionsPerHost1 = + _registerName1("HTTPMaximumConnectionsPerHost"); + late final _sel_setHTTPMaximumConnectionsPerHost_1 = + _registerName1("setHTTPMaximumConnectionsPerHost:"); + late final _sel_HTTPCookieStorage1 = _registerName1("HTTPCookieStorage"); + late final _sel_setHTTPCookieStorage_1 = + _registerName1("setHTTPCookieStorage:"); + void _objc_msgSend_950( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_950( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_950Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_950 = __objc_msgSend_950Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_URLCredentialStorage1 = + _registerName1("URLCredentialStorage"); + late final _sel_setURLCredentialStorage_1 = + _registerName1("setURLCredentialStorage:"); + void _objc_msgSend_951( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_951( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_951Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_951 = __objc_msgSend_951Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_URLCache1 = _registerName1("URLCache"); + late final _sel_setURLCache_1 = _registerName1("setURLCache:"); + late final _sel_shouldUseExtendedBackgroundIdleMode1 = + _registerName1("shouldUseExtendedBackgroundIdleMode"); + late final _sel_setShouldUseExtendedBackgroundIdleMode_1 = + _registerName1("setShouldUseExtendedBackgroundIdleMode:"); + late final _sel_protocolClasses1 = _registerName1("protocolClasses"); + late final _sel_setProtocolClasses_1 = _registerName1("setProtocolClasses:"); + late final _sel_multipathServiceType1 = + _registerName1("multipathServiceType"); + int _objc_msgSend_952( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_952( + obj, + sel, + ); + } + + late final __objc_msgSend_952Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_952 = __objc_msgSend_952Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setMultipathServiceType_1 = + _registerName1("setMultipathServiceType:"); + void _objc_msgSend_953( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_953( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_953Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_953 = __objc_msgSend_953Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_backgroundSessionConfiguration_1 = + _registerName1("backgroundSessionConfiguration:"); + late final _sel_sessionWithConfiguration_1 = + _registerName1("sessionWithConfiguration:"); + ffi.Pointer _objc_msgSend_954( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer configuration, + ) { + return __objc_msgSend_954( + obj, + sel, + configuration, + ); + } + + late final __objc_msgSend_954Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_954 = __objc_msgSend_954Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_sessionWithConfiguration_delegate_delegateQueue_1 = + _registerName1("sessionWithConfiguration:delegate:delegateQueue:"); + ffi.Pointer _objc_msgSend_955( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer configuration, + ffi.Pointer delegate, + ffi.Pointer queue, + ) { + return __objc_msgSend_955( + obj, + sel, + configuration, + delegate, + queue, + ); + } + + late final __objc_msgSend_955Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_955 = __objc_msgSend_955Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_delegateQueue1 = _registerName1("delegateQueue"); + late final _sel_configuration1 = _registerName1("configuration"); + late final _sel_sessionDescription1 = _registerName1("sessionDescription"); + late final _sel_setSessionDescription_1 = + _registerName1("setSessionDescription:"); + late final _sel_finishTasksAndInvalidate1 = + _registerName1("finishTasksAndInvalidate"); + late final _sel_invalidateAndCancel1 = _registerName1("invalidateAndCancel"); + late final _sel_resetWithCompletionHandler_1 = + _registerName1("resetWithCompletionHandler:"); + late final _sel_flushWithCompletionHandler_1 = + _registerName1("flushWithCompletionHandler:"); + late final _sel_getTasksWithCompletionHandler_1 = + _registerName1("getTasksWithCompletionHandler:"); + void _objc_msgSend_956( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_956( + obj, + sel, + completionHandler, + ); + } + + late final __objc_msgSend_956Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_956 = __objc_msgSend_956Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_getAllTasksWithCompletionHandler_1 = + _registerName1("getAllTasksWithCompletionHandler:"); + void _objc_msgSend_957( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_957( + obj, + sel, + completionHandler, + ); + } + + late final __objc_msgSend_957Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_957 = __objc_msgSend_957Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_dataTaskWithRequest_1 = + _registerName1("dataTaskWithRequest:"); + ffi.Pointer _objc_msgSend_958( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer request, + ) { + return __objc_msgSend_958( + obj, + sel, + request, + ); + } + + late final __objc_msgSend_958Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_958 = __objc_msgSend_958Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_dataTaskWithURL_1 = _registerName1("dataTaskWithURL:"); + ffi.Pointer _objc_msgSend_959( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ) { + return __objc_msgSend_959( + obj, + sel, + url, + ); + } + + late final __objc_msgSend_959Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_959 = __objc_msgSend_959Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _class_NSURLSessionUploadTask1 = + _getClass1("NSURLSessionUploadTask"); + late final _sel_uploadTaskWithRequest_fromFile_1 = + _registerName1("uploadTaskWithRequest:fromFile:"); + ffi.Pointer _objc_msgSend_960( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer request, + ffi.Pointer fileURL, + ) { + return __objc_msgSend_960( + obj, + sel, + request, + fileURL, + ); + } + + late final __objc_msgSend_960Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_960 = __objc_msgSend_960Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_uploadTaskWithRequest_fromData_1 = + _registerName1("uploadTaskWithRequest:fromData:"); + ffi.Pointer _objc_msgSend_961( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer request, + ffi.Pointer bodyData, + ) { + return __objc_msgSend_961( + obj, + sel, + request, + bodyData, + ); + } + + late final __objc_msgSend_961Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_961 = __objc_msgSend_961Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_uploadTaskWithStreamedRequest_1 = + _registerName1("uploadTaskWithStreamedRequest:"); + ffi.Pointer _objc_msgSend_962( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer request, + ) { + return __objc_msgSend_962( + obj, + sel, + request, + ); + } + + late final __objc_msgSend_962Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_962 = __objc_msgSend_962Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _class_NSURLSessionDownloadTask1 = + _getClass1("NSURLSessionDownloadTask"); + late final _sel_cancelByProducingResumeData_1 = + _registerName1("cancelByProducingResumeData:"); + void _objc_msgSend_963( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_963( + obj, + sel, + completionHandler, + ); + } + + late final __objc_msgSend_963Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_963 = __objc_msgSend_963Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_downloadTaskWithRequest_1 = + _registerName1("downloadTaskWithRequest:"); + ffi.Pointer _objc_msgSend_964( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer request, + ) { + return __objc_msgSend_964( + obj, + sel, + request, + ); + } + + late final __objc_msgSend_964Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_964 = __objc_msgSend_964Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_downloadTaskWithURL_1 = + _registerName1("downloadTaskWithURL:"); + ffi.Pointer _objc_msgSend_965( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ) { + return __objc_msgSend_965( + obj, + sel, + url, + ); + } + + late final __objc_msgSend_965Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_965 = __objc_msgSend_965Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_downloadTaskWithResumeData_1 = + _registerName1("downloadTaskWithResumeData:"); + ffi.Pointer _objc_msgSend_966( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer resumeData, + ) { + return __objc_msgSend_966( + obj, + sel, + resumeData, + ); + } + + late final __objc_msgSend_966Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_966 = __objc_msgSend_966Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _class_NSURLSessionStreamTask1 = + _getClass1("NSURLSessionStreamTask"); + late final _sel_readDataOfMinLength_maxLength_timeout_completionHandler_1 = + _registerName1( + "readDataOfMinLength:maxLength:timeout:completionHandler:"); + void _objc_msgSend_967( + ffi.Pointer obj, + ffi.Pointer sel, + int minBytes, + int maxBytes, + double timeout, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_967( + obj, + sel, + minBytes, + maxBytes, + timeout, + completionHandler, + ); + } + + late final __objc_msgSend_967Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.UnsignedLong, + ffi.UnsignedLong, + ffi.Double, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_967 = __objc_msgSend_967Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, int, + double, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_writeData_timeout_completionHandler_1 = + _registerName1("writeData:timeout:completionHandler:"); + void _objc_msgSend_968( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer data, + double timeout, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_968( + obj, + sel, + data, + timeout, + completionHandler, + ); + } + + late final __objc_msgSend_968Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Double, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_968 = __objc_msgSend_968Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, double, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_captureStreams1 = _registerName1("captureStreams"); + late final _sel_closeWrite1 = _registerName1("closeWrite"); + late final _sel_closeRead1 = _registerName1("closeRead"); + late final _sel_startSecureConnection1 = + _registerName1("startSecureConnection"); + late final _sel_stopSecureConnection1 = + _registerName1("stopSecureConnection"); + late final _sel_streamTaskWithHostName_port_1 = + _registerName1("streamTaskWithHostName:port:"); + ffi.Pointer _objc_msgSend_969( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer hostname, + int port, + ) { + return __objc_msgSend_969( + obj, + sel, + hostname, + port, + ); + } + + late final __objc_msgSend_969Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Long)>>('objc_msgSend'); + late final __objc_msgSend_969 = __objc_msgSend_969Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer, int)>(); + + late final _class_NSNetService1 = _getClass1("NSNetService"); + late final _sel_initWithDomain_type_name_port_1 = + _registerName1("initWithDomain:type:name:port:"); + instancetype _objc_msgSend_970( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer domain, + ffi.Pointer type, + ffi.Pointer name, + int port, + ) { + return __objc_msgSend_970( + obj, + sel, + domain, + type, + name, + port, + ); + } + + late final __objc_msgSend_970Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int)>>('objc_msgSend'); + late final __objc_msgSend_970 = __objc_msgSend_970Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int)>(); + + late final _sel_initWithDomain_type_name_1 = + _registerName1("initWithDomain:type:name:"); + late final _sel_includesPeerToPeer1 = _registerName1("includesPeerToPeer"); + late final _sel_setIncludesPeerToPeer_1 = + _registerName1("setIncludesPeerToPeer:"); + late final _sel_type1 = _registerName1("type"); + late final _sel_publishWithOptions_1 = _registerName1("publishWithOptions:"); + void _objc_msgSend_971( + ffi.Pointer obj, + ffi.Pointer sel, + int options, + ) { + return __objc_msgSend_971( + obj, + sel, + options, + ); + } + + late final __objc_msgSend_971Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_971 = __objc_msgSend_971Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_resolve1 = _registerName1("resolve"); + late final _sel_stop1 = _registerName1("stop"); + late final _sel_dictionaryFromTXTRecordData_1 = + _registerName1("dictionaryFromTXTRecordData:"); + ffi.Pointer _objc_msgSend_972( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer txtData, + ) { + return __objc_msgSend_972( + obj, + sel, + txtData, + ); + } + + late final __objc_msgSend_972Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_972 = __objc_msgSend_972Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_dataFromTXTRecordDictionary_1 = + _registerName1("dataFromTXTRecordDictionary:"); + ffi.Pointer _objc_msgSend_973( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer txtDictionary, + ) { + return __objc_msgSend_973( + obj, + sel, + txtDictionary, + ); + } + + late final __objc_msgSend_973Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_973 = __objc_msgSend_973Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_resolveWithTimeout_1 = _registerName1("resolveWithTimeout:"); + late final _sel_getInputStream_outputStream_1 = + _registerName1("getInputStream:outputStream:"); + bool _objc_msgSend_974( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer> inputStream, + ffi.Pointer> outputStream, + ) { + return __objc_msgSend_974( + obj, + sel, + inputStream, + outputStream, + ); + } + + late final __objc_msgSend_974Ptr = _lookup< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_974 = __objc_msgSend_974Ptr.asFunction< + bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer>)>(); + + late final _sel_setTXTRecordData_1 = _registerName1("setTXTRecordData:"); + late final _sel_TXTRecordData1 = _registerName1("TXTRecordData"); + late final _sel_startMonitoring1 = _registerName1("startMonitoring"); + late final _sel_stopMonitoring1 = _registerName1("stopMonitoring"); + late final _sel_streamTaskWithNetService_1 = + _registerName1("streamTaskWithNetService:"); + ffi.Pointer _objc_msgSend_975( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer service, + ) { + return __objc_msgSend_975( + obj, + sel, + service, + ); + } + + late final __objc_msgSend_975Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_975 = __objc_msgSend_975Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _class_NSURLSessionWebSocketTask1 = + _getClass1("NSURLSessionWebSocketTask"); + late final _class_NSURLSessionWebSocketMessage1 = + _getClass1("NSURLSessionWebSocketMessage"); + int _objc_msgSend_976( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_976( + obj, + sel, + ); + } + + late final __objc_msgSend_976Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_976 = __objc_msgSend_976Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_sendMessage_completionHandler_1 = + _registerName1("sendMessage:completionHandler:"); + void _objc_msgSend_977( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer message, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_977( + obj, + sel, + message, + completionHandler, + ); + } + + late final __objc_msgSend_977Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_977 = __objc_msgSend_977Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_receiveMessageWithCompletionHandler_1 = + _registerName1("receiveMessageWithCompletionHandler:"); + void _objc_msgSend_978( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_978( + obj, + sel, + completionHandler, + ); + } + + late final __objc_msgSend_978Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_978 = __objc_msgSend_978Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_sendPingWithPongReceiveHandler_1 = + _registerName1("sendPingWithPongReceiveHandler:"); + void _objc_msgSend_979( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> pongReceiveHandler, + ) { + return __objc_msgSend_979( + obj, + sel, + pongReceiveHandler, + ); + } + + late final __objc_msgSend_979Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_979 = __objc_msgSend_979Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_cancelWithCloseCode_reason_1 = + _registerName1("cancelWithCloseCode:reason:"); + void _objc_msgSend_980( + ffi.Pointer obj, + ffi.Pointer sel, + int closeCode, + ffi.Pointer reason, + ) { + return __objc_msgSend_980( + obj, + sel, + closeCode, + reason, + ); + } + + late final __objc_msgSend_980Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_980 = __objc_msgSend_980Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer)>(); + + late final _sel_maximumMessageSize1 = _registerName1("maximumMessageSize"); + late final _sel_setMaximumMessageSize_1 = + _registerName1("setMaximumMessageSize:"); + late final _sel_closeCode1 = _registerName1("closeCode"); + int _objc_msgSend_981( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_981( + obj, + sel, + ); + } + + late final __objc_msgSend_981Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_981 = __objc_msgSend_981Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_closeReason1 = _registerName1("closeReason"); + late final _sel_webSocketTaskWithURL_1 = + _registerName1("webSocketTaskWithURL:"); + ffi.Pointer _objc_msgSend_982( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ) { + return __objc_msgSend_982( + obj, + sel, + url, + ); + } + + late final __objc_msgSend_982Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_982 = __objc_msgSend_982Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_webSocketTaskWithURL_protocols_1 = + _registerName1("webSocketTaskWithURL:protocols:"); + ffi.Pointer _objc_msgSend_983( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ffi.Pointer protocols, + ) { + return __objc_msgSend_983( + obj, + sel, + url, + protocols, + ); + } + + late final __objc_msgSend_983Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_983 = __objc_msgSend_983Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_webSocketTaskWithRequest_1 = + _registerName1("webSocketTaskWithRequest:"); + ffi.Pointer _objc_msgSend_984( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer request, + ) { + return __objc_msgSend_984( + obj, + sel, + request, + ); + } + + late final __objc_msgSend_984Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_984 = __objc_msgSend_984Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_dataTaskWithRequest_completionHandler_1 = + _registerName1("dataTaskWithRequest:completionHandler:"); + ffi.Pointer _objc_msgSend_985( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer request, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_985( + obj, + sel, + request, + completionHandler, + ); + } + + late final __objc_msgSend_985Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_985 = __objc_msgSend_985Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_dataTaskWithURL_completionHandler_1 = + _registerName1("dataTaskWithURL:completionHandler:"); + ffi.Pointer _objc_msgSend_986( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_986( + obj, + sel, + url, + completionHandler, + ); + } + + late final __objc_msgSend_986Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_986 = __objc_msgSend_986Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_uploadTaskWithRequest_fromFile_completionHandler_1 = + _registerName1("uploadTaskWithRequest:fromFile:completionHandler:"); + ffi.Pointer _objc_msgSend_987( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer request, + ffi.Pointer fileURL, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_987( + obj, + sel, + request, + fileURL, + completionHandler, + ); + } + + late final __objc_msgSend_987Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_987 = __objc_msgSend_987Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_uploadTaskWithRequest_fromData_completionHandler_1 = + _registerName1("uploadTaskWithRequest:fromData:completionHandler:"); + ffi.Pointer _objc_msgSend_988( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer request, + ffi.Pointer bodyData, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_988( + obj, + sel, + request, + bodyData, + completionHandler, + ); + } + + late final __objc_msgSend_988Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_988 = __objc_msgSend_988Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_downloadTaskWithRequest_completionHandler_1 = + _registerName1("downloadTaskWithRequest:completionHandler:"); + ffi.Pointer _objc_msgSend_989( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer request, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_989( + obj, + sel, + request, + completionHandler, + ); + } + + late final __objc_msgSend_989Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_989 = __objc_msgSend_989Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_downloadTaskWithURL_completionHandler_1 = + _registerName1("downloadTaskWithURL:completionHandler:"); + ffi.Pointer _objc_msgSend_990( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_990( + obj, + sel, + url, + completionHandler, + ); + } + + late final __objc_msgSend_990Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_990 = __objc_msgSend_990Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_downloadTaskWithResumeData_completionHandler_1 = + _registerName1("downloadTaskWithResumeData:completionHandler:"); + ffi.Pointer _objc_msgSend_991( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer resumeData, + ffi.Pointer<_ObjCBlock> completionHandler, + ) { + return __objc_msgSend_991( + obj, + sel, + resumeData, + completionHandler, + ); + } + + late final __objc_msgSend_991Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_991 = __objc_msgSend_991Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _class_NSProtocolChecker1 = _getClass1("NSProtocolChecker"); + ffi.Pointer _objc_msgSend_992( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_992( + obj, + sel, + ); + } + + late final __objc_msgSend_992Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_992 = __objc_msgSend_992Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_protocolCheckerWithTarget_protocol_1 = + _registerName1("protocolCheckerWithTarget:protocol:"); + instancetype _objc_msgSend_993( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer anObject, + ffi.Pointer aProtocol, + ) { + return __objc_msgSend_993( + obj, + sel, + anObject, + aProtocol, + ); + } + + late final __objc_msgSend_993Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_993 = __objc_msgSend_993Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_initWithTarget_protocol_1 = + _registerName1("initWithTarget:protocol:"); + late final _class_NSTask1 = _getClass1("NSTask"); + late final _sel_setExecutableURL_1 = _registerName1("setExecutableURL:"); + late final _sel_setEnvironment_1 = _registerName1("setEnvironment:"); + late final _sel_currentDirectoryURL1 = _registerName1("currentDirectoryURL"); + late final _sel_setCurrentDirectoryURL_1 = + _registerName1("setCurrentDirectoryURL:"); + late final _sel_standardInput1 = _registerName1("standardInput"); + late final _sel_setStandardInput_1 = _registerName1("setStandardInput:"); + late final _sel_standardOutput1 = _registerName1("standardOutput"); + late final _sel_setStandardOutput_1 = _registerName1("setStandardOutput:"); + late final _sel_standardError1 = _registerName1("standardError"); + late final _sel_setStandardError_1 = _registerName1("setStandardError:"); + late final _sel_launchAndReturnError_1 = + _registerName1("launchAndReturnError:"); + late final _sel_interrupt1 = _registerName1("interrupt"); + late final _sel_terminate1 = _registerName1("terminate"); + late final _sel_isRunning1 = _registerName1("isRunning"); + late final _sel_terminationStatus1 = _registerName1("terminationStatus"); + late final _sel_terminationReason1 = _registerName1("terminationReason"); + int _objc_msgSend_994( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_994( + obj, + sel, + ); + } + + late final __objc_msgSend_994Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_994 = __objc_msgSend_994Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_terminationHandler1 = _registerName1("terminationHandler"); + ffi.Pointer<_ObjCBlock> _objc_msgSend_995( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_995( + obj, + sel, + ); + } + + late final __objc_msgSend_995Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer<_ObjCBlock> Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_995 = __objc_msgSend_995Ptr.asFunction< + ffi.Pointer<_ObjCBlock> Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setTerminationHandler_1 = + _registerName1("setTerminationHandler:"); + void _objc_msgSend_996( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> value, + ) { + return __objc_msgSend_996( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_996Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_996 = __objc_msgSend_996Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_launchedTaskWithExecutableURL_arguments_error_terminationHandler_1 = + _registerName1( + "launchedTaskWithExecutableURL:arguments:error:terminationHandler:"); + ffi.Pointer _objc_msgSend_997( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + ffi.Pointer arguments, + ffi.Pointer> error, + ffi.Pointer<_ObjCBlock> terminationHandler, + ) { + return __objc_msgSend_997( + obj, + sel, + url, + arguments, + error, + terminationHandler, + ); + } + + late final __objc_msgSend_997Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_997 = __objc_msgSend_997Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_waitUntilExit1 = _registerName1("waitUntilExit"); + late final _sel_launchPath1 = _registerName1("launchPath"); + late final _sel_setLaunchPath_1 = _registerName1("setLaunchPath:"); + late final _sel_setCurrentDirectoryPath_1 = + _registerName1("setCurrentDirectoryPath:"); + late final _sel_launch1 = _registerName1("launch"); + late final _sel_launchedTaskWithLaunchPath_arguments_1 = + _registerName1("launchedTaskWithLaunchPath:arguments:"); + ffi.Pointer _objc_msgSend_998( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer path, + ffi.Pointer arguments, + ) { + return __objc_msgSend_998( + obj, + sel, + path, + arguments, + ); + } + + late final __objc_msgSend_998Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_998 = __objc_msgSend_998Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _class_NSXMLElement1 = _getClass1("NSXMLElement"); + late final _class_NSXMLNode1 = _getClass1("NSXMLNode"); + late final _sel_initWithKind_1 = _registerName1("initWithKind:"); + instancetype _objc_msgSend_999( + ffi.Pointer obj, + ffi.Pointer sel, + int kind, + ) { + return __objc_msgSend_999( + obj, + sel, + kind, + ); + } + + late final __objc_msgSend_999Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_999 = __objc_msgSend_999Ptr.asFunction< + instancetype Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_initWithKind_options_1 = + _registerName1("initWithKind:options:"); + instancetype _objc_msgSend_1000( + ffi.Pointer obj, + ffi.Pointer sel, + int kind, + int options, + ) { + return __objc_msgSend_1000( + obj, + sel, + kind, + options, + ); + } + + late final __objc_msgSend_1000Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Int32, ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_1000 = __objc_msgSend_1000Ptr.asFunction< + instancetype Function( + ffi.Pointer, ffi.Pointer, int, int)>(); + + late final _sel_document1 = _registerName1("document"); + late final _sel_documentWithRootElement_1 = + _registerName1("documentWithRootElement:"); + ffi.Pointer _objc_msgSend_1001( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer element, + ) { + return __objc_msgSend_1001( + obj, + sel, + element, + ); + } + + late final __objc_msgSend_1001Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1001 = __objc_msgSend_1001Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_elementWithName_1 = _registerName1("elementWithName:"); + late final _sel_elementWithName_URI_1 = + _registerName1("elementWithName:URI:"); + late final _sel_elementWithName_stringValue_1 = + _registerName1("elementWithName:stringValue:"); + late final _sel_elementWithName_children_attributes_1 = + _registerName1("elementWithName:children:attributes:"); + ffi.Pointer _objc_msgSend_1002( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + ffi.Pointer children, + ffi.Pointer attributes, + ) { + return __objc_msgSend_1002( + obj, + sel, + name, + children, + attributes, + ); + } + + late final __objc_msgSend_1002Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1002 = __objc_msgSend_1002Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_attributeWithName_stringValue_1 = + _registerName1("attributeWithName:stringValue:"); + late final _sel_attributeWithName_URI_stringValue_1 = + _registerName1("attributeWithName:URI:stringValue:"); + late final _sel_namespaceWithName_stringValue_1 = + _registerName1("namespaceWithName:stringValue:"); + late final _sel_processingInstructionWithName_stringValue_1 = + _registerName1("processingInstructionWithName:stringValue:"); + late final _sel_commentWithStringValue_1 = + _registerName1("commentWithStringValue:"); + late final _sel_textWithStringValue_1 = + _registerName1("textWithStringValue:"); + late final _sel_DTDNodeWithXMLString_1 = + _registerName1("DTDNodeWithXMLString:"); + int _objc_msgSend_1003( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_1003( + obj, + sel, + ); + } + + late final __objc_msgSend_1003Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1003 = __objc_msgSend_1003Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_objectValue1 = _registerName1("objectValue"); + late final _sel_setObjectValue_1 = _registerName1("setObjectValue:"); + late final _sel_setStringValue_1 = _registerName1("setStringValue:"); + late final _sel_setStringValue_resolvingEntities_1 = + _registerName1("setStringValue:resolvingEntities:"); + void _objc_msgSend_1004( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer string, + bool resolve, + ) { + return __objc_msgSend_1004( + obj, + sel, + string, + resolve, + ); + } + + late final __objc_msgSend_1004Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_1004 = __objc_msgSend_1004Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, bool)>(); + + late final _sel_index1 = _registerName1("index"); + late final _sel_level1 = _registerName1("level"); + late final _class_NSXMLDocument1 = _getClass1("NSXMLDocument"); + late final _sel_initWithXMLString_options_error_1 = + _registerName1("initWithXMLString:options:error:"); + instancetype _objc_msgSend_1005( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer string, + int mask, + ffi.Pointer> error, + ) { + return __objc_msgSend_1005( + obj, + sel, + string, + mask, + error, + ); + } + + late final __objc_msgSend_1005Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_1005 = __objc_msgSend_1005Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer>)>(); + + instancetype _objc_msgSend_1006( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer url, + int mask, + ffi.Pointer> error, + ) { + return __objc_msgSend_1006( + obj, + sel, + url, + mask, + error, + ); + } + + late final __objc_msgSend_1006Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_1006 = __objc_msgSend_1006Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer>)>(); + + late final _sel_initWithData_options_error_1 = + _registerName1("initWithData:options:error:"); + instancetype _objc_msgSend_1007( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer data, + int mask, + ffi.Pointer> error, + ) { + return __objc_msgSend_1007( + obj, + sel, + data, + mask, + error, + ); + } + + late final __objc_msgSend_1007Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Int32, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_1007 = __objc_msgSend_1007Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + int, + ffi.Pointer>)>(); + + late final _sel_initWithRootElement_1 = + _registerName1("initWithRootElement:"); + late final _sel_replacementClassForClass_1 = + _registerName1("replacementClassForClass:"); + late final _sel_characterEncoding1 = _registerName1("characterEncoding"); + late final _sel_setCharacterEncoding_1 = + _registerName1("setCharacterEncoding:"); + late final _sel_isStandalone1 = _registerName1("isStandalone"); + late final _sel_setStandalone_1 = _registerName1("setStandalone:"); + late final _sel_documentContentKind1 = _registerName1("documentContentKind"); + int _objc_msgSend_1008( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_1008( + obj, + sel, + ); + } + + late final __objc_msgSend_1008Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1008 = __objc_msgSend_1008Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setDocumentContentKind_1 = + _registerName1("setDocumentContentKind:"); + void _objc_msgSend_1009( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_1009( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_1009Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_1009 = __objc_msgSend_1009Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_setMIMEType_1 = _registerName1("setMIMEType:"); + late final _class_NSXMLDTD1 = _getClass1("NSXMLDTD"); + late final _sel_setPublicID_1 = _registerName1("setPublicID:"); + late final _sel_setSystemID_1 = _registerName1("setSystemID:"); + late final _sel_insertChild_atIndex_1 = + _registerName1("insertChild:atIndex:"); + void _objc_msgSend_1010( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer child, + int index, + ) { + return __objc_msgSend_1010( + obj, + sel, + child, + index, + ); + } + + late final __objc_msgSend_1010Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_1010 = __objc_msgSend_1010Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_insertChildren_atIndex_1 = + _registerName1("insertChildren:atIndex:"); + void _objc_msgSend_1011( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer children, + int index, + ) { + return __objc_msgSend_1011( + obj, + sel, + children, + index, + ); + } + + late final __objc_msgSend_1011Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_1011 = __objc_msgSend_1011Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _sel_removeChildAtIndex_1 = _registerName1("removeChildAtIndex:"); + late final _sel_setChildren_1 = _registerName1("setChildren:"); + late final _sel_addChild_1 = _registerName1("addChild:"); + void _objc_msgSend_1012( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer child, + ) { + return __objc_msgSend_1012( + obj, + sel, + child, + ); + } + + late final __objc_msgSend_1012Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1012 = __objc_msgSend_1012Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_replaceChildAtIndex_withNode_1 = + _registerName1("replaceChildAtIndex:withNode:"); + void _objc_msgSend_1013( + ffi.Pointer obj, + ffi.Pointer sel, + int index, + ffi.Pointer node, + ) { + return __objc_msgSend_1013( + obj, + sel, + index, + node, + ); + } + + late final __objc_msgSend_1013Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.UnsignedLong, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1013 = __objc_msgSend_1013Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int, + ffi.Pointer)>(); + + late final _class_NSXMLDTDNode1 = _getClass1("NSXMLDTDNode"); + late final _sel_initWithXMLString_1 = _registerName1("initWithXMLString:"); + late final _sel_DTDKind1 = _registerName1("DTDKind"); + int _objc_msgSend_1014( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_1014( + obj, + sel, + ); + } + + late final __objc_msgSend_1014Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1014 = __objc_msgSend_1014Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setDTDKind_1 = _registerName1("setDTDKind:"); + void _objc_msgSend_1015( + ffi.Pointer obj, + ffi.Pointer sel, + int value, + ) { + return __objc_msgSend_1015( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_1015Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_1015 = __objc_msgSend_1015Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_isExternal1 = _registerName1("isExternal"); + late final _sel_notationName1 = _registerName1("notationName"); + late final _sel_setNotationName_1 = _registerName1("setNotationName:"); + late final _sel_localNameForName_1 = _registerName1("localNameForName:"); + late final _sel_prefixForName_1 = _registerName1("prefixForName:"); + late final _sel_predefinedNamespaceForPrefix_1 = + _registerName1("predefinedNamespaceForPrefix:"); + ffi.Pointer _objc_msgSend_1016( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + ) { + return __objc_msgSend_1016( + obj, + sel, + name, + ); + } + + late final __objc_msgSend_1016Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1016 = __objc_msgSend_1016Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_entityDeclarationForName_1 = + _registerName1("entityDeclarationForName:"); + ffi.Pointer _objc_msgSend_1017( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + ) { + return __objc_msgSend_1017( + obj, + sel, + name, + ); + } + + late final __objc_msgSend_1017Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1017 = __objc_msgSend_1017Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_notationDeclarationForName_1 = + _registerName1("notationDeclarationForName:"); + late final _sel_elementDeclarationForName_1 = + _registerName1("elementDeclarationForName:"); + late final _sel_attributeDeclarationForName_elementName_1 = + _registerName1("attributeDeclarationForName:elementName:"); + ffi.Pointer _objc_msgSend_1018( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer name, + ffi.Pointer elementName, + ) { + return __objc_msgSend_1018( + obj, + sel, + name, + elementName, + ); + } + + late final __objc_msgSend_1018Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1018 = __objc_msgSend_1018Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_predefinedEntityDeclarationForName_1 = + _registerName1("predefinedEntityDeclarationForName:"); + late final _sel_DTD1 = _registerName1("DTD"); + ffi.Pointer _objc_msgSend_1019( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_1019( + obj, + sel, + ); + } + + late final __objc_msgSend_1019Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1019 = __objc_msgSend_1019Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setDTD_1 = _registerName1("setDTD:"); + void _objc_msgSend_1020( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer value, + ) { + return __objc_msgSend_1020( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_1020Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1020 = __objc_msgSend_1020Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_setRootElement_1 = _registerName1("setRootElement:"); + void _objc_msgSend_1021( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer root, + ) { + return __objc_msgSend_1021( + obj, + sel, + root, + ); + } + + late final __objc_msgSend_1021Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1021 = __objc_msgSend_1021Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_rootElement1 = _registerName1("rootElement"); + ffi.Pointer _objc_msgSend_1022( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_1022( + obj, + sel, + ); + } + + late final __objc_msgSend_1022Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1022 = __objc_msgSend_1022Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_XMLData1 = _registerName1("XMLData"); + late final _sel_XMLDataWithOptions_1 = _registerName1("XMLDataWithOptions:"); + ffi.Pointer _objc_msgSend_1023( + ffi.Pointer obj, + ffi.Pointer sel, + int options, + ) { + return __objc_msgSend_1023( + obj, + sel, + options, + ); + } + + late final __objc_msgSend_1023Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_1023 = __objc_msgSend_1023Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_objectByApplyingXSLT_arguments_error_1 = + _registerName1("objectByApplyingXSLT:arguments:error:"); + ffi.Pointer _objc_msgSend_1024( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer xslt, + ffi.Pointer arguments, + ffi.Pointer> error, + ) { + return __objc_msgSend_1024( + obj, + sel, + xslt, + arguments, + error, + ); + } + + late final __objc_msgSend_1024Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_1024 = __objc_msgSend_1024Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_objectByApplyingXSLTString_arguments_error_1 = + _registerName1("objectByApplyingXSLTString:arguments:error:"); + ffi.Pointer _objc_msgSend_1025( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer xslt, + ffi.Pointer arguments, + ffi.Pointer> error, + ) { + return __objc_msgSend_1025( + obj, + sel, + xslt, + arguments, + error, + ); + } + + late final __objc_msgSend_1025Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_1025 = __objc_msgSend_1025Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_objectByApplyingXSLTAtURL_arguments_error_1 = + _registerName1("objectByApplyingXSLTAtURL:arguments:error:"); + ffi.Pointer _objc_msgSend_1026( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer xsltURL, + ffi.Pointer argument, + ffi.Pointer> error, + ) { + return __objc_msgSend_1026( + obj, + sel, + xsltURL, + argument, + error, + ); + } + + late final __objc_msgSend_1026Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_1026 = __objc_msgSend_1026Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_validateAndReturnError_1 = + _registerName1("validateAndReturnError:"); + late final _sel_rootDocument1 = _registerName1("rootDocument"); + ffi.Pointer _objc_msgSend_1027( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_1027( + obj, + sel, + ); + } + + late final __objc_msgSend_1027Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1027 = __objc_msgSend_1027Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_parent1 = _registerName1("parent"); + ffi.Pointer _objc_msgSend_1028( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_1028( + obj, + sel, + ); + } + + late final __objc_msgSend_1028Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1028 = __objc_msgSend_1028Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_childCount1 = _registerName1("childCount"); + late final _sel_children1 = _registerName1("children"); + late final _sel_childAtIndex_1 = _registerName1("childAtIndex:"); + ffi.Pointer _objc_msgSend_1029( + ffi.Pointer obj, + ffi.Pointer sel, + int index, + ) { + return __objc_msgSend_1029( + obj, + sel, + index, + ); + } + + late final __objc_msgSend_1029Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_1029 = __objc_msgSend_1029Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_previousSibling1 = _registerName1("previousSibling"); + late final _sel_nextSibling1 = _registerName1("nextSibling"); + late final _sel_previousNode1 = _registerName1("previousNode"); + late final _sel_nextNode1 = _registerName1("nextNode"); + late final _sel_detach1 = _registerName1("detach"); + late final _sel_XPath1 = _registerName1("XPath"); + late final _sel_localName1 = _registerName1("localName"); + late final _sel_prefix1 = _registerName1("prefix"); + late final _sel_URI1 = _registerName1("URI"); + late final _sel_setURI_1 = _registerName1("setURI:"); + late final _sel_XMLString1 = _registerName1("XMLString"); + late final _sel_XMLStringWithOptions_1 = + _registerName1("XMLStringWithOptions:"); + ffi.Pointer _objc_msgSend_1030( + ffi.Pointer obj, + ffi.Pointer sel, + int options, + ) { + return __objc_msgSend_1030( + obj, + sel, + options, + ); + } + + late final __objc_msgSend_1030Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Int32)>>('objc_msgSend'); + late final __objc_msgSend_1030 = __objc_msgSend_1030Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, int)>(); + + late final _sel_canonicalXMLStringPreservingComments_1 = + _registerName1("canonicalXMLStringPreservingComments:"); + ffi.Pointer _objc_msgSend_1031( + ffi.Pointer obj, + ffi.Pointer sel, + bool comments, + ) { + return __objc_msgSend_1031( + obj, + sel, + comments, + ); + } + + late final __objc_msgSend_1031Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_1031 = __objc_msgSend_1031Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, bool)>(); + + late final _sel_nodesForXPath_error_1 = + _registerName1("nodesForXPath:error:"); + late final _sel_objectsForXQuery_constants_error_1 = + _registerName1("objectsForXQuery:constants:error:"); + ffi.Pointer _objc_msgSend_1032( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer xquery, + ffi.Pointer constants, + ffi.Pointer> error, + ) { + return __objc_msgSend_1032( + obj, + sel, + xquery, + constants, + error, + ); + } + + late final __objc_msgSend_1032Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>>('objc_msgSend'); + late final __objc_msgSend_1032 = __objc_msgSend_1032Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer>)>(); + + late final _sel_objectsForXQuery_error_1 = + _registerName1("objectsForXQuery:error:"); + late final _sel_initWithName_URI_1 = _registerName1("initWithName:URI:"); + late final _sel_initWithName_stringValue_1 = + _registerName1("initWithName:stringValue:"); + late final _sel_initWithXMLString_error_1 = + _registerName1("initWithXMLString:error:"); + late final _sel_elementsForName_1 = _registerName1("elementsForName:"); + late final _sel_elementsForLocalName_URI_1 = + _registerName1("elementsForLocalName:URI:"); + late final _sel_addAttribute_1 = _registerName1("addAttribute:"); + late final _sel_removeAttributeForName_1 = + _registerName1("removeAttributeForName:"); + late final _sel_attributes1 = _registerName1("attributes"); + late final _sel_setAttributes_1 = _registerName1("setAttributes:"); + late final _sel_setAttributesWithDictionary_1 = + _registerName1("setAttributesWithDictionary:"); + late final _sel_attributeForName_1 = _registerName1("attributeForName:"); + late final _sel_attributeForLocalName_URI_1 = + _registerName1("attributeForLocalName:URI:"); + ffi.Pointer _objc_msgSend_1033( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer localName, + ffi.Pointer URI, + ) { + return __objc_msgSend_1033( + obj, + sel, + localName, + URI, + ); + } + + late final __objc_msgSend_1033Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1033 = __objc_msgSend_1033Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_addNamespace_1 = _registerName1("addNamespace:"); + late final _sel_removeNamespaceForPrefix_1 = + _registerName1("removeNamespaceForPrefix:"); + late final _sel_namespaces1 = _registerName1("namespaces"); + late final _sel_setNamespaces_1 = _registerName1("setNamespaces:"); + late final _sel_namespaceForPrefix_1 = _registerName1("namespaceForPrefix:"); + late final _sel_resolveNamespaceForName_1 = + _registerName1("resolveNamespaceForName:"); + late final _sel_resolvePrefixForNamespaceURI_1 = + _registerName1("resolvePrefixForNamespaceURI:"); + late final _sel_normalizeAdjacentTextNodesPreservingCDATA_1 = + _registerName1("normalizeAdjacentTextNodesPreservingCDATA:"); + late final _sel_setAttributesAsDictionary_1 = + _registerName1("setAttributesAsDictionary:"); + late final _class_PrivateSentrySDKOnly1 = _getClass1("PrivateSentrySDKOnly"); + late final _class_SentryEnvelope1 = _getClass1("SentryEnvelope"); + late final _class_SentryId1 = _getClass1("SentryId"); + late final _class_NSUUID1 = _getClass1("NSUUID"); + late final _sel_UUID1 = _registerName1("UUID"); + late final _sel_initWithUUIDString_1 = _registerName1("initWithUUIDString:"); + late final _sel_initWithUUIDBytes_1 = _registerName1("initWithUUIDBytes:"); + instancetype _objc_msgSend_1034( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer bytes, + ) { + return __objc_msgSend_1034( + obj, + sel, + bytes, + ); + } + + late final __objc_msgSend_1034Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1034 = __objc_msgSend_1034Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_getUUIDBytes_1 = _registerName1("getUUIDBytes:"); + void _objc_msgSend_1035( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer uuid, + ) { + return __objc_msgSend_1035( + obj, + sel, + uuid, + ); + } + + late final __objc_msgSend_1035Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1035 = __objc_msgSend_1035Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + int _objc_msgSend_1036( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer otherUUID, + ) { + return __objc_msgSend_1036( + obj, + sel, + otherUUID, + ); + } + + late final __objc_msgSend_1036Ptr = _lookup< + ffi.NativeFunction< + ffi.Int32 Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1036 = __objc_msgSend_1036Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_UUIDString1 = _registerName1("UUIDString"); + late final _sel_initWithUUID_1 = _registerName1("initWithUUID:"); + instancetype _objc_msgSend_1037( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer uuid, + ) { + return __objc_msgSend_1037( + obj, + sel, + uuid, + ); + } + + late final __objc_msgSend_1037Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1037 = __objc_msgSend_1037Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_sentryIdString1 = _registerName1("sentryIdString"); + late final _sel_empty1 = _registerName1("empty"); + ffi.Pointer _objc_msgSend_1038( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_1038( + obj, + sel, + ); + } + + late final __objc_msgSend_1038Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1038 = __objc_msgSend_1038Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _class_SentryEnvelopeItem1 = _getClass1("SentryEnvelopeItem"); + late final _class_SentryEvent1 = _getClass1("SentryEvent"); + late final _sel_initWithEvent_1 = _registerName1("initWithEvent:"); + instancetype _objc_msgSend_1039( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer event, + ) { + return __objc_msgSend_1039( + obj, + sel, + event, + ); + } + + late final __objc_msgSend_1039Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1039 = __objc_msgSend_1039Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _class_SentrySession1 = _getClass1("SentrySession"); + late final _sel_initWithSession_1 = _registerName1("initWithSession:"); + instancetype _objc_msgSend_1040( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer session, + ) { + return __objc_msgSend_1040( + obj, + sel, + session, + ); + } + + late final __objc_msgSend_1040Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1040 = __objc_msgSend_1040Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _class_SentryUserFeedback1 = _getClass1("SentryUserFeedback"); + late final _sel_initWithUserFeedback_1 = + _registerName1("initWithUserFeedback:"); + instancetype _objc_msgSend_1041( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer userFeedback, + ) { + return __objc_msgSend_1041( + obj, + sel, + userFeedback, + ); + } + + late final __objc_msgSend_1041Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1041 = __objc_msgSend_1041Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _class_SentryAttachment1 = _getClass1("SentryAttachment"); + late final _sel_initWithAttachment_maxAttachmentSize_1 = + _registerName1("initWithAttachment:maxAttachmentSize:"); + instancetype _objc_msgSend_1042( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer attachment, + int maxAttachmentSize, + ) { + return __objc_msgSend_1042( + obj, + sel, + attachment, + maxAttachmentSize, + ); + } + + late final __objc_msgSend_1042Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.UnsignedLong)>>('objc_msgSend'); + late final __objc_msgSend_1042 = __objc_msgSend_1042Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, int)>(); + + late final _class_SentryEnvelopeItemHeader1 = + _getClass1("SentryEnvelopeItemHeader"); + late final _sel_initWithHeader_data_1 = + _registerName1("initWithHeader:data:"); + instancetype _objc_msgSend_1043( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer header, + ffi.Pointer data, + ) { + return __objc_msgSend_1043( + obj, + sel, + header, + data, + ); + } + + late final __objc_msgSend_1043Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1043 = __objc_msgSend_1043Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_header1 = _registerName1("header"); + ffi.Pointer _objc_msgSend_1044( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_1044( + obj, + sel, + ); + } + + late final __objc_msgSend_1044Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1044 = __objc_msgSend_1044Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_initWithId_singleItem_1 = + _registerName1("initWithId:singleItem:"); + instancetype _objc_msgSend_1045( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer id, + ffi.Pointer item, + ) { + return __objc_msgSend_1045( + obj, + sel, + id, + item, + ); + } + + late final __objc_msgSend_1045Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1045 = __objc_msgSend_1045Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _class_SentryEnvelopeHeader1 = _getClass1("SentryEnvelopeHeader"); + late final _sel_initWithId_1 = _registerName1("initWithId:"); + instancetype _objc_msgSend_1046( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer eventId, + ) { + return __objc_msgSend_1046( + obj, + sel, + eventId, + ); + } + + late final __objc_msgSend_1046Ptr = _lookup< + ffi.NativeFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1046 = __objc_msgSend_1046Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _class_SentryTraceContext1 = _getClass1("SentryTraceContext"); + late final _sel_initWithId_traceContext_1 = + _registerName1("initWithId:traceContext:"); + instancetype _objc_msgSend_1047( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer eventId, + ffi.Pointer traceContext, + ) { + return __objc_msgSend_1047( + obj, + sel, + eventId, + traceContext, + ); + } + + late final __objc_msgSend_1047Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1047 = __objc_msgSend_1047Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _class_SentrySdkInfo1 = _getClass1("SentrySdkInfo"); + late final _sel_initWithId_sdkInfo_traceContext_1 = + _registerName1("initWithId:sdkInfo:traceContext:"); + instancetype _objc_msgSend_1048( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer eventId, + ffi.Pointer sdkInfo, + ffi.Pointer traceContext, + ) { + return __objc_msgSend_1048( + obj, + sel, + eventId, + sdkInfo, + traceContext, + ); + } + + late final __objc_msgSend_1048Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1048 = __objc_msgSend_1048Ptr.asFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_eventId1 = _registerName1("eventId"); + late final _sel_sdkInfo1 = _registerName1("sdkInfo"); + ffi.Pointer _objc_msgSend_1049( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_1049( + obj, + sel, + ); + } + + late final __objc_msgSend_1049Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1049 = __objc_msgSend_1049Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_traceContext1 = _registerName1("traceContext"); + ffi.Pointer _objc_msgSend_1050( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_1050( + obj, + sel, + ); + } + + late final __objc_msgSend_1050Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1050 = __objc_msgSend_1050Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_sentAt1 = _registerName1("sentAt"); + late final _sel_setSentAt_1 = _registerName1("setSentAt:"); + late final _sel_initWithHeader_singleItem_1 = + _registerName1("initWithHeader:singleItem:"); + instancetype _objc_msgSend_1051( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer header, + ffi.Pointer item, + ) { + return __objc_msgSend_1051( + obj, + sel, + header, + item, + ); + } + + late final __objc_msgSend_1051Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1051 = __objc_msgSend_1051Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_initWithId_items_1 = _registerName1("initWithId:items:"); + instancetype _objc_msgSend_1052( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer id, + ffi.Pointer items, + ) { + return __objc_msgSend_1052( + obj, + sel, + id, + items, + ); + } + + late final __objc_msgSend_1052Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1052 = __objc_msgSend_1052Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_initWithSessions_1 = _registerName1("initWithSessions:"); + late final _sel_initWithHeader_items_1 = + _registerName1("initWithHeader:items:"); + instancetype _objc_msgSend_1053( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer header, + ffi.Pointer items, + ) { + return __objc_msgSend_1053( + obj, + sel, + header, + items, + ); + } + + late final __objc_msgSend_1053Ptr = _lookup< + ffi.NativeFunction< + instancetype Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1053 = __objc_msgSend_1053Ptr.asFunction< + instancetype Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + ffi.Pointer _objc_msgSend_1054( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_1054( + obj, + sel, + ); + } + + late final __objc_msgSend_1054Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1054 = __objc_msgSend_1054Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_items1 = _registerName1("items"); + late final _sel_storeEnvelope_1 = _registerName1("storeEnvelope:"); + void _objc_msgSend_1055( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer envelope, + ) { + return __objc_msgSend_1055( + obj, + sel, + envelope, + ); + } + + late final __objc_msgSend_1055Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1055 = __objc_msgSend_1055Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_captureEnvelope_1 = _registerName1("captureEnvelope:"); + late final _sel_envelopeWithData_1 = _registerName1("envelopeWithData:"); + ffi.Pointer _objc_msgSend_1056( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer data, + ) { + return __objc_msgSend_1056( + obj, + sel, + data, + ); + } + + late final __objc_msgSend_1056Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1056 = __objc_msgSend_1056Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_getDebugImages1 = _registerName1("getDebugImages"); + late final _sel_getDebugImagesCrashed_1 = + _registerName1("getDebugImagesCrashed:"); + ffi.Pointer _objc_msgSend_1057( + ffi.Pointer obj, + ffi.Pointer sel, + bool isCrash, + ) { + return __objc_msgSend_1057( + obj, + sel, + isCrash, + ); + } + + late final __objc_msgSend_1057Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Bool)>>('objc_msgSend'); + late final __objc_msgSend_1057 = __objc_msgSend_1057Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer, bool)>(); + + late final _sel_setSdkName_andVersionString_1 = + _registerName1("setSdkName:andVersionString:"); + late final _sel_setSdkName_1 = _registerName1("setSdkName:"); + late final _sel_getSdkName1 = _registerName1("getSdkName"); + late final _sel_getSdkVersionString1 = _registerName1("getSdkVersionString"); + late final _sel_getExtraContext1 = _registerName1("getExtraContext"); + late final _sel_startProfilerForTrace_1 = + _registerName1("startProfilerForTrace:"); + int _objc_msgSend_1058( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer traceId, + ) { + return __objc_msgSend_1058( + obj, + sel, + traceId, + ); + } + + late final __objc_msgSend_1058Ptr = _lookup< + ffi.NativeFunction< + ffi.Uint64 Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1058 = __objc_msgSend_1058Ptr.asFunction< + int Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _sel_collectProfileBetween_and_forTrace_1 = + _registerName1("collectProfileBetween:and:forTrace:"); + ffi.Pointer _objc_msgSend_1059( + ffi.Pointer obj, + ffi.Pointer sel, + int startSystemTime, + int endSystemTime, + ffi.Pointer traceId, + ) { + return __objc_msgSend_1059( + obj, + sel, + startSystemTime, + endSystemTime, + traceId, + ); + } + + late final __objc_msgSend_1059Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer, + ffi.Uint64, + ffi.Uint64, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1059 = __objc_msgSend_1059Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, int, int, ffi.Pointer)>(); + + late final _sel_discardProfilerForTrace_1 = + _registerName1("discardProfilerForTrace:"); + void _objc_msgSend_1060( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer traceId, + ) { + return __objc_msgSend_1060( + obj, + sel, + traceId, + ); + } + + late final __objc_msgSend_1060Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1060 = __objc_msgSend_1060Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer)>(); + + late final _class_SentryAppStartMeasurement1 = + _getClass1("SentryAppStartMeasurement"); + late final _sel_onAppStartMeasurementAvailable1 = + _registerName1("onAppStartMeasurementAvailable"); + ffi.Pointer<_ObjCBlock> _objc_msgSend_1061( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_1061( + obj, + sel, + ); + } + + late final __objc_msgSend_1061Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer<_ObjCBlock> Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1061 = __objc_msgSend_1061Ptr.asFunction< + ffi.Pointer<_ObjCBlock> Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_setOnAppStartMeasurementAvailable_1 = + _registerName1("setOnAppStartMeasurementAvailable:"); + void _objc_msgSend_1062( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer<_ObjCBlock> value, + ) { + return __objc_msgSend_1062( + obj, + sel, + value, + ); + } + + late final __objc_msgSend_1062Ptr = _lookup< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>>('objc_msgSend'); + late final __objc_msgSend_1062 = __objc_msgSend_1062Ptr.asFunction< + void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer<_ObjCBlock>)>(); + + late final _sel_appStartMeasurement1 = _registerName1("appStartMeasurement"); + ffi.Pointer _objc_msgSend_1063( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_1063( + obj, + sel, + ); + } + + late final __objc_msgSend_1063Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1063 = __objc_msgSend_1063Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_installationID1 = _registerName1("installationID"); + late final _class_SentryOptions1 = _getClass1("SentryOptions"); + ffi.Pointer _objc_msgSend_1064( + ffi.Pointer obj, + ffi.Pointer sel, + ) { + return __objc_msgSend_1064( + obj, + sel, + ); + } + + late final __objc_msgSend_1064Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1064 = __objc_msgSend_1064Ptr.asFunction< + ffi.Pointer Function( + ffi.Pointer, ffi.Pointer)>(); + + late final _sel_appStartMeasurementHybridSDKMode1 = + _registerName1("appStartMeasurementHybridSDKMode"); + late final _sel_setAppStartMeasurementHybridSDKMode_1 = + _registerName1("setAppStartMeasurementHybridSDKMode:"); + late final _class_SentryUser1 = _getClass1("SentryUser"); + late final _sel_userWithDictionary_1 = _registerName1("userWithDictionary:"); + ffi.Pointer _objc_msgSend_1065( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer dictionary, + ) { + return __objc_msgSend_1065( + obj, + sel, + dictionary, + ); + } + + late final __objc_msgSend_1065Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1065 = __objc_msgSend_1065Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); + + late final _class_SentryBreadcrumb1 = _getClass1("SentryBreadcrumb"); + late final _sel_breadcrumbWithDictionary_1 = + _registerName1("breadcrumbWithDictionary:"); + ffi.Pointer _objc_msgSend_1066( + ffi.Pointer obj, + ffi.Pointer sel, + ffi.Pointer dictionary, + ) { + return __objc_msgSend_1066( + obj, + sel, + dictionary, + ); + } + + late final __objc_msgSend_1066Ptr = _lookup< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>>('objc_msgSend'); + late final __objc_msgSend_1066 = __objc_msgSend_1066Ptr.asFunction< + ffi.Pointer Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>(); +} + +class _ObjCWrapper implements ffi.Finalizable { + final ffi.Pointer _id; + final SentryCocoa _lib; + bool _pendingRelease; + + _ObjCWrapper._(this._id, this._lib, + {bool retain = false, bool release = false}) + : _pendingRelease = release { + if (retain) { + _lib._objc_retain(_id.cast()); + } + if (release) { + _lib._objc_releaseFinalizer2.attach(this, _id.cast(), detach: this); + } + } + + /// Releases the reference to the underlying ObjC object held by this wrapper. + /// Throws a StateError if this wrapper doesn't currently hold a reference. + void release() { + if (_pendingRelease) { + _pendingRelease = false; + _lib._objc_release(_id.cast()); + _lib._objc_releaseFinalizer2.detach(this); + } else { + throw StateError( + 'Released an ObjC object that was unowned or already released.'); + } + } + + @override + bool operator ==(Object other) { + return other is _ObjCWrapper && _id == other._id; + } + + @override + int get hashCode => _id.hashCode; + + /// Return a pointer to this object. + ffi.Pointer get pointer => _id; +} + +class NSObject extends _ObjCWrapper { + NSObject._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSObject] that points to the same underlying object as [other]. + static NSObject castFrom(T other) { + return NSObject._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSObject] that wraps the given raw object pointer. + static NSObject castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSObject._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSObject]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSObject1); + } + + static void load(SentryCocoa _lib) { + _lib._objc_msgSend_1(_lib._class_NSObject1, _lib._sel_load1); + } + + static void initialize(SentryCocoa _lib) { + _lib._objc_msgSend_1(_lib._class_NSObject1, _lib._sel_initialize1); + } + + NSObject init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSObject1, _lib._sel_new1); + return NSObject._(_ret, _lib, retain: false, release: true); + } + + static NSObject allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSObject1, _lib._sel_allocWithZone_1, zone); + return NSObject._(_ret, _lib, retain: false, release: true); + } + + static NSObject alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSObject1, _lib._sel_alloc1); + return NSObject._(_ret, _lib, retain: false, release: true); + } + + void dealloc() { + _lib._objc_msgSend_1(_id, _lib._sel_dealloc1); + } + + void finalize() { + _lib._objc_msgSend_1(_id, _lib._sel_finalize1); + } + + NSObject copy() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_copy1); + return NSObject._(_ret, _lib, retain: false, release: true); + } + + NSObject mutableCopy() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_mutableCopy1); + return NSObject._(_ret, _lib, retain: false, release: true); + } + + static NSObject copyWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSObject1, _lib._sel_copyWithZone_1, zone); + return NSObject._(_ret, _lib, retain: false, release: true); + } + + static NSObject mutableCopyWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSObject1, _lib._sel_mutableCopyWithZone_1, zone); + return NSObject._(_ret, _lib, retain: false, release: true); + } + + static bool instancesRespondToSelector_( + SentryCocoa _lib, ffi.Pointer aSelector) { + return _lib._objc_msgSend_4(_lib._class_NSObject1, + _lib._sel_instancesRespondToSelector_1, aSelector); + } + + static bool conformsToProtocol_(SentryCocoa _lib, Protocol? protocol) { + return _lib._objc_msgSend_5(_lib._class_NSObject1, + _lib._sel_conformsToProtocol_1, protocol?._id ?? ffi.nullptr); + } + + ffi.Pointer> methodForSelector_( + ffi.Pointer aSelector) { + return _lib._objc_msgSend_6(_id, _lib._sel_methodForSelector_1, aSelector); + } + + static ffi.Pointer> + instanceMethodForSelector_( + SentryCocoa _lib, ffi.Pointer aSelector) { + return _lib._objc_msgSend_6(_lib._class_NSObject1, + _lib._sel_instanceMethodForSelector_1, aSelector); + } + + void doesNotRecognizeSelector_(ffi.Pointer aSelector) { + _lib._objc_msgSend_7(_id, _lib._sel_doesNotRecognizeSelector_1, aSelector); + } + + NSObject forwardingTargetForSelector_(ffi.Pointer aSelector) { + final _ret = _lib._objc_msgSend_8( + _id, _lib._sel_forwardingTargetForSelector_1, aSelector); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void forwardInvocation_(NSInvocation? anInvocation) { + _lib._objc_msgSend_392( + _id, _lib._sel_forwardInvocation_1, anInvocation?._id ?? ffi.nullptr); + } + + NSMethodSignature methodSignatureForSelector_( + ffi.Pointer aSelector) { + final _ret = _lib._objc_msgSend_393( + _id, _lib._sel_methodSignatureForSelector_1, aSelector); + return NSMethodSignature._(_ret, _lib, retain: true, release: true); + } + + static NSMethodSignature instanceMethodSignatureForSelector_( + SentryCocoa _lib, ffi.Pointer aSelector) { + final _ret = _lib._objc_msgSend_393(_lib._class_NSObject1, + _lib._sel_instanceMethodSignatureForSelector_1, aSelector); + return NSMethodSignature._(_ret, _lib, retain: true, release: true); + } + + bool allowsWeakReference() { + return _lib._objc_msgSend_12(_id, _lib._sel_allowsWeakReference1); + } + + bool retainWeakReference() { + return _lib._objc_msgSend_12(_id, _lib._sel_retainWeakReference1); + } + + static bool isSubclassOfClass_(SentryCocoa _lib, NSObject aClass) { + return _lib._objc_msgSend_0( + _lib._class_NSObject1, _lib._sel_isSubclassOfClass_1, aClass._id); + } + + static bool resolveClassMethod_(SentryCocoa _lib, ffi.Pointer sel) { + return _lib._objc_msgSend_4( + _lib._class_NSObject1, _lib._sel_resolveClassMethod_1, sel); + } + + static bool resolveInstanceMethod_( + SentryCocoa _lib, ffi.Pointer sel) { + return _lib._objc_msgSend_4( + _lib._class_NSObject1, _lib._sel_resolveInstanceMethod_1, sel); + } + + static int hash(SentryCocoa _lib) { + return _lib._objc_msgSend_10(_lib._class_NSObject1, _lib._sel_hash1); + } + + static NSObject superclass(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSObject1, _lib._sel_superclass1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject class1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSObject1, _lib._sel_class1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSString description(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_20(_lib._class_NSObject1, _lib._sel_description1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString debugDescription(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_20( + _lib._class_NSObject1, _lib._sel_debugDescription1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static int version(SentryCocoa _lib) { + return _lib._objc_msgSend_78(_lib._class_NSObject1, _lib._sel_version1); + } + + static void setVersion_(SentryCocoa _lib, int aVersion) { + _lib._objc_msgSend_394( + _lib._class_NSObject1, _lib._sel_setVersion_1, aVersion); + } + + NSObject get classForCoder { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_classForCoder1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject replacementObjectForCoder_(NSCoder? coder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_replacementObjectForCoder_1, coder?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject awakeAfterUsingCoder_(NSCoder? coder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_awakeAfterUsingCoder_1, coder?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: false, release: true); + } + + static void poseAsClass_(SentryCocoa _lib, NSObject aClass) { + _lib._objc_msgSend_15( + _lib._class_NSObject1, _lib._sel_poseAsClass_1, aClass._id); + } + + NSObject get autoContentAccessingProxy { + final _ret = + _lib._objc_msgSend_2(_id, _lib._sel_autoContentAccessingProxy1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void + attemptRecoveryFromError_optionIndex_delegate_didRecoverSelector_contextInfo_( + NSError? error, + int recoveryOptionIndex, + NSObject delegate, + ffi.Pointer didRecoverSelector, + ffi.Pointer contextInfo) { + _lib._objc_msgSend_395( + _id, + _lib._sel_attemptRecoveryFromError_optionIndex_delegate_didRecoverSelector_contextInfo_1, + error?._id ?? ffi.nullptr, + recoveryOptionIndex, + delegate._id, + didRecoverSelector, + contextInfo); + } + + bool attemptRecoveryFromError_optionIndex_( + NSError? error, int recoveryOptionIndex) { + return _lib._objc_msgSend_396( + _id, + _lib._sel_attemptRecoveryFromError_optionIndex_1, + error?._id ?? ffi.nullptr, + recoveryOptionIndex); + } + + void performSelector_withObject_afterDelay_inModes_( + ffi.Pointer aSelector, + NSObject anArgument, + double delay, + NSArray? modes) { + _lib._objc_msgSend_397( + _id, + _lib._sel_performSelector_withObject_afterDelay_inModes_1, + aSelector, + anArgument._id, + delay, + modes?._id ?? ffi.nullptr); + } + + void performSelector_withObject_afterDelay_( + ffi.Pointer aSelector, NSObject anArgument, double delay) { + _lib._objc_msgSend_398( + _id, + _lib._sel_performSelector_withObject_afterDelay_1, + aSelector, + anArgument._id, + delay); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSObject1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSObject1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + void URL_resourceDataDidBecomeAvailable_(NSURL? sender, NSData? newBytes) { + _lib._objc_msgSend_399(_id, _lib._sel_URL_resourceDataDidBecomeAvailable_1, + sender?._id ?? ffi.nullptr, newBytes?._id ?? ffi.nullptr); + } + + void URLResourceDidFinishLoading_(NSURL? sender) { + _lib._objc_msgSend_400(_id, _lib._sel_URLResourceDidFinishLoading_1, + sender?._id ?? ffi.nullptr); + } + + void URLResourceDidCancelLoading_(NSURL? sender) { + _lib._objc_msgSend_400(_id, _lib._sel_URLResourceDidCancelLoading_1, + sender?._id ?? ffi.nullptr); + } + + void URL_resourceDidFailLoadingWithReason_(NSURL? sender, NSString? reason) { + _lib._objc_msgSend_401( + _id, + _lib._sel_URL_resourceDidFailLoadingWithReason_1, + sender?._id ?? ffi.nullptr, + reason?._id ?? ffi.nullptr); + } + + bool fileManager_shouldProceedAfterError_( + NSFileManager? fm, NSDictionary? errorInfo) { + return _lib._objc_msgSend_436( + _id, + _lib._sel_fileManager_shouldProceedAfterError_1, + fm?._id ?? ffi.nullptr, + errorInfo?._id ?? ffi.nullptr); + } + + void fileManager_willProcessPath_(NSFileManager? fm, NSString? path) { + _lib._objc_msgSend_437(_id, _lib._sel_fileManager_willProcessPath_1, + fm?._id ?? ffi.nullptr, path?._id ?? ffi.nullptr); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSObject1, _lib._sel_accessInstanceVariablesDirectly1); + } + + NSObject valueForKey_(NSString? key) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_valueForKey_1, key?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void setValue_forKey_(NSObject value, NSString? key) { + _lib._objc_msgSend_126( + _id, _lib._sel_setValue_forKey_1, value._id, key?._id ?? ffi.nullptr); + } + + bool validateValue_forKey_error_(ffi.Pointer> ioValue, + NSString? inKey, ffi.Pointer> outError) { + return _lib._objc_msgSend_226(_id, _lib._sel_validateValue_forKey_error_1, + ioValue, inKey?._id ?? ffi.nullptr, outError); + } + + NSMutableArray mutableArrayValueForKey_(NSString? key) { + final _ret = _lib._objc_msgSend_454( + _id, _lib._sel_mutableArrayValueForKey_1, key?._id ?? ffi.nullptr); + return NSMutableArray._(_ret, _lib, retain: true, release: true); + } + + NSMutableOrderedSet mutableOrderedSetValueForKey_(NSString? key) { + final _ret = _lib._objc_msgSend_473( + _id, _lib._sel_mutableOrderedSetValueForKey_1, key?._id ?? ffi.nullptr); + return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true); + } + + NSMutableSet mutableSetValueForKey_(NSString? key) { + final _ret = _lib._objc_msgSend_474( + _id, _lib._sel_mutableSetValueForKey_1, key?._id ?? ffi.nullptr); + return NSMutableSet._(_ret, _lib, retain: true, release: true); + } + + NSObject valueForKeyPath_(NSString? keyPath) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_valueForKeyPath_1, keyPath?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void setValue_forKeyPath_(NSObject value, NSString? keyPath) { + _lib._objc_msgSend_126(_id, _lib._sel_setValue_forKeyPath_1, value._id, + keyPath?._id ?? ffi.nullptr); + } + + bool validateValue_forKeyPath_error_( + ffi.Pointer> ioValue, + NSString? inKeyPath, + ffi.Pointer> outError) { + return _lib._objc_msgSend_226( + _id, + _lib._sel_validateValue_forKeyPath_error_1, + ioValue, + inKeyPath?._id ?? ffi.nullptr, + outError); + } + + NSMutableArray mutableArrayValueForKeyPath_(NSString? keyPath) { + final _ret = _lib._objc_msgSend_454(_id, + _lib._sel_mutableArrayValueForKeyPath_1, keyPath?._id ?? ffi.nullptr); + return NSMutableArray._(_ret, _lib, retain: true, release: true); + } + + NSMutableOrderedSet mutableOrderedSetValueForKeyPath_(NSString? keyPath) { + final _ret = _lib._objc_msgSend_473( + _id, + _lib._sel_mutableOrderedSetValueForKeyPath_1, + keyPath?._id ?? ffi.nullptr); + return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true); + } + + NSMutableSet mutableSetValueForKeyPath_(NSString? keyPath) { + final _ret = _lib._objc_msgSend_474(_id, + _lib._sel_mutableSetValueForKeyPath_1, keyPath?._id ?? ffi.nullptr); + return NSMutableSet._(_ret, _lib, retain: true, release: true); + } + + NSObject valueForUndefinedKey_(NSString? key) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_valueForUndefinedKey_1, key?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void setValue_forUndefinedKey_(NSObject value, NSString? key) { + _lib._objc_msgSend_126(_id, _lib._sel_setValue_forUndefinedKey_1, value._id, + key?._id ?? ffi.nullptr); + } + + void setNilValueForKey_(NSString? key) { + _lib._objc_msgSend_192( + _id, _lib._sel_setNilValueForKey_1, key?._id ?? ffi.nullptr); + } + + NSDictionary dictionaryWithValuesForKeys_(NSArray? keys) { + final _ret = _lib._objc_msgSend_475( + _id, _lib._sel_dictionaryWithValuesForKeys_1, keys?._id ?? ffi.nullptr); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + void setValuesForKeysWithDictionary_(NSDictionary? keyedValues) { + _lib._objc_msgSend_476(_id, _lib._sel_setValuesForKeysWithDictionary_1, + keyedValues?._id ?? ffi.nullptr); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSObject1, _lib._sel_useStoredAccessor1); + } + + NSObject storedValueForKey_(NSString? key) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_storedValueForKey_1, key?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void takeStoredValue_forKey_(NSObject value, NSString? key) { + _lib._objc_msgSend_126(_id, _lib._sel_takeStoredValue_forKey_1, value._id, + key?._id ?? ffi.nullptr); + } + + void takeValue_forKey_(NSObject value, NSString? key) { + _lib._objc_msgSend_126( + _id, _lib._sel_takeValue_forKey_1, value._id, key?._id ?? ffi.nullptr); + } + + void takeValue_forKeyPath_(NSObject value, NSString? keyPath) { + _lib._objc_msgSend_126(_id, _lib._sel_takeValue_forKeyPath_1, value._id, + keyPath?._id ?? ffi.nullptr); + } + + NSObject handleQueryWithUnboundKey_(NSString? key) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_handleQueryWithUnboundKey_1, key?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void handleTakeValue_forUnboundKey_(NSObject value, NSString? key) { + _lib._objc_msgSend_126(_id, _lib._sel_handleTakeValue_forUnboundKey_1, + value._id, key?._id ?? ffi.nullptr); + } + + void unableToSetNilForKey_(NSString? key) { + _lib._objc_msgSend_192( + _id, _lib._sel_unableToSetNilForKey_1, key?._id ?? ffi.nullptr); + } + + NSDictionary valuesForKeys_(NSArray? keys) { + final _ret = _lib._objc_msgSend_475( + _id, _lib._sel_valuesForKeys_1, keys?._id ?? ffi.nullptr); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + void takeValuesFromDictionary_(NSDictionary? properties) { + _lib._objc_msgSend_476(_id, _lib._sel_takeValuesFromDictionary_1, + properties?._id ?? ffi.nullptr); + } + + void observeValueForKeyPath_ofObject_change_context_(NSString? keyPath, + NSObject object, NSDictionary? change, ffi.Pointer context) { + _lib._objc_msgSend_477( + _id, + _lib._sel_observeValueForKeyPath_ofObject_change_context_1, + keyPath?._id ?? ffi.nullptr, + object._id, + change?._id ?? ffi.nullptr, + context); + } + + void addObserver_forKeyPath_options_context_(NSObject? observer, + NSString? keyPath, int options, ffi.Pointer context) { + _lib._objc_msgSend_130( + _id, + _lib._sel_addObserver_forKeyPath_options_context_1, + observer?._id ?? ffi.nullptr, + keyPath?._id ?? ffi.nullptr, + options, + context); + } + + void removeObserver_forKeyPath_context_( + NSObject? observer, NSString? keyPath, ffi.Pointer context) { + _lib._objc_msgSend_131(_id, _lib._sel_removeObserver_forKeyPath_context_1, + observer?._id ?? ffi.nullptr, keyPath?._id ?? ffi.nullptr, context); + } + + void removeObserver_forKeyPath_(NSObject? observer, NSString? keyPath) { + _lib._objc_msgSend_132(_id, _lib._sel_removeObserver_forKeyPath_1, + observer?._id ?? ffi.nullptr, keyPath?._id ?? ffi.nullptr); + } + + void willChangeValueForKey_(NSString? key) { + _lib._objc_msgSend_192( + _id, _lib._sel_willChangeValueForKey_1, key?._id ?? ffi.nullptr); + } + + void didChangeValueForKey_(NSString? key) { + _lib._objc_msgSend_192( + _id, _lib._sel_didChangeValueForKey_1, key?._id ?? ffi.nullptr); + } + + void willChange_valuesAtIndexes_forKey_( + int changeKind, NSIndexSet? indexes, NSString? key) { + _lib._objc_msgSend_478(_id, _lib._sel_willChange_valuesAtIndexes_forKey_1, + changeKind, indexes?._id ?? ffi.nullptr, key?._id ?? ffi.nullptr); + } + + void didChange_valuesAtIndexes_forKey_( + int changeKind, NSIndexSet? indexes, NSString? key) { + _lib._objc_msgSend_478(_id, _lib._sel_didChange_valuesAtIndexes_forKey_1, + changeKind, indexes?._id ?? ffi.nullptr, key?._id ?? ffi.nullptr); + } + + void willChangeValueForKey_withSetMutation_usingObjects_( + NSString? key, int mutationKind, NSSet? objects) { + _lib._objc_msgSend_479( + _id, + _lib._sel_willChangeValueForKey_withSetMutation_usingObjects_1, + key?._id ?? ffi.nullptr, + mutationKind, + objects?._id ?? ffi.nullptr); + } + + void didChangeValueForKey_withSetMutation_usingObjects_( + NSString? key, int mutationKind, NSSet? objects) { + _lib._objc_msgSend_479( + _id, + _lib._sel_didChangeValueForKey_withSetMutation_usingObjects_1, + key?._id ?? ffi.nullptr, + mutationKind, + objects?._id ?? ffi.nullptr); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSObject1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSObject1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + ffi.Pointer get observationInfo { + return _lib._objc_msgSend_19(_id, _lib._sel_observationInfo1); + } + + set observationInfo(ffi.Pointer value) { + return _lib._objc_msgSend_480(_id, _lib._sel_setObservationInfo_1, value); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSObject1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + NSObject get classForKeyedArchiver { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_classForKeyedArchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject replacementObjectForKeyedArchiver_(NSKeyedArchiver? archiver) { + final _ret = _lib._objc_msgSend_493( + _id, + _lib._sel_replacementObjectForKeyedArchiver_1, + archiver?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSObject1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSObject1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void performSelectorOnMainThread_withObject_waitUntilDone_modes_( + ffi.Pointer aSelector, NSObject arg, bool wait, NSArray? array) { + _lib._objc_msgSend_494( + _id, + _lib._sel_performSelectorOnMainThread_withObject_waitUntilDone_modes_1, + aSelector, + arg._id, + wait, + array?._id ?? ffi.nullptr); + } + + void performSelectorOnMainThread_withObject_waitUntilDone_( + ffi.Pointer aSelector, NSObject arg, bool wait) { + _lib._objc_msgSend_495( + _id, + _lib._sel_performSelectorOnMainThread_withObject_waitUntilDone_1, + aSelector, + arg._id, + wait); + } + + void performSelector_onThread_withObject_waitUntilDone_modes_( + ffi.Pointer aSelector, + NSThread? thr, + NSObject arg, + bool wait, + NSArray? array) { + _lib._objc_msgSend_512( + _id, + _lib._sel_performSelector_onThread_withObject_waitUntilDone_modes_1, + aSelector, + thr?._id ?? ffi.nullptr, + arg._id, + wait, + array?._id ?? ffi.nullptr); + } + + void performSelector_onThread_withObject_waitUntilDone_( + ffi.Pointer aSelector, NSThread? thr, NSObject arg, bool wait) { + _lib._objc_msgSend_513( + _id, + _lib._sel_performSelector_onThread_withObject_waitUntilDone_1, + aSelector, + thr?._id ?? ffi.nullptr, + arg._id, + wait); + } + + void performSelectorInBackground_withObject_( + ffi.Pointer aSelector, NSObject arg) { + _lib._objc_msgSend_84(_id, + _lib._sel_performSelectorInBackground_withObject_1, aSelector, arg._id); + } + + NSObject get classForArchiver { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_classForArchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject replacementObjectForArchiver_(NSArchiver? archiver) { + final _ret = _lib._objc_msgSend_516(_id, + _lib._sel_replacementObjectForArchiver_1, archiver?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject get classForPortCoder { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_classForPortCoder1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject replacementObjectForPortCoder_(NSPortCoder? coder) { + final _ret = _lib._objc_msgSend_554(_id, + _lib._sel_replacementObjectForPortCoder_1, coder?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSClassDescription? get classDescription { + final _ret = _lib._objc_msgSend_557(_id, _lib._sel_classDescription1); + return _ret.address == 0 + ? null + : NSClassDescription._(_ret, _lib, retain: true, release: true); + } + + NSArray? get attributeKeys { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_attributeKeys1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get toOneRelationshipKeys { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_toOneRelationshipKeys1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get toManyRelationshipKeys { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_toManyRelationshipKeys1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSString inverseForRelationshipKey_(NSString? relationshipKey) { + final _ret = _lib._objc_msgSend_64( + _id, + _lib._sel_inverseForRelationshipKey_1, + relationshipKey?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSObject scriptingValueForSpecifier_( + NSScriptObjectSpecifier? objectSpecifier) { + final _ret = _lib._objc_msgSend_601( + _id, + _lib._sel_scriptingValueForSpecifier_1, + objectSpecifier?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSDictionary? get scriptingProperties { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_scriptingProperties1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + set scriptingProperties(NSDictionary? value) { + return _lib._objc_msgSend_171( + _id, _lib._sel_setScriptingProperties_1, value?._id ?? ffi.nullptr); + } + + NSObject copyScriptingValue_forKey_withProperties_( + NSObject value, NSString? key, NSDictionary? properties) { + final _ret = _lib._objc_msgSend_602( + _id, + _lib._sel_copyScriptingValue_forKey_withProperties_1, + value._id, + key?._id ?? ffi.nullptr, + properties?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: false, release: true); + } + + NSObject + newScriptingObjectOfClass_forValueForKey_withContentsValue_properties_( + NSObject objectClass, + NSString? key, + NSObject contentsValue, + NSDictionary? properties) { + final _ret = _lib._objc_msgSend_603( + _id, + _lib._sel_newScriptingObjectOfClass_forValueForKey_withContentsValue_properties_1, + objectClass._id, + key?._id ?? ffi.nullptr, + contentsValue._id, + properties?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: false, release: true); + } + + int get classCode { + return _lib._objc_msgSend_197(_id, _lib._sel_classCode1); + } + + NSString? get className { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_className1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSObject valueAtIndex_inPropertyWithKey_(int index, NSString? key) { + final _ret = _lib._objc_msgSend_604( + _id, + _lib._sel_valueAtIndex_inPropertyWithKey_1, + index, + key?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject valueWithName_inPropertyWithKey_(NSString? name, NSString? key) { + final _ret = _lib._objc_msgSend_165( + _id, + _lib._sel_valueWithName_inPropertyWithKey_1, + name?._id ?? ffi.nullptr, + key?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject valueWithUniqueID_inPropertyWithKey_( + NSObject uniqueID, NSString? key) { + final _ret = _lib._objc_msgSend_287( + _id, + _lib._sel_valueWithUniqueID_inPropertyWithKey_1, + uniqueID._id, + key?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void insertValue_atIndex_inPropertyWithKey_( + NSObject value, int index, NSString? key) { + _lib._objc_msgSend_605( + _id, + _lib._sel_insertValue_atIndex_inPropertyWithKey_1, + value._id, + index, + key?._id ?? ffi.nullptr); + } + + void removeValueAtIndex_fromPropertyWithKey_(int index, NSString? key) { + _lib._objc_msgSend_606( + _id, + _lib._sel_removeValueAtIndex_fromPropertyWithKey_1, + index, + key?._id ?? ffi.nullptr); + } + + void replaceValueAtIndex_inPropertyWithKey_withValue_( + int index, NSString? key, NSObject value) { + _lib._objc_msgSend_607( + _id, + _lib._sel_replaceValueAtIndex_inPropertyWithKey_withValue_1, + index, + key?._id ?? ffi.nullptr, + value._id); + } + + void insertValue_inPropertyWithKey_(NSObject value, NSString? key) { + _lib._objc_msgSend_126(_id, _lib._sel_insertValue_inPropertyWithKey_1, + value._id, key?._id ?? ffi.nullptr); + } + + NSObject coerceValue_forKey_(NSObject value, NSString? key) { + final _ret = _lib._objc_msgSend_287(_id, _lib._sel_coerceValue_forKey_1, + value._id, key?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSScriptObjectSpecifier? get objectSpecifier { + final _ret = _lib._objc_msgSend_588(_id, _lib._sel_objectSpecifier1); + return _ret.address == 0 + ? null + : NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true); + } + + NSArray indicesOfObjectsByEvaluatingObjectSpecifier_( + NSScriptObjectSpecifier? specifier) { + final _ret = _lib._objc_msgSend_608( + _id, + _lib._sel_indicesOfObjectsByEvaluatingObjectSpecifier_1, + specifier?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + bool isEqualTo_(NSObject object) { + return _lib._objc_msgSend_0(_id, _lib._sel_isEqualTo_1, object._id); + } + + bool isLessThanOrEqualTo_(NSObject object) { + return _lib._objc_msgSend_0( + _id, _lib._sel_isLessThanOrEqualTo_1, object._id); + } + + bool isLessThan_(NSObject object) { + return _lib._objc_msgSend_0(_id, _lib._sel_isLessThan_1, object._id); + } + + bool isGreaterThanOrEqualTo_(NSObject object) { + return _lib._objc_msgSend_0( + _id, _lib._sel_isGreaterThanOrEqualTo_1, object._id); + } + + bool isGreaterThan_(NSObject object) { + return _lib._objc_msgSend_0(_id, _lib._sel_isGreaterThan_1, object._id); + } + + bool isNotEqualTo_(NSObject object) { + return _lib._objc_msgSend_0(_id, _lib._sel_isNotEqualTo_1, object._id); + } + + bool doesContain_(NSObject object) { + return _lib._objc_msgSend_0(_id, _lib._sel_doesContain_1, object._id); + } + + bool isLike_(NSString? object) { + return _lib._objc_msgSend_59( + _id, _lib._sel_isLike_1, object?._id ?? ffi.nullptr); + } + + bool isCaseInsensitiveLike_(NSString? object) { + return _lib._objc_msgSend_59( + _id, _lib._sel_isCaseInsensitiveLike_1, object?._id ?? ffi.nullptr); + } + + bool scriptingIsEqualTo_(NSObject object) { + return _lib._objc_msgSend_0( + _id, _lib._sel_scriptingIsEqualTo_1, object._id); + } + + bool scriptingIsLessThanOrEqualTo_(NSObject object) { + return _lib._objc_msgSend_0( + _id, _lib._sel_scriptingIsLessThanOrEqualTo_1, object._id); + } + + bool scriptingIsLessThan_(NSObject object) { + return _lib._objc_msgSend_0( + _id, _lib._sel_scriptingIsLessThan_1, object._id); + } + + bool scriptingIsGreaterThanOrEqualTo_(NSObject object) { + return _lib._objc_msgSend_0( + _id, _lib._sel_scriptingIsGreaterThanOrEqualTo_1, object._id); + } + + bool scriptingIsGreaterThan_(NSObject object) { + return _lib._objc_msgSend_0( + _id, _lib._sel_scriptingIsGreaterThan_1, object._id); + } + + bool scriptingBeginsWith_(NSObject object) { + return _lib._objc_msgSend_0( + _id, _lib._sel_scriptingBeginsWith_1, object._id); + } + + bool scriptingEndsWith_(NSObject object) { + return _lib._objc_msgSend_0(_id, _lib._sel_scriptingEndsWith_1, object._id); + } + + bool scriptingContains_(NSObject object) { + return _lib._objc_msgSend_0(_id, _lib._sel_scriptingContains_1, object._id); + } +} + +class ObjCSel extends ffi.Opaque {} + +class ObjCObject extends ffi.Opaque {} + +typedef instancetype = ffi.Pointer; + +class _NSZone extends ffi.Opaque {} + +class Protocol extends _ObjCWrapper { + Protocol._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [Protocol] that points to the same underlying object as [other]. + static Protocol castFrom(T other) { + return Protocol._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [Protocol] that wraps the given raw object pointer. + static Protocol castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return Protocol._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [Protocol]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_Protocol1); + } +} + +class NSInvocation extends NSObject { + NSInvocation._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSInvocation] that points to the same underlying object as [other]. + static NSInvocation castFrom(T other) { + return NSInvocation._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSInvocation] that wraps the given raw object pointer. + static NSInvocation castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSInvocation._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSInvocation]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSInvocation1); + } + + static NSInvocation invocationWithMethodSignature_( + SentryCocoa _lib, NSMethodSignature? sig) { + final _ret = _lib._objc_msgSend_385(_lib._class_NSInvocation1, + _lib._sel_invocationWithMethodSignature_1, sig?._id ?? ffi.nullptr); + return NSInvocation._(_ret, _lib, retain: true, release: true); + } + + NSMethodSignature? get methodSignature { + final _ret = _lib._objc_msgSend_386(_id, _lib._sel_methodSignature1); + return _ret.address == 0 + ? null + : NSMethodSignature._(_ret, _lib, retain: true, release: true); + } + + void retainArguments() { + _lib._objc_msgSend_1(_id, _lib._sel_retainArguments1); + } + + bool get argumentsRetained { + return _lib._objc_msgSend_12(_id, _lib._sel_argumentsRetained1); + } + + NSObject get target { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_target1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + set target(NSObject value) { + return _lib._objc_msgSend_387(_id, _lib._sel_setTarget_1, value._id); + } + + ffi.Pointer get selector { + return _lib._objc_msgSend_388(_id, _lib._sel_selector1); + } + + set selector(ffi.Pointer value) { + return _lib._objc_msgSend_389(_id, _lib._sel_setSelector_1, value); + } + + void getReturnValue_(ffi.Pointer retLoc) { + _lib._objc_msgSend_47(_id, _lib._sel_getReturnValue_1, retLoc); + } + + void setReturnValue_(ffi.Pointer retLoc) { + _lib._objc_msgSend_47(_id, _lib._sel_setReturnValue_1, retLoc); + } + + void getArgument_atIndex_(ffi.Pointer argumentLocation, int idx) { + _lib._objc_msgSend_390( + _id, _lib._sel_getArgument_atIndex_1, argumentLocation, idx); + } + + void setArgument_atIndex_(ffi.Pointer argumentLocation, int idx) { + _lib._objc_msgSend_390( + _id, _lib._sel_setArgument_atIndex_1, argumentLocation, idx); + } + + void invoke() { + _lib._objc_msgSend_1(_id, _lib._sel_invoke1); + } + + void invokeWithTarget_(NSObject target) { + _lib._objc_msgSend_15(_id, _lib._sel_invokeWithTarget_1, target._id); + } + + void invokeUsingIMP_( + ffi.Pointer> imp) { + _lib._objc_msgSend_391(_id, _lib._sel_invokeUsingIMP_1, imp); + } + + @override + NSInvocation init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSInvocation._(_ret, _lib, retain: true, release: true); + } + + static NSInvocation new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSInvocation1, _lib._sel_new1); + return NSInvocation._(_ret, _lib, retain: false, release: true); + } + + static NSInvocation allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSInvocation1, _lib._sel_allocWithZone_1, zone); + return NSInvocation._(_ret, _lib, retain: false, release: true); + } + + static NSInvocation alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSInvocation1, _lib._sel_alloc1); + return NSInvocation._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSInvocation1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSInvocation1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSInvocation1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSInvocation1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSInvocation1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSInvocation1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSInvocation1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSInvocation1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSInvocation1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSMethodSignature extends NSObject { + NSMethodSignature._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSMethodSignature] that points to the same underlying object as [other]. + static NSMethodSignature castFrom(T other) { + return NSMethodSignature._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSMethodSignature] that wraps the given raw object pointer. + static NSMethodSignature castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSMethodSignature._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSMethodSignature]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSMethodSignature1); + } + + static NSMethodSignature signatureWithObjCTypes_( + SentryCocoa _lib, ffi.Pointer types) { + final _ret = _lib._objc_msgSend_9(_lib._class_NSMethodSignature1, + _lib._sel_signatureWithObjCTypes_1, types); + return NSMethodSignature._(_ret, _lib, retain: true, release: true); + } + + int get numberOfArguments { + return _lib._objc_msgSend_10(_id, _lib._sel_numberOfArguments1); + } + + ffi.Pointer getArgumentTypeAtIndex_(int idx) { + return _lib._objc_msgSend_11(_id, _lib._sel_getArgumentTypeAtIndex_1, idx); + } + + int get frameLength { + return _lib._objc_msgSend_10(_id, _lib._sel_frameLength1); + } + + bool isOneway() { + return _lib._objc_msgSend_12(_id, _lib._sel_isOneway1); + } + + ffi.Pointer get methodReturnType { + return _lib._objc_msgSend_13(_id, _lib._sel_methodReturnType1); + } + + int get methodReturnLength { + return _lib._objc_msgSend_10(_id, _lib._sel_methodReturnLength1); + } + + @override + NSMethodSignature init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSMethodSignature._(_ret, _lib, retain: true, release: true); + } + + static NSMethodSignature new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSMethodSignature1, _lib._sel_new1); + return NSMethodSignature._(_ret, _lib, retain: false, release: true); + } + + static NSMethodSignature allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSMethodSignature1, _lib._sel_allocWithZone_1, zone); + return NSMethodSignature._(_ret, _lib, retain: false, release: true); + } + + static NSMethodSignature alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSMethodSignature1, _lib._sel_alloc1); + return NSMethodSignature._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSMethodSignature1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSMethodSignature1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSMethodSignature1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSMethodSignature1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSMethodSignature1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSMethodSignature1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSMethodSignature1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSMethodSignature1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSMethodSignature1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSSet extends NSObject { + NSSet._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSSet] that points to the same underlying object as [other]. + static NSSet castFrom(T other) { + return NSSet._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSSet] that wraps the given raw object pointer. + static NSSet castFromPointer(SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSSet._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSSet]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSSet1); + } + + int get count { + return _lib._objc_msgSend_10(_id, _lib._sel_count1); + } + + NSObject member_(NSObject object) { + final _ret = _lib._objc_msgSend_16(_id, _lib._sel_member_1, object._id); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSEnumerator objectEnumerator() { + final _ret = _lib._objc_msgSend_72(_id, _lib._sel_objectEnumerator1); + return NSEnumerator._(_ret, _lib, retain: true, release: true); + } + + @override + NSSet init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + NSSet initWithObjects_count_( + ffi.Pointer> objects, int cnt) { + final _ret = _lib._objc_msgSend_61( + _id, _lib._sel_initWithObjects_count_1, objects, cnt); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + NSSet initWithCoder_(NSCoder? coder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + NSArray? get allObjects { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_allObjects1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSObject anyObject() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_anyObject1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + bool containsObject_(NSObject anObject) { + return _lib._objc_msgSend_0(_id, _lib._sel_containsObject_1, anObject._id); + } + + NSString? get description { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString descriptionWithLocale_(NSObject locale) { + final _ret = _lib._objc_msgSend_65( + _id, _lib._sel_descriptionWithLocale_1, locale._id); + return NSString._(_ret, _lib, retain: true, release: true); + } + + bool intersectsSet_(NSSet? otherSet) { + return _lib._objc_msgSend_374( + _id, _lib._sel_intersectsSet_1, otherSet?._id ?? ffi.nullptr); + } + + bool isEqualToSet_(NSSet? otherSet) { + return _lib._objc_msgSend_374( + _id, _lib._sel_isEqualToSet_1, otherSet?._id ?? ffi.nullptr); + } + + bool isSubsetOfSet_(NSSet? otherSet) { + return _lib._objc_msgSend_374( + _id, _lib._sel_isSubsetOfSet_1, otherSet?._id ?? ffi.nullptr); + } + + void makeObjectsPerformSelector_(ffi.Pointer aSelector) { + _lib._objc_msgSend_7( + _id, _lib._sel_makeObjectsPerformSelector_1, aSelector); + } + + void makeObjectsPerformSelector_withObject_( + ffi.Pointer aSelector, NSObject argument) { + _lib._objc_msgSend_84( + _id, + _lib._sel_makeObjectsPerformSelector_withObject_1, + aSelector, + argument._id); + } + + NSSet setByAddingObject_(NSObject anObject) { + final _ret = _lib._objc_msgSend_375( + _id, _lib._sel_setByAddingObject_1, anObject._id); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + NSSet setByAddingObjectsFromSet_(NSSet? other) { + final _ret = _lib._objc_msgSend_376( + _id, _lib._sel_setByAddingObjectsFromSet_1, other?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + NSSet setByAddingObjectsFromArray_(NSArray? other) { + final _ret = _lib._objc_msgSend_377(_id, + _lib._sel_setByAddingObjectsFromArray_1, other?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + void enumerateObjectsUsingBlock_(ObjCBlock_ffiVoid_ObjCObject_bool block) { + _lib._objc_msgSend_378( + _id, _lib._sel_enumerateObjectsUsingBlock_1, block._id); + } + + void enumerateObjectsWithOptions_usingBlock_( + int opts, ObjCBlock_ffiVoid_ObjCObject_bool block) { + _lib._objc_msgSend_379(_id, + _lib._sel_enumerateObjectsWithOptions_usingBlock_1, opts, block._id); + } + + NSSet objectsPassingTest_(ObjCBlock_bool_ObjCObject_bool predicate) { + final _ret = _lib._objc_msgSend_380( + _id, _lib._sel_objectsPassingTest_1, predicate._id); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + NSSet objectsWithOptions_passingTest_( + int opts, ObjCBlock_bool_ObjCObject_bool predicate) { + final _ret = _lib._objc_msgSend_381( + _id, _lib._sel_objectsWithOptions_passingTest_1, opts, predicate._id); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static NSSet set1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSSet1, _lib._sel_set1); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static NSSet setWithObject_(SentryCocoa _lib, NSObject object) { + final _ret = _lib._objc_msgSend_16( + _lib._class_NSSet1, _lib._sel_setWithObject_1, object._id); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static NSSet setWithObjects_count_( + SentryCocoa _lib, ffi.Pointer> objects, int cnt) { + final _ret = _lib._objc_msgSend_61( + _lib._class_NSSet1, _lib._sel_setWithObjects_count_1, objects, cnt); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static NSSet setWithObjects_(SentryCocoa _lib, NSObject firstObj) { + final _ret = _lib._objc_msgSend_16( + _lib._class_NSSet1, _lib._sel_setWithObjects_1, firstObj._id); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static NSSet setWithSet_(SentryCocoa _lib, NSSet? set) { + final _ret = _lib._objc_msgSend_382( + _lib._class_NSSet1, _lib._sel_setWithSet_1, set?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static NSSet setWithArray_(SentryCocoa _lib, NSArray? array) { + final _ret = _lib._objc_msgSend_67(_lib._class_NSSet1, + _lib._sel_setWithArray_1, array?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + NSSet initWithObjects_(NSObject firstObj) { + final _ret = + _lib._objc_msgSend_16(_id, _lib._sel_initWithObjects_1, firstObj._id); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + NSSet initWithSet_(NSSet? set) { + final _ret = _lib._objc_msgSend_382( + _id, _lib._sel_initWithSet_1, set?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + NSSet initWithSet_copyItems_(NSSet? set, bool flag) { + final _ret = _lib._objc_msgSend_383( + _id, _lib._sel_initWithSet_copyItems_1, set?._id ?? ffi.nullptr, flag); + return NSSet._(_ret, _lib, retain: false, release: true); + } + + NSSet initWithArray_(NSArray? array) { + final _ret = _lib._objc_msgSend_67( + _id, _lib._sel_initWithArray_1, array?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + @override + NSObject valueForKey_(NSString? key) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_valueForKey_1, key?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + @override + void setValue_forKey_(NSObject value, NSString? key) { + _lib._objc_msgSend_126( + _id, _lib._sel_setValue_forKey_1, value._id, key?._id ?? ffi.nullptr); + } + + @override + void addObserver_forKeyPath_options_context_(NSObject? observer, + NSString? keyPath, int options, ffi.Pointer context) { + _lib._objc_msgSend_130( + _id, + _lib._sel_addObserver_forKeyPath_options_context_1, + observer?._id ?? ffi.nullptr, + keyPath?._id ?? ffi.nullptr, + options, + context); + } + + @override + void removeObserver_forKeyPath_context_( + NSObject? observer, NSString? keyPath, ffi.Pointer context) { + _lib._objc_msgSend_131(_id, _lib._sel_removeObserver_forKeyPath_context_1, + observer?._id ?? ffi.nullptr, keyPath?._id ?? ffi.nullptr, context); + } + + @override + void removeObserver_forKeyPath_(NSObject? observer, NSString? keyPath) { + _lib._objc_msgSend_132(_id, _lib._sel_removeObserver_forKeyPath_1, + observer?._id ?? ffi.nullptr, keyPath?._id ?? ffi.nullptr); + } + + NSArray sortedArrayUsingDescriptors_(NSArray? sortDescriptors) { + final _ret = _lib._objc_msgSend_63( + _id, + _lib._sel_sortedArrayUsingDescriptors_1, + sortDescriptors?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSSet filteredSetUsingPredicate_(NSPredicate? predicate) { + final _ret = _lib._objc_msgSend_384(_id, + _lib._sel_filteredSetUsingPredicate_1, predicate?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static NSSet new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSSet1, _lib._sel_new1); + return NSSet._(_ret, _lib, retain: false, release: true); + } + + static NSSet allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSSet1, _lib._sel_allocWithZone_1, zone); + return NSSet._(_ret, _lib, retain: false, release: true); + } + + static NSSet alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSSet1, _lib._sel_alloc1); + return NSSet._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSSet1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSSet1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSSet1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSSet1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSSet1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSSet1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSSet1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSSet1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSSet1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSEnumerator extends NSObject { + NSEnumerator._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSEnumerator] that points to the same underlying object as [other]. + static NSEnumerator castFrom(T other) { + return NSEnumerator._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSEnumerator] that wraps the given raw object pointer. + static NSEnumerator castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSEnumerator._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSEnumerator]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSEnumerator1); + } + + NSObject nextObject() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_nextObject1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject? get allObjects { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_allObjects1); + return _ret.address == 0 + ? null + : NSObject._(_ret, _lib, retain: true, release: true); + } + + @override + NSEnumerator init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSEnumerator._(_ret, _lib, retain: true, release: true); + } + + static NSEnumerator new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSEnumerator1, _lib._sel_new1); + return NSEnumerator._(_ret, _lib, retain: false, release: true); + } + + static NSEnumerator allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSEnumerator1, _lib._sel_allocWithZone_1, zone); + return NSEnumerator._(_ret, _lib, retain: false, release: true); + } + + static NSEnumerator alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSEnumerator1, _lib._sel_alloc1); + return NSEnumerator._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSEnumerator1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSEnumerator1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSEnumerator1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSEnumerator1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSEnumerator1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSEnumerator1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSEnumerator1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSEnumerator1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSEnumerator1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSString extends NSObject { + NSString._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSString] that points to the same underlying object as [other]. + static NSString castFrom(T other) { + return NSString._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSString] that wraps the given raw object pointer. + static NSString castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSString._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSString]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSString1); + } + + factory NSString(SentryCocoa _lib, String str) { + final cstr = str.toNativeUtf16(); + final nsstr = stringWithCharacters_length_(_lib, cstr.cast(), str.length); + pkg_ffi.calloc.free(cstr); + return nsstr; + } + + @override + String toString() { + final data = + dataUsingEncoding_(0x94000100 /* NSUTF16LittleEndianStringEncoding */); + return data.bytes.cast().toDartString(length: length); + } + + int get length { + return _lib._objc_msgSend_10(_id, _lib._sel_length1); + } + + int characterAtIndex_(int index) { + return _lib._objc_msgSend_17(_id, _lib._sel_characterAtIndex_1, index); + } + + @override + NSString init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString initWithCoder_(NSCoder? coder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString substringFromIndex_(int from) { + final _ret = + _lib._objc_msgSend_308(_id, _lib._sel_substringFromIndex_1, from); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString substringToIndex_(int to) { + final _ret = _lib._objc_msgSend_308(_id, _lib._sel_substringToIndex_1, to); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString substringWithRange_(_NSRange range) { + final _ret = + _lib._objc_msgSend_309(_id, _lib._sel_substringWithRange_1, range); + return NSString._(_ret, _lib, retain: true, release: true); + } + + void getCharacters_range_( + ffi.Pointer buffer, _NSRange range) { + _lib._objc_msgSend_310(_id, _lib._sel_getCharacters_range_1, buffer, range); + } + + int compare_(NSString? string) { + return _lib._objc_msgSend_311( + _id, _lib._sel_compare_1, string?._id ?? ffi.nullptr); + } + + int compare_options_(NSString? string, int mask) { + return _lib._objc_msgSend_312( + _id, _lib._sel_compare_options_1, string?._id ?? ffi.nullptr, mask); + } + + int compare_options_range_( + NSString? string, int mask, _NSRange rangeOfReceiverToCompare) { + return _lib._objc_msgSend_313(_id, _lib._sel_compare_options_range_1, + string?._id ?? ffi.nullptr, mask, rangeOfReceiverToCompare); + } + + int compare_options_range_locale_(NSString? string, int mask, + _NSRange rangeOfReceiverToCompare, NSObject locale) { + return _lib._objc_msgSend_314(_id, _lib._sel_compare_options_range_locale_1, + string?._id ?? ffi.nullptr, mask, rangeOfReceiverToCompare, locale._id); + } + + int caseInsensitiveCompare_(NSString? string) { + return _lib._objc_msgSend_311( + _id, _lib._sel_caseInsensitiveCompare_1, string?._id ?? ffi.nullptr); + } + + int localizedCompare_(NSString? string) { + return _lib._objc_msgSend_311( + _id, _lib._sel_localizedCompare_1, string?._id ?? ffi.nullptr); + } + + int localizedCaseInsensitiveCompare_(NSString? string) { + return _lib._objc_msgSend_311( + _id, + _lib._sel_localizedCaseInsensitiveCompare_1, + string?._id ?? ffi.nullptr); + } + + int localizedStandardCompare_(NSString? string) { + return _lib._objc_msgSend_311( + _id, _lib._sel_localizedStandardCompare_1, string?._id ?? ffi.nullptr); + } + + bool isEqualToString_(NSString? aString) { + return _lib._objc_msgSend_59( + _id, _lib._sel_isEqualToString_1, aString?._id ?? ffi.nullptr); + } + + bool hasPrefix_(NSString? str) { + return _lib._objc_msgSend_59( + _id, _lib._sel_hasPrefix_1, str?._id ?? ffi.nullptr); + } + + bool hasSuffix_(NSString? str) { + return _lib._objc_msgSend_59( + _id, _lib._sel_hasSuffix_1, str?._id ?? ffi.nullptr); + } + + NSString commonPrefixWithString_options_(NSString? str, int mask) { + final _ret = _lib._objc_msgSend_315( + _id, + _lib._sel_commonPrefixWithString_options_1, + str?._id ?? ffi.nullptr, + mask); + return NSString._(_ret, _lib, retain: true, release: true); + } + + bool containsString_(NSString? str) { + return _lib._objc_msgSend_59( + _id, _lib._sel_containsString_1, str?._id ?? ffi.nullptr); + } + + bool localizedCaseInsensitiveContainsString_(NSString? str) { + return _lib._objc_msgSend_59( + _id, + _lib._sel_localizedCaseInsensitiveContainsString_1, + str?._id ?? ffi.nullptr); + } + + bool localizedStandardContainsString_(NSString? str) { + return _lib._objc_msgSend_59(_id, + _lib._sel_localizedStandardContainsString_1, str?._id ?? ffi.nullptr); + } + + void localizedStandardRangeOfString_( + ffi.Pointer<_NSRange> stret, NSString? str) { + _lib._objc_msgSend_316(stret, _id, + _lib._sel_localizedStandardRangeOfString_1, str?._id ?? ffi.nullptr); + } + + void rangeOfString_(ffi.Pointer<_NSRange> stret, NSString? searchString) { + _lib._objc_msgSend_316(stret, _id, _lib._sel_rangeOfString_1, + searchString?._id ?? ffi.nullptr); + } + + void rangeOfString_options_( + ffi.Pointer<_NSRange> stret, NSString? searchString, int mask) { + _lib._objc_msgSend_317(stret, _id, _lib._sel_rangeOfString_options_1, + searchString?._id ?? ffi.nullptr, mask); + } + + void rangeOfString_options_range_(ffi.Pointer<_NSRange> stret, + NSString? searchString, int mask, _NSRange rangeOfReceiverToSearch) { + _lib._objc_msgSend_318(stret, _id, _lib._sel_rangeOfString_options_range_1, + searchString?._id ?? ffi.nullptr, mask, rangeOfReceiverToSearch); + } + + void rangeOfString_options_range_locale_( + ffi.Pointer<_NSRange> stret, + NSString? searchString, + int mask, + _NSRange rangeOfReceiverToSearch, + NSLocale? locale) { + _lib._objc_msgSend_319( + stret, + _id, + _lib._sel_rangeOfString_options_range_locale_1, + searchString?._id ?? ffi.nullptr, + mask, + rangeOfReceiverToSearch, + locale?._id ?? ffi.nullptr); + } + + void rangeOfCharacterFromSet_( + ffi.Pointer<_NSRange> stret, NSCharacterSet? searchSet) { + _lib._objc_msgSend_320(stret, _id, _lib._sel_rangeOfCharacterFromSet_1, + searchSet?._id ?? ffi.nullptr); + } + + void rangeOfCharacterFromSet_options_( + ffi.Pointer<_NSRange> stret, NSCharacterSet? searchSet, int mask) { + _lib._objc_msgSend_321( + stret, + _id, + _lib._sel_rangeOfCharacterFromSet_options_1, + searchSet?._id ?? ffi.nullptr, + mask); + } + + void rangeOfCharacterFromSet_options_range_(ffi.Pointer<_NSRange> stret, + NSCharacterSet? searchSet, int mask, _NSRange rangeOfReceiverToSearch) { + _lib._objc_msgSend_322( + stret, + _id, + _lib._sel_rangeOfCharacterFromSet_options_range_1, + searchSet?._id ?? ffi.nullptr, + mask, + rangeOfReceiverToSearch); + } + + void rangeOfComposedCharacterSequenceAtIndex_( + ffi.Pointer<_NSRange> stret, int index) { + _lib._objc_msgSend_323( + stret, _id, _lib._sel_rangeOfComposedCharacterSequenceAtIndex_1, index); + } + + void rangeOfComposedCharacterSequencesForRange_( + ffi.Pointer<_NSRange> stret, _NSRange range) { + _lib._objc_msgSend_324(stret, _id, + _lib._sel_rangeOfComposedCharacterSequencesForRange_1, range); + } + + NSString stringByAppendingString_(NSString? aString) { + final _ret = _lib._objc_msgSend_64( + _id, _lib._sel_stringByAppendingString_1, aString?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString stringByAppendingFormat_(NSString? format) { + final _ret = _lib._objc_msgSend_64( + _id, _lib._sel_stringByAppendingFormat_1, format?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + double get doubleValue { + return _lib._objc_msgSend_155(_id, _lib._sel_doubleValue1); + } + + double get floatValue { + return _lib._objc_msgSend_221(_id, _lib._sel_floatValue1); + } + + int get intValue { + return _lib._objc_msgSend_219(_id, _lib._sel_intValue1); + } + + int get integerValue { + return _lib._objc_msgSend_78(_id, _lib._sel_integerValue1); + } + + int get longLongValue { + return _lib._objc_msgSend_220(_id, _lib._sel_longLongValue1); + } + + bool get boolValue { + return _lib._objc_msgSend_12(_id, _lib._sel_boolValue1); + } + + NSString? get uppercaseString { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_uppercaseString1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get lowercaseString { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_lowercaseString1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get capitalizedString { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_capitalizedString1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get localizedUppercaseString { + final _ret = + _lib._objc_msgSend_20(_id, _lib._sel_localizedUppercaseString1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get localizedLowercaseString { + final _ret = + _lib._objc_msgSend_20(_id, _lib._sel_localizedLowercaseString1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get localizedCapitalizedString { + final _ret = + _lib._objc_msgSend_20(_id, _lib._sel_localizedCapitalizedString1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString uppercaseStringWithLocale_(NSLocale? locale) { + final _ret = _lib._objc_msgSend_325( + _id, _lib._sel_uppercaseStringWithLocale_1, locale?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString lowercaseStringWithLocale_(NSLocale? locale) { + final _ret = _lib._objc_msgSend_325( + _id, _lib._sel_lowercaseStringWithLocale_1, locale?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString capitalizedStringWithLocale_(NSLocale? locale) { + final _ret = _lib._objc_msgSend_325(_id, + _lib._sel_capitalizedStringWithLocale_1, locale?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + void getLineStart_end_contentsEnd_forRange_( + ffi.Pointer startPtr, + ffi.Pointer lineEndPtr, + ffi.Pointer contentsEndPtr, + _NSRange range) { + _lib._objc_msgSend_326( + _id, + _lib._sel_getLineStart_end_contentsEnd_forRange_1, + startPtr, + lineEndPtr, + contentsEndPtr, + range); + } + + void lineRangeForRange_(ffi.Pointer<_NSRange> stret, _NSRange range) { + _lib._objc_msgSend_324(stret, _id, _lib._sel_lineRangeForRange_1, range); + } + + void getParagraphStart_end_contentsEnd_forRange_( + ffi.Pointer startPtr, + ffi.Pointer parEndPtr, + ffi.Pointer contentsEndPtr, + _NSRange range) { + _lib._objc_msgSend_326( + _id, + _lib._sel_getParagraphStart_end_contentsEnd_forRange_1, + startPtr, + parEndPtr, + contentsEndPtr, + range); + } + + void paragraphRangeForRange_(ffi.Pointer<_NSRange> stret, _NSRange range) { + _lib._objc_msgSend_324( + stret, _id, _lib._sel_paragraphRangeForRange_1, range); + } + + void enumerateSubstringsInRange_options_usingBlock_(_NSRange range, int opts, + ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool block) { + _lib._objc_msgSend_327( + _id, + _lib._sel_enumerateSubstringsInRange_options_usingBlock_1, + range, + opts, + block._id); + } + + void enumerateLinesUsingBlock_(ObjCBlock_ffiVoid_NSString_bool block) { + _lib._objc_msgSend_328( + _id, _lib._sel_enumerateLinesUsingBlock_1, block._id); + } + + ffi.Pointer get UTF8String { + return _lib._objc_msgSend_13(_id, _lib._sel_UTF8String1); + } + + int get fastestEncoding { + return _lib._objc_msgSend_10(_id, _lib._sel_fastestEncoding1); + } + + int get smallestEncoding { + return _lib._objc_msgSend_10(_id, _lib._sel_smallestEncoding1); + } + + NSData dataUsingEncoding_allowLossyConversion_(int encoding, bool lossy) { + final _ret = _lib._objc_msgSend_329(_id, + _lib._sel_dataUsingEncoding_allowLossyConversion_1, encoding, lossy); + return NSData._(_ret, _lib, retain: true, release: true); + } + + NSData dataUsingEncoding_(int encoding) { + final _ret = + _lib._objc_msgSend_330(_id, _lib._sel_dataUsingEncoding_1, encoding); + return NSData._(_ret, _lib, retain: true, release: true); + } + + bool canBeConvertedToEncoding_(int encoding) { + return _lib._objc_msgSend_91( + _id, _lib._sel_canBeConvertedToEncoding_1, encoding); + } + + ffi.Pointer cStringUsingEncoding_(int encoding) { + return _lib._objc_msgSend_11( + _id, _lib._sel_cStringUsingEncoding_1, encoding); + } + + bool getCString_maxLength_encoding_( + ffi.Pointer buffer, int maxBufferCount, int encoding) { + return _lib._objc_msgSend_331( + _id, + _lib._sel_getCString_maxLength_encoding_1, + buffer, + maxBufferCount, + encoding); + } + + bool getBytes_maxLength_usedLength_encoding_options_range_remainingRange_( + ffi.Pointer buffer, + int maxBufferCount, + ffi.Pointer usedBufferCount, + int encoding, + int options, + _NSRange range, + ffi.Pointer<_NSRange> leftover) { + return _lib._objc_msgSend_332( + _id, + _lib._sel_getBytes_maxLength_usedLength_encoding_options_range_remainingRange_1, + buffer, + maxBufferCount, + usedBufferCount, + encoding, + options, + range, + leftover); + } + + int maximumLengthOfBytesUsingEncoding_(int enc) { + return _lib._objc_msgSend_88( + _id, _lib._sel_maximumLengthOfBytesUsingEncoding_1, enc); + } + + int lengthOfBytesUsingEncoding_(int enc) { + return _lib._objc_msgSend_88( + _id, _lib._sel_lengthOfBytesUsingEncoding_1, enc); + } + + static ffi.Pointer getAvailableStringEncodings( + SentryCocoa _lib) { + return _lib._objc_msgSend_333( + _lib._class_NSString1, _lib._sel_availableStringEncodings1); + } + + static NSString localizedNameOfStringEncoding_( + SentryCocoa _lib, int encoding) { + final _ret = _lib._objc_msgSend_308(_lib._class_NSString1, + _lib._sel_localizedNameOfStringEncoding_1, encoding); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static int getDefaultCStringEncoding(SentryCocoa _lib) { + return _lib._objc_msgSend_10( + _lib._class_NSString1, _lib._sel_defaultCStringEncoding1); + } + + NSString? get decomposedStringWithCanonicalMapping { + final _ret = _lib._objc_msgSend_20( + _id, _lib._sel_decomposedStringWithCanonicalMapping1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get precomposedStringWithCanonicalMapping { + final _ret = _lib._objc_msgSend_20( + _id, _lib._sel_precomposedStringWithCanonicalMapping1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get decomposedStringWithCompatibilityMapping { + final _ret = _lib._objc_msgSend_20( + _id, _lib._sel_decomposedStringWithCompatibilityMapping1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get precomposedStringWithCompatibilityMapping { + final _ret = _lib._objc_msgSend_20( + _id, _lib._sel_precomposedStringWithCompatibilityMapping1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSArray componentsSeparatedByString_(NSString? separator) { + final _ret = _lib._objc_msgSend_123(_id, + _lib._sel_componentsSeparatedByString_1, separator?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray componentsSeparatedByCharactersInSet_(NSCharacterSet? separator) { + final _ret = _lib._objc_msgSend_334( + _id, + _lib._sel_componentsSeparatedByCharactersInSet_1, + separator?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSString stringByTrimmingCharactersInSet_(NSCharacterSet? set) { + final _ret = _lib._objc_msgSend_335(_id, + _lib._sel_stringByTrimmingCharactersInSet_1, set?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString stringByPaddingToLength_withString_startingAtIndex_( + int newLength, NSString? padString, int padIndex) { + final _ret = _lib._objc_msgSend_336( + _id, + _lib._sel_stringByPaddingToLength_withString_startingAtIndex_1, + newLength, + padString?._id ?? ffi.nullptr, + padIndex); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString stringByFoldingWithOptions_locale_(int options, NSLocale? locale) { + final _ret = _lib._objc_msgSend_337( + _id, + _lib._sel_stringByFoldingWithOptions_locale_1, + options, + locale?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString stringByReplacingOccurrencesOfString_withString_options_range_( + NSString? target, + NSString? replacement, + int options, + _NSRange searchRange) { + final _ret = _lib._objc_msgSend_338( + _id, + _lib._sel_stringByReplacingOccurrencesOfString_withString_options_range_1, + target?._id ?? ffi.nullptr, + replacement?._id ?? ffi.nullptr, + options, + searchRange); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString stringByReplacingOccurrencesOfString_withString_( + NSString? target, NSString? replacement) { + final _ret = _lib._objc_msgSend_339( + _id, + _lib._sel_stringByReplacingOccurrencesOfString_withString_1, + target?._id ?? ffi.nullptr, + replacement?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString stringByReplacingCharactersInRange_withString_( + _NSRange range, NSString? replacement) { + final _ret = _lib._objc_msgSend_340( + _id, + _lib._sel_stringByReplacingCharactersInRange_withString_1, + range, + replacement?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString stringByApplyingTransform_reverse_( + NSString transform, bool reverse) { + final _ret = _lib._objc_msgSend_341(_id, + _lib._sel_stringByApplyingTransform_reverse_1, transform._id, reverse); + return NSString._(_ret, _lib, retain: true, release: true); + } + + bool writeToURL_atomically_encoding_error_(NSURL? url, bool useAuxiliaryFile, + int enc, ffi.Pointer> error) { + return _lib._objc_msgSend_342( + _id, + _lib._sel_writeToURL_atomically_encoding_error_1, + url?._id ?? ffi.nullptr, + useAuxiliaryFile, + enc, + error); + } + + bool writeToFile_atomically_encoding_error_( + NSString? path, + bool useAuxiliaryFile, + int enc, + ffi.Pointer> error) { + return _lib._objc_msgSend_343( + _id, + _lib._sel_writeToFile_atomically_encoding_error_1, + path?._id ?? ffi.nullptr, + useAuxiliaryFile, + enc, + error); + } + + NSString? get description { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + int get hash { + return _lib._objc_msgSend_10(_id, _lib._sel_hash1); + } + + NSString initWithCharactersNoCopy_length_freeWhenDone_( + ffi.Pointer characters, int length, bool freeBuffer) { + final _ret = _lib._objc_msgSend_344( + _id, + _lib._sel_initWithCharactersNoCopy_length_freeWhenDone_1, + characters, + length, + freeBuffer); + return NSString._(_ret, _lib, retain: false, release: true); + } + + NSString initWithCharactersNoCopy_length_deallocator_( + ffi.Pointer chars, + int len, + ObjCBlock_ffiVoid_ffiUnsignedShort_ffiUnsignedLong deallocator) { + final _ret = _lib._objc_msgSend_345( + _id, + _lib._sel_initWithCharactersNoCopy_length_deallocator_1, + chars, + len, + deallocator._id); + return NSString._(_ret, _lib, retain: false, release: true); + } + + NSString initWithCharacters_length_( + ffi.Pointer characters, int length) { + final _ret = _lib._objc_msgSend_346( + _id, _lib._sel_initWithCharacters_length_1, characters, length); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString initWithUTF8String_(ffi.Pointer nullTerminatedCString) { + final _ret = _lib._objc_msgSend_347( + _id, _lib._sel_initWithUTF8String_1, nullTerminatedCString); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString initWithString_(NSString? aString) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithString_1, aString?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString initWithFormat_(NSString? format) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithFormat_1, format?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString initWithFormat_arguments_( + NSString? format, ffi.Pointer<__va_list_tag> argList) { + final _ret = _lib._objc_msgSend_348( + _id, + _lib._sel_initWithFormat_arguments_1, + format?._id ?? ffi.nullptr, + argList); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString initWithFormat_locale_(NSString? format, NSObject locale) { + final _ret = _lib._objc_msgSend_163(_id, _lib._sel_initWithFormat_locale_1, + format?._id ?? ffi.nullptr, locale._id); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString initWithFormat_locale_arguments_( + NSString? format, NSObject locale, ffi.Pointer<__va_list_tag> argList) { + final _ret = _lib._objc_msgSend_349( + _id, + _lib._sel_initWithFormat_locale_arguments_1, + format?._id ?? ffi.nullptr, + locale._id, + argList); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString initWithValidatedFormat_validFormatSpecifiers_error_( + NSString? format, + NSString? validFormatSpecifiers, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_350( + _id, + _lib._sel_initWithValidatedFormat_validFormatSpecifiers_error_1, + format?._id ?? ffi.nullptr, + validFormatSpecifiers?._id ?? ffi.nullptr, + error); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString initWithValidatedFormat_validFormatSpecifiers_locale_error_( + NSString? format, + NSString? validFormatSpecifiers, + NSObject locale, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_351( + _id, + _lib._sel_initWithValidatedFormat_validFormatSpecifiers_locale_error_1, + format?._id ?? ffi.nullptr, + validFormatSpecifiers?._id ?? ffi.nullptr, + locale._id, + error); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString initWithValidatedFormat_validFormatSpecifiers_arguments_error_( + NSString? format, + NSString? validFormatSpecifiers, + ffi.Pointer<__va_list_tag> argList, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_352( + _id, + _lib._sel_initWithValidatedFormat_validFormatSpecifiers_arguments_error_1, + format?._id ?? ffi.nullptr, + validFormatSpecifiers?._id ?? ffi.nullptr, + argList, + error); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString + initWithValidatedFormat_validFormatSpecifiers_locale_arguments_error_( + NSString? format, + NSString? validFormatSpecifiers, + NSObject locale, + ffi.Pointer<__va_list_tag> argList, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_353( + _id, + _lib._sel_initWithValidatedFormat_validFormatSpecifiers_locale_arguments_error_1, + format?._id ?? ffi.nullptr, + validFormatSpecifiers?._id ?? ffi.nullptr, + locale._id, + argList, + error); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString initWithData_encoding_(NSData? data, int encoding) { + final _ret = _lib._objc_msgSend_354(_id, _lib._sel_initWithData_encoding_1, + data?._id ?? ffi.nullptr, encoding); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString initWithBytes_length_encoding_( + ffi.Pointer bytes, int len, int encoding) { + final _ret = _lib._objc_msgSend_355( + _id, _lib._sel_initWithBytes_length_encoding_1, bytes, len, encoding); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString initWithBytesNoCopy_length_encoding_freeWhenDone_( + ffi.Pointer bytes, int len, int encoding, bool freeBuffer) { + final _ret = _lib._objc_msgSend_356( + _id, + _lib._sel_initWithBytesNoCopy_length_encoding_freeWhenDone_1, + bytes, + len, + encoding, + freeBuffer); + return NSString._(_ret, _lib, retain: false, release: true); + } + + NSString initWithBytesNoCopy_length_encoding_deallocator_( + ffi.Pointer bytes, + int len, + int encoding, + ObjCBlock_ffiVoid_ffiVoid_ffiUnsignedLong deallocator) { + final _ret = _lib._objc_msgSend_357( + _id, + _lib._sel_initWithBytesNoCopy_length_encoding_deallocator_1, + bytes, + len, + encoding, + deallocator._id); + return NSString._(_ret, _lib, retain: false, release: true); + } + + static NSString string(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSString1, _lib._sel_string1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString stringWithString_(SentryCocoa _lib, NSString? string) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSString1, + _lib._sel_stringWithString_1, string?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString stringWithCharacters_length_( + SentryCocoa _lib, ffi.Pointer characters, int length) { + final _ret = _lib._objc_msgSend_346(_lib._class_NSString1, + _lib._sel_stringWithCharacters_length_1, characters, length); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString stringWithUTF8String_( + SentryCocoa _lib, ffi.Pointer nullTerminatedCString) { + final _ret = _lib._objc_msgSend_347(_lib._class_NSString1, + _lib._sel_stringWithUTF8String_1, nullTerminatedCString); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString stringWithFormat_(SentryCocoa _lib, NSString? format) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSString1, + _lib._sel_stringWithFormat_1, format?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString localizedStringWithFormat_( + SentryCocoa _lib, NSString? format) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSString1, + _lib._sel_localizedStringWithFormat_1, format?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString stringWithValidatedFormat_validFormatSpecifiers_error_( + SentryCocoa _lib, + NSString? format, + NSString? validFormatSpecifiers, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_350( + _lib._class_NSString1, + _lib._sel_stringWithValidatedFormat_validFormatSpecifiers_error_1, + format?._id ?? ffi.nullptr, + validFormatSpecifiers?._id ?? ffi.nullptr, + error); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString + localizedStringWithValidatedFormat_validFormatSpecifiers_error_( + SentryCocoa _lib, + NSString? format, + NSString? validFormatSpecifiers, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_350( + _lib._class_NSString1, + _lib._sel_localizedStringWithValidatedFormat_validFormatSpecifiers_error_1, + format?._id ?? ffi.nullptr, + validFormatSpecifiers?._id ?? ffi.nullptr, + error); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString initWithCString_encoding_( + ffi.Pointer nullTerminatedCString, int encoding) { + final _ret = _lib._objc_msgSend_358(_id, + _lib._sel_initWithCString_encoding_1, nullTerminatedCString, encoding); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString stringWithCString_encoding_( + SentryCocoa _lib, ffi.Pointer cString, int enc) { + final _ret = _lib._objc_msgSend_358(_lib._class_NSString1, + _lib._sel_stringWithCString_encoding_1, cString, enc); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString initWithContentsOfURL_encoding_error_( + NSURL? url, int enc, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_359( + _id, + _lib._sel_initWithContentsOfURL_encoding_error_1, + url?._id ?? ffi.nullptr, + enc, + error); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString initWithContentsOfFile_encoding_error_( + NSString? path, int enc, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_360( + _id, + _lib._sel_initWithContentsOfFile_encoding_error_1, + path?._id ?? ffi.nullptr, + enc, + error); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString stringWithContentsOfURL_encoding_error_(SentryCocoa _lib, + NSURL? url, int enc, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_359( + _lib._class_NSString1, + _lib._sel_stringWithContentsOfURL_encoding_error_1, + url?._id ?? ffi.nullptr, + enc, + error); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString stringWithContentsOfFile_encoding_error_(SentryCocoa _lib, + NSString? path, int enc, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_360( + _lib._class_NSString1, + _lib._sel_stringWithContentsOfFile_encoding_error_1, + path?._id ?? ffi.nullptr, + enc, + error); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString initWithContentsOfURL_usedEncoding_error_( + NSURL? url, + ffi.Pointer enc, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_361( + _id, + _lib._sel_initWithContentsOfURL_usedEncoding_error_1, + url?._id ?? ffi.nullptr, + enc, + error); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString initWithContentsOfFile_usedEncoding_error_( + NSString? path, + ffi.Pointer enc, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_362( + _id, + _lib._sel_initWithContentsOfFile_usedEncoding_error_1, + path?._id ?? ffi.nullptr, + enc, + error); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString stringWithContentsOfURL_usedEncoding_error_( + SentryCocoa _lib, + NSURL? url, + ffi.Pointer enc, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_361( + _lib._class_NSString1, + _lib._sel_stringWithContentsOfURL_usedEncoding_error_1, + url?._id ?? ffi.nullptr, + enc, + error); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString stringWithContentsOfFile_usedEncoding_error_( + SentryCocoa _lib, + NSString? path, + ffi.Pointer enc, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_362( + _lib._class_NSString1, + _lib._sel_stringWithContentsOfFile_usedEncoding_error_1, + path?._id ?? ffi.nullptr, + enc, + error); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static int + stringEncodingForData_encodingOptions_convertedString_usedLossyConversion_( + SentryCocoa _lib, + NSData? data, + NSDictionary? opts, + ffi.Pointer> string, + ffi.Pointer usedLossyConversion) { + return _lib._objc_msgSend_363( + _lib._class_NSString1, + _lib._sel_stringEncodingForData_encodingOptions_convertedString_usedLossyConversion_1, + data?._id ?? ffi.nullptr, + opts?._id ?? ffi.nullptr, + string, + usedLossyConversion); + } + + NSObject propertyList() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_propertyList1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSDictionary propertyListFromStringsFileFormat() { + final _ret = _lib._objc_msgSend_170( + _id, _lib._sel_propertyListFromStringsFileFormat1); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + ffi.Pointer cString() { + return _lib._objc_msgSend_13(_id, _lib._sel_cString1); + } + + ffi.Pointer lossyCString() { + return _lib._objc_msgSend_13(_id, _lib._sel_lossyCString1); + } + + int cStringLength() { + return _lib._objc_msgSend_10(_id, _lib._sel_cStringLength1); + } + + void getCString_(ffi.Pointer bytes) { + _lib._objc_msgSend_266(_id, _lib._sel_getCString_1, bytes); + } + + void getCString_maxLength_(ffi.Pointer bytes, int maxLength) { + _lib._objc_msgSend_364( + _id, _lib._sel_getCString_maxLength_1, bytes, maxLength); + } + + void getCString_maxLength_range_remainingRange_(ffi.Pointer bytes, + int maxLength, _NSRange aRange, ffi.Pointer<_NSRange> leftoverRange) { + _lib._objc_msgSend_365( + _id, + _lib._sel_getCString_maxLength_range_remainingRange_1, + bytes, + maxLength, + aRange, + leftoverRange); + } + + bool writeToFile_atomically_(NSString? path, bool useAuxiliaryFile) { + return _lib._objc_msgSend_25(_id, _lib._sel_writeToFile_atomically_1, + path?._id ?? ffi.nullptr, useAuxiliaryFile); + } + + bool writeToURL_atomically_(NSURL? url, bool atomically) { + return _lib._objc_msgSend_125(_id, _lib._sel_writeToURL_atomically_1, + url?._id ?? ffi.nullptr, atomically); + } + + NSObject initWithContentsOfFile_(NSString? path) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithContentsOfFile_1, path?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject initWithContentsOfURL_(NSURL? url) { + final _ret = _lib._objc_msgSend_241( + _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject stringWithContentsOfFile_(SentryCocoa _lib, NSString? path) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSString1, + _lib._sel_stringWithContentsOfFile_1, path?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject stringWithContentsOfURL_(SentryCocoa _lib, NSURL? url) { + final _ret = _lib._objc_msgSend_241(_lib._class_NSString1, + _lib._sel_stringWithContentsOfURL_1, url?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject initWithCStringNoCopy_length_freeWhenDone_( + ffi.Pointer bytes, int length, bool freeBuffer) { + final _ret = _lib._objc_msgSend_366( + _id, + _lib._sel_initWithCStringNoCopy_length_freeWhenDone_1, + bytes, + length, + freeBuffer); + return NSObject._(_ret, _lib, retain: false, release: true); + } + + NSObject initWithCString_length_(ffi.Pointer bytes, int length) { + final _ret = _lib._objc_msgSend_358( + _id, _lib._sel_initWithCString_length_1, bytes, length); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject initWithCString_(ffi.Pointer bytes) { + final _ret = + _lib._objc_msgSend_347(_id, _lib._sel_initWithCString_1, bytes); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject stringWithCString_length_( + SentryCocoa _lib, ffi.Pointer bytes, int length) { + final _ret = _lib._objc_msgSend_358(_lib._class_NSString1, + _lib._sel_stringWithCString_length_1, bytes, length); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject stringWithCString_( + SentryCocoa _lib, ffi.Pointer bytes) { + final _ret = _lib._objc_msgSend_347( + _lib._class_NSString1, _lib._sel_stringWithCString_1, bytes); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void getCharacters_(ffi.Pointer buffer) { + _lib._objc_msgSend_367(_id, _lib._sel_getCharacters_1, buffer); + } + + NSString variantFittingPresentationWidth_(int width) { + final _ret = _lib._objc_msgSend_368( + _id, _lib._sel_variantFittingPresentationWidth_1, width); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString pathWithComponents_(SentryCocoa _lib, NSArray? components) { + final _ret = _lib._objc_msgSend_369(_lib._class_NSString1, + _lib._sel_pathWithComponents_1, components?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSArray? get pathComponents { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_pathComponents1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + bool get absolutePath { + return _lib._objc_msgSend_12(_id, _lib._sel_isAbsolutePath1); + } + + NSString? get lastPathComponent { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_lastPathComponent1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get stringByDeletingLastPathComponent { + final _ret = _lib._objc_msgSend_20( + _id, _lib._sel_stringByDeletingLastPathComponent1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString stringByAppendingPathComponent_(NSString? str) { + final _ret = _lib._objc_msgSend_64(_id, + _lib._sel_stringByAppendingPathComponent_1, str?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get pathExtension { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_pathExtension1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get stringByDeletingPathExtension { + final _ret = + _lib._objc_msgSend_20(_id, _lib._sel_stringByDeletingPathExtension1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString stringByAppendingPathExtension_(NSString? str) { + final _ret = _lib._objc_msgSend_64(_id, + _lib._sel_stringByAppendingPathExtension_1, str?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get stringByAbbreviatingWithTildeInPath { + final _ret = _lib._objc_msgSend_20( + _id, _lib._sel_stringByAbbreviatingWithTildeInPath1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get stringByExpandingTildeInPath { + final _ret = + _lib._objc_msgSend_20(_id, _lib._sel_stringByExpandingTildeInPath1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get stringByStandardizingPath { + final _ret = + _lib._objc_msgSend_20(_id, _lib._sel_stringByStandardizingPath1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get stringByResolvingSymlinksInPath { + final _ret = + _lib._objc_msgSend_20(_id, _lib._sel_stringByResolvingSymlinksInPath1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSArray stringsByAppendingPaths_(NSArray? paths) { + final _ret = _lib._objc_msgSend_63( + _id, _lib._sel_stringsByAppendingPaths_1, paths?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + int completePathIntoString_caseSensitive_matchesIntoArray_filterTypes_( + ffi.Pointer> outputName, + bool flag, + ffi.Pointer> outputArray, + NSArray? filterTypes) { + return _lib._objc_msgSend_370( + _id, + _lib._sel_completePathIntoString_caseSensitive_matchesIntoArray_filterTypes_1, + outputName, + flag, + outputArray, + filterTypes?._id ?? ffi.nullptr); + } + + ffi.Pointer get fileSystemRepresentation { + return _lib._objc_msgSend_13(_id, _lib._sel_fileSystemRepresentation1); + } + + bool getFileSystemRepresentation_maxLength_( + ffi.Pointer cname, int max) { + return _lib._objc_msgSend_224( + _id, _lib._sel_getFileSystemRepresentation_maxLength_1, cname, max); + } + + NSString stringByAddingPercentEncodingWithAllowedCharacters_( + NSCharacterSet? allowedCharacters) { + final _ret = _lib._objc_msgSend_335( + _id, + _lib._sel_stringByAddingPercentEncodingWithAllowedCharacters_1, + allowedCharacters?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get stringByRemovingPercentEncoding { + final _ret = + _lib._objc_msgSend_20(_id, _lib._sel_stringByRemovingPercentEncoding1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString stringByAddingPercentEscapesUsingEncoding_(int enc) { + final _ret = _lib._objc_msgSend_308( + _id, _lib._sel_stringByAddingPercentEscapesUsingEncoding_1, enc); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString stringByReplacingPercentEscapesUsingEncoding_(int enc) { + final _ret = _lib._objc_msgSend_308( + _id, _lib._sel_stringByReplacingPercentEscapesUsingEncoding_1, enc); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSArray linguisticTagsInRange_scheme_options_orthography_tokenRanges_( + _NSRange range, + NSString scheme, + int options, + NSOrthography? orthography, + ffi.Pointer> tokenRanges) { + final _ret = _lib._objc_msgSend_372( + _id, + _lib._sel_linguisticTagsInRange_scheme_options_orthography_tokenRanges_1, + range, + scheme._id, + options, + orthography?._id ?? ffi.nullptr, + tokenRanges); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + void enumerateLinguisticTagsInRange_scheme_options_orthography_usingBlock_( + _NSRange range, + NSString scheme, + int options, + NSOrthography? orthography, + ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool block) { + _lib._objc_msgSend_373( + _id, + _lib._sel_enumerateLinguisticTagsInRange_scheme_options_orthography_usingBlock_1, + range, + scheme._id, + options, + orthography?._id ?? ffi.nullptr, + block._id); + } + + static NSString new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSString1, _lib._sel_new1); + return NSString._(_ret, _lib, retain: false, release: true); + } + + static NSString allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSString1, _lib._sel_allocWithZone_1, zone); + return NSString._(_ret, _lib, retain: false, release: true); + } + + static NSString alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSString1, _lib._sel_alloc1); + return NSString._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSString1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSString1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSString1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSString1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSString1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSString1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSString1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSString1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSString1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +extension StringToNSString on String { + NSString toNSString(SentryCocoa lib) => NSString(lib, this); +} + +class NSCoder extends NSObject { + NSCoder._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSCoder] that points to the same underlying object as [other]. + static NSCoder castFrom(T other) { + return NSCoder._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSCoder] that wraps the given raw object pointer. + static NSCoder castFromPointer(SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSCoder._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSCoder]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSCoder1); + } + + void encodeValueOfObjCType_at_( + ffi.Pointer type, ffi.Pointer addr) { + _lib._objc_msgSend_18( + _id, _lib._sel_encodeValueOfObjCType_at_1, type, addr); + } + + void encodeDataObject_(NSData? data) { + _lib._objc_msgSend_263( + _id, _lib._sel_encodeDataObject_1, data?._id ?? ffi.nullptr); + } + + NSData decodeDataObject() { + final _ret = _lib._objc_msgSend_39(_id, _lib._sel_decodeDataObject1); + return NSData._(_ret, _lib, retain: true, release: true); + } + + void decodeValueOfObjCType_at_size_( + ffi.Pointer type, ffi.Pointer data, int size) { + _lib._objc_msgSend_264( + _id, _lib._sel_decodeValueOfObjCType_at_size_1, type, data, size); + } + + int versionForClassName_(NSString? className) { + return _lib._objc_msgSend_265( + _id, _lib._sel_versionForClassName_1, className?._id ?? ffi.nullptr); + } + + void encodeObject_(NSObject object) { + _lib._objc_msgSend_15(_id, _lib._sel_encodeObject_1, object._id); + } + + void encodeRootObject_(NSObject rootObject) { + _lib._objc_msgSend_15(_id, _lib._sel_encodeRootObject_1, rootObject._id); + } + + void encodeBycopyObject_(NSObject anObject) { + _lib._objc_msgSend_15(_id, _lib._sel_encodeBycopyObject_1, anObject._id); + } + + void encodeByrefObject_(NSObject anObject) { + _lib._objc_msgSend_15(_id, _lib._sel_encodeByrefObject_1, anObject._id); + } + + void encodeConditionalObject_(NSObject object) { + _lib._objc_msgSend_15(_id, _lib._sel_encodeConditionalObject_1, object._id); + } + + void encodeValuesOfObjCTypes_(ffi.Pointer types) { + _lib._objc_msgSend_266(_id, _lib._sel_encodeValuesOfObjCTypes_1, types); + } + + void encodeArrayOfObjCType_count_at_( + ffi.Pointer type, int count, ffi.Pointer array) { + _lib._objc_msgSend_267( + _id, _lib._sel_encodeArrayOfObjCType_count_at_1, type, count, array); + } + + void encodeBytes_length_(ffi.Pointer byteaddr, int length) { + _lib._objc_msgSend_21( + _id, _lib._sel_encodeBytes_length_1, byteaddr, length); + } + + NSObject decodeObject() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_decodeObject1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject decodeTopLevelObjectAndReturnError_( + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_268( + _id, _lib._sel_decodeTopLevelObjectAndReturnError_1, error); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void decodeValuesOfObjCTypes_(ffi.Pointer types) { + _lib._objc_msgSend_266(_id, _lib._sel_decodeValuesOfObjCTypes_1, types); + } + + void decodeArrayOfObjCType_count_at_( + ffi.Pointer itemType, int count, ffi.Pointer array) { + _lib._objc_msgSend_267(_id, _lib._sel_decodeArrayOfObjCType_count_at_1, + itemType, count, array); + } + + ffi.Pointer decodeBytesWithReturnedLength_( + ffi.Pointer lengthp) { + return _lib._objc_msgSend_269( + _id, _lib._sel_decodeBytesWithReturnedLength_1, lengthp); + } + + void encodePropertyList_(NSObject aPropertyList) { + _lib._objc_msgSend_15( + _id, _lib._sel_encodePropertyList_1, aPropertyList._id); + } + + NSObject decodePropertyList() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_decodePropertyList1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void setObjectZone_(ffi.Pointer<_NSZone> zone) { + _lib._objc_msgSend_270(_id, _lib._sel_setObjectZone_1, zone); + } + + ffi.Pointer<_NSZone> objectZone() { + return _lib._objc_msgSend_271(_id, _lib._sel_objectZone1); + } + + int get systemVersion { + return _lib._objc_msgSend_197(_id, _lib._sel_systemVersion1); + } + + bool get allowsKeyedCoding { + return _lib._objc_msgSend_12(_id, _lib._sel_allowsKeyedCoding1); + } + + void encodeObject_forKey_(NSObject object, NSString? key) { + _lib._objc_msgSend_126(_id, _lib._sel_encodeObject_forKey_1, object._id, + key?._id ?? ffi.nullptr); + } + + void encodeConditionalObject_forKey_(NSObject object, NSString? key) { + _lib._objc_msgSend_126(_id, _lib._sel_encodeConditionalObject_forKey_1, + object._id, key?._id ?? ffi.nullptr); + } + + void encodeBool_forKey_(bool value, NSString? key) { + _lib._objc_msgSend_272( + _id, _lib._sel_encodeBool_forKey_1, value, key?._id ?? ffi.nullptr); + } + + void encodeInt_forKey_(int value, NSString? key) { + _lib._objc_msgSend_273( + _id, _lib._sel_encodeInt_forKey_1, value, key?._id ?? ffi.nullptr); + } + + void encodeInt32_forKey_(int value, NSString? key) { + _lib._objc_msgSend_274( + _id, _lib._sel_encodeInt32_forKey_1, value, key?._id ?? ffi.nullptr); + } + + void encodeInt64_forKey_(int value, NSString? key) { + _lib._objc_msgSend_275( + _id, _lib._sel_encodeInt64_forKey_1, value, key?._id ?? ffi.nullptr); + } + + void encodeFloat_forKey_(double value, NSString? key) { + _lib._objc_msgSend_276( + _id, _lib._sel_encodeFloat_forKey_1, value, key?._id ?? ffi.nullptr); + } + + void encodeDouble_forKey_(double value, NSString? key) { + _lib._objc_msgSend_277( + _id, _lib._sel_encodeDouble_forKey_1, value, key?._id ?? ffi.nullptr); + } + + void encodeBytes_length_forKey_( + ffi.Pointer bytes, int length, NSString? key) { + _lib._objc_msgSend_278(_id, _lib._sel_encodeBytes_length_forKey_1, bytes, + length, key?._id ?? ffi.nullptr); + } + + bool containsValueForKey_(NSString? key) { + return _lib._objc_msgSend_59( + _id, _lib._sel_containsValueForKey_1, key?._id ?? ffi.nullptr); + } + + NSObject decodeObjectForKey_(NSString? key) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_decodeObjectForKey_1, key?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject decodeTopLevelObjectForKey_error_( + NSString? key, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_279( + _id, + _lib._sel_decodeTopLevelObjectForKey_error_1, + key?._id ?? ffi.nullptr, + error); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + bool decodeBoolForKey_(NSString? key) { + return _lib._objc_msgSend_59( + _id, _lib._sel_decodeBoolForKey_1, key?._id ?? ffi.nullptr); + } + + int decodeIntForKey_(NSString? key) { + return _lib._objc_msgSend_280( + _id, _lib._sel_decodeIntForKey_1, key?._id ?? ffi.nullptr); + } + + int decodeInt32ForKey_(NSString? key) { + return _lib._objc_msgSend_281( + _id, _lib._sel_decodeInt32ForKey_1, key?._id ?? ffi.nullptr); + } + + int decodeInt64ForKey_(NSString? key) { + return _lib._objc_msgSend_282( + _id, _lib._sel_decodeInt64ForKey_1, key?._id ?? ffi.nullptr); + } + + double decodeFloatForKey_(NSString? key) { + return _lib._objc_msgSend_283( + _id, _lib._sel_decodeFloatForKey_1, key?._id ?? ffi.nullptr); + } + + double decodeDoubleForKey_(NSString? key) { + return _lib._objc_msgSend_284( + _id, _lib._sel_decodeDoubleForKey_1, key?._id ?? ffi.nullptr); + } + + ffi.Pointer decodeBytesForKey_returnedLength_( + NSString? key, ffi.Pointer lengthp) { + return _lib._objc_msgSend_285( + _id, + _lib._sel_decodeBytesForKey_returnedLength_1, + key?._id ?? ffi.nullptr, + lengthp); + } + + void encodeInteger_forKey_(int value, NSString? key) { + _lib._objc_msgSend_286( + _id, _lib._sel_encodeInteger_forKey_1, value, key?._id ?? ffi.nullptr); + } + + int decodeIntegerForKey_(NSString? key) { + return _lib._objc_msgSend_265( + _id, _lib._sel_decodeIntegerForKey_1, key?._id ?? ffi.nullptr); + } + + bool get requiresSecureCoding { + return _lib._objc_msgSend_12(_id, _lib._sel_requiresSecureCoding1); + } + + NSObject decodeObjectOfClass_forKey_(NSObject aClass, NSString? key) { + final _ret = _lib._objc_msgSend_287( + _id, + _lib._sel_decodeObjectOfClass_forKey_1, + aClass._id, + key?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject decodeTopLevelObjectOfClass_forKey_error_(NSObject aClass, + NSString? key, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_288( + _id, + _lib._sel_decodeTopLevelObjectOfClass_forKey_error_1, + aClass._id, + key?._id ?? ffi.nullptr, + error); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSArray decodeArrayOfObjectsOfClass_forKey_(NSObject cls, NSString? key) { + final _ret = _lib._objc_msgSend_289( + _id, + _lib._sel_decodeArrayOfObjectsOfClass_forKey_1, + cls._id, + key?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSDictionary decodeDictionaryWithKeysOfClass_objectsOfClass_forKey_( + NSObject keyCls, NSObject objectCls, NSString? key) { + final _ret = _lib._objc_msgSend_290( + _id, + _lib._sel_decodeDictionaryWithKeysOfClass_objectsOfClass_forKey_1, + keyCls._id, + objectCls._id, + key?._id ?? ffi.nullptr); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSObject decodeObjectOfClasses_forKey_(NSSet? classes, NSString? key) { + final _ret = _lib._objc_msgSend_291( + _id, + _lib._sel_decodeObjectOfClasses_forKey_1, + classes?._id ?? ffi.nullptr, + key?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject decodeTopLevelObjectOfClasses_forKey_error_(NSSet? classes, + NSString? key, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_292( + _id, + _lib._sel_decodeTopLevelObjectOfClasses_forKey_error_1, + classes?._id ?? ffi.nullptr, + key?._id ?? ffi.nullptr, + error); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSArray decodeArrayOfObjectsOfClasses_forKey_(NSSet? classes, NSString? key) { + final _ret = _lib._objc_msgSend_293( + _id, + _lib._sel_decodeArrayOfObjectsOfClasses_forKey_1, + classes?._id ?? ffi.nullptr, + key?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSDictionary decodeDictionaryWithKeysOfClasses_objectsOfClasses_forKey_( + NSSet? keyClasses, NSSet? objectClasses, NSString? key) { + final _ret = _lib._objc_msgSend_294( + _id, + _lib._sel_decodeDictionaryWithKeysOfClasses_objectsOfClasses_forKey_1, + keyClasses?._id ?? ffi.nullptr, + objectClasses?._id ?? ffi.nullptr, + key?._id ?? ffi.nullptr); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSObject decodePropertyListForKey_(NSString? key) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_decodePropertyListForKey_1, key?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSSet? get allowedClasses { + final _ret = _lib._objc_msgSend_295(_id, _lib._sel_allowedClasses1); + return _ret.address == 0 + ? null + : NSSet._(_ret, _lib, retain: true, release: true); + } + + void failWithError_(NSError? error) { + _lib._objc_msgSend_296( + _id, _lib._sel_failWithError_1, error?._id ?? ffi.nullptr); + } + + int get decodingFailurePolicy { + return _lib._objc_msgSend_297(_id, _lib._sel_decodingFailurePolicy1); + } + + NSError? get error { + final _ret = _lib._objc_msgSend_298(_id, _lib._sel_error1); + return _ret.address == 0 + ? null + : NSError._(_ret, _lib, retain: true, release: true); + } + + void encodeNXObject_(NSObject object) { + _lib._objc_msgSend_15(_id, _lib._sel_encodeNXObject_1, object._id); + } + + NSObject decodeNXObject() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_decodeNXObject1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void decodeValueOfObjCType_at_( + ffi.Pointer type, ffi.Pointer data) { + _lib._objc_msgSend_18( + _id, _lib._sel_decodeValueOfObjCType_at_1, type, data); + } + + void encodePoint_(CGPoint point) { + _lib._objc_msgSend_299(_id, _lib._sel_encodePoint_1, point); + } + + void decodePoint(ffi.Pointer stret) { + _lib._objc_msgSend_54(stret, _id, _lib._sel_decodePoint1); + } + + void encodeSize_(CGSize size) { + _lib._objc_msgSend_300(_id, _lib._sel_encodeSize_1, size); + } + + void decodeSize(ffi.Pointer stret) { + _lib._objc_msgSend_55(stret, _id, _lib._sel_decodeSize1); + } + + void encodeRect_(CGRect rect) { + _lib._objc_msgSend_301(_id, _lib._sel_encodeRect_1, rect); + } + + void decodeRect(ffi.Pointer stret) { + _lib._objc_msgSend_56(stret, _id, _lib._sel_decodeRect1); + } + + void encodePoint_forKey_(CGPoint point, NSString? key) { + _lib._objc_msgSend_302( + _id, _lib._sel_encodePoint_forKey_1, point, key?._id ?? ffi.nullptr); + } + + void encodeSize_forKey_(CGSize size, NSString? key) { + _lib._objc_msgSend_303( + _id, _lib._sel_encodeSize_forKey_1, size, key?._id ?? ffi.nullptr); + } + + void encodeRect_forKey_(CGRect rect, NSString? key) { + _lib._objc_msgSend_304( + _id, _lib._sel_encodeRect_forKey_1, rect, key?._id ?? ffi.nullptr); + } + + void decodePointForKey_(ffi.Pointer stret, NSString? key) { + _lib._objc_msgSend_305( + stret, _id, _lib._sel_decodePointForKey_1, key?._id ?? ffi.nullptr); + } + + void decodeSizeForKey_(ffi.Pointer stret, NSString? key) { + _lib._objc_msgSend_306( + stret, _id, _lib._sel_decodeSizeForKey_1, key?._id ?? ffi.nullptr); + } + + void decodeRectForKey_(ffi.Pointer stret, NSString? key) { + _lib._objc_msgSend_307( + stret, _id, _lib._sel_decodeRectForKey_1, key?._id ?? ffi.nullptr); + } + + @override + NSCoder init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSCoder._(_ret, _lib, retain: true, release: true); + } + + static NSCoder new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSCoder1, _lib._sel_new1); + return NSCoder._(_ret, _lib, retain: false, release: true); + } + + static NSCoder allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSCoder1, _lib._sel_allocWithZone_1, zone); + return NSCoder._(_ret, _lib, retain: false, release: true); + } + + static NSCoder alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSCoder1, _lib._sel_alloc1); + return NSCoder._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSCoder1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSCoder1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSCoder1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSCoder1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSCoder1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSCoder1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSCoder1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSCoder1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSCoder1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSData extends NSObject { + NSData._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSData] that points to the same underlying object as [other]. + static NSData castFrom(T other) { + return NSData._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSData] that wraps the given raw object pointer. + static NSData castFromPointer(SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSData._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSData]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSData1); + } + + int get length { + return _lib._objc_msgSend_10(_id, _lib._sel_length1); + } + + ffi.Pointer get bytes { + return _lib._objc_msgSend_19(_id, _lib._sel_bytes1); + } + + NSString? get description { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + void getBytes_length_(ffi.Pointer buffer, int length) { + _lib._objc_msgSend_21(_id, _lib._sel_getBytes_length_1, buffer, length); + } + + void getBytes_range_(ffi.Pointer buffer, _NSRange range) { + _lib._objc_msgSend_22(_id, _lib._sel_getBytes_range_1, buffer, range); + } + + bool isEqualToData_(NSData? other) { + return _lib._objc_msgSend_23( + _id, _lib._sel_isEqualToData_1, other?._id ?? ffi.nullptr); + } + + NSData subdataWithRange_(_NSRange range) { + final _ret = + _lib._objc_msgSend_24(_id, _lib._sel_subdataWithRange_1, range); + return NSData._(_ret, _lib, retain: true, release: true); + } + + bool writeToFile_atomically_(NSString? path, bool useAuxiliaryFile) { + return _lib._objc_msgSend_25(_id, _lib._sel_writeToFile_atomically_1, + path?._id ?? ffi.nullptr, useAuxiliaryFile); + } + + bool writeToURL_atomically_(NSURL? url, bool atomically) { + return _lib._objc_msgSend_125(_id, _lib._sel_writeToURL_atomically_1, + url?._id ?? ffi.nullptr, atomically); + } + + bool writeToFile_options_error_(NSString? path, int writeOptionsMask, + ffi.Pointer> errorPtr) { + return _lib._objc_msgSend_248(_id, _lib._sel_writeToFile_options_error_1, + path?._id ?? ffi.nullptr, writeOptionsMask, errorPtr); + } + + bool writeToURL_options_error_(NSURL? url, int writeOptionsMask, + ffi.Pointer> errorPtr) { + return _lib._objc_msgSend_249(_id, _lib._sel_writeToURL_options_error_1, + url?._id ?? ffi.nullptr, writeOptionsMask, errorPtr); + } + + void rangeOfData_options_range_(ffi.Pointer<_NSRange> stret, + NSData? dataToFind, int mask, _NSRange searchRange) { + _lib._objc_msgSend_250(stret, _id, _lib._sel_rangeOfData_options_range_1, + dataToFind?._id ?? ffi.nullptr, mask, searchRange); + } + + void enumerateByteRangesUsingBlock_( + ObjCBlock_ffiVoid_ffiVoid_NSRange_bool block) { + _lib._objc_msgSend_251( + _id, _lib._sel_enumerateByteRangesUsingBlock_1, block._id); + } + + static NSData data(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSData1, _lib._sel_data1); + return NSData._(_ret, _lib, retain: true, release: true); + } + + static NSData dataWithBytes_length_( + SentryCocoa _lib, ffi.Pointer bytes, int length) { + final _ret = _lib._objc_msgSend_252( + _lib._class_NSData1, _lib._sel_dataWithBytes_length_1, bytes, length); + return NSData._(_ret, _lib, retain: true, release: true); + } + + static NSData dataWithBytesNoCopy_length_( + SentryCocoa _lib, ffi.Pointer bytes, int length) { + final _ret = _lib._objc_msgSend_252(_lib._class_NSData1, + _lib._sel_dataWithBytesNoCopy_length_1, bytes, length); + return NSData._(_ret, _lib, retain: false, release: true); + } + + static NSData dataWithBytesNoCopy_length_freeWhenDone_( + SentryCocoa _lib, ffi.Pointer bytes, int length, bool b) { + final _ret = _lib._objc_msgSend_253(_lib._class_NSData1, + _lib._sel_dataWithBytesNoCopy_length_freeWhenDone_1, bytes, length, b); + return NSData._(_ret, _lib, retain: false, release: true); + } + + static NSData dataWithContentsOfFile_options_error_( + SentryCocoa _lib, + NSString? path, + int readOptionsMask, + ffi.Pointer> errorPtr) { + final _ret = _lib._objc_msgSend_254( + _lib._class_NSData1, + _lib._sel_dataWithContentsOfFile_options_error_1, + path?._id ?? ffi.nullptr, + readOptionsMask, + errorPtr); + return NSData._(_ret, _lib, retain: true, release: true); + } + + static NSData dataWithContentsOfURL_options_error_( + SentryCocoa _lib, + NSURL? url, + int readOptionsMask, + ffi.Pointer> errorPtr) { + final _ret = _lib._objc_msgSend_255( + _lib._class_NSData1, + _lib._sel_dataWithContentsOfURL_options_error_1, + url?._id ?? ffi.nullptr, + readOptionsMask, + errorPtr); + return NSData._(_ret, _lib, retain: true, release: true); + } + + static NSData dataWithContentsOfFile_(SentryCocoa _lib, NSString? path) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSData1, + _lib._sel_dataWithContentsOfFile_1, path?._id ?? ffi.nullptr); + return NSData._(_ret, _lib, retain: true, release: true); + } + + static NSData dataWithContentsOfURL_(SentryCocoa _lib, NSURL? url) { + final _ret = _lib._objc_msgSend_241(_lib._class_NSData1, + _lib._sel_dataWithContentsOfURL_1, url?._id ?? ffi.nullptr); + return NSData._(_ret, _lib, retain: true, release: true); + } + + NSData initWithBytes_length_(ffi.Pointer bytes, int length) { + final _ret = _lib._objc_msgSend_252( + _id, _lib._sel_initWithBytes_length_1, bytes, length); + return NSData._(_ret, _lib, retain: true, release: true); + } + + NSData initWithBytesNoCopy_length_(ffi.Pointer bytes, int length) { + final _ret = _lib._objc_msgSend_252( + _id, _lib._sel_initWithBytesNoCopy_length_1, bytes, length); + return NSData._(_ret, _lib, retain: false, release: true); + } + + NSData initWithBytesNoCopy_length_freeWhenDone_( + ffi.Pointer bytes, int length, bool b) { + final _ret = _lib._objc_msgSend_253(_id, + _lib._sel_initWithBytesNoCopy_length_freeWhenDone_1, bytes, length, b); + return NSData._(_ret, _lib, retain: false, release: true); + } + + NSData initWithBytesNoCopy_length_deallocator_(ffi.Pointer bytes, + int length, ObjCBlock_ffiVoid_ffiVoid_ffiUnsignedLong deallocator) { + final _ret = _lib._objc_msgSend_256( + _id, + _lib._sel_initWithBytesNoCopy_length_deallocator_1, + bytes, + length, + deallocator._id); + return NSData._(_ret, _lib, retain: false, release: true); + } + + NSData initWithContentsOfFile_options_error_(NSString? path, + int readOptionsMask, ffi.Pointer> errorPtr) { + final _ret = _lib._objc_msgSend_254( + _id, + _lib._sel_initWithContentsOfFile_options_error_1, + path?._id ?? ffi.nullptr, + readOptionsMask, + errorPtr); + return NSData._(_ret, _lib, retain: true, release: true); + } + + NSData initWithContentsOfURL_options_error_(NSURL? url, int readOptionsMask, + ffi.Pointer> errorPtr) { + final _ret = _lib._objc_msgSend_255( + _id, + _lib._sel_initWithContentsOfURL_options_error_1, + url?._id ?? ffi.nullptr, + readOptionsMask, + errorPtr); + return NSData._(_ret, _lib, retain: true, release: true); + } + + NSData initWithContentsOfFile_(NSString? path) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithContentsOfFile_1, path?._id ?? ffi.nullptr); + return NSData._(_ret, _lib, retain: true, release: true); + } + + NSData initWithContentsOfURL_(NSURL? url) { + final _ret = _lib._objc_msgSend_241( + _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr); + return NSData._(_ret, _lib, retain: true, release: true); + } + + NSData initWithData_(NSData? data) { + final _ret = _lib._objc_msgSend_257( + _id, _lib._sel_initWithData_1, data?._id ?? ffi.nullptr); + return NSData._(_ret, _lib, retain: true, release: true); + } + + static NSData dataWithData_(SentryCocoa _lib, NSData? data) { + final _ret = _lib._objc_msgSend_257(_lib._class_NSData1, + _lib._sel_dataWithData_1, data?._id ?? ffi.nullptr); + return NSData._(_ret, _lib, retain: true, release: true); + } + + NSData initWithBase64EncodedString_options_( + NSString? base64String, int options) { + final _ret = _lib._objc_msgSend_258( + _id, + _lib._sel_initWithBase64EncodedString_options_1, + base64String?._id ?? ffi.nullptr, + options); + return NSData._(_ret, _lib, retain: true, release: true); + } + + NSString base64EncodedStringWithOptions_(int options) { + final _ret = _lib._objc_msgSend_259( + _id, _lib._sel_base64EncodedStringWithOptions_1, options); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSData initWithBase64EncodedData_options_(NSData? base64Data, int options) { + final _ret = _lib._objc_msgSend_260( + _id, + _lib._sel_initWithBase64EncodedData_options_1, + base64Data?._id ?? ffi.nullptr, + options); + return NSData._(_ret, _lib, retain: true, release: true); + } + + NSData base64EncodedDataWithOptions_(int options) { + final _ret = _lib._objc_msgSend_261( + _id, _lib._sel_base64EncodedDataWithOptions_1, options); + return NSData._(_ret, _lib, retain: true, release: true); + } + + NSData decompressedDataUsingAlgorithm_error_( + int algorithm, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_262(_id, + _lib._sel_decompressedDataUsingAlgorithm_error_1, algorithm, error); + return NSData._(_ret, _lib, retain: true, release: true); + } + + NSData compressedDataUsingAlgorithm_error_( + int algorithm, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_262( + _id, _lib._sel_compressedDataUsingAlgorithm_error_1, algorithm, error); + return NSData._(_ret, _lib, retain: true, release: true); + } + + void getBytes_(ffi.Pointer buffer) { + _lib._objc_msgSend_47(_id, _lib._sel_getBytes_1, buffer); + } + + static NSObject dataWithContentsOfMappedFile_( + SentryCocoa _lib, NSString? path) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSData1, + _lib._sel_dataWithContentsOfMappedFile_1, path?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject initWithContentsOfMappedFile_(NSString? path) { + final _ret = _lib._objc_msgSend_30(_id, + _lib._sel_initWithContentsOfMappedFile_1, path?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject initWithBase64Encoding_(NSString? base64String) { + final _ret = _lib._objc_msgSend_30(_id, _lib._sel_initWithBase64Encoding_1, + base64String?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSString base64Encoding() { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_base64Encoding1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + @override + NSData init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSData._(_ret, _lib, retain: true, release: true); + } + + static NSData new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSData1, _lib._sel_new1); + return NSData._(_ret, _lib, retain: false, release: true); + } + + static NSData allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSData1, _lib._sel_allocWithZone_1, zone); + return NSData._(_ret, _lib, retain: false, release: true); + } + + static NSData alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSData1, _lib._sel_alloc1); + return NSData._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSData1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSData1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSData1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSData1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSData1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSData1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSData1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSData1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSData1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class _NSRange extends ffi.Struct { + @ffi.UnsignedLong() + external int location; + + @ffi.UnsignedLong() + external int length; +} + +class NSURL extends NSObject { + NSURL._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSURL] that points to the same underlying object as [other]. + static NSURL castFrom(T other) { + return NSURL._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSURL] that wraps the given raw object pointer. + static NSURL castFromPointer(SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSURL._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSURL]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSURL1); + } + + NSURL initWithScheme_host_path_( + NSString? scheme, NSString? host, NSString? path) { + final _ret = _lib._objc_msgSend_26( + _id, + _lib._sel_initWithScheme_host_path_1, + scheme?._id ?? ffi.nullptr, + host?._id ?? ffi.nullptr, + path?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL initFileURLWithPath_isDirectory_relativeToURL_( + NSString? path, bool isDir, NSURL? baseURL) { + final _ret = _lib._objc_msgSend_27( + _id, + _lib._sel_initFileURLWithPath_isDirectory_relativeToURL_1, + path?._id ?? ffi.nullptr, + isDir, + baseURL?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL initFileURLWithPath_relativeToURL_(NSString? path, NSURL? baseURL) { + final _ret = _lib._objc_msgSend_28( + _id, + _lib._sel_initFileURLWithPath_relativeToURL_1, + path?._id ?? ffi.nullptr, + baseURL?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL initFileURLWithPath_isDirectory_(NSString? path, bool isDir) { + final _ret = _lib._objc_msgSend_29( + _id, + _lib._sel_initFileURLWithPath_isDirectory_1, + path?._id ?? ffi.nullptr, + isDir); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL initFileURLWithPath_(NSString? path) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initFileURLWithPath_1, path?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + static NSURL fileURLWithPath_isDirectory_relativeToURL_( + SentryCocoa _lib, NSString? path, bool isDir, NSURL? baseURL) { + final _ret = _lib._objc_msgSend_31( + _lib._class_NSURL1, + _lib._sel_fileURLWithPath_isDirectory_relativeToURL_1, + path?._id ?? ffi.nullptr, + isDir, + baseURL?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + static NSURL fileURLWithPath_relativeToURL_( + SentryCocoa _lib, NSString? path, NSURL? baseURL) { + final _ret = _lib._objc_msgSend_32( + _lib._class_NSURL1, + _lib._sel_fileURLWithPath_relativeToURL_1, + path?._id ?? ffi.nullptr, + baseURL?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + static NSURL fileURLWithPath_isDirectory_( + SentryCocoa _lib, NSString? path, bool isDir) { + final _ret = _lib._objc_msgSend_33( + _lib._class_NSURL1, + _lib._sel_fileURLWithPath_isDirectory_1, + path?._id ?? ffi.nullptr, + isDir); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + static NSURL fileURLWithPath_(SentryCocoa _lib, NSString? path) { + final _ret = _lib._objc_msgSend_34(_lib._class_NSURL1, + _lib._sel_fileURLWithPath_1, path?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL initFileURLWithFileSystemRepresentation_isDirectory_relativeToURL_( + ffi.Pointer path, bool isDir, NSURL? baseURL) { + final _ret = _lib._objc_msgSend_35( + _id, + _lib._sel_initFileURLWithFileSystemRepresentation_isDirectory_relativeToURL_1, + path, + isDir, + baseURL?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + static NSURL fileURLWithFileSystemRepresentation_isDirectory_relativeToURL_( + SentryCocoa _lib, + ffi.Pointer path, + bool isDir, + NSURL? baseURL) { + final _ret = _lib._objc_msgSend_36( + _lib._class_NSURL1, + _lib._sel_fileURLWithFileSystemRepresentation_isDirectory_relativeToURL_1, + path, + isDir, + baseURL?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL initWithString_(NSString? URLString) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithString_1, URLString?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL initWithString_relativeToURL_(NSString? URLString, NSURL? baseURL) { + final _ret = _lib._objc_msgSend_28( + _id, + _lib._sel_initWithString_relativeToURL_1, + URLString?._id ?? ffi.nullptr, + baseURL?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + static NSURL URLWithString_(SentryCocoa _lib, NSString? URLString) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSURL1, + _lib._sel_URLWithString_1, URLString?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + static NSURL URLWithString_relativeToURL_( + SentryCocoa _lib, NSString? URLString, NSURL? baseURL) { + final _ret = _lib._objc_msgSend_28( + _lib._class_NSURL1, + _lib._sel_URLWithString_relativeToURL_1, + URLString?._id ?? ffi.nullptr, + baseURL?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL initWithDataRepresentation_relativeToURL_( + NSData? data, NSURL? baseURL) { + final _ret = _lib._objc_msgSend_37( + _id, + _lib._sel_initWithDataRepresentation_relativeToURL_1, + data?._id ?? ffi.nullptr, + baseURL?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + static NSURL URLWithDataRepresentation_relativeToURL_( + SentryCocoa _lib, NSData? data, NSURL? baseURL) { + final _ret = _lib._objc_msgSend_38( + _lib._class_NSURL1, + _lib._sel_URLWithDataRepresentation_relativeToURL_1, + data?._id ?? ffi.nullptr, + baseURL?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL initAbsoluteURLWithDataRepresentation_relativeToURL_( + NSData? data, NSURL? baseURL) { + final _ret = _lib._objc_msgSend_37( + _id, + _lib._sel_initAbsoluteURLWithDataRepresentation_relativeToURL_1, + data?._id ?? ffi.nullptr, + baseURL?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + static NSURL absoluteURLWithDataRepresentation_relativeToURL_( + SentryCocoa _lib, NSData? data, NSURL? baseURL) { + final _ret = _lib._objc_msgSend_38( + _lib._class_NSURL1, + _lib._sel_absoluteURLWithDataRepresentation_relativeToURL_1, + data?._id ?? ffi.nullptr, + baseURL?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSData? get dataRepresentation { + final _ret = _lib._objc_msgSend_39(_id, _lib._sel_dataRepresentation1); + return _ret.address == 0 + ? null + : NSData._(_ret, _lib, retain: true, release: true); + } + + NSString? get absoluteString { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_absoluteString1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get relativeString { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_relativeString1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSURL? get baseURL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_baseURL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL? get absoluteURL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_absoluteURL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + NSString? get scheme { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_scheme1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get resourceSpecifier { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_resourceSpecifier1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get host { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_host1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSNumber? get port { + final _ret = _lib._objc_msgSend_198(_id, _lib._sel_port1); + return _ret.address == 0 + ? null + : NSNumber._(_ret, _lib, retain: true, release: true); + } + + NSString? get user { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_user1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get password { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_password1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get path { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_path1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get fragment { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_fragment1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get parameterString { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_parameterString1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get query { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_query1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get relativePath { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_relativePath1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + bool get hasDirectoryPath { + return _lib._objc_msgSend_12(_id, _lib._sel_hasDirectoryPath1); + } + + bool getFileSystemRepresentation_maxLength_( + ffi.Pointer buffer, int maxBufferLength) { + return _lib._objc_msgSend_224( + _id, + _lib._sel_getFileSystemRepresentation_maxLength_1, + buffer, + maxBufferLength); + } + + ffi.Pointer get fileSystemRepresentation { + return _lib._objc_msgSend_13(_id, _lib._sel_fileSystemRepresentation1); + } + + bool get fileURL { + return _lib._objc_msgSend_12(_id, _lib._sel_isFileURL1); + } + + NSURL? get standardizedURL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_standardizedURL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + bool checkResourceIsReachableAndReturnError_( + ffi.Pointer> error) { + return _lib._objc_msgSend_225( + _id, _lib._sel_checkResourceIsReachableAndReturnError_1, error); + } + + bool isFileReferenceURL() { + return _lib._objc_msgSend_12(_id, _lib._sel_isFileReferenceURL1); + } + + NSURL fileReferenceURL() { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_fileReferenceURL1); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL? get filePathURL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_filePathURL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + bool getResourceValue_forKey_error_( + ffi.Pointer> value, + NSString key, + ffi.Pointer> error) { + return _lib._objc_msgSend_226( + _id, _lib._sel_getResourceValue_forKey_error_1, value, key._id, error); + } + + NSObject resourceValuesForKeys_error_( + NSArray? keys, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_227( + _id, + _lib._sel_resourceValuesForKeys_error_1, + keys?._id ?? ffi.nullptr, + error); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + bool setResourceValue_forKey_error_(NSObject value, NSString key, + ffi.Pointer> error) { + return _lib._objc_msgSend_228(_id, + _lib._sel_setResourceValue_forKey_error_1, value._id, key._id, error); + } + + bool setResourceValues_error_( + NSObject? keyedValues, ffi.Pointer> error) { + return _lib._objc_msgSend_229(_id, _lib._sel_setResourceValues_error_1, + keyedValues?._id ?? ffi.nullptr, error); + } + + void removeCachedResourceValueForKey_(NSString key) { + _lib._objc_msgSend_192( + _id, _lib._sel_removeCachedResourceValueForKey_1, key._id); + } + + void removeAllCachedResourceValues() { + _lib._objc_msgSend_1(_id, _lib._sel_removeAllCachedResourceValues1); + } + + void setTemporaryResourceValue_forKey_(NSObject value, NSString key) { + _lib._objc_msgSend_126( + _id, _lib._sel_setTemporaryResourceValue_forKey_1, value._id, key._id); + } + + NSData + bookmarkDataWithOptions_includingResourceValuesForKeys_relativeToURL_error_( + int options, + NSArray? keys, + NSURL? relativeURL, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_230( + _id, + _lib._sel_bookmarkDataWithOptions_includingResourceValuesForKeys_relativeToURL_error_1, + options, + keys?._id ?? ffi.nullptr, + relativeURL?._id ?? ffi.nullptr, + error); + return NSData._(_ret, _lib, retain: true, release: true); + } + + NSURL + initByResolvingBookmarkData_options_relativeToURL_bookmarkDataIsStale_error_( + NSData? bookmarkData, + int options, + NSURL? relativeURL, + ffi.Pointer isStale, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_231( + _id, + _lib._sel_initByResolvingBookmarkData_options_relativeToURL_bookmarkDataIsStale_error_1, + bookmarkData?._id ?? ffi.nullptr, + options, + relativeURL?._id ?? ffi.nullptr, + isStale, + error); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + static NSURL + URLByResolvingBookmarkData_options_relativeToURL_bookmarkDataIsStale_error_( + SentryCocoa _lib, + NSData? bookmarkData, + int options, + NSURL? relativeURL, + ffi.Pointer isStale, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_231( + _lib._class_NSURL1, + _lib._sel_URLByResolvingBookmarkData_options_relativeToURL_bookmarkDataIsStale_error_1, + bookmarkData?._id ?? ffi.nullptr, + options, + relativeURL?._id ?? ffi.nullptr, + isStale, + error); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + static NSObject resourceValuesForKeys_fromBookmarkData_( + SentryCocoa _lib, NSArray? keys, NSData? bookmarkData) { + final _ret = _lib._objc_msgSend_232( + _lib._class_NSURL1, + _lib._sel_resourceValuesForKeys_fromBookmarkData_1, + keys?._id ?? ffi.nullptr, + bookmarkData?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static bool writeBookmarkData_toURL_options_error_( + SentryCocoa _lib, + NSData? bookmarkData, + NSURL? bookmarkFileURL, + int options, + ffi.Pointer> error) { + return _lib._objc_msgSend_233( + _lib._class_NSURL1, + _lib._sel_writeBookmarkData_toURL_options_error_1, + bookmarkData?._id ?? ffi.nullptr, + bookmarkFileURL?._id ?? ffi.nullptr, + options, + error); + } + + static NSData bookmarkDataWithContentsOfURL_error_(SentryCocoa _lib, + NSURL? bookmarkFileURL, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_234( + _lib._class_NSURL1, + _lib._sel_bookmarkDataWithContentsOfURL_error_1, + bookmarkFileURL?._id ?? ffi.nullptr, + error); + return NSData._(_ret, _lib, retain: true, release: true); + } + + static NSURL URLByResolvingAliasFileAtURL_options_error_(SentryCocoa _lib, + NSURL? url, int options, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_235( + _lib._class_NSURL1, + _lib._sel_URLByResolvingAliasFileAtURL_options_error_1, + url?._id ?? ffi.nullptr, + options, + error); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + bool startAccessingSecurityScopedResource() { + return _lib._objc_msgSend_12( + _id, _lib._sel_startAccessingSecurityScopedResource1); + } + + void stopAccessingSecurityScopedResource() { + _lib._objc_msgSend_1(_id, _lib._sel_stopAccessingSecurityScopedResource1); + } + + bool getPromisedItemResourceValue_forKey_error_( + ffi.Pointer> value, + NSString key, + ffi.Pointer> error) { + return _lib._objc_msgSend_226( + _id, + _lib._sel_getPromisedItemResourceValue_forKey_error_1, + value, + key._id, + error); + } + + NSDictionary promisedItemResourceValuesForKeys_error_( + NSArray? keys, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_236( + _id, + _lib._sel_promisedItemResourceValuesForKeys_error_1, + keys?._id ?? ffi.nullptr, + error); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + bool checkPromisedItemIsReachableAndReturnError_( + ffi.Pointer> error) { + return _lib._objc_msgSend_225( + _id, _lib._sel_checkPromisedItemIsReachableAndReturnError_1, error); + } + + static NSURL fileURLWithPathComponents_( + SentryCocoa _lib, NSArray? components) { + final _ret = _lib._objc_msgSend_237(_lib._class_NSURL1, + _lib._sel_fileURLWithPathComponents_1, components?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSArray? get pathComponents { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_pathComponents1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSString? get lastPathComponent { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_lastPathComponent1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get pathExtension { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_pathExtension1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSURL URLByAppendingPathComponent_(NSString? pathComponent) { + final _ret = _lib._objc_msgSend_34( + _id, + _lib._sel_URLByAppendingPathComponent_1, + pathComponent?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL URLByAppendingPathComponent_isDirectory_( + NSString? pathComponent, bool isDirectory) { + final _ret = _lib._objc_msgSend_33( + _id, + _lib._sel_URLByAppendingPathComponent_isDirectory_1, + pathComponent?._id ?? ffi.nullptr, + isDirectory); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL? get URLByDeletingLastPathComponent { + final _ret = + _lib._objc_msgSend_40(_id, _lib._sel_URLByDeletingLastPathComponent1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL URLByAppendingPathExtension_(NSString? pathExtension) { + final _ret = _lib._objc_msgSend_34( + _id, + _lib._sel_URLByAppendingPathExtension_1, + pathExtension?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL? get URLByDeletingPathExtension { + final _ret = + _lib._objc_msgSend_40(_id, _lib._sel_URLByDeletingPathExtension1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL? get URLByStandardizingPath { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_URLByStandardizingPath1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL? get URLByResolvingSymlinksInPath { + final _ret = + _lib._objc_msgSend_40(_id, _lib._sel_URLByResolvingSymlinksInPath1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + NSData resourceDataUsingCache_(bool shouldUseCache) { + final _ret = _lib._objc_msgSend_238( + _id, _lib._sel_resourceDataUsingCache_1, shouldUseCache); + return NSData._(_ret, _lib, retain: true, release: true); + } + + void loadResourceDataNotifyingClient_usingCache_( + NSObject client, bool shouldUseCache) { + _lib._objc_msgSend_239( + _id, + _lib._sel_loadResourceDataNotifyingClient_usingCache_1, + client._id, + shouldUseCache); + } + + NSObject propertyForKey_(NSString? propertyKey) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_propertyForKey_1, propertyKey?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + bool setResourceData_(NSData? data) { + return _lib._objc_msgSend_23( + _id, _lib._sel_setResourceData_1, data?._id ?? ffi.nullptr); + } + + bool setProperty_forKey_(NSObject property, NSString? propertyKey) { + return _lib._objc_msgSend_240(_id, _lib._sel_setProperty_forKey_1, + property._id, propertyKey?._id ?? ffi.nullptr); + } + + NSURLHandle URLHandleUsingCache_(bool shouldUseCache) { + final _ret = _lib._objc_msgSend_247( + _id, _lib._sel_URLHandleUsingCache_1, shouldUseCache); + return NSURLHandle._(_ret, _lib, retain: true, release: true); + } + + @override + NSURL init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + static NSURL new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSURL1, _lib._sel_new1); + return NSURL._(_ret, _lib, retain: false, release: true); + } + + static NSURL allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSURL1, _lib._sel_allocWithZone_1, zone); + return NSURL._(_ret, _lib, retain: false, release: true); + } + + static NSURL alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSURL1, _lib._sel_alloc1); + return NSURL._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSURL1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSURL1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURL1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURL1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSURL1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSURL1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSURL1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSURL1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURL1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSNumber extends NSValue { + NSNumber._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSNumber] that points to the same underlying object as [other]. + static NSNumber castFrom(T other) { + return NSNumber._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSNumber] that wraps the given raw object pointer. + static NSNumber castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSNumber._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSNumber]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSNumber1); + } + + @override + NSNumber initWithCoder_(NSCoder? coder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + NSNumber initWithChar_(int value) { + final _ret = _lib._objc_msgSend_202(_id, _lib._sel_initWithChar_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + NSNumber initWithUnsignedChar_(int value) { + final _ret = + _lib._objc_msgSend_203(_id, _lib._sel_initWithUnsignedChar_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + NSNumber initWithShort_(int value) { + final _ret = _lib._objc_msgSend_204(_id, _lib._sel_initWithShort_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + NSNumber initWithUnsignedShort_(int value) { + final _ret = + _lib._objc_msgSend_205(_id, _lib._sel_initWithUnsignedShort_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + NSNumber initWithInt_(int value) { + final _ret = _lib._objc_msgSend_206(_id, _lib._sel_initWithInt_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + NSNumber initWithUnsignedInt_(int value) { + final _ret = + _lib._objc_msgSend_207(_id, _lib._sel_initWithUnsignedInt_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + NSNumber initWithLong_(int value) { + final _ret = _lib._objc_msgSend_208(_id, _lib._sel_initWithLong_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + NSNumber initWithUnsignedLong_(int value) { + final _ret = + _lib._objc_msgSend_209(_id, _lib._sel_initWithUnsignedLong_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + NSNumber initWithLongLong_(int value) { + final _ret = + _lib._objc_msgSend_210(_id, _lib._sel_initWithLongLong_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + NSNumber initWithUnsignedLongLong_(int value) { + final _ret = _lib._objc_msgSend_211( + _id, _lib._sel_initWithUnsignedLongLong_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + NSNumber initWithFloat_(double value) { + final _ret = _lib._objc_msgSend_212(_id, _lib._sel_initWithFloat_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + NSNumber initWithDouble_(double value) { + final _ret = _lib._objc_msgSend_213(_id, _lib._sel_initWithDouble_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + NSNumber initWithBool_(bool value) { + final _ret = _lib._objc_msgSend_214(_id, _lib._sel_initWithBool_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + NSNumber initWithInteger_(int value) { + final _ret = + _lib._objc_msgSend_208(_id, _lib._sel_initWithInteger_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + NSNumber initWithUnsignedInteger_(int value) { + final _ret = + _lib._objc_msgSend_209(_id, _lib._sel_initWithUnsignedInteger_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + int get charValue { + return _lib._objc_msgSend_215(_id, _lib._sel_charValue1); + } + + int get unsignedCharValue { + return _lib._objc_msgSend_216(_id, _lib._sel_unsignedCharValue1); + } + + int get shortValue { + return _lib._objc_msgSend_217(_id, _lib._sel_shortValue1); + } + + int get unsignedShortValue { + return _lib._objc_msgSend_218(_id, _lib._sel_unsignedShortValue1); + } + + int get intValue { + return _lib._objc_msgSend_219(_id, _lib._sel_intValue1); + } + + int get unsignedIntValue { + return _lib._objc_msgSend_197(_id, _lib._sel_unsignedIntValue1); + } + + int get longValue { + return _lib._objc_msgSend_78(_id, _lib._sel_longValue1); + } + + int get unsignedLongValue { + return _lib._objc_msgSend_10(_id, _lib._sel_unsignedLongValue1); + } + + int get longLongValue { + return _lib._objc_msgSend_220(_id, _lib._sel_longLongValue1); + } + + int get unsignedLongLongValue { + return _lib._objc_msgSend_154(_id, _lib._sel_unsignedLongLongValue1); + } + + double get floatValue { + return _lib._objc_msgSend_221(_id, _lib._sel_floatValue1); + } + + double get doubleValue { + return _lib._objc_msgSend_155(_id, _lib._sel_doubleValue1); + } + + bool get boolValue { + return _lib._objc_msgSend_12(_id, _lib._sel_boolValue1); + } + + int get integerValue { + return _lib._objc_msgSend_78(_id, _lib._sel_integerValue1); + } + + int get unsignedIntegerValue { + return _lib._objc_msgSend_10(_id, _lib._sel_unsignedIntegerValue1); + } + + NSString? get stringValue { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_stringValue1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + int compare_(NSNumber? otherNumber) { + return _lib._objc_msgSend_222( + _id, _lib._sel_compare_1, otherNumber?._id ?? ffi.nullptr); + } + + bool isEqualToNumber_(NSNumber? number) { + return _lib._objc_msgSend_223( + _id, _lib._sel_isEqualToNumber_1, number?._id ?? ffi.nullptr); + } + + NSString descriptionWithLocale_(NSObject locale) { + final _ret = _lib._objc_msgSend_65( + _id, _lib._sel_descriptionWithLocale_1, locale._id); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSNumber numberWithChar_(SentryCocoa _lib, int value) { + final _ret = _lib._objc_msgSend_202( + _lib._class_NSNumber1, _lib._sel_numberWithChar_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + static NSNumber numberWithUnsignedChar_(SentryCocoa _lib, int value) { + final _ret = _lib._objc_msgSend_203( + _lib._class_NSNumber1, _lib._sel_numberWithUnsignedChar_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + static NSNumber numberWithShort_(SentryCocoa _lib, int value) { + final _ret = _lib._objc_msgSend_204( + _lib._class_NSNumber1, _lib._sel_numberWithShort_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + static NSNumber numberWithUnsignedShort_(SentryCocoa _lib, int value) { + final _ret = _lib._objc_msgSend_205( + _lib._class_NSNumber1, _lib._sel_numberWithUnsignedShort_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + static NSNumber numberWithInt_(SentryCocoa _lib, int value) { + final _ret = _lib._objc_msgSend_206( + _lib._class_NSNumber1, _lib._sel_numberWithInt_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + static NSNumber numberWithUnsignedInt_(SentryCocoa _lib, int value) { + final _ret = _lib._objc_msgSend_207( + _lib._class_NSNumber1, _lib._sel_numberWithUnsignedInt_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + static NSNumber numberWithLong_(SentryCocoa _lib, int value) { + final _ret = _lib._objc_msgSend_208( + _lib._class_NSNumber1, _lib._sel_numberWithLong_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + static NSNumber numberWithUnsignedLong_(SentryCocoa _lib, int value) { + final _ret = _lib._objc_msgSend_209( + _lib._class_NSNumber1, _lib._sel_numberWithUnsignedLong_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + static NSNumber numberWithLongLong_(SentryCocoa _lib, int value) { + final _ret = _lib._objc_msgSend_210( + _lib._class_NSNumber1, _lib._sel_numberWithLongLong_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + static NSNumber numberWithUnsignedLongLong_(SentryCocoa _lib, int value) { + final _ret = _lib._objc_msgSend_211( + _lib._class_NSNumber1, _lib._sel_numberWithUnsignedLongLong_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + static NSNumber numberWithFloat_(SentryCocoa _lib, double value) { + final _ret = _lib._objc_msgSend_212( + _lib._class_NSNumber1, _lib._sel_numberWithFloat_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + static NSNumber numberWithDouble_(SentryCocoa _lib, double value) { + final _ret = _lib._objc_msgSend_213( + _lib._class_NSNumber1, _lib._sel_numberWithDouble_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + static NSNumber numberWithBool_(SentryCocoa _lib, bool value) { + final _ret = _lib._objc_msgSend_214( + _lib._class_NSNumber1, _lib._sel_numberWithBool_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + static NSNumber numberWithInteger_(SentryCocoa _lib, int value) { + final _ret = _lib._objc_msgSend_208( + _lib._class_NSNumber1, _lib._sel_numberWithInteger_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + static NSNumber numberWithUnsignedInteger_(SentryCocoa _lib, int value) { + final _ret = _lib._objc_msgSend_209( + _lib._class_NSNumber1, _lib._sel_numberWithUnsignedInteger_1, value); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + @override + NSNumber initWithBytes_objCType_( + ffi.Pointer value, ffi.Pointer type) { + final _ret = _lib._objc_msgSend_41( + _id, _lib._sel_initWithBytes_objCType_1, value, type); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + static NSValue valueWithBytes_objCType_(SentryCocoa _lib, + ffi.Pointer value, ffi.Pointer type) { + final _ret = _lib._objc_msgSend_43(_lib._class_NSNumber1, + _lib._sel_valueWithBytes_objCType_1, value, type); + return NSValue._(_ret, _lib, retain: true, release: true); + } + + static NSValue value_withObjCType_(SentryCocoa _lib, + ffi.Pointer value, ffi.Pointer type) { + final _ret = _lib._objc_msgSend_43( + _lib._class_NSNumber1, _lib._sel_value_withObjCType_1, value, type); + return NSValue._(_ret, _lib, retain: true, release: true); + } + + static NSValue valueWithNonretainedObject_( + SentryCocoa _lib, NSObject anObject) { + final _ret = _lib._objc_msgSend_44(_lib._class_NSNumber1, + _lib._sel_valueWithNonretainedObject_1, anObject._id); + return NSValue._(_ret, _lib, retain: true, release: true); + } + + static NSValue valueWithPointer_( + SentryCocoa _lib, ffi.Pointer pointer) { + final _ret = _lib._objc_msgSend_45( + _lib._class_NSNumber1, _lib._sel_valueWithPointer_1, pointer); + return NSValue._(_ret, _lib, retain: true, release: true); + } + + static NSValue valueWithRange_(SentryCocoa _lib, _NSRange range) { + final _ret = _lib._objc_msgSend_48( + _lib._class_NSNumber1, _lib._sel_valueWithRange_1, range); + return NSValue._(_ret, _lib, retain: true, release: true); + } + + static NSValue valueWithPoint_(SentryCocoa _lib, CGPoint point) { + final _ret = _lib._objc_msgSend_50( + _lib._class_NSNumber1, _lib._sel_valueWithPoint_1, point); + return NSValue._(_ret, _lib, retain: true, release: true); + } + + static NSValue valueWithSize_(SentryCocoa _lib, CGSize size) { + final _ret = _lib._objc_msgSend_51( + _lib._class_NSNumber1, _lib._sel_valueWithSize_1, size); + return NSValue._(_ret, _lib, retain: true, release: true); + } + + static NSValue valueWithRect_(SentryCocoa _lib, CGRect rect) { + final _ret = _lib._objc_msgSend_52( + _lib._class_NSNumber1, _lib._sel_valueWithRect_1, rect); + return NSValue._(_ret, _lib, retain: true, release: true); + } + + static NSValue valueWithEdgeInsets_(SentryCocoa _lib, NSEdgeInsets insets) { + final _ret = _lib._objc_msgSend_53( + _lib._class_NSNumber1, _lib._sel_valueWithEdgeInsets_1, insets); + return NSValue._(_ret, _lib, retain: true, release: true); + } + + @override + NSNumber init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + static NSNumber new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSNumber1, _lib._sel_new1); + return NSNumber._(_ret, _lib, retain: false, release: true); + } + + static NSNumber allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSNumber1, _lib._sel_allocWithZone_1, zone); + return NSNumber._(_ret, _lib, retain: false, release: true); + } + + static NSNumber alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSNumber1, _lib._sel_alloc1); + return NSNumber._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSNumber1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSNumber1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSNumber1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSNumber1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSNumber1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSNumber1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSNumber1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSNumber1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSNumber1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSValue extends NSObject { + NSValue._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSValue] that points to the same underlying object as [other]. + static NSValue castFrom(T other) { + return NSValue._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSValue] that wraps the given raw object pointer. + static NSValue castFromPointer(SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSValue._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSValue]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSValue1); + } + + void getValue_size_(ffi.Pointer value, int size) { + _lib._objc_msgSend_21(_id, _lib._sel_getValue_size_1, value, size); + } + + ffi.Pointer get objCType { + return _lib._objc_msgSend_13(_id, _lib._sel_objCType1); + } + + NSValue initWithBytes_objCType_( + ffi.Pointer value, ffi.Pointer type) { + final _ret = _lib._objc_msgSend_41( + _id, _lib._sel_initWithBytes_objCType_1, value, type); + return NSValue._(_ret, _lib, retain: true, release: true); + } + + NSValue initWithCoder_(NSCoder? coder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr); + return NSValue._(_ret, _lib, retain: true, release: true); + } + + static NSValue valueWithBytes_objCType_(SentryCocoa _lib, + ffi.Pointer value, ffi.Pointer type) { + final _ret = _lib._objc_msgSend_43( + _lib._class_NSValue1, _lib._sel_valueWithBytes_objCType_1, value, type); + return NSValue._(_ret, _lib, retain: true, release: true); + } + + static NSValue value_withObjCType_(SentryCocoa _lib, + ffi.Pointer value, ffi.Pointer type) { + final _ret = _lib._objc_msgSend_43( + _lib._class_NSValue1, _lib._sel_value_withObjCType_1, value, type); + return NSValue._(_ret, _lib, retain: true, release: true); + } + + static NSValue valueWithNonretainedObject_( + SentryCocoa _lib, NSObject anObject) { + final _ret = _lib._objc_msgSend_44(_lib._class_NSValue1, + _lib._sel_valueWithNonretainedObject_1, anObject._id); + return NSValue._(_ret, _lib, retain: true, release: true); + } + + NSObject get nonretainedObjectValue { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_nonretainedObjectValue1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSValue valueWithPointer_( + SentryCocoa _lib, ffi.Pointer pointer) { + final _ret = _lib._objc_msgSend_45( + _lib._class_NSValue1, _lib._sel_valueWithPointer_1, pointer); + return NSValue._(_ret, _lib, retain: true, release: true); + } + + ffi.Pointer get pointerValue { + return _lib._objc_msgSend_19(_id, _lib._sel_pointerValue1); + } + + bool isEqualToValue_(NSValue? value) { + return _lib._objc_msgSend_46( + _id, _lib._sel_isEqualToValue_1, value?._id ?? ffi.nullptr); + } + + void getValue_(ffi.Pointer value) { + _lib._objc_msgSend_47(_id, _lib._sel_getValue_1, value); + } + + static NSValue valueWithRange_(SentryCocoa _lib, _NSRange range) { + final _ret = _lib._objc_msgSend_48( + _lib._class_NSValue1, _lib._sel_valueWithRange_1, range); + return NSValue._(_ret, _lib, retain: true, release: true); + } + + void getRangeValue(ffi.Pointer<_NSRange> stret) { + _lib._objc_msgSend_49(stret, _id, _lib._sel_rangeValue1); + } + + static NSValue valueWithPoint_(SentryCocoa _lib, CGPoint point) { + final _ret = _lib._objc_msgSend_50( + _lib._class_NSValue1, _lib._sel_valueWithPoint_1, point); + return NSValue._(_ret, _lib, retain: true, release: true); + } + + static NSValue valueWithSize_(SentryCocoa _lib, CGSize size) { + final _ret = _lib._objc_msgSend_51( + _lib._class_NSValue1, _lib._sel_valueWithSize_1, size); + return NSValue._(_ret, _lib, retain: true, release: true); + } + + static NSValue valueWithRect_(SentryCocoa _lib, CGRect rect) { + final _ret = _lib._objc_msgSend_52( + _lib._class_NSValue1, _lib._sel_valueWithRect_1, rect); + return NSValue._(_ret, _lib, retain: true, release: true); + } + + static NSValue valueWithEdgeInsets_(SentryCocoa _lib, NSEdgeInsets insets) { + final _ret = _lib._objc_msgSend_53( + _lib._class_NSValue1, _lib._sel_valueWithEdgeInsets_1, insets); + return NSValue._(_ret, _lib, retain: true, release: true); + } + + void getPointValue(ffi.Pointer stret) { + _lib._objc_msgSend_54(stret, _id, _lib._sel_pointValue1); + } + + void getSizeValue(ffi.Pointer stret) { + _lib._objc_msgSend_55(stret, _id, _lib._sel_sizeValue1); + } + + void getRectValue(ffi.Pointer stret) { + _lib._objc_msgSend_56(stret, _id, _lib._sel_rectValue1); + } + + void getEdgeInsetsValue(ffi.Pointer stret) { + _lib._objc_msgSend_57(stret, _id, _lib._sel_edgeInsetsValue1); + } + + @override + NSValue init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSValue._(_ret, _lib, retain: true, release: true); + } + + static NSValue new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSValue1, _lib._sel_new1); + return NSValue._(_ret, _lib, retain: false, release: true); + } + + static NSValue allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSValue1, _lib._sel_allocWithZone_1, zone); + return NSValue._(_ret, _lib, retain: false, release: true); + } + + static NSValue alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSValue1, _lib._sel_alloc1); + return NSValue._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSValue1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSValue1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSValue1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSValue1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSValue1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSValue1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSValue1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSValue1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSValue1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class CGPoint extends ffi.Struct { + @ffi.Double() + external double x; + + @ffi.Double() + external double y; +} + +class CGSize extends ffi.Struct { + @ffi.Double() + external double width; + + @ffi.Double() + external double height; +} + +class CGRect extends ffi.Struct { + external CGPoint origin; + + external CGSize size; +} + +class NSEdgeInsets extends ffi.Struct { + @ffi.Double() + external double top; + + @ffi.Double() + external double left; + + @ffi.Double() + external double bottom; + + @ffi.Double() + external double right; +} + +class NSArray extends NSObject { + NSArray._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSArray] that points to the same underlying object as [other]. + static NSArray castFrom(T other) { + return NSArray._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSArray] that wraps the given raw object pointer. + static NSArray castFromPointer(SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSArray._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSArray]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSArray1); + } + + int get count { + return _lib._objc_msgSend_10(_id, _lib._sel_count1); + } + + NSObject objectAtIndex_(int index) { + final _ret = _lib._objc_msgSend_60(_id, _lib._sel_objectAtIndex_1, index); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + @override + NSArray init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray initWithObjects_count_( + ffi.Pointer> objects, int cnt) { + final _ret = _lib._objc_msgSend_61( + _id, _lib._sel_initWithObjects_count_1, objects, cnt); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray initWithCoder_(NSCoder? coder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray arrayByAddingObject_(NSObject anObject) { + final _ret = _lib._objc_msgSend_62( + _id, _lib._sel_arrayByAddingObject_1, anObject._id); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray arrayByAddingObjectsFromArray_(NSArray? otherArray) { + final _ret = _lib._objc_msgSend_63( + _id, + _lib._sel_arrayByAddingObjectsFromArray_1, + otherArray?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSString componentsJoinedByString_(NSString? separator) { + final _ret = _lib._objc_msgSend_64(_id, + _lib._sel_componentsJoinedByString_1, separator?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + bool containsObject_(NSObject anObject) { + return _lib._objc_msgSend_0(_id, _lib._sel_containsObject_1, anObject._id); + } + + NSString? get description { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString descriptionWithLocale_(NSObject locale) { + final _ret = _lib._objc_msgSend_65( + _id, _lib._sel_descriptionWithLocale_1, locale._id); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString descriptionWithLocale_indent_(NSObject locale, int level) { + final _ret = _lib._objc_msgSend_66( + _id, _lib._sel_descriptionWithLocale_indent_1, locale._id, level); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSObject firstObjectCommonWithArray_(NSArray? otherArray) { + final _ret = _lib._objc_msgSend_67(_id, + _lib._sel_firstObjectCommonWithArray_1, otherArray?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void getObjects_range_( + ffi.Pointer> objects, _NSRange range) { + _lib._objc_msgSend_68(_id, _lib._sel_getObjects_range_1, objects, range); + } + + int indexOfObject_(NSObject anObject) { + return _lib._objc_msgSend_69(_id, _lib._sel_indexOfObject_1, anObject._id); + } + + int indexOfObject_inRange_(NSObject anObject, _NSRange range) { + return _lib._objc_msgSend_70( + _id, _lib._sel_indexOfObject_inRange_1, anObject._id, range); + } + + int indexOfObjectIdenticalTo_(NSObject anObject) { + return _lib._objc_msgSend_69( + _id, _lib._sel_indexOfObjectIdenticalTo_1, anObject._id); + } + + int indexOfObjectIdenticalTo_inRange_(NSObject anObject, _NSRange range) { + return _lib._objc_msgSend_70( + _id, _lib._sel_indexOfObjectIdenticalTo_inRange_1, anObject._id, range); + } + + bool isEqualToArray_(NSArray? otherArray) { + return _lib._objc_msgSend_71( + _id, _lib._sel_isEqualToArray_1, otherArray?._id ?? ffi.nullptr); + } + + NSObject get firstObject { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_firstObject1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject get lastObject { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_lastObject1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSEnumerator objectEnumerator() { + final _ret = _lib._objc_msgSend_72(_id, _lib._sel_objectEnumerator1); + return NSEnumerator._(_ret, _lib, retain: true, release: true); + } + + NSEnumerator reverseObjectEnumerator() { + final _ret = _lib._objc_msgSend_72(_id, _lib._sel_reverseObjectEnumerator1); + return NSEnumerator._(_ret, _lib, retain: true, release: true); + } + + NSData? get sortedArrayHint { + final _ret = _lib._objc_msgSend_39(_id, _lib._sel_sortedArrayHint1); + return _ret.address == 0 + ? null + : NSData._(_ret, _lib, retain: true, release: true); + } + + NSArray sortedArrayUsingFunction_context_( + ffi.Pointer< + ffi.NativeFunction< + ffi.Long Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>> + comparator, + ffi.Pointer context) { + final _ret = _lib._objc_msgSend_73( + _id, _lib._sel_sortedArrayUsingFunction_context_1, comparator, context); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray sortedArrayUsingFunction_context_hint_( + ffi.Pointer< + ffi.NativeFunction< + ffi.Long Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>> + comparator, + ffi.Pointer context, + NSData? hint) { + final _ret = _lib._objc_msgSend_74( + _id, + _lib._sel_sortedArrayUsingFunction_context_hint_1, + comparator, + context, + hint?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray sortedArrayUsingSelector_(ffi.Pointer comparator) { + final _ret = _lib._objc_msgSend_75( + _id, _lib._sel_sortedArrayUsingSelector_1, comparator); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray subarrayWithRange_(_NSRange range) { + final _ret = + _lib._objc_msgSend_76(_id, _lib._sel_subarrayWithRange_1, range); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + bool writeToURL_error_( + NSURL? url, ffi.Pointer> error) { + return _lib._objc_msgSend_83( + _id, _lib._sel_writeToURL_error_1, url?._id ?? ffi.nullptr, error); + } + + void makeObjectsPerformSelector_(ffi.Pointer aSelector) { + _lib._objc_msgSend_7( + _id, _lib._sel_makeObjectsPerformSelector_1, aSelector); + } + + void makeObjectsPerformSelector_withObject_( + ffi.Pointer aSelector, NSObject argument) { + _lib._objc_msgSend_84( + _id, + _lib._sel_makeObjectsPerformSelector_withObject_1, + aSelector, + argument._id); + } + + NSArray objectsAtIndexes_(NSIndexSet? indexes) { + final _ret = _lib._objc_msgSend_105( + _id, _lib._sel_objectsAtIndexes_1, indexes?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSObject objectAtIndexedSubscript_(int idx) { + final _ret = + _lib._objc_msgSend_60(_id, _lib._sel_objectAtIndexedSubscript_1, idx); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void enumerateObjectsUsingBlock_( + ObjCBlock_ffiVoid_ObjCObject_ffiUnsignedLong_bool block) { + _lib._objc_msgSend_106( + _id, _lib._sel_enumerateObjectsUsingBlock_1, block._id); + } + + void enumerateObjectsWithOptions_usingBlock_( + int opts, ObjCBlock_ffiVoid_ObjCObject_ffiUnsignedLong_bool block) { + _lib._objc_msgSend_107(_id, + _lib._sel_enumerateObjectsWithOptions_usingBlock_1, opts, block._id); + } + + void enumerateObjectsAtIndexes_options_usingBlock_(NSIndexSet? s, int opts, + ObjCBlock_ffiVoid_ObjCObject_ffiUnsignedLong_bool block) { + _lib._objc_msgSend_108( + _id, + _lib._sel_enumerateObjectsAtIndexes_options_usingBlock_1, + s?._id ?? ffi.nullptr, + opts, + block._id); + } + + int indexOfObjectPassingTest_( + ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool predicate) { + return _lib._objc_msgSend_109( + _id, _lib._sel_indexOfObjectPassingTest_1, predicate._id); + } + + int indexOfObjectWithOptions_passingTest_( + int opts, ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool predicate) { + return _lib._objc_msgSend_110(_id, + _lib._sel_indexOfObjectWithOptions_passingTest_1, opts, predicate._id); + } + + int indexOfObjectAtIndexes_options_passingTest_(NSIndexSet? s, int opts, + ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool predicate) { + return _lib._objc_msgSend_111( + _id, + _lib._sel_indexOfObjectAtIndexes_options_passingTest_1, + s?._id ?? ffi.nullptr, + opts, + predicate._id); + } + + NSIndexSet indexesOfObjectsPassingTest_( + ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool predicate) { + final _ret = _lib._objc_msgSend_112( + _id, _lib._sel_indexesOfObjectsPassingTest_1, predicate._id); + return NSIndexSet._(_ret, _lib, retain: true, release: true); + } + + NSIndexSet indexesOfObjectsWithOptions_passingTest_( + int opts, ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool predicate) { + final _ret = _lib._objc_msgSend_113( + _id, + _lib._sel_indexesOfObjectsWithOptions_passingTest_1, + opts, + predicate._id); + return NSIndexSet._(_ret, _lib, retain: true, release: true); + } + + NSIndexSet indexesOfObjectsAtIndexes_options_passingTest_(NSIndexSet? s, + int opts, ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool predicate) { + final _ret = _lib._objc_msgSend_114( + _id, + _lib._sel_indexesOfObjectsAtIndexes_options_passingTest_1, + s?._id ?? ffi.nullptr, + opts, + predicate._id); + return NSIndexSet._(_ret, _lib, retain: true, release: true); + } + + NSArray sortedArrayUsingComparator_( + ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject cmptr) { + final _ret = _lib._objc_msgSend_115( + _id, _lib._sel_sortedArrayUsingComparator_1, cmptr._id); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray sortedArrayWithOptions_usingComparator_( + int opts, ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject cmptr) { + final _ret = _lib._objc_msgSend_116(_id, + _lib._sel_sortedArrayWithOptions_usingComparator_1, opts, cmptr._id); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + int indexOfObject_inSortedRange_options_usingComparator_( + NSObject obj, + _NSRange r, + int opts, + ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject cmp) { + return _lib._objc_msgSend_117( + _id, + _lib._sel_indexOfObject_inSortedRange_options_usingComparator_1, + obj._id, + r, + opts, + cmp._id); + } + + static NSArray array(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSArray1, _lib._sel_array1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSArray arrayWithObject_(SentryCocoa _lib, NSObject anObject) { + final _ret = _lib._objc_msgSend_16( + _lib._class_NSArray1, _lib._sel_arrayWithObject_1, anObject._id); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSArray arrayWithObjects_count_( + SentryCocoa _lib, ffi.Pointer> objects, int cnt) { + final _ret = _lib._objc_msgSend_61( + _lib._class_NSArray1, _lib._sel_arrayWithObjects_count_1, objects, cnt); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSArray arrayWithObjects_(SentryCocoa _lib, NSObject firstObj) { + final _ret = _lib._objc_msgSend_16( + _lib._class_NSArray1, _lib._sel_arrayWithObjects_1, firstObj._id); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSArray arrayWithArray_(SentryCocoa _lib, NSArray? array) { + final _ret = _lib._objc_msgSend_67(_lib._class_NSArray1, + _lib._sel_arrayWithArray_1, array?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray initWithObjects_(NSObject firstObj) { + final _ret = + _lib._objc_msgSend_16(_id, _lib._sel_initWithObjects_1, firstObj._id); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray initWithArray_(NSArray? array) { + final _ret = _lib._objc_msgSend_67( + _id, _lib._sel_initWithArray_1, array?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray initWithArray_copyItems_(NSArray? array, bool flag) { + final _ret = _lib._objc_msgSend_118(_id, + _lib._sel_initWithArray_copyItems_1, array?._id ?? ffi.nullptr, flag); + return NSArray._(_ret, _lib, retain: false, release: true); + } + + NSArray initWithContentsOfURL_error_( + NSURL? url, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_119( + _id, + _lib._sel_initWithContentsOfURL_error_1, + url?._id ?? ffi.nullptr, + error); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSArray arrayWithContentsOfURL_error_(SentryCocoa _lib, NSURL? url, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_119( + _lib._class_NSArray1, + _lib._sel_arrayWithContentsOfURL_error_1, + url?._id ?? ffi.nullptr, + error); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSObject differenceFromArray_withOptions_usingEquivalenceTest_( + NSArray? other, int options, ObjCBlock_bool_ObjCObject_ObjCObject block) { + final _ret = _lib._objc_msgSend_120( + _id, + _lib._sel_differenceFromArray_withOptions_usingEquivalenceTest_1, + other?._id ?? ffi.nullptr, + options, + block._id); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject differenceFromArray_withOptions_(NSArray? other, int options) { + final _ret = _lib._objc_msgSend_121( + _id, + _lib._sel_differenceFromArray_withOptions_1, + other?._id ?? ffi.nullptr, + options); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject differenceFromArray_(NSArray? other) { + final _ret = _lib._objc_msgSend_67( + _id, _lib._sel_differenceFromArray_1, other?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSArray arrayByApplyingDifference_(NSObject? difference) { + final _ret = _lib._objc_msgSend_62(_id, + _lib._sel_arrayByApplyingDifference_1, difference?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + void getObjects_(ffi.Pointer> objects) { + _lib._objc_msgSend_122(_id, _lib._sel_getObjects_1, objects); + } + + static NSArray arrayWithContentsOfFile_(SentryCocoa _lib, NSString? path) { + final _ret = _lib._objc_msgSend_123(_lib._class_NSArray1, + _lib._sel_arrayWithContentsOfFile_1, path?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSArray arrayWithContentsOfURL_(SentryCocoa _lib, NSURL? url) { + final _ret = _lib._objc_msgSend_124(_lib._class_NSArray1, + _lib._sel_arrayWithContentsOfURL_1, url?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray initWithContentsOfFile_(NSString? path) { + final _ret = _lib._objc_msgSend_123( + _id, _lib._sel_initWithContentsOfFile_1, path?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray initWithContentsOfURL_(NSURL? url) { + final _ret = _lib._objc_msgSend_124( + _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + bool writeToFile_atomically_(NSString? path, bool useAuxiliaryFile) { + return _lib._objc_msgSend_25(_id, _lib._sel_writeToFile_atomically_1, + path?._id ?? ffi.nullptr, useAuxiliaryFile); + } + + bool writeToURL_atomically_(NSURL? url, bool atomically) { + return _lib._objc_msgSend_125(_id, _lib._sel_writeToURL_atomically_1, + url?._id ?? ffi.nullptr, atomically); + } + + NSArray pathsMatchingExtensions_(NSArray? filterTypes) { + final _ret = _lib._objc_msgSend_63(_id, _lib._sel_pathsMatchingExtensions_1, + filterTypes?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + @override + NSObject valueForKey_(NSString? key) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_valueForKey_1, key?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + @override + void setValue_forKey_(NSObject value, NSString? key) { + _lib._objc_msgSend_126( + _id, _lib._sel_setValue_forKey_1, value._id, key?._id ?? ffi.nullptr); + } + + void addObserver_toObjectsAtIndexes_forKeyPath_options_context_( + NSObject? observer, + NSIndexSet? indexes, + NSString? keyPath, + int options, + ffi.Pointer context) { + _lib._objc_msgSend_127( + _id, + _lib._sel_addObserver_toObjectsAtIndexes_forKeyPath_options_context_1, + observer?._id ?? ffi.nullptr, + indexes?._id ?? ffi.nullptr, + keyPath?._id ?? ffi.nullptr, + options, + context); + } + + void removeObserver_fromObjectsAtIndexes_forKeyPath_context_( + NSObject? observer, + NSIndexSet? indexes, + NSString? keyPath, + ffi.Pointer context) { + _lib._objc_msgSend_128( + _id, + _lib._sel_removeObserver_fromObjectsAtIndexes_forKeyPath_context_1, + observer?._id ?? ffi.nullptr, + indexes?._id ?? ffi.nullptr, + keyPath?._id ?? ffi.nullptr, + context); + } + + void removeObserver_fromObjectsAtIndexes_forKeyPath_( + NSObject? observer, NSIndexSet? indexes, NSString? keyPath) { + _lib._objc_msgSend_129( + _id, + _lib._sel_removeObserver_fromObjectsAtIndexes_forKeyPath_1, + observer?._id ?? ffi.nullptr, + indexes?._id ?? ffi.nullptr, + keyPath?._id ?? ffi.nullptr); + } + + @override + void addObserver_forKeyPath_options_context_(NSObject? observer, + NSString? keyPath, int options, ffi.Pointer context) { + _lib._objc_msgSend_130( + _id, + _lib._sel_addObserver_forKeyPath_options_context_1, + observer?._id ?? ffi.nullptr, + keyPath?._id ?? ffi.nullptr, + options, + context); + } + + @override + void removeObserver_forKeyPath_context_( + NSObject? observer, NSString? keyPath, ffi.Pointer context) { + _lib._objc_msgSend_131(_id, _lib._sel_removeObserver_forKeyPath_context_1, + observer?._id ?? ffi.nullptr, keyPath?._id ?? ffi.nullptr, context); + } + + @override + void removeObserver_forKeyPath_(NSObject? observer, NSString? keyPath) { + _lib._objc_msgSend_132(_id, _lib._sel_removeObserver_forKeyPath_1, + observer?._id ?? ffi.nullptr, keyPath?._id ?? ffi.nullptr); + } + + NSArray sortedArrayUsingDescriptors_(NSArray? sortDescriptors) { + final _ret = _lib._objc_msgSend_63( + _id, + _lib._sel_sortedArrayUsingDescriptors_1, + sortDescriptors?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray filteredArrayUsingPredicate_(NSPredicate? predicate) { + final _ret = _lib._objc_msgSend_201(_id, + _lib._sel_filteredArrayUsingPredicate_1, predicate?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSArray new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSArray1, _lib._sel_new1); + return NSArray._(_ret, _lib, retain: false, release: true); + } + + static NSArray allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSArray1, _lib._sel_allocWithZone_1, zone); + return NSArray._(_ret, _lib, retain: false, release: true); + } + + static NSArray alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSArray1, _lib._sel_alloc1); + return NSArray._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSArray1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSArray1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSArray1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSArray1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSArray1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSArray1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSArray1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSArray1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSArray1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSError extends NSObject { + NSError._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSError] that points to the same underlying object as [other]. + static NSError castFrom(T other) { + return NSError._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSError] that wraps the given raw object pointer. + static NSError castFromPointer(SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSError._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSError]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSError1); + } + + NSError initWithDomain_code_userInfo_( + NSString domain, int code, NSObject? dict) { + final _ret = _lib._objc_msgSend_77( + _id, + _lib._sel_initWithDomain_code_userInfo_1, + domain._id, + code, + dict?._id ?? ffi.nullptr); + return NSError._(_ret, _lib, retain: true, release: true); + } + + static NSError errorWithDomain_code_userInfo_( + SentryCocoa _lib, NSString domain, int code, NSObject? dict) { + final _ret = _lib._objc_msgSend_77( + _lib._class_NSError1, + _lib._sel_errorWithDomain_code_userInfo_1, + domain._id, + code, + dict?._id ?? ffi.nullptr); + return NSError._(_ret, _lib, retain: true, release: true); + } + + NSString get domain { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_domain1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + int get code { + return _lib._objc_msgSend_78(_id, _lib._sel_code1); + } + + NSObject? get userInfo { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_userInfo1); + return _ret.address == 0 + ? null + : NSObject._(_ret, _lib, retain: true, release: true); + } + + NSString? get localizedDescription { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_localizedDescription1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get localizedFailureReason { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_localizedFailureReason1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get localizedRecoverySuggestion { + final _ret = + _lib._objc_msgSend_20(_id, _lib._sel_localizedRecoverySuggestion1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSArray? get localizedRecoveryOptions { + final _ret = + _lib._objc_msgSend_79(_id, _lib._sel_localizedRecoveryOptions1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSObject get recoveryAttempter { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_recoveryAttempter1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSString? get helpAnchor { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_helpAnchor1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSArray? get underlyingErrors { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_underlyingErrors1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + static void setUserInfoValueProviderForDomain_provider_(SentryCocoa _lib, + NSString errorDomain, ObjCBlock_ObjCObject_NSError_NSString provider) { + _lib._objc_msgSend_80( + _lib._class_NSError1, + _lib._sel_setUserInfoValueProviderForDomain_provider_1, + errorDomain._id, + provider._id); + } + + static ObjCBlock_ObjCObject_NSError_NSString userInfoValueProviderForDomain_( + SentryCocoa _lib, + NSError? err, + NSString userInfoKey, + NSString errorDomain) { + final _ret = _lib._objc_msgSend_81( + _lib._class_NSError1, + _lib._sel_userInfoValueProviderForDomain_1, + err?._id ?? ffi.nullptr, + userInfoKey._id, + errorDomain._id); + return ObjCBlock_ObjCObject_NSError_NSString._(_ret, _lib); + } + + @override + NSError init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSError._(_ret, _lib, retain: true, release: true); + } + + static NSError new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSError1, _lib._sel_new1); + return NSError._(_ret, _lib, retain: false, release: true); + } + + static NSError allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSError1, _lib._sel_allocWithZone_1, zone); + return NSError._(_ret, _lib, retain: false, release: true); + } + + static NSError alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSError1, _lib._sel_alloc1); + return NSError._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSError1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSError1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSError1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSError1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSError1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSError1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSError1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSError1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSError1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class _ObjCBlockBase implements ffi.Finalizable { + final ffi.Pointer<_ObjCBlock> _id; + final SentryCocoa _lib; + bool _pendingRelease; + + _ObjCBlockBase._(this._id, this._lib, + {bool retain = false, bool release = false}) + : _pendingRelease = release { + if (retain) { + _lib._Block_copy(_id.cast()); + } + if (release) { + _lib._objc_releaseFinalizer11.attach(this, _id.cast(), detach: this); + } + } + + /// Releases the reference to the underlying ObjC block held by this wrapper. + /// Throws a StateError if this wrapper doesn't currently hold a reference. + void release() { + if (_pendingRelease) { + _pendingRelease = false; + _lib._Block_release(_id.cast()); + _lib._objc_releaseFinalizer11.detach(this); + } else { + throw StateError( + 'Released an ObjC block that was unowned or already released.'); + } + } + + @override + bool operator ==(Object other) { + return other is _ObjCBlockBase && _id == other._id; + } + + @override + int get hashCode => _id.hashCode; + + /// Return a pointer to this object. + ffi.Pointer<_ObjCBlock> get pointer => _id; +} + +ffi.Pointer _ObjCBlock_ObjCObject_NSError_NSString_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + ffi.Pointer Function(ffi.Pointer arg0, + ffi.Pointer arg1)>()(arg0, arg1); +} + +final _ObjCBlock_ObjCObject_NSError_NSString_closureRegistry = + {}; +int _ObjCBlock_ObjCObject_NSError_NSString_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ObjCObject_NSError_NSString_registerClosure( + Function fn) { + final id = ++_ObjCBlock_ObjCObject_NSError_NSString_closureRegistryIndex; + _ObjCBlock_ObjCObject_NSError_NSString_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +ffi.Pointer + _ObjCBlock_ObjCObject_NSError_NSString_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return (_ObjCBlock_ObjCObject_NSError_NSString_closureRegistry[ + block.ref.target.address] + as ffi.Pointer Function( + ffi.Pointer, ffi.Pointer))(arg0, arg1); +} + +class ObjCBlock_ObjCObject_NSError_NSString extends _ObjCBlockBase { + ObjCBlock_ObjCObject_NSError_NSString._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ObjCObject_NSError_NSString.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer arg0, + ffi.Pointer arg1)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Pointer Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_ObjCObject_NSError_NSString_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ObjCObject_NSError_NSString.fromFunction( + SentryCocoa lib, + ffi.Pointer Function( + ffi.Pointer arg0, ffi.Pointer arg1) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Pointer Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_ObjCObject_NSError_NSString_closureTrampoline) + .cast(), + _ObjCBlock_ObjCObject_NSError_NSString_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + ffi.Pointer call( + ffi.Pointer arg0, ffi.Pointer arg1) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + ffi.Pointer Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>()(_id, arg0, arg1); + } +} + +class _ObjCBlockDesc extends ffi.Struct { + @ffi.UnsignedLong() + external int reserved; + + @ffi.UnsignedLong() + external int size; + + external ffi.Pointer copy_helper; + + external ffi.Pointer dispose_helper; + + external ffi.Pointer signature; +} + +class _ObjCBlock extends ffi.Struct { + external ffi.Pointer isa; + + @ffi.Int() + external int flags; + + @ffi.Int() + external int reserved; + + external ffi.Pointer invoke; + + external ffi.Pointer<_ObjCBlockDesc> descriptor; + + external ffi.Pointer target; +} + +class NSIndexSet extends NSObject { + NSIndexSet._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSIndexSet] that points to the same underlying object as [other]. + static NSIndexSet castFrom(T other) { + return NSIndexSet._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSIndexSet] that wraps the given raw object pointer. + static NSIndexSet castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSIndexSet._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSIndexSet]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSIndexSet1); + } + + static NSIndexSet indexSet(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSIndexSet1, _lib._sel_indexSet1); + return NSIndexSet._(_ret, _lib, retain: true, release: true); + } + + static NSIndexSet indexSetWithIndex_(SentryCocoa _lib, int value) { + final _ret = _lib._objc_msgSend_60( + _lib._class_NSIndexSet1, _lib._sel_indexSetWithIndex_1, value); + return NSIndexSet._(_ret, _lib, retain: true, release: true); + } + + static NSIndexSet indexSetWithIndexesInRange_( + SentryCocoa _lib, _NSRange range) { + final _ret = _lib._objc_msgSend_85( + _lib._class_NSIndexSet1, _lib._sel_indexSetWithIndexesInRange_1, range); + return NSIndexSet._(_ret, _lib, retain: true, release: true); + } + + NSIndexSet initWithIndexesInRange_(_NSRange range) { + final _ret = + _lib._objc_msgSend_85(_id, _lib._sel_initWithIndexesInRange_1, range); + return NSIndexSet._(_ret, _lib, retain: true, release: true); + } + + NSIndexSet initWithIndexSet_(NSIndexSet? indexSet) { + final _ret = _lib._objc_msgSend_86( + _id, _lib._sel_initWithIndexSet_1, indexSet?._id ?? ffi.nullptr); + return NSIndexSet._(_ret, _lib, retain: true, release: true); + } + + NSIndexSet initWithIndex_(int value) { + final _ret = _lib._objc_msgSend_60(_id, _lib._sel_initWithIndex_1, value); + return NSIndexSet._(_ret, _lib, retain: true, release: true); + } + + bool isEqualToIndexSet_(NSIndexSet? indexSet) { + return _lib._objc_msgSend_87( + _id, _lib._sel_isEqualToIndexSet_1, indexSet?._id ?? ffi.nullptr); + } + + int get count { + return _lib._objc_msgSend_10(_id, _lib._sel_count1); + } + + int get firstIndex { + return _lib._objc_msgSend_10(_id, _lib._sel_firstIndex1); + } + + int get lastIndex { + return _lib._objc_msgSend_10(_id, _lib._sel_lastIndex1); + } + + int indexGreaterThanIndex_(int value) { + return _lib._objc_msgSend_88(_id, _lib._sel_indexGreaterThanIndex_1, value); + } + + int indexLessThanIndex_(int value) { + return _lib._objc_msgSend_88(_id, _lib._sel_indexLessThanIndex_1, value); + } + + int indexGreaterThanOrEqualToIndex_(int value) { + return _lib._objc_msgSend_88( + _id, _lib._sel_indexGreaterThanOrEqualToIndex_1, value); + } + + int indexLessThanOrEqualToIndex_(int value) { + return _lib._objc_msgSend_88( + _id, _lib._sel_indexLessThanOrEqualToIndex_1, value); + } + + int getIndexes_maxCount_inIndexRange_( + ffi.Pointer indexBuffer, + int bufferSize, + ffi.Pointer<_NSRange> range) { + return _lib._objc_msgSend_89( + _id, + _lib._sel_getIndexes_maxCount_inIndexRange_1, + indexBuffer, + bufferSize, + range); + } + + int countOfIndexesInRange_(_NSRange range) { + return _lib._objc_msgSend_90(_id, _lib._sel_countOfIndexesInRange_1, range); + } + + bool containsIndex_(int value) { + return _lib._objc_msgSend_91(_id, _lib._sel_containsIndex_1, value); + } + + bool containsIndexesInRange_(_NSRange range) { + return _lib._objc_msgSend_92( + _id, _lib._sel_containsIndexesInRange_1, range); + } + + bool containsIndexes_(NSIndexSet? indexSet) { + return _lib._objc_msgSend_87( + _id, _lib._sel_containsIndexes_1, indexSet?._id ?? ffi.nullptr); + } + + bool intersectsIndexesInRange_(_NSRange range) { + return _lib._objc_msgSend_92( + _id, _lib._sel_intersectsIndexesInRange_1, range); + } + + void enumerateIndexesUsingBlock_( + ObjCBlock_ffiVoid_ffiUnsignedLong_bool block) { + _lib._objc_msgSend_93( + _id, _lib._sel_enumerateIndexesUsingBlock_1, block._id); + } + + void enumerateIndexesWithOptions_usingBlock_( + int opts, ObjCBlock_ffiVoid_ffiUnsignedLong_bool block) { + _lib._objc_msgSend_94(_id, + _lib._sel_enumerateIndexesWithOptions_usingBlock_1, opts, block._id); + } + + void enumerateIndexesInRange_options_usingBlock_( + _NSRange range, int opts, ObjCBlock_ffiVoid_ffiUnsignedLong_bool block) { + _lib._objc_msgSend_95( + _id, + _lib._sel_enumerateIndexesInRange_options_usingBlock_1, + range, + opts, + block._id); + } + + int indexPassingTest_(ObjCBlock_bool_ffiUnsignedLong_bool predicate) { + return _lib._objc_msgSend_96( + _id, _lib._sel_indexPassingTest_1, predicate._id); + } + + int indexWithOptions_passingTest_( + int opts, ObjCBlock_bool_ffiUnsignedLong_bool predicate) { + return _lib._objc_msgSend_97( + _id, _lib._sel_indexWithOptions_passingTest_1, opts, predicate._id); + } + + int indexInRange_options_passingTest_( + _NSRange range, int opts, ObjCBlock_bool_ffiUnsignedLong_bool predicate) { + return _lib._objc_msgSend_98( + _id, + _lib._sel_indexInRange_options_passingTest_1, + range, + opts, + predicate._id); + } + + NSIndexSet indexesPassingTest_( + ObjCBlock_bool_ffiUnsignedLong_bool predicate) { + final _ret = _lib._objc_msgSend_99( + _id, _lib._sel_indexesPassingTest_1, predicate._id); + return NSIndexSet._(_ret, _lib, retain: true, release: true); + } + + NSIndexSet indexesWithOptions_passingTest_( + int opts, ObjCBlock_bool_ffiUnsignedLong_bool predicate) { + final _ret = _lib._objc_msgSend_100( + _id, _lib._sel_indexesWithOptions_passingTest_1, opts, predicate._id); + return NSIndexSet._(_ret, _lib, retain: true, release: true); + } + + NSIndexSet indexesInRange_options_passingTest_( + _NSRange range, int opts, ObjCBlock_bool_ffiUnsignedLong_bool predicate) { + final _ret = _lib._objc_msgSend_101( + _id, + _lib._sel_indexesInRange_options_passingTest_1, + range, + opts, + predicate._id); + return NSIndexSet._(_ret, _lib, retain: true, release: true); + } + + void enumerateRangesUsingBlock_(ObjCBlock_ffiVoid_NSRange_bool block) { + _lib._objc_msgSend_102( + _id, _lib._sel_enumerateRangesUsingBlock_1, block._id); + } + + void enumerateRangesWithOptions_usingBlock_( + int opts, ObjCBlock_ffiVoid_NSRange_bool block) { + _lib._objc_msgSend_103(_id, + _lib._sel_enumerateRangesWithOptions_usingBlock_1, opts, block._id); + } + + void enumerateRangesInRange_options_usingBlock_( + _NSRange range, int opts, ObjCBlock_ffiVoid_NSRange_bool block) { + _lib._objc_msgSend_104( + _id, + _lib._sel_enumerateRangesInRange_options_usingBlock_1, + range, + opts, + block._id); + } + + @override + NSIndexSet init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSIndexSet._(_ret, _lib, retain: true, release: true); + } + + static NSIndexSet new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSIndexSet1, _lib._sel_new1); + return NSIndexSet._(_ret, _lib, retain: false, release: true); + } + + static NSIndexSet allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSIndexSet1, _lib._sel_allocWithZone_1, zone); + return NSIndexSet._(_ret, _lib, retain: false, release: true); + } + + static NSIndexSet alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSIndexSet1, _lib._sel_alloc1); + return NSIndexSet._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSIndexSet1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSIndexSet1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSIndexSet1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSIndexSet1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSIndexSet1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSIndexSet1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSIndexSet1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSIndexSet1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSIndexSet1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +void _ObjCBlock_ffiVoid_ffiUnsignedLong_bool_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, int arg0, ffi.Pointer arg1) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.UnsignedLong arg0, ffi.Pointer arg1)>>() + .asFunction arg1)>()( + arg0, arg1); +} + +final _ObjCBlock_ffiVoid_ffiUnsignedLong_bool_closureRegistry = + {}; +int _ObjCBlock_ffiVoid_ffiUnsignedLong_bool_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_ffiUnsignedLong_bool_registerClosure( + Function fn) { + final id = ++_ObjCBlock_ffiVoid_ffiUnsignedLong_bool_closureRegistryIndex; + _ObjCBlock_ffiVoid_ffiUnsignedLong_bool_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_ffiUnsignedLong_bool_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, int arg0, ffi.Pointer arg1) { + return (_ObjCBlock_ffiVoid_ffiUnsignedLong_bool_closureRegistry[block + .ref + .target + .address] as void Function(int, ffi.Pointer))(arg0, arg1); +} + +class ObjCBlock_ffiVoid_ffiUnsignedLong_bool extends _ObjCBlockBase { + ObjCBlock_ffiVoid_ffiUnsignedLong_bool._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_ffiUnsignedLong_bool.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.UnsignedLong arg0, ffi.Pointer arg1)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.UnsignedLong arg0, + ffi.Pointer arg1)>( + _ObjCBlock_ffiVoid_ffiUnsignedLong_bool_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_ffiUnsignedLong_bool.fromFunction( + SentryCocoa lib, void Function(int arg0, ffi.Pointer arg1) fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.UnsignedLong arg0, + ffi.Pointer arg1)>( + _ObjCBlock_ffiVoid_ffiUnsignedLong_bool_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_ffiUnsignedLong_bool_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(int arg0, ffi.Pointer arg1) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.UnsignedLong arg0, ffi.Pointer arg1)>>() + .asFunction< + void Function(ffi.Pointer<_ObjCBlock> block, int arg0, + ffi.Pointer arg1)>()(_id, arg0, arg1); + } +} + +abstract class NSEnumerationOptions { + static const int NSEnumerationConcurrent = 1; + static const int NSEnumerationReverse = 2; +} + +bool _ObjCBlock_bool_ffiUnsignedLong_bool_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, int arg0, ffi.Pointer arg1) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Bool Function( + ffi.UnsignedLong arg0, ffi.Pointer arg1)>>() + .asFunction arg1)>()( + arg0, arg1); +} + +final _ObjCBlock_bool_ffiUnsignedLong_bool_closureRegistry = {}; +int _ObjCBlock_bool_ffiUnsignedLong_bool_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_bool_ffiUnsignedLong_bool_registerClosure( + Function fn) { + final id = ++_ObjCBlock_bool_ffiUnsignedLong_bool_closureRegistryIndex; + _ObjCBlock_bool_ffiUnsignedLong_bool_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +bool _ObjCBlock_bool_ffiUnsignedLong_bool_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, int arg0, ffi.Pointer arg1) { + return (_ObjCBlock_bool_ffiUnsignedLong_bool_closureRegistry[block.ref.target + .address] as bool Function(int, ffi.Pointer))(arg0, arg1); +} + +class ObjCBlock_bool_ffiUnsignedLong_bool extends _ObjCBlockBase { + ObjCBlock_bool_ffiUnsignedLong_bool._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_bool_ffiUnsignedLong_bool.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Bool Function( + ffi.UnsignedLong arg0, ffi.Pointer arg1)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.UnsignedLong arg0, + ffi.Pointer arg1)>( + _ObjCBlock_bool_ffiUnsignedLong_bool_fnPtrTrampoline, + false) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_bool_ffiUnsignedLong_bool.fromFunction( + SentryCocoa lib, bool Function(int arg0, ffi.Pointer arg1) fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.UnsignedLong arg0, + ffi.Pointer arg1)>( + _ObjCBlock_bool_ffiUnsignedLong_bool_closureTrampoline, + false) + .cast(), + _ObjCBlock_bool_ffiUnsignedLong_bool_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + bool call(int arg0, ffi.Pointer arg1) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer<_ObjCBlock> block, + ffi.UnsignedLong arg0, ffi.Pointer arg1)>>() + .asFunction< + bool Function(ffi.Pointer<_ObjCBlock> block, int arg0, + ffi.Pointer arg1)>()(_id, arg0, arg1); + } +} + +void _ObjCBlock_ffiVoid_NSRange_bool_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, _NSRange arg0, ffi.Pointer arg1) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function(_NSRange arg0, ffi.Pointer arg1)>>() + .asFunction< + void Function( + _NSRange arg0, ffi.Pointer arg1)>()(arg0, arg1); +} + +final _ObjCBlock_ffiVoid_NSRange_bool_closureRegistry = {}; +int _ObjCBlock_ffiVoid_NSRange_bool_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_NSRange_bool_registerClosure( + Function fn) { + final id = ++_ObjCBlock_ffiVoid_NSRange_bool_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSRange_bool_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSRange_bool_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, _NSRange arg0, ffi.Pointer arg1) { + return (_ObjCBlock_ffiVoid_NSRange_bool_closureRegistry[block.ref.target + .address] as void Function(_NSRange, ffi.Pointer))(arg0, arg1); +} + +class ObjCBlock_ffiVoid_NSRange_bool extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSRange_bool._(ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSRange_bool.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(_NSRange arg0, ffi.Pointer arg1)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + _NSRange arg0, ffi.Pointer arg1)>( + _ObjCBlock_ffiVoid_NSRange_bool_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSRange_bool.fromFunction(SentryCocoa lib, + void Function(_NSRange arg0, ffi.Pointer arg1) fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + _NSRange arg0, ffi.Pointer arg1)>( + _ObjCBlock_ffiVoid_NSRange_bool_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSRange_bool_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(_NSRange arg0, ffi.Pointer arg1) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, _NSRange arg0, + ffi.Pointer arg1)>>() + .asFunction< + void Function(ffi.Pointer<_ObjCBlock> block, _NSRange arg0, + ffi.Pointer arg1)>()(_id, arg0, arg1); + } +} + +void _ObjCBlock_ffiVoid_ObjCObject_ffiUnsignedLong_bool_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + int arg1, + ffi.Pointer arg2) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, + ffi.UnsignedLong arg1, ffi.Pointer arg2)>>() + .asFunction< + void Function(ffi.Pointer arg0, int arg1, + ffi.Pointer arg2)>()(arg0, arg1, arg2); +} + +final _ObjCBlock_ffiVoid_ObjCObject_ffiUnsignedLong_bool_closureRegistry = + {}; +int _ObjCBlock_ffiVoid_ObjCObject_ffiUnsignedLong_bool_closureRegistryIndex = 0; +ffi.Pointer + _ObjCBlock_ffiVoid_ObjCObject_ffiUnsignedLong_bool_registerClosure( + Function fn) { + final id = + ++_ObjCBlock_ffiVoid_ObjCObject_ffiUnsignedLong_bool_closureRegistryIndex; + _ObjCBlock_ffiVoid_ObjCObject_ffiUnsignedLong_bool_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_ObjCObject_ffiUnsignedLong_bool_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + int arg1, + ffi.Pointer arg2) { + return (_ObjCBlock_ffiVoid_ObjCObject_ffiUnsignedLong_bool_closureRegistry[ + block.ref.target.address] + as void Function(ffi.Pointer, int, + ffi.Pointer))(arg0, arg1, arg2); +} + +class ObjCBlock_ffiVoid_ObjCObject_ffiUnsignedLong_bool extends _ObjCBlockBase { + ObjCBlock_ffiVoid_ObjCObject_ffiUnsignedLong_bool._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_ObjCObject_ffiUnsignedLong_bool.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, + ffi.UnsignedLong arg1, ffi.Pointer arg2)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.UnsignedLong arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_ObjCObject_ffiUnsignedLong_bool_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_ObjCObject_ffiUnsignedLong_bool.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, int arg1, + ffi.Pointer arg2) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.UnsignedLong arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_ObjCObject_ffiUnsignedLong_bool_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_ObjCObject_ffiUnsignedLong_bool_registerClosure( + fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call( + ffi.Pointer arg0, int arg1, ffi.Pointer arg2) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.UnsignedLong arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + int arg1, + ffi.Pointer arg2)>()(_id, arg0, arg1, arg2); + } +} + +bool _ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + int arg1, + ffi.Pointer arg2) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer arg0, + ffi.UnsignedLong arg1, ffi.Pointer arg2)>>() + .asFunction< + bool Function(ffi.Pointer arg0, int arg1, + ffi.Pointer arg2)>()(arg0, arg1, arg2); +} + +final _ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool_closureRegistry = + {}; +int _ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool_closureRegistryIndex = 0; +ffi.Pointer + _ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool_registerClosure( + Function fn) { + final id = + ++_ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool_closureRegistryIndex; + _ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +bool _ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + int arg1, + ffi.Pointer arg2) { + return (_ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool_closureRegistry[ + block.ref.target.address] + as bool Function(ffi.Pointer, int, + ffi.Pointer))(arg0, arg1, arg2); +} + +class ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool extends _ObjCBlockBase { + ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer arg0, + ffi.UnsignedLong arg1, ffi.Pointer arg2)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.UnsignedLong arg1, + ffi.Pointer arg2)>( + _ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool_fnPtrTrampoline, + false) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool.fromFunction( + SentryCocoa lib, + bool Function(ffi.Pointer arg0, int arg1, + ffi.Pointer arg2) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.UnsignedLong arg1, + ffi.Pointer arg2)>( + _ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool_closureTrampoline, + false) + .cast(), + _ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool_registerClosure( + fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + bool call( + ffi.Pointer arg0, int arg1, ffi.Pointer arg2) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.UnsignedLong arg1, + ffi.Pointer arg2)>>() + .asFunction< + bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + int arg1, + ffi.Pointer arg2)>()(_id, arg0, arg1, arg2); + } +} + +int _ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Int32 Function(ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + int Function(ffi.Pointer arg0, + ffi.Pointer arg1)>()(arg0, arg1); +} + +final _ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject_closureRegistry = + {}; +int _ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject_closureRegistryIndex = + 0; +ffi.Pointer + _ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject_registerClosure( + Function fn) { + final id = + ++_ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject_closureRegistryIndex; + _ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +int _ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return (_ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject_closureRegistry[ + block.ref.target.address] + as int Function( + ffi.Pointer, ffi.Pointer))(arg0, arg1); +} + +class ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject + extends _ObjCBlockBase { + ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Int32 Function(ffi.Pointer arg0, + ffi.Pointer arg1)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Int32 Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject_fnPtrTrampoline, + 0) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject.fromFunction( + SentryCocoa lib, + int Function(ffi.Pointer arg0, ffi.Pointer arg1) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Int32 Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject_closureTrampoline, + 0) + .cast(), + _ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject_registerClosure( + fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + int call(ffi.Pointer arg0, ffi.Pointer arg1) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Int32 Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + int Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>()(_id, arg0, arg1); + } +} + +abstract class NSComparisonResult { + static const int NSOrderedAscending = -1; + static const int NSOrderedSame = 0; + static const int NSOrderedDescending = 1; +} + +abstract class NSSortOptions { + static const int NSSortConcurrent = 1; + static const int NSSortStable = 16; +} + +abstract class NSBinarySearchingOptions { + static const int NSBinarySearchingFirstEqual = 256; + static const int NSBinarySearchingLastEqual = 512; + static const int NSBinarySearchingInsertionIndex = 1024; +} + +abstract class NSOrderedCollectionDifferenceCalculationOptions { + static const int NSOrderedCollectionDifferenceCalculationOmitInsertedObjects = + 1; + static const int NSOrderedCollectionDifferenceCalculationOmitRemovedObjects = + 2; + static const int NSOrderedCollectionDifferenceCalculationInferMoves = 4; +} + +bool _ObjCBlock_bool_ObjCObject_ObjCObject_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + bool Function(ffi.Pointer arg0, + ffi.Pointer arg1)>()(arg0, arg1); +} + +final _ObjCBlock_bool_ObjCObject_ObjCObject_closureRegistry = {}; +int _ObjCBlock_bool_ObjCObject_ObjCObject_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_bool_ObjCObject_ObjCObject_registerClosure( + Function fn) { + final id = ++_ObjCBlock_bool_ObjCObject_ObjCObject_closureRegistryIndex; + _ObjCBlock_bool_ObjCObject_ObjCObject_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +bool _ObjCBlock_bool_ObjCObject_ObjCObject_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return (_ObjCBlock_bool_ObjCObject_ObjCObject_closureRegistry[ + block.ref.target.address] + as bool Function( + ffi.Pointer, ffi.Pointer))(arg0, arg1); +} + +class ObjCBlock_bool_ObjCObject_ObjCObject extends _ObjCBlockBase { + ObjCBlock_bool_ObjCObject_ObjCObject._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_bool_ObjCObject_ObjCObject.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer arg0, + ffi.Pointer arg1)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_bool_ObjCObject_ObjCObject_fnPtrTrampoline, + false) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_bool_ObjCObject_ObjCObject.fromFunction( + SentryCocoa lib, + bool Function(ffi.Pointer arg0, ffi.Pointer arg1) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_bool_ObjCObject_ObjCObject_closureTrampoline, + false) + .cast(), + _ObjCBlock_bool_ObjCObject_ObjCObject_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + bool call(ffi.Pointer arg0, ffi.Pointer arg1) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>()(_id, arg0, arg1); + } +} + +abstract class NSKeyValueObservingOptions { + static const int NSKeyValueObservingOptionNew = 1; + static const int NSKeyValueObservingOptionOld = 2; + static const int NSKeyValueObservingOptionInitial = 4; + static const int NSKeyValueObservingOptionPrior = 8; +} + +class NSPredicate extends NSObject { + NSPredicate._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSPredicate] that points to the same underlying object as [other]. + static NSPredicate castFrom(T other) { + return NSPredicate._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSPredicate] that wraps the given raw object pointer. + static NSPredicate castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSPredicate._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSPredicate]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSPredicate1); + } + + static NSPredicate predicateWithFormat_argumentArray_( + SentryCocoa _lib, NSString? predicateFormat, NSArray? arguments) { + final _ret = _lib._objc_msgSend_133( + _lib._class_NSPredicate1, + _lib._sel_predicateWithFormat_argumentArray_1, + predicateFormat?._id ?? ffi.nullptr, + arguments?._id ?? ffi.nullptr); + return NSPredicate._(_ret, _lib, retain: true, release: true); + } + + static NSPredicate predicateWithFormat_( + SentryCocoa _lib, NSString? predicateFormat) { + final _ret = _lib._objc_msgSend_134(_lib._class_NSPredicate1, + _lib._sel_predicateWithFormat_1, predicateFormat?._id ?? ffi.nullptr); + return NSPredicate._(_ret, _lib, retain: true, release: true); + } + + static NSPredicate predicateWithFormat_arguments_(SentryCocoa _lib, + NSString? predicateFormat, ffi.Pointer<__va_list_tag> argList) { + final _ret = _lib._objc_msgSend_135( + _lib._class_NSPredicate1, + _lib._sel_predicateWithFormat_arguments_1, + predicateFormat?._id ?? ffi.nullptr, + argList); + return NSPredicate._(_ret, _lib, retain: true, release: true); + } + + static NSPredicate predicateFromMetadataQueryString_( + SentryCocoa _lib, NSString? queryString) { + final _ret = _lib._objc_msgSend_134( + _lib._class_NSPredicate1, + _lib._sel_predicateFromMetadataQueryString_1, + queryString?._id ?? ffi.nullptr); + return NSPredicate._(_ret, _lib, retain: true, release: true); + } + + static NSPredicate predicateWithValue_(SentryCocoa _lib, bool value) { + final _ret = _lib._objc_msgSend_136( + _lib._class_NSPredicate1, _lib._sel_predicateWithValue_1, value); + return NSPredicate._(_ret, _lib, retain: true, release: true); + } + + static NSPredicate predicateWithBlock_( + SentryCocoa _lib, ObjCBlock_bool_ObjCObject_NSDictionary block) { + final _ret = _lib._objc_msgSend_199( + _lib._class_NSPredicate1, _lib._sel_predicateWithBlock_1, block._id); + return NSPredicate._(_ret, _lib, retain: true, release: true); + } + + NSString? get predicateFormat { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_predicateFormat1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSPredicate predicateWithSubstitutionVariables_(NSDictionary? variables) { + final _ret = _lib._objc_msgSend_149( + _id, + _lib._sel_predicateWithSubstitutionVariables_1, + variables?._id ?? ffi.nullptr); + return NSPredicate._(_ret, _lib, retain: true, release: true); + } + + bool evaluateWithObject_(NSObject object) { + return _lib._objc_msgSend_0( + _id, _lib._sel_evaluateWithObject_1, object._id); + } + + bool evaluateWithObject_substitutionVariables_( + NSObject object, NSDictionary? bindings) { + return _lib._objc_msgSend_200( + _id, + _lib._sel_evaluateWithObject_substitutionVariables_1, + object._id, + bindings?._id ?? ffi.nullptr); + } + + void allowEvaluation() { + _lib._objc_msgSend_1(_id, _lib._sel_allowEvaluation1); + } + + @override + NSPredicate init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSPredicate._(_ret, _lib, retain: true, release: true); + } + + static NSPredicate new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSPredicate1, _lib._sel_new1); + return NSPredicate._(_ret, _lib, retain: false, release: true); + } + + static NSPredicate allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSPredicate1, _lib._sel_allocWithZone_1, zone); + return NSPredicate._(_ret, _lib, retain: false, release: true); + } + + static NSPredicate alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSPredicate1, _lib._sel_alloc1); + return NSPredicate._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSPredicate1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSPredicate1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSPredicate1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSPredicate1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSPredicate1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSPredicate1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSPredicate1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSPredicate1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSPredicate1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class __va_list_tag extends ffi.Struct { + @ffi.UnsignedInt() + external int gp_offset; + + @ffi.UnsignedInt() + external int fp_offset; + + external ffi.Pointer overflow_arg_area; + + external ffi.Pointer reg_save_area; +} + +bool _ObjCBlock_bool_ObjCObject_NSDictionary_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + bool Function(ffi.Pointer arg0, + ffi.Pointer arg1)>()(arg0, arg1); +} + +final _ObjCBlock_bool_ObjCObject_NSDictionary_closureRegistry = + {}; +int _ObjCBlock_bool_ObjCObject_NSDictionary_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_bool_ObjCObject_NSDictionary_registerClosure( + Function fn) { + final id = ++_ObjCBlock_bool_ObjCObject_NSDictionary_closureRegistryIndex; + _ObjCBlock_bool_ObjCObject_NSDictionary_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +bool _ObjCBlock_bool_ObjCObject_NSDictionary_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return (_ObjCBlock_bool_ObjCObject_NSDictionary_closureRegistry[ + block.ref.target.address] + as bool Function( + ffi.Pointer, ffi.Pointer))(arg0, arg1); +} + +class ObjCBlock_bool_ObjCObject_NSDictionary extends _ObjCBlockBase { + ObjCBlock_bool_ObjCObject_NSDictionary._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_bool_ObjCObject_NSDictionary.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer arg0, + ffi.Pointer arg1)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_bool_ObjCObject_NSDictionary_fnPtrTrampoline, + false) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_bool_ObjCObject_NSDictionary.fromFunction( + SentryCocoa lib, + bool Function(ffi.Pointer arg0, ffi.Pointer arg1) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_bool_ObjCObject_NSDictionary_closureTrampoline, + false) + .cast(), + _ObjCBlock_bool_ObjCObject_NSDictionary_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + bool call(ffi.Pointer arg0, ffi.Pointer arg1) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>()(_id, arg0, arg1); + } +} + +class NSDictionary extends NSObject { + NSDictionary._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSDictionary] that points to the same underlying object as [other]. + static NSDictionary castFrom(T other) { + return NSDictionary._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSDictionary] that wraps the given raw object pointer. + static NSDictionary castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSDictionary._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSDictionary]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSDictionary1); + } + + int get count { + return _lib._objc_msgSend_10(_id, _lib._sel_count1); + } + + NSObject objectForKey_(NSObject aKey) { + final _ret = _lib._objc_msgSend_16(_id, _lib._sel_objectForKey_1, aKey._id); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSEnumerator keyEnumerator() { + final _ret = _lib._objc_msgSend_72(_id, _lib._sel_keyEnumerator1); + return NSEnumerator._(_ret, _lib, retain: true, release: true); + } + + @override + NSDictionary init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSDictionary initWithObjects_forKeys_count_( + ffi.Pointer> objects, + ffi.Pointer> keys, + int cnt) { + final _ret = _lib._objc_msgSend_137( + _id, _lib._sel_initWithObjects_forKeys_count_1, objects, keys, cnt); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSDictionary initWithCoder_(NSCoder? coder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSArray? get allKeys { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_allKeys1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray allKeysForObject_(NSObject anObject) { + final _ret = + _lib._objc_msgSend_62(_id, _lib._sel_allKeysForObject_1, anObject._id); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get allValues { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_allValues1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSString? get description { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get descriptionInStringsFileFormat { + final _ret = + _lib._objc_msgSend_20(_id, _lib._sel_descriptionInStringsFileFormat1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString descriptionWithLocale_(NSObject locale) { + final _ret = _lib._objc_msgSend_65( + _id, _lib._sel_descriptionWithLocale_1, locale._id); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString descriptionWithLocale_indent_(NSObject locale, int level) { + final _ret = _lib._objc_msgSend_66( + _id, _lib._sel_descriptionWithLocale_indent_1, locale._id, level); + return NSString._(_ret, _lib, retain: true, release: true); + } + + bool isEqualToDictionary_(NSDictionary? otherDictionary) { + return _lib._objc_msgSend_138(_id, _lib._sel_isEqualToDictionary_1, + otherDictionary?._id ?? ffi.nullptr); + } + + NSEnumerator objectEnumerator() { + final _ret = _lib._objc_msgSend_72(_id, _lib._sel_objectEnumerator1); + return NSEnumerator._(_ret, _lib, retain: true, release: true); + } + + NSArray objectsForKeys_notFoundMarker_(NSArray? keys, NSObject marker) { + final _ret = _lib._objc_msgSend_139( + _id, + _lib._sel_objectsForKeys_notFoundMarker_1, + keys?._id ?? ffi.nullptr, + marker._id); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + bool writeToURL_error_( + NSURL? url, ffi.Pointer> error) { + return _lib._objc_msgSend_83( + _id, _lib._sel_writeToURL_error_1, url?._id ?? ffi.nullptr, error); + } + + NSArray keysSortedByValueUsingSelector_(ffi.Pointer comparator) { + final _ret = _lib._objc_msgSend_75( + _id, _lib._sel_keysSortedByValueUsingSelector_1, comparator); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + void getObjects_andKeys_count_(ffi.Pointer> objects, + ffi.Pointer> keys, int count) { + _lib._objc_msgSend_140( + _id, _lib._sel_getObjects_andKeys_count_1, objects, keys, count); + } + + NSObject objectForKeyedSubscript_(NSObject key) { + final _ret = _lib._objc_msgSend_16( + _id, _lib._sel_objectForKeyedSubscript_1, key._id); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void enumerateKeysAndObjectsUsingBlock_( + ObjCBlock_ffiVoid_ObjCObject_ObjCObject_bool block) { + _lib._objc_msgSend_141( + _id, _lib._sel_enumerateKeysAndObjectsUsingBlock_1, block._id); + } + + void enumerateKeysAndObjectsWithOptions_usingBlock_( + int opts, ObjCBlock_ffiVoid_ObjCObject_ObjCObject_bool block) { + _lib._objc_msgSend_142( + _id, + _lib._sel_enumerateKeysAndObjectsWithOptions_usingBlock_1, + opts, + block._id); + } + + NSArray keysSortedByValueUsingComparator_( + ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject cmptr) { + final _ret = _lib._objc_msgSend_115( + _id, _lib._sel_keysSortedByValueUsingComparator_1, cmptr._id); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray keysSortedByValueWithOptions_usingComparator_( + int opts, ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject cmptr) { + final _ret = _lib._objc_msgSend_116( + _id, + _lib._sel_keysSortedByValueWithOptions_usingComparator_1, + opts, + cmptr._id); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSObject keysOfEntriesPassingTest_( + ObjCBlock_bool_ObjCObject_ObjCObject_bool predicate) { + final _ret = _lib._objc_msgSend_143( + _id, _lib._sel_keysOfEntriesPassingTest_1, predicate._id); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject keysOfEntriesWithOptions_passingTest_( + int opts, ObjCBlock_bool_ObjCObject_ObjCObject_bool predicate) { + final _ret = _lib._objc_msgSend_144(_id, + _lib._sel_keysOfEntriesWithOptions_passingTest_1, opts, predicate._id); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void getObjects_andKeys_(ffi.Pointer> objects, + ffi.Pointer> keys) { + _lib._objc_msgSend_145(_id, _lib._sel_getObjects_andKeys_1, objects, keys); + } + + static NSDictionary dictionaryWithContentsOfFile_( + SentryCocoa _lib, NSString? path) { + final _ret = _lib._objc_msgSend_146(_lib._class_NSDictionary1, + _lib._sel_dictionaryWithContentsOfFile_1, path?._id ?? ffi.nullptr); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSDictionary dictionaryWithContentsOfURL_( + SentryCocoa _lib, NSURL? url) { + final _ret = _lib._objc_msgSend_147(_lib._class_NSDictionary1, + _lib._sel_dictionaryWithContentsOfURL_1, url?._id ?? ffi.nullptr); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSDictionary initWithContentsOfFile_(NSString? path) { + final _ret = _lib._objc_msgSend_146( + _id, _lib._sel_initWithContentsOfFile_1, path?._id ?? ffi.nullptr); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSDictionary initWithContentsOfURL_(NSURL? url) { + final _ret = _lib._objc_msgSend_147( + _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + bool writeToFile_atomically_(NSString? path, bool useAuxiliaryFile) { + return _lib._objc_msgSend_25(_id, _lib._sel_writeToFile_atomically_1, + path?._id ?? ffi.nullptr, useAuxiliaryFile); + } + + bool writeToURL_atomically_(NSURL? url, bool atomically) { + return _lib._objc_msgSend_125(_id, _lib._sel_writeToURL_atomically_1, + url?._id ?? ffi.nullptr, atomically); + } + + static NSDictionary dictionary(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSDictionary1, _lib._sel_dictionary1); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSDictionary dictionaryWithObject_forKey_( + SentryCocoa _lib, NSObject object, NSObject? key) { + final _ret = _lib._objc_msgSend_148( + _lib._class_NSDictionary1, + _lib._sel_dictionaryWithObject_forKey_1, + object._id, + key?._id ?? ffi.nullptr); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSDictionary dictionaryWithObjects_forKeys_count_( + SentryCocoa _lib, + ffi.Pointer> objects, + ffi.Pointer> keys, + int cnt) { + final _ret = _lib._objc_msgSend_137(_lib._class_NSDictionary1, + _lib._sel_dictionaryWithObjects_forKeys_count_1, objects, keys, cnt); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSDictionary dictionaryWithObjectsAndKeys_( + SentryCocoa _lib, NSObject firstObject) { + final _ret = _lib._objc_msgSend_16(_lib._class_NSDictionary1, + _lib._sel_dictionaryWithObjectsAndKeys_1, firstObject._id); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSDictionary dictionaryWithDictionary_( + SentryCocoa _lib, NSDictionary? dict) { + final _ret = _lib._objc_msgSend_149(_lib._class_NSDictionary1, + _lib._sel_dictionaryWithDictionary_1, dict?._id ?? ffi.nullptr); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSDictionary dictionaryWithObjects_forKeys_( + SentryCocoa _lib, NSArray? objects, NSArray? keys) { + final _ret = _lib._objc_msgSend_150( + _lib._class_NSDictionary1, + _lib._sel_dictionaryWithObjects_forKeys_1, + objects?._id ?? ffi.nullptr, + keys?._id ?? ffi.nullptr); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSDictionary initWithObjectsAndKeys_(NSObject firstObject) { + final _ret = _lib._objc_msgSend_16( + _id, _lib._sel_initWithObjectsAndKeys_1, firstObject._id); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSDictionary initWithDictionary_(NSDictionary? otherDictionary) { + final _ret = _lib._objc_msgSend_149(_id, _lib._sel_initWithDictionary_1, + otherDictionary?._id ?? ffi.nullptr); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSDictionary initWithDictionary_copyItems_( + NSDictionary? otherDictionary, bool flag) { + final _ret = _lib._objc_msgSend_151( + _id, + _lib._sel_initWithDictionary_copyItems_1, + otherDictionary?._id ?? ffi.nullptr, + flag); + return NSDictionary._(_ret, _lib, retain: false, release: true); + } + + NSDictionary initWithObjects_forKeys_(NSArray? objects, NSArray? keys) { + final _ret = _lib._objc_msgSend_150( + _id, + _lib._sel_initWithObjects_forKeys_1, + objects?._id ?? ffi.nullptr, + keys?._id ?? ffi.nullptr); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSDictionary initWithContentsOfURL_error_( + NSURL? url, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_152( + _id, + _lib._sel_initWithContentsOfURL_error_1, + url?._id ?? ffi.nullptr, + error); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSDictionary dictionaryWithContentsOfURL_error_(SentryCocoa _lib, + NSURL? url, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_152( + _lib._class_NSDictionary1, + _lib._sel_dictionaryWithContentsOfURL_error_1, + url?._id ?? ffi.nullptr, + error); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSObject sharedKeySetForKeys_(SentryCocoa _lib, NSArray? keys) { + final _ret = _lib._objc_msgSend_67(_lib._class_NSDictionary1, + _lib._sel_sharedKeySetForKeys_1, keys?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + int countByEnumeratingWithState_objects_count_( + ffi.Pointer state, + ffi.Pointer> buffer, + int len) { + return _lib._objc_msgSend_153( + _id, + _lib._sel_countByEnumeratingWithState_objects_count_1, + state, + buffer, + len); + } + + int fileSize() { + return _lib._objc_msgSend_154(_id, _lib._sel_fileSize1); + } + + NSDate fileModificationDate() { + final _ret = _lib._objc_msgSend_162(_id, _lib._sel_fileModificationDate1); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + NSString fileType() { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_fileType1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + int filePosixPermissions() { + return _lib._objc_msgSend_10(_id, _lib._sel_filePosixPermissions1); + } + + NSString fileOwnerAccountName() { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_fileOwnerAccountName1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString fileGroupOwnerAccountName() { + final _ret = + _lib._objc_msgSend_20(_id, _lib._sel_fileGroupOwnerAccountName1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + int fileSystemNumber() { + return _lib._objc_msgSend_78(_id, _lib._sel_fileSystemNumber1); + } + + int fileSystemFileNumber() { + return _lib._objc_msgSend_10(_id, _lib._sel_fileSystemFileNumber1); + } + + bool fileExtensionHidden() { + return _lib._objc_msgSend_12(_id, _lib._sel_fileExtensionHidden1); + } + + int fileHFSCreatorCode() { + return _lib._objc_msgSend_197(_id, _lib._sel_fileHFSCreatorCode1); + } + + int fileHFSTypeCode() { + return _lib._objc_msgSend_197(_id, _lib._sel_fileHFSTypeCode1); + } + + bool fileIsImmutable() { + return _lib._objc_msgSend_12(_id, _lib._sel_fileIsImmutable1); + } + + bool fileIsAppendOnly() { + return _lib._objc_msgSend_12(_id, _lib._sel_fileIsAppendOnly1); + } + + NSDate fileCreationDate() { + final _ret = _lib._objc_msgSend_162(_id, _lib._sel_fileCreationDate1); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + NSNumber fileOwnerAccountID() { + final _ret = _lib._objc_msgSend_198(_id, _lib._sel_fileOwnerAccountID1); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + NSNumber fileGroupOwnerAccountID() { + final _ret = + _lib._objc_msgSend_198(_id, _lib._sel_fileGroupOwnerAccountID1); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + @override + NSObject valueForKey_(NSString? key) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_valueForKey_1, key?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSDictionary new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSDictionary1, _lib._sel_new1); + return NSDictionary._(_ret, _lib, retain: false, release: true); + } + + static NSDictionary allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSDictionary1, _lib._sel_allocWithZone_1, zone); + return NSDictionary._(_ret, _lib, retain: false, release: true); + } + + static NSDictionary alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSDictionary1, _lib._sel_alloc1); + return NSDictionary._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSDictionary1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSDictionary1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSDictionary1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSDictionary1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSDictionary1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSDictionary1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSDictionary1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSDictionary1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSDictionary1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +void _ObjCBlock_ffiVoid_ObjCObject_ObjCObject_bool_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, + ffi.Pointer arg1, ffi.Pointer arg2)>>() + .asFunction< + void Function( + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>()(arg0, arg1, arg2); +} + +final _ObjCBlock_ffiVoid_ObjCObject_ObjCObject_bool_closureRegistry = + {}; +int _ObjCBlock_ffiVoid_ObjCObject_ObjCObject_bool_closureRegistryIndex = 0; +ffi.Pointer + _ObjCBlock_ffiVoid_ObjCObject_ObjCObject_bool_registerClosure(Function fn) { + final id = + ++_ObjCBlock_ffiVoid_ObjCObject_ObjCObject_bool_closureRegistryIndex; + _ObjCBlock_ffiVoid_ObjCObject_ObjCObject_bool_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_ObjCObject_ObjCObject_bool_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2) { + return (_ObjCBlock_ffiVoid_ObjCObject_ObjCObject_bool_closureRegistry[ + block.ref.target.address] + as void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer))(arg0, arg1, arg2); +} + +class ObjCBlock_ffiVoid_ObjCObject_ObjCObject_bool extends _ObjCBlockBase { + ObjCBlock_ffiVoid_ObjCObject_ObjCObject_bool._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_ObjCObject_ObjCObject_bool.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_ObjCObject_ObjCObject_bool_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_ObjCObject_ObjCObject_bool.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, ffi.Pointer arg1, + ffi.Pointer arg2) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_ObjCObject_ObjCObject_bool_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_ObjCObject_ObjCObject_bool_registerClosure( + fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0, ffi.Pointer arg1, + ffi.Pointer arg2) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>()(_id, arg0, arg1, arg2); + } +} + +bool _ObjCBlock_bool_ObjCObject_ObjCObject_bool_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer arg0, + ffi.Pointer arg1, ffi.Pointer arg2)>>() + .asFunction< + bool Function( + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>()(arg0, arg1, arg2); +} + +final _ObjCBlock_bool_ObjCObject_ObjCObject_bool_closureRegistry = + {}; +int _ObjCBlock_bool_ObjCObject_ObjCObject_bool_closureRegistryIndex = 0; +ffi.Pointer + _ObjCBlock_bool_ObjCObject_ObjCObject_bool_registerClosure(Function fn) { + final id = ++_ObjCBlock_bool_ObjCObject_ObjCObject_bool_closureRegistryIndex; + _ObjCBlock_bool_ObjCObject_ObjCObject_bool_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +bool _ObjCBlock_bool_ObjCObject_ObjCObject_bool_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2) { + return (_ObjCBlock_bool_ObjCObject_ObjCObject_bool_closureRegistry[ + block.ref.target.address] + as bool Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer))(arg0, arg1, arg2); +} + +class ObjCBlock_bool_ObjCObject_ObjCObject_bool extends _ObjCBlockBase { + ObjCBlock_bool_ObjCObject_ObjCObject_bool._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_bool_ObjCObject_ObjCObject_bool.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>( + _ObjCBlock_bool_ObjCObject_ObjCObject_bool_fnPtrTrampoline, + false) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_bool_ObjCObject_ObjCObject_bool.fromFunction( + SentryCocoa lib, + bool Function(ffi.Pointer arg0, ffi.Pointer arg1, + ffi.Pointer arg2) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>( + _ObjCBlock_bool_ObjCObject_ObjCObject_bool_closureTrampoline, + false) + .cast(), + _ObjCBlock_bool_ObjCObject_ObjCObject_bool_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + bool call(ffi.Pointer arg0, ffi.Pointer arg1, + ffi.Pointer arg2) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>>() + .asFunction< + bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>()(_id, arg0, arg1, arg2); + } +} + +class NSFastEnumerationState extends ffi.Struct { + @ffi.UnsignedLong() + external int state; + + external ffi.Pointer> itemsPtr; + + external ffi.Pointer mutationsPtr; + + @ffi.Array.multi([5]) + external ffi.Array extra; +} + +class NSDate extends NSObject { + NSDate._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSDate] that points to the same underlying object as [other]. + static NSDate castFrom(T other) { + return NSDate._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSDate] that wraps the given raw object pointer. + static NSDate castFromPointer(SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSDate._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSDate]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSDate1); + } + + double get timeIntervalSinceReferenceDate { + return _lib._objc_msgSend_155( + _id, _lib._sel_timeIntervalSinceReferenceDate1); + } + + @override + NSDate init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + NSDate initWithTimeIntervalSinceReferenceDate_(double ti) { + final _ret = _lib._objc_msgSend_156( + _id, _lib._sel_initWithTimeIntervalSinceReferenceDate_1, ti); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + NSDate initWithCoder_(NSCoder? coder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + double timeIntervalSinceDate_(NSDate? anotherDate) { + return _lib._objc_msgSend_157(_id, _lib._sel_timeIntervalSinceDate_1, + anotherDate?._id ?? ffi.nullptr); + } + + double get timeIntervalSinceNow { + return _lib._objc_msgSend_155(_id, _lib._sel_timeIntervalSinceNow1); + } + + double get timeIntervalSince1970 { + return _lib._objc_msgSend_155(_id, _lib._sel_timeIntervalSince19701); + } + + NSObject addTimeInterval_(double seconds) { + final _ret = + _lib._objc_msgSend_156(_id, _lib._sel_addTimeInterval_1, seconds); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSDate dateByAddingTimeInterval_(double ti) { + final _ret = + _lib._objc_msgSend_156(_id, _lib._sel_dateByAddingTimeInterval_1, ti); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + NSDate earlierDate_(NSDate? anotherDate) { + final _ret = _lib._objc_msgSend_158( + _id, _lib._sel_earlierDate_1, anotherDate?._id ?? ffi.nullptr); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + NSDate laterDate_(NSDate? anotherDate) { + final _ret = _lib._objc_msgSend_158( + _id, _lib._sel_laterDate_1, anotherDate?._id ?? ffi.nullptr); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + int compare_(NSDate? other) { + return _lib._objc_msgSend_159( + _id, _lib._sel_compare_1, other?._id ?? ffi.nullptr); + } + + bool isEqualToDate_(NSDate? otherDate) { + return _lib._objc_msgSend_160( + _id, _lib._sel_isEqualToDate_1, otherDate?._id ?? ffi.nullptr); + } + + NSString? get description { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString descriptionWithLocale_(NSObject locale) { + final _ret = _lib._objc_msgSend_65( + _id, _lib._sel_descriptionWithLocale_1, locale._id); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSDate date(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSDate1, _lib._sel_date1); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + static NSDate dateWithTimeIntervalSinceNow_(SentryCocoa _lib, double secs) { + final _ret = _lib._objc_msgSend_156( + _lib._class_NSDate1, _lib._sel_dateWithTimeIntervalSinceNow_1, secs); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + static NSDate dateWithTimeIntervalSinceReferenceDate_( + SentryCocoa _lib, double ti) { + final _ret = _lib._objc_msgSend_156(_lib._class_NSDate1, + _lib._sel_dateWithTimeIntervalSinceReferenceDate_1, ti); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + static NSDate dateWithTimeIntervalSince1970_(SentryCocoa _lib, double secs) { + final _ret = _lib._objc_msgSend_156( + _lib._class_NSDate1, _lib._sel_dateWithTimeIntervalSince1970_1, secs); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + static NSDate dateWithTimeInterval_sinceDate_( + SentryCocoa _lib, double secsToBeAdded, NSDate? date) { + final _ret = _lib._objc_msgSend_161( + _lib._class_NSDate1, + _lib._sel_dateWithTimeInterval_sinceDate_1, + secsToBeAdded, + date?._id ?? ffi.nullptr); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + static NSDate? getDistantFuture(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_162(_lib._class_NSDate1, _lib._sel_distantFuture1); + return _ret.address == 0 + ? null + : NSDate._(_ret, _lib, retain: true, release: true); + } + + static NSDate? getDistantPast(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_162(_lib._class_NSDate1, _lib._sel_distantPast1); + return _ret.address == 0 + ? null + : NSDate._(_ret, _lib, retain: true, release: true); + } + + static NSDate? getNow(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_162(_lib._class_NSDate1, _lib._sel_now1); + return _ret.address == 0 + ? null + : NSDate._(_ret, _lib, retain: true, release: true); + } + + NSDate initWithTimeIntervalSinceNow_(double secs) { + final _ret = _lib._objc_msgSend_156( + _id, _lib._sel_initWithTimeIntervalSinceNow_1, secs); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + NSDate initWithTimeIntervalSince1970_(double secs) { + final _ret = _lib._objc_msgSend_156( + _id, _lib._sel_initWithTimeIntervalSince1970_1, secs); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + NSDate initWithTimeInterval_sinceDate_(double secsToBeAdded, NSDate? date) { + final _ret = _lib._objc_msgSend_161( + _id, + _lib._sel_initWithTimeInterval_sinceDate_1, + secsToBeAdded, + date?._id ?? ffi.nullptr); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + static NSObject dateWithNaturalLanguageString_locale_( + SentryCocoa _lib, NSString? string, NSObject locale) { + final _ret = _lib._objc_msgSend_163( + _lib._class_NSDate1, + _lib._sel_dateWithNaturalLanguageString_locale_1, + string?._id ?? ffi.nullptr, + locale._id); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject dateWithNaturalLanguageString_( + SentryCocoa _lib, NSString? string) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSDate1, + _lib._sel_dateWithNaturalLanguageString_1, string?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject dateWithString_(SentryCocoa _lib, NSString? aString) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSDate1, + _lib._sel_dateWithString_1, aString?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSCalendarDate dateWithCalendarFormat_timeZone_( + NSString? format, NSTimeZone? aTimeZone) { + final _ret = _lib._objc_msgSend_195( + _id, + _lib._sel_dateWithCalendarFormat_timeZone_1, + format?._id ?? ffi.nullptr, + aTimeZone?._id ?? ffi.nullptr); + return NSCalendarDate._(_ret, _lib, retain: true, release: true); + } + + NSString descriptionWithCalendarFormat_timeZone_locale_( + NSString? format, NSTimeZone? aTimeZone, NSObject locale) { + final _ret = _lib._objc_msgSend_196( + _id, + _lib._sel_descriptionWithCalendarFormat_timeZone_locale_1, + format?._id ?? ffi.nullptr, + aTimeZone?._id ?? ffi.nullptr, + locale._id); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSObject initWithString_(NSString? description) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithString_1, description?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSDate new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSDate1, _lib._sel_new1); + return NSDate._(_ret, _lib, retain: false, release: true); + } + + static NSDate allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSDate1, _lib._sel_allocWithZone_1, zone); + return NSDate._(_ret, _lib, retain: false, release: true); + } + + static NSDate alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSDate1, _lib._sel_alloc1); + return NSDate._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSDate1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSDate1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSDate1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSDate1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSDate1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSDate1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSDate1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSDate1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSDate1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSCalendarDate extends NSDate { + NSCalendarDate._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSCalendarDate] that points to the same underlying object as [other]. + static NSCalendarDate castFrom(T other) { + return NSCalendarDate._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSCalendarDate] that wraps the given raw object pointer. + static NSCalendarDate castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSCalendarDate._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSCalendarDate]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSCalendarDate1); + } + + static NSObject calendarDate(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSCalendarDate1, _lib._sel_calendarDate1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject dateWithString_calendarFormat_locale_(SentryCocoa _lib, + NSString? description, NSString? format, NSObject locale) { + final _ret = _lib._objc_msgSend_164( + _lib._class_NSCalendarDate1, + _lib._sel_dateWithString_calendarFormat_locale_1, + description?._id ?? ffi.nullptr, + format?._id ?? ffi.nullptr, + locale._id); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject dateWithString_calendarFormat_( + SentryCocoa _lib, NSString? description, NSString? format) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSCalendarDate1, + _lib._sel_dateWithString_calendarFormat_1, + description?._id ?? ffi.nullptr, + format?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject dateWithYear_month_day_hour_minute_second_timeZone_( + SentryCocoa _lib, + int year, + int month, + int day, + int hour, + int minute, + int second, + NSTimeZone? aTimeZone) { + final _ret = _lib._objc_msgSend_190( + _lib._class_NSCalendarDate1, + _lib._sel_dateWithYear_month_day_hour_minute_second_timeZone_1, + year, + month, + day, + hour, + minute, + second, + aTimeZone?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSCalendarDate dateByAddingYears_months_days_hours_minutes_seconds_( + int year, int month, int day, int hour, int minute, int second) { + final _ret = _lib._objc_msgSend_191( + _id, + _lib._sel_dateByAddingYears_months_days_hours_minutes_seconds_1, + year, + month, + day, + hour, + minute, + second); + return NSCalendarDate._(_ret, _lib, retain: true, release: true); + } + + int dayOfCommonEra() { + return _lib._objc_msgSend_78(_id, _lib._sel_dayOfCommonEra1); + } + + int dayOfMonth() { + return _lib._objc_msgSend_78(_id, _lib._sel_dayOfMonth1); + } + + int dayOfWeek() { + return _lib._objc_msgSend_78(_id, _lib._sel_dayOfWeek1); + } + + int dayOfYear() { + return _lib._objc_msgSend_78(_id, _lib._sel_dayOfYear1); + } + + int hourOfDay() { + return _lib._objc_msgSend_78(_id, _lib._sel_hourOfDay1); + } + + int minuteOfHour() { + return _lib._objc_msgSend_78(_id, _lib._sel_minuteOfHour1); + } + + int monthOfYear() { + return _lib._objc_msgSend_78(_id, _lib._sel_monthOfYear1); + } + + int secondOfMinute() { + return _lib._objc_msgSend_78(_id, _lib._sel_secondOfMinute1); + } + + int yearOfCommonEra() { + return _lib._objc_msgSend_78(_id, _lib._sel_yearOfCommonEra1); + } + + NSString calendarFormat() { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_calendarFormat1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString descriptionWithCalendarFormat_locale_( + NSString? format, NSObject locale) { + final _ret = _lib._objc_msgSend_173( + _id, + _lib._sel_descriptionWithCalendarFormat_locale_1, + format?._id ?? ffi.nullptr, + locale._id); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString descriptionWithCalendarFormat_(NSString? format) { + final _ret = _lib._objc_msgSend_64(_id, + _lib._sel_descriptionWithCalendarFormat_1, format?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + @override + NSString descriptionWithLocale_(NSObject locale) { + final _ret = _lib._objc_msgSend_65( + _id, _lib._sel_descriptionWithLocale_1, locale._id); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSTimeZone timeZone() { + final _ret = _lib._objc_msgSend_168(_id, _lib._sel_timeZone1); + return NSTimeZone._(_ret, _lib, retain: true, release: true); + } + + NSObject initWithString_calendarFormat_locale_( + NSString? description, NSString? format, NSObject locale) { + final _ret = _lib._objc_msgSend_164( + _id, + _lib._sel_initWithString_calendarFormat_locale_1, + description?._id ?? ffi.nullptr, + format?._id ?? ffi.nullptr, + locale._id); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject initWithString_calendarFormat_( + NSString? description, NSString? format) { + final _ret = _lib._objc_msgSend_165( + _id, + _lib._sel_initWithString_calendarFormat_1, + description?._id ?? ffi.nullptr, + format?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + @override + NSObject initWithString_(NSString? description) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithString_1, description?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject initWithYear_month_day_hour_minute_second_timeZone_( + int year, + int month, + int day, + int hour, + int minute, + int second, + NSTimeZone? aTimeZone) { + final _ret = _lib._objc_msgSend_190( + _id, + _lib._sel_initWithYear_month_day_hour_minute_second_timeZone_1, + year, + month, + day, + hour, + minute, + second, + aTimeZone?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void setCalendarFormat_(NSString? format) { + _lib._objc_msgSend_192( + _id, _lib._sel_setCalendarFormat_1, format?._id ?? ffi.nullptr); + } + + void setTimeZone_(NSTimeZone? aTimeZone) { + _lib._objc_msgSend_193( + _id, _lib._sel_setTimeZone_1, aTimeZone?._id ?? ffi.nullptr); + } + + void years_months_days_hours_minutes_seconds_sinceDate_( + ffi.Pointer yp, + ffi.Pointer mop, + ffi.Pointer dp, + ffi.Pointer hp, + ffi.Pointer mip, + ffi.Pointer sp, + NSCalendarDate? date) { + _lib._objc_msgSend_194( + _id, + _lib._sel_years_months_days_hours_minutes_seconds_sinceDate_1, + yp, + mop, + dp, + hp, + mip, + sp, + date?._id ?? ffi.nullptr); + } + + static NSDate? getDistantFuture(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_162( + _lib._class_NSCalendarDate1, _lib._sel_distantFuture1); + return _ret.address == 0 + ? null + : NSDate._(_ret, _lib, retain: true, release: true); + } + + static NSDate? getDistantPast(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_162( + _lib._class_NSCalendarDate1, _lib._sel_distantPast1); + return _ret.address == 0 + ? null + : NSDate._(_ret, _lib, retain: true, release: true); + } + + @override + NSCalendarDate init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSCalendarDate._(_ret, _lib, retain: true, release: true); + } + + @override + NSCalendarDate initWithTimeIntervalSinceReferenceDate_(double ti) { + final _ret = _lib._objc_msgSend_156( + _id, _lib._sel_initWithTimeIntervalSinceReferenceDate_1, ti); + return NSCalendarDate._(_ret, _lib, retain: true, release: true); + } + + @override + NSCalendarDate initWithCoder_(NSCoder? coder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr); + return NSCalendarDate._(_ret, _lib, retain: true, release: true); + } + + @override + NSCalendarDate dateByAddingTimeInterval_(double ti) { + final _ret = + _lib._objc_msgSend_156(_id, _lib._sel_dateByAddingTimeInterval_1, ti); + return NSCalendarDate._(_ret, _lib, retain: true, release: true); + } + + static NSCalendarDate date(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSCalendarDate1, _lib._sel_date1); + return NSCalendarDate._(_ret, _lib, retain: true, release: true); + } + + static NSCalendarDate dateWithTimeIntervalSinceNow_( + SentryCocoa _lib, double secs) { + final _ret = _lib._objc_msgSend_156(_lib._class_NSCalendarDate1, + _lib._sel_dateWithTimeIntervalSinceNow_1, secs); + return NSCalendarDate._(_ret, _lib, retain: true, release: true); + } + + static NSCalendarDate dateWithTimeIntervalSinceReferenceDate_( + SentryCocoa _lib, double ti) { + final _ret = _lib._objc_msgSend_156(_lib._class_NSCalendarDate1, + _lib._sel_dateWithTimeIntervalSinceReferenceDate_1, ti); + return NSCalendarDate._(_ret, _lib, retain: true, release: true); + } + + static NSCalendarDate dateWithTimeIntervalSince1970_( + SentryCocoa _lib, double secs) { + final _ret = _lib._objc_msgSend_156(_lib._class_NSCalendarDate1, + _lib._sel_dateWithTimeIntervalSince1970_1, secs); + return NSCalendarDate._(_ret, _lib, retain: true, release: true); + } + + static NSCalendarDate dateWithTimeInterval_sinceDate_( + SentryCocoa _lib, double secsToBeAdded, NSDate? date) { + final _ret = _lib._objc_msgSend_161( + _lib._class_NSCalendarDate1, + _lib._sel_dateWithTimeInterval_sinceDate_1, + secsToBeAdded, + date?._id ?? ffi.nullptr); + return NSCalendarDate._(_ret, _lib, retain: true, release: true); + } + + static NSDate? getNow(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_162(_lib._class_NSCalendarDate1, _lib._sel_now1); + return _ret.address == 0 + ? null + : NSDate._(_ret, _lib, retain: true, release: true); + } + + @override + NSCalendarDate initWithTimeIntervalSinceNow_(double secs) { + final _ret = _lib._objc_msgSend_156( + _id, _lib._sel_initWithTimeIntervalSinceNow_1, secs); + return NSCalendarDate._(_ret, _lib, retain: true, release: true); + } + + @override + NSCalendarDate initWithTimeIntervalSince1970_(double secs) { + final _ret = _lib._objc_msgSend_156( + _id, _lib._sel_initWithTimeIntervalSince1970_1, secs); + return NSCalendarDate._(_ret, _lib, retain: true, release: true); + } + + @override + NSCalendarDate initWithTimeInterval_sinceDate_( + double secsToBeAdded, NSDate? date) { + final _ret = _lib._objc_msgSend_161( + _id, + _lib._sel_initWithTimeInterval_sinceDate_1, + secsToBeAdded, + date?._id ?? ffi.nullptr); + return NSCalendarDate._(_ret, _lib, retain: true, release: true); + } + + static NSObject dateWithNaturalLanguageString_locale_( + SentryCocoa _lib, NSString? string, NSObject locale) { + final _ret = _lib._objc_msgSend_163( + _lib._class_NSCalendarDate1, + _lib._sel_dateWithNaturalLanguageString_locale_1, + string?._id ?? ffi.nullptr, + locale._id); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject dateWithNaturalLanguageString_( + SentryCocoa _lib, NSString? string) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSCalendarDate1, + _lib._sel_dateWithNaturalLanguageString_1, string?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject dateWithString_(SentryCocoa _lib, NSString? aString) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSCalendarDate1, + _lib._sel_dateWithString_1, aString?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSCalendarDate new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSCalendarDate1, _lib._sel_new1); + return NSCalendarDate._(_ret, _lib, retain: false, release: true); + } + + static NSCalendarDate allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSCalendarDate1, _lib._sel_allocWithZone_1, zone); + return NSCalendarDate._(_ret, _lib, retain: false, release: true); + } + + static NSCalendarDate alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSCalendarDate1, _lib._sel_alloc1); + return NSCalendarDate._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSCalendarDate1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSCalendarDate1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSCalendarDate1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSCalendarDate1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSCalendarDate1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSCalendarDate1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSCalendarDate1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSCalendarDate1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSCalendarDate1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSTimeZone extends NSObject { + NSTimeZone._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSTimeZone] that points to the same underlying object as [other]. + static NSTimeZone castFrom(T other) { + return NSTimeZone._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSTimeZone] that wraps the given raw object pointer. + static NSTimeZone castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSTimeZone._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSTimeZone]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSTimeZone1); + } + + NSString? get name { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSData? get data { + final _ret = _lib._objc_msgSend_39(_id, _lib._sel_data1); + return _ret.address == 0 + ? null + : NSData._(_ret, _lib, retain: true, release: true); + } + + int secondsFromGMTForDate_(NSDate? aDate) { + return _lib._objc_msgSend_166( + _id, _lib._sel_secondsFromGMTForDate_1, aDate?._id ?? ffi.nullptr); + } + + NSString abbreviationForDate_(NSDate? aDate) { + final _ret = _lib._objc_msgSend_167( + _id, _lib._sel_abbreviationForDate_1, aDate?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + bool isDaylightSavingTimeForDate_(NSDate? aDate) { + return _lib._objc_msgSend_160(_id, _lib._sel_isDaylightSavingTimeForDate_1, + aDate?._id ?? ffi.nullptr); + } + + double daylightSavingTimeOffsetForDate_(NSDate? aDate) { + return _lib._objc_msgSend_157(_id, + _lib._sel_daylightSavingTimeOffsetForDate_1, aDate?._id ?? ffi.nullptr); + } + + NSDate nextDaylightSavingTimeTransitionAfterDate_(NSDate? aDate) { + final _ret = _lib._objc_msgSend_158( + _id, + _lib._sel_nextDaylightSavingTimeTransitionAfterDate_1, + aDate?._id ?? ffi.nullptr); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + static NSTimeZone? getSystemTimeZone(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_168( + _lib._class_NSTimeZone1, _lib._sel_systemTimeZone1); + return _ret.address == 0 + ? null + : NSTimeZone._(_ret, _lib, retain: true, release: true); + } + + static void resetSystemTimeZone(SentryCocoa _lib) { + _lib._objc_msgSend_1( + _lib._class_NSTimeZone1, _lib._sel_resetSystemTimeZone1); + } + + static NSTimeZone? getDefaultTimeZone(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_168( + _lib._class_NSTimeZone1, _lib._sel_defaultTimeZone1); + return _ret.address == 0 + ? null + : NSTimeZone._(_ret, _lib, retain: true, release: true); + } + + static void setDefaultTimeZone(SentryCocoa _lib, NSTimeZone? value) { + return _lib._objc_msgSend_169(_lib._class_NSTimeZone1, + _lib._sel_setDefaultTimeZone_1, value?._id ?? ffi.nullptr); + } + + static NSTimeZone? getLocalTimeZone(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_168( + _lib._class_NSTimeZone1, _lib._sel_localTimeZone1); + return _ret.address == 0 + ? null + : NSTimeZone._(_ret, _lib, retain: true, release: true); + } + + static NSArray? getKnownTimeZoneNames(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSTimeZone1, _lib._sel_knownTimeZoneNames1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSDictionary? getAbbreviationDictionary(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_170( + _lib._class_NSTimeZone1, _lib._sel_abbreviationDictionary1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + static void setAbbreviationDictionary(SentryCocoa _lib, NSDictionary? value) { + return _lib._objc_msgSend_171(_lib._class_NSTimeZone1, + _lib._sel_setAbbreviationDictionary_1, value?._id ?? ffi.nullptr); + } + + static NSString? getTimeZoneDataVersion(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_20( + _lib._class_NSTimeZone1, _lib._sel_timeZoneDataVersion1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + int get secondsFromGMT { + return _lib._objc_msgSend_78(_id, _lib._sel_secondsFromGMT1); + } + + NSString? get abbreviation { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_abbreviation1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + bool get daylightSavingTime { + return _lib._objc_msgSend_12(_id, _lib._sel_isDaylightSavingTime1); + } + + double get daylightSavingTimeOffset { + return _lib._objc_msgSend_155(_id, _lib._sel_daylightSavingTimeOffset1); + } + + NSDate? get nextDaylightSavingTimeTransition { + final _ret = _lib._objc_msgSend_162( + _id, _lib._sel_nextDaylightSavingTimeTransition1); + return _ret.address == 0 + ? null + : NSDate._(_ret, _lib, retain: true, release: true); + } + + NSString? get description { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + bool isEqualToTimeZone_(NSTimeZone? aTimeZone) { + return _lib._objc_msgSend_172( + _id, _lib._sel_isEqualToTimeZone_1, aTimeZone?._id ?? ffi.nullptr); + } + + NSString localizedName_locale_(int style, NSLocale? locale) { + final _ret = _lib._objc_msgSend_187(_id, _lib._sel_localizedName_locale_1, + style, locale?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSTimeZone timeZoneWithName_(SentryCocoa _lib, NSString? tzName) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSTimeZone1, + _lib._sel_timeZoneWithName_1, tzName?._id ?? ffi.nullptr); + return NSTimeZone._(_ret, _lib, retain: true, release: true); + } + + static NSTimeZone timeZoneWithName_data_( + SentryCocoa _lib, NSString? tzName, NSData? aData) { + final _ret = _lib._objc_msgSend_188( + _lib._class_NSTimeZone1, + _lib._sel_timeZoneWithName_data_1, + tzName?._id ?? ffi.nullptr, + aData?._id ?? ffi.nullptr); + return NSTimeZone._(_ret, _lib, retain: true, release: true); + } + + NSTimeZone initWithName_(NSString? tzName) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithName_1, tzName?._id ?? ffi.nullptr); + return NSTimeZone._(_ret, _lib, retain: true, release: true); + } + + NSTimeZone initWithName_data_(NSString? tzName, NSData? aData) { + final _ret = _lib._objc_msgSend_188(_id, _lib._sel_initWithName_data_1, + tzName?._id ?? ffi.nullptr, aData?._id ?? ffi.nullptr); + return NSTimeZone._(_ret, _lib, retain: true, release: true); + } + + static NSTimeZone timeZoneForSecondsFromGMT_(SentryCocoa _lib, int seconds) { + final _ret = _lib._objc_msgSend_189(_lib._class_NSTimeZone1, + _lib._sel_timeZoneForSecondsFromGMT_1, seconds); + return NSTimeZone._(_ret, _lib, retain: true, release: true); + } + + static NSTimeZone timeZoneWithAbbreviation_( + SentryCocoa _lib, NSString? abbreviation) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSTimeZone1, + _lib._sel_timeZoneWithAbbreviation_1, abbreviation?._id ?? ffi.nullptr); + return NSTimeZone._(_ret, _lib, retain: true, release: true); + } + + @override + NSTimeZone init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSTimeZone._(_ret, _lib, retain: true, release: true); + } + + static NSTimeZone new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSTimeZone1, _lib._sel_new1); + return NSTimeZone._(_ret, _lib, retain: false, release: true); + } + + static NSTimeZone allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSTimeZone1, _lib._sel_allocWithZone_1, zone); + return NSTimeZone._(_ret, _lib, retain: false, release: true); + } + + static NSTimeZone alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSTimeZone1, _lib._sel_alloc1); + return NSTimeZone._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSTimeZone1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSTimeZone1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSTimeZone1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSTimeZone1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSTimeZone1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSTimeZone1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSTimeZone1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSTimeZone1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSTimeZone1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSTimeZoneNameStyle { + static const int NSTimeZoneNameStyleStandard = 0; + static const int NSTimeZoneNameStyleShortStandard = 1; + static const int NSTimeZoneNameStyleDaylightSaving = 2; + static const int NSTimeZoneNameStyleShortDaylightSaving = 3; + static const int NSTimeZoneNameStyleGeneric = 4; + static const int NSTimeZoneNameStyleShortGeneric = 5; +} + +class NSLocale extends NSObject { + NSLocale._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSLocale] that points to the same underlying object as [other]. + static NSLocale castFrom(T other) { + return NSLocale._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSLocale] that wraps the given raw object pointer. + static NSLocale castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSLocale._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSLocale]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSLocale1); + } + + NSObject objectForKey_(NSString key) { + final _ret = _lib._objc_msgSend_30(_id, _lib._sel_objectForKey_1, key._id); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSString displayNameForKey_value_(NSString key, NSObject value) { + final _ret = _lib._objc_msgSend_173( + _id, _lib._sel_displayNameForKey_value_1, key._id, value._id); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSLocale initWithLocaleIdentifier_(NSString? string) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithLocaleIdentifier_1, string?._id ?? ffi.nullptr); + return NSLocale._(_ret, _lib, retain: true, release: true); + } + + NSLocale initWithCoder_(NSCoder? coder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr); + return NSLocale._(_ret, _lib, retain: true, release: true); + } + + NSString? get localeIdentifier { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_localeIdentifier1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString localizedStringForLocaleIdentifier_(NSString? localeIdentifier) { + final _ret = _lib._objc_msgSend_64( + _id, + _lib._sel_localizedStringForLocaleIdentifier_1, + localeIdentifier?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get languageCode { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_languageCode1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString localizedStringForLanguageCode_(NSString? languageCode) { + final _ret = _lib._objc_msgSend_64( + _id, + _lib._sel_localizedStringForLanguageCode_1, + languageCode?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get countryCode { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_countryCode1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString localizedStringForCountryCode_(NSString? countryCode) { + final _ret = _lib._objc_msgSend_64( + _id, + _lib._sel_localizedStringForCountryCode_1, + countryCode?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get scriptCode { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_scriptCode1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString localizedStringForScriptCode_(NSString? scriptCode) { + final _ret = _lib._objc_msgSend_64( + _id, + _lib._sel_localizedStringForScriptCode_1, + scriptCode?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get variantCode { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_variantCode1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString localizedStringForVariantCode_(NSString? variantCode) { + final _ret = _lib._objc_msgSend_64( + _id, + _lib._sel_localizedStringForVariantCode_1, + variantCode?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSCharacterSet? get exemplarCharacterSet { + final _ret = _lib._objc_msgSend_174(_id, _lib._sel_exemplarCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + NSString? get calendarIdentifier { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_calendarIdentifier1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString localizedStringForCalendarIdentifier_(NSString? calendarIdentifier) { + final _ret = _lib._objc_msgSend_64( + _id, + _lib._sel_localizedStringForCalendarIdentifier_1, + calendarIdentifier?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get collationIdentifier { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_collationIdentifier1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString localizedStringForCollationIdentifier_( + NSString? collationIdentifier) { + final _ret = _lib._objc_msgSend_64( + _id, + _lib._sel_localizedStringForCollationIdentifier_1, + collationIdentifier?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + bool get usesMetricSystem { + return _lib._objc_msgSend_12(_id, _lib._sel_usesMetricSystem1); + } + + NSString? get decimalSeparator { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_decimalSeparator1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get groupingSeparator { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_groupingSeparator1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get currencySymbol { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_currencySymbol1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get currencyCode { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_currencyCode1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString localizedStringForCurrencyCode_(NSString? currencyCode) { + final _ret = _lib._objc_msgSend_64( + _id, + _lib._sel_localizedStringForCurrencyCode_1, + currencyCode?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get collatorIdentifier { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_collatorIdentifier1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString localizedStringForCollatorIdentifier_(NSString? collatorIdentifier) { + final _ret = _lib._objc_msgSend_64( + _id, + _lib._sel_localizedStringForCollatorIdentifier_1, + collatorIdentifier?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get quotationBeginDelimiter { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_quotationBeginDelimiter1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get quotationEndDelimiter { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_quotationEndDelimiter1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get alternateQuotationBeginDelimiter { + final _ret = + _lib._objc_msgSend_20(_id, _lib._sel_alternateQuotationBeginDelimiter1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get alternateQuotationEndDelimiter { + final _ret = + _lib._objc_msgSend_20(_id, _lib._sel_alternateQuotationEndDelimiter1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + static NSLocale? getAutoupdatingCurrentLocale(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_182( + _lib._class_NSLocale1, _lib._sel_autoupdatingCurrentLocale1); + return _ret.address == 0 + ? null + : NSLocale._(_ret, _lib, retain: true, release: true); + } + + static NSLocale? getCurrentLocale(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_182(_lib._class_NSLocale1, _lib._sel_currentLocale1); + return _ret.address == 0 + ? null + : NSLocale._(_ret, _lib, retain: true, release: true); + } + + static NSLocale? getSystemLocale(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_182(_lib._class_NSLocale1, _lib._sel_systemLocale1); + return _ret.address == 0 + ? null + : NSLocale._(_ret, _lib, retain: true, release: true); + } + + static NSLocale localeWithLocaleIdentifier_( + SentryCocoa _lib, NSString? ident) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSLocale1, + _lib._sel_localeWithLocaleIdentifier_1, ident?._id ?? ffi.nullptr); + return NSLocale._(_ret, _lib, retain: true, release: true); + } + + @override + NSLocale init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSLocale._(_ret, _lib, retain: true, release: true); + } + + static NSArray? getAvailableLocaleIdentifiers(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSLocale1, _lib._sel_availableLocaleIdentifiers1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSArray? getISOLanguageCodes(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSLocale1, _lib._sel_ISOLanguageCodes1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSArray? getISOCountryCodes(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSLocale1, _lib._sel_ISOCountryCodes1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSArray? getISOCurrencyCodes(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSLocale1, _lib._sel_ISOCurrencyCodes1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSArray? getCommonISOCurrencyCodes(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSLocale1, _lib._sel_commonISOCurrencyCodes1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSArray? getPreferredLanguages(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSLocale1, _lib._sel_preferredLanguages1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSDictionary componentsFromLocaleIdentifier_( + SentryCocoa _lib, NSString? string) { + final _ret = _lib._objc_msgSend_146(_lib._class_NSLocale1, + _lib._sel_componentsFromLocaleIdentifier_1, string?._id ?? ffi.nullptr); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSString localeIdentifierFromComponents_( + SentryCocoa _lib, NSDictionary? dict) { + final _ret = _lib._objc_msgSend_183(_lib._class_NSLocale1, + _lib._sel_localeIdentifierFromComponents_1, dict?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString canonicalLocaleIdentifierFromString_( + SentryCocoa _lib, NSString? string) { + final _ret = _lib._objc_msgSend_64( + _lib._class_NSLocale1, + _lib._sel_canonicalLocaleIdentifierFromString_1, + string?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString canonicalLanguageIdentifierFromString_( + SentryCocoa _lib, NSString? string) { + final _ret = _lib._objc_msgSend_64( + _lib._class_NSLocale1, + _lib._sel_canonicalLanguageIdentifierFromString_1, + string?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString localeIdentifierFromWindowsLocaleCode_( + SentryCocoa _lib, int lcid) { + final _ret = _lib._objc_msgSend_184(_lib._class_NSLocale1, + _lib._sel_localeIdentifierFromWindowsLocaleCode_1, lcid); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static int windowsLocaleCodeFromLocaleIdentifier_( + SentryCocoa _lib, NSString? localeIdentifier) { + return _lib._objc_msgSend_185( + _lib._class_NSLocale1, + _lib._sel_windowsLocaleCodeFromLocaleIdentifier_1, + localeIdentifier?._id ?? ffi.nullptr); + } + + static int characterDirectionForLanguage_( + SentryCocoa _lib, NSString? isoLangCode) { + return _lib._objc_msgSend_186( + _lib._class_NSLocale1, + _lib._sel_characterDirectionForLanguage_1, + isoLangCode?._id ?? ffi.nullptr); + } + + static int lineDirectionForLanguage_( + SentryCocoa _lib, NSString? isoLangCode) { + return _lib._objc_msgSend_186(_lib._class_NSLocale1, + _lib._sel_lineDirectionForLanguage_1, isoLangCode?._id ?? ffi.nullptr); + } + + static NSLocale new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSLocale1, _lib._sel_new1); + return NSLocale._(_ret, _lib, retain: false, release: true); + } + + static NSLocale allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSLocale1, _lib._sel_allocWithZone_1, zone); + return NSLocale._(_ret, _lib, retain: false, release: true); + } + + static NSLocale alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSLocale1, _lib._sel_alloc1); + return NSLocale._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSLocale1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSLocale1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSLocale1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSLocale1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSLocale1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSLocale1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSLocale1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSLocale1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSLocale1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSCharacterSet extends NSObject { + NSCharacterSet._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSCharacterSet] that points to the same underlying object as [other]. + static NSCharacterSet castFrom(T other) { + return NSCharacterSet._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSCharacterSet] that wraps the given raw object pointer. + static NSCharacterSet castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSCharacterSet._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSCharacterSet]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSCharacterSet1); + } + + static NSCharacterSet? getControlCharacterSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_174( + _lib._class_NSCharacterSet1, _lib._sel_controlCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet? getWhitespaceCharacterSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_174( + _lib._class_NSCharacterSet1, _lib._sel_whitespaceCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet? getWhitespaceAndNewlineCharacterSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_174(_lib._class_NSCharacterSet1, + _lib._sel_whitespaceAndNewlineCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet? getDecimalDigitCharacterSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_174( + _lib._class_NSCharacterSet1, _lib._sel_decimalDigitCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet? getLetterCharacterSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_174( + _lib._class_NSCharacterSet1, _lib._sel_letterCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet? getLowercaseLetterCharacterSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_174( + _lib._class_NSCharacterSet1, _lib._sel_lowercaseLetterCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet? getUppercaseLetterCharacterSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_174( + _lib._class_NSCharacterSet1, _lib._sel_uppercaseLetterCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet? getNonBaseCharacterSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_174( + _lib._class_NSCharacterSet1, _lib._sel_nonBaseCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet? getAlphanumericCharacterSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_174( + _lib._class_NSCharacterSet1, _lib._sel_alphanumericCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet? getDecomposableCharacterSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_174( + _lib._class_NSCharacterSet1, _lib._sel_decomposableCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet? getIllegalCharacterSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_174( + _lib._class_NSCharacterSet1, _lib._sel_illegalCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet? getPunctuationCharacterSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_174( + _lib._class_NSCharacterSet1, _lib._sel_punctuationCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet? getCapitalizedLetterCharacterSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_174( + _lib._class_NSCharacterSet1, _lib._sel_capitalizedLetterCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet? getSymbolCharacterSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_174( + _lib._class_NSCharacterSet1, _lib._sel_symbolCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet? getNewlineCharacterSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_174( + _lib._class_NSCharacterSet1, _lib._sel_newlineCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: false, release: true); + } + + static NSCharacterSet characterSetWithRange_( + SentryCocoa _lib, _NSRange aRange) { + final _ret = _lib._objc_msgSend_175( + _lib._class_NSCharacterSet1, _lib._sel_characterSetWithRange_1, aRange); + return NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet characterSetWithCharactersInString_( + SentryCocoa _lib, NSString? aString) { + final _ret = _lib._objc_msgSend_176( + _lib._class_NSCharacterSet1, + _lib._sel_characterSetWithCharactersInString_1, + aString?._id ?? ffi.nullptr); + return NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet characterSetWithBitmapRepresentation_( + SentryCocoa _lib, NSData? data) { + final _ret = _lib._objc_msgSend_177( + _lib._class_NSCharacterSet1, + _lib._sel_characterSetWithBitmapRepresentation_1, + data?._id ?? ffi.nullptr); + return NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet characterSetWithContentsOfFile_( + SentryCocoa _lib, NSString? fName) { + final _ret = _lib._objc_msgSend_176(_lib._class_NSCharacterSet1, + _lib._sel_characterSetWithContentsOfFile_1, fName?._id ?? ffi.nullptr); + return NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + NSCharacterSet initWithCoder_(NSCoder? coder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr); + return NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + bool characterIsMember_(int aCharacter) { + return _lib._objc_msgSend_178( + _id, _lib._sel_characterIsMember_1, aCharacter); + } + + NSData? get bitmapRepresentation { + final _ret = _lib._objc_msgSend_39(_id, _lib._sel_bitmapRepresentation1); + return _ret.address == 0 + ? null + : NSData._(_ret, _lib, retain: true, release: true); + } + + NSCharacterSet? get invertedSet { + final _ret = _lib._objc_msgSend_174(_id, _lib._sel_invertedSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + bool longCharacterIsMember_(int theLongChar) { + return _lib._objc_msgSend_179( + _id, _lib._sel_longCharacterIsMember_1, theLongChar); + } + + bool isSupersetOfSet_(NSCharacterSet? theOtherSet) { + return _lib._objc_msgSend_180( + _id, _lib._sel_isSupersetOfSet_1, theOtherSet?._id ?? ffi.nullptr); + } + + bool hasMemberInPlane_(int thePlane) { + return _lib._objc_msgSend_181(_id, _lib._sel_hasMemberInPlane_1, thePlane); + } + + static NSCharacterSet? getURLUserAllowedCharacterSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_174( + _lib._class_NSCharacterSet1, _lib._sel_URLUserAllowedCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet? getURLPasswordAllowedCharacterSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_174( + _lib._class_NSCharacterSet1, _lib._sel_URLPasswordAllowedCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet? getURLHostAllowedCharacterSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_174( + _lib._class_NSCharacterSet1, _lib._sel_URLHostAllowedCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet? getURLPathAllowedCharacterSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_174( + _lib._class_NSCharacterSet1, _lib._sel_URLPathAllowedCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet? getURLQueryAllowedCharacterSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_174( + _lib._class_NSCharacterSet1, _lib._sel_URLQueryAllowedCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet? getURLFragmentAllowedCharacterSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_174( + _lib._class_NSCharacterSet1, _lib._sel_URLFragmentAllowedCharacterSet1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + @override + NSCharacterSet init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + static NSCharacterSet new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSCharacterSet1, _lib._sel_new1); + return NSCharacterSet._(_ret, _lib, retain: false, release: true); + } + + static NSCharacterSet allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSCharacterSet1, _lib._sel_allocWithZone_1, zone); + return NSCharacterSet._(_ret, _lib, retain: false, release: true); + } + + static NSCharacterSet alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSCharacterSet1, _lib._sel_alloc1); + return NSCharacterSet._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSCharacterSet1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSCharacterSet1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSCharacterSet1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSCharacterSet1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSCharacterSet1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSCharacterSet1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSCharacterSet1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSCharacterSet1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSCharacterSet1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSLocaleLanguageDirection { + static const int NSLocaleLanguageDirectionUnknown = 0; + static const int NSLocaleLanguageDirectionLeftToRight = 1; + static const int NSLocaleLanguageDirectionRightToLeft = 2; + static const int NSLocaleLanguageDirectionTopToBottom = 3; + static const int NSLocaleLanguageDirectionBottomToTop = 4; +} + +abstract class NSURLBookmarkCreationOptions { + static const int NSURLBookmarkCreationPreferFileIDResolution = 256; + static const int NSURLBookmarkCreationMinimalBookmark = 512; + static const int NSURLBookmarkCreationSuitableForBookmarkFile = 1024; + static const int NSURLBookmarkCreationWithSecurityScope = 2048; + static const int NSURLBookmarkCreationSecurityScopeAllowOnlyReadAccess = 4096; + static const int NSURLBookmarkCreationWithoutImplicitSecurityScope = + 536870912; +} + +abstract class NSURLBookmarkResolutionOptions { + static const int NSURLBookmarkResolutionWithoutUI = 256; + static const int NSURLBookmarkResolutionWithoutMounting = 512; + static const int NSURLBookmarkResolutionWithSecurityScope = 1024; + static const int NSURLBookmarkResolutionWithoutImplicitStartAccessing = 32768; +} + +class NSURLHandle extends NSObject { + NSURLHandle._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSURLHandle] that points to the same underlying object as [other]. + static NSURLHandle castFrom(T other) { + return NSURLHandle._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSURLHandle] that wraps the given raw object pointer. + static NSURLHandle castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSURLHandle._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSURLHandle]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSURLHandle1); + } + + static void registerURLHandleClass_( + SentryCocoa _lib, NSObject anURLHandleSubclass) { + _lib._objc_msgSend_15(_lib._class_NSURLHandle1, + _lib._sel_registerURLHandleClass_1, anURLHandleSubclass._id); + } + + static NSObject URLHandleClassForURL_(SentryCocoa _lib, NSURL? anURL) { + final _ret = _lib._objc_msgSend_241(_lib._class_NSURLHandle1, + _lib._sel_URLHandleClassForURL_1, anURL?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + int status() { + return _lib._objc_msgSend_242(_id, _lib._sel_status1); + } + + NSString failureReason() { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_failureReason1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + void addClient_(NSObject? client) { + _lib._objc_msgSend_15( + _id, _lib._sel_addClient_1, client?._id ?? ffi.nullptr); + } + + void removeClient_(NSObject? client) { + _lib._objc_msgSend_15( + _id, _lib._sel_removeClient_1, client?._id ?? ffi.nullptr); + } + + void loadInBackground() { + _lib._objc_msgSend_1(_id, _lib._sel_loadInBackground1); + } + + void cancelLoadInBackground() { + _lib._objc_msgSend_1(_id, _lib._sel_cancelLoadInBackground1); + } + + NSData resourceData() { + final _ret = _lib._objc_msgSend_39(_id, _lib._sel_resourceData1); + return NSData._(_ret, _lib, retain: true, release: true); + } + + NSData availableResourceData() { + final _ret = _lib._objc_msgSend_39(_id, _lib._sel_availableResourceData1); + return NSData._(_ret, _lib, retain: true, release: true); + } + + int expectedResourceDataSize() { + return _lib._objc_msgSend_220(_id, _lib._sel_expectedResourceDataSize1); + } + + void flushCachedData() { + _lib._objc_msgSend_1(_id, _lib._sel_flushCachedData1); + } + + void backgroundLoadDidFailWithReason_(NSString? reason) { + _lib._objc_msgSend_192(_id, _lib._sel_backgroundLoadDidFailWithReason_1, + reason?._id ?? ffi.nullptr); + } + + void didLoadBytes_loadComplete_(NSData? newBytes, bool yorn) { + _lib._objc_msgSend_243(_id, _lib._sel_didLoadBytes_loadComplete_1, + newBytes?._id ?? ffi.nullptr, yorn); + } + + static bool canInitWithURL_(SentryCocoa _lib, NSURL? anURL) { + return _lib._objc_msgSend_244(_lib._class_NSURLHandle1, + _lib._sel_canInitWithURL_1, anURL?._id ?? ffi.nullptr); + } + + static NSURLHandle cachedHandleForURL_(SentryCocoa _lib, NSURL? anURL) { + final _ret = _lib._objc_msgSend_245(_lib._class_NSURLHandle1, + _lib._sel_cachedHandleForURL_1, anURL?._id ?? ffi.nullptr); + return NSURLHandle._(_ret, _lib, retain: true, release: true); + } + + NSObject initWithURL_cached_(NSURL? anURL, bool willCache) { + final _ret = _lib._objc_msgSend_246(_id, _lib._sel_initWithURL_cached_1, + anURL?._id ?? ffi.nullptr, willCache); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject propertyForKey_(NSString? propertyKey) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_propertyForKey_1, propertyKey?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject propertyForKeyIfAvailable_(NSString? propertyKey) { + final _ret = _lib._objc_msgSend_30(_id, + _lib._sel_propertyForKeyIfAvailable_1, propertyKey?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + bool writeProperty_forKey_(NSObject propertyValue, NSString? propertyKey) { + return _lib._objc_msgSend_240(_id, _lib._sel_writeProperty_forKey_1, + propertyValue._id, propertyKey?._id ?? ffi.nullptr); + } + + bool writeData_(NSData? data) { + return _lib._objc_msgSend_23( + _id, _lib._sel_writeData_1, data?._id ?? ffi.nullptr); + } + + NSData loadInForeground() { + final _ret = _lib._objc_msgSend_39(_id, _lib._sel_loadInForeground1); + return NSData._(_ret, _lib, retain: true, release: true); + } + + void beginLoadInBackground() { + _lib._objc_msgSend_1(_id, _lib._sel_beginLoadInBackground1); + } + + void endLoadInBackground() { + _lib._objc_msgSend_1(_id, _lib._sel_endLoadInBackground1); + } + + @override + NSURLHandle init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSURLHandle._(_ret, _lib, retain: true, release: true); + } + + static NSURLHandle new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSURLHandle1, _lib._sel_new1); + return NSURLHandle._(_ret, _lib, retain: false, release: true); + } + + static NSURLHandle allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSURLHandle1, _lib._sel_allocWithZone_1, zone); + return NSURLHandle._(_ret, _lib, retain: false, release: true); + } + + static NSURLHandle alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSURLHandle1, _lib._sel_alloc1); + return NSURLHandle._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSURLHandle1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSURLHandle1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLHandle1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLHandle1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSURLHandle1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSURLHandle1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSURLHandle1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSURLHandle1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLHandle1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSURLHandleStatus { + static const int NSURLHandleNotLoaded = 0; + static const int NSURLHandleLoadSucceeded = 1; + static const int NSURLHandleLoadInProgress = 2; + static const int NSURLHandleLoadFailed = 3; +} + +abstract class NSDataWritingOptions { + static const int NSDataWritingAtomic = 1; + static const int NSDataWritingWithoutOverwriting = 2; + static const int NSDataWritingFileProtectionNone = 268435456; + static const int NSDataWritingFileProtectionComplete = 536870912; + static const int NSDataWritingFileProtectionCompleteUnlessOpen = 805306368; + static const int + NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication = + 1073741824; + static const int NSDataWritingFileProtectionMask = 4026531840; + static const int NSAtomicWrite = 1; +} + +abstract class NSDataSearchOptions { + static const int NSDataSearchBackwards = 1; + static const int NSDataSearchAnchored = 2; +} + +void _ObjCBlock_ffiVoid_ffiVoid_NSRange_bool_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + ffi.Pointer arg2) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, _NSRange arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function(ffi.Pointer arg0, _NSRange arg1, + ffi.Pointer arg2)>()(arg0, arg1, arg2); +} + +final _ObjCBlock_ffiVoid_ffiVoid_NSRange_bool_closureRegistry = + {}; +int _ObjCBlock_ffiVoid_ffiVoid_NSRange_bool_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_ffiVoid_NSRange_bool_registerClosure( + Function fn) { + final id = ++_ObjCBlock_ffiVoid_ffiVoid_NSRange_bool_closureRegistryIndex; + _ObjCBlock_ffiVoid_ffiVoid_NSRange_bool_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_ffiVoid_NSRange_bool_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + ffi.Pointer arg2) { + return (_ObjCBlock_ffiVoid_ffiVoid_NSRange_bool_closureRegistry[ + block.ref.target.address] + as void Function(ffi.Pointer, _NSRange, + ffi.Pointer))(arg0, arg1, arg2); +} + +class ObjCBlock_ffiVoid_ffiVoid_NSRange_bool extends _ObjCBlockBase { + ObjCBlock_ffiVoid_ffiVoid_NSRange_bool._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_ffiVoid_NSRange_bool.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, _NSRange arg1, + ffi.Pointer arg2)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_ffiVoid_NSRange_bool_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_ffiVoid_NSRange_bool.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, _NSRange arg1, + ffi.Pointer arg2) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_ffiVoid_NSRange_bool_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_ffiVoid_NSRange_bool_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call( + ffi.Pointer arg0, _NSRange arg1, ffi.Pointer arg2) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + ffi.Pointer arg2)>()(_id, arg0, arg1, arg2); + } +} + +abstract class NSDataReadingOptions { + static const int NSDataReadingMappedIfSafe = 1; + static const int NSDataReadingUncached = 2; + static const int NSDataReadingMappedAlways = 8; + static const int NSDataReadingMapped = 1; + static const int NSMappedRead = 1; + static const int NSUncachedRead = 2; +} + +void _ObjCBlock_ffiVoid_ffiVoid_ffiUnsignedLong_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0, int arg1) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer arg0, ffi.UnsignedLong arg1)>>() + .asFunction arg0, int arg1)>()( + arg0, arg1); +} + +final _ObjCBlock_ffiVoid_ffiVoid_ffiUnsignedLong_closureRegistry = + {}; +int _ObjCBlock_ffiVoid_ffiVoid_ffiUnsignedLong_closureRegistryIndex = 0; +ffi.Pointer + _ObjCBlock_ffiVoid_ffiVoid_ffiUnsignedLong_registerClosure(Function fn) { + final id = ++_ObjCBlock_ffiVoid_ffiVoid_ffiUnsignedLong_closureRegistryIndex; + _ObjCBlock_ffiVoid_ffiVoid_ffiUnsignedLong_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_ffiVoid_ffiUnsignedLong_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0, int arg1) { + return (_ObjCBlock_ffiVoid_ffiVoid_ffiUnsignedLong_closureRegistry[block + .ref + .target + .address] as void Function(ffi.Pointer, int))(arg0, arg1); +} + +class ObjCBlock_ffiVoid_ffiVoid_ffiUnsignedLong extends _ObjCBlockBase { + ObjCBlock_ffiVoid_ffiVoid_ffiUnsignedLong._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_ffiVoid_ffiUnsignedLong.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer arg0, ffi.UnsignedLong arg1)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.UnsignedLong arg1)>( + _ObjCBlock_ffiVoid_ffiVoid_ffiUnsignedLong_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_ffiVoid_ffiUnsignedLong.fromFunction( + SentryCocoa lib, void Function(ffi.Pointer arg0, int arg1) fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.UnsignedLong arg1)>( + _ObjCBlock_ffiVoid_ffiVoid_ffiUnsignedLong_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_ffiVoid_ffiUnsignedLong_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0, int arg1) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, ffi.UnsignedLong arg1)>>() + .asFunction< + void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, int arg1)>()(_id, arg0, arg1); + } +} + +abstract class NSDataBase64DecodingOptions { + static const int NSDataBase64DecodingIgnoreUnknownCharacters = 1; +} + +abstract class NSDataBase64EncodingOptions { + static const int NSDataBase64Encoding64CharacterLineLength = 1; + static const int NSDataBase64Encoding76CharacterLineLength = 2; + static const int NSDataBase64EncodingEndLineWithCarriageReturn = 16; + static const int NSDataBase64EncodingEndLineWithLineFeed = 32; +} + +abstract class NSDataCompressionAlgorithm { + static const int NSDataCompressionAlgorithmLZFSE = 0; + static const int NSDataCompressionAlgorithmLZ4 = 1; + static const int NSDataCompressionAlgorithmLZMA = 2; + static const int NSDataCompressionAlgorithmZlib = 3; +} + +abstract class NSDecodingFailurePolicy { + static const int NSDecodingFailurePolicyRaiseException = 0; + static const int NSDecodingFailurePolicySetErrorAndReturn = 1; +} + +abstract class NSStringCompareOptions { + static const int NSCaseInsensitiveSearch = 1; + static const int NSLiteralSearch = 2; + static const int NSBackwardsSearch = 4; + static const int NSAnchoredSearch = 8; + static const int NSNumericSearch = 64; + static const int NSDiacriticInsensitiveSearch = 128; + static const int NSWidthInsensitiveSearch = 256; + static const int NSForcedOrderingSearch = 512; + static const int NSRegularExpressionSearch = 1024; +} + +abstract class NSStringEnumerationOptions { + static const int NSStringEnumerationByLines = 0; + static const int NSStringEnumerationByParagraphs = 1; + static const int NSStringEnumerationByComposedCharacterSequences = 2; + static const int NSStringEnumerationByWords = 3; + static const int NSStringEnumerationBySentences = 4; + static const int NSStringEnumerationByCaretPositions = 5; + static const int NSStringEnumerationByDeletionClusters = 6; + static const int NSStringEnumerationReverse = 256; + static const int NSStringEnumerationSubstringNotRequired = 512; + static const int NSStringEnumerationLocalized = 1024; +} + +void _ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + _NSRange arg2, + ffi.Pointer arg3) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, _NSRange arg1, + _NSRange arg2, ffi.Pointer arg3)>>() + .asFunction< + void Function( + ffi.Pointer arg0, + _NSRange arg1, + _NSRange arg2, + ffi.Pointer arg3)>()(arg0, arg1, arg2, arg3); +} + +final _ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool_closureRegistry = + {}; +int _ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool_closureRegistryIndex = 0; +ffi.Pointer + _ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool_registerClosure( + Function fn) { + final id = + ++_ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + _NSRange arg2, + ffi.Pointer arg3) { + return (_ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool_closureRegistry[ + block.ref.target.address] + as void Function(ffi.Pointer, _NSRange, _NSRange, + ffi.Pointer))(arg0, arg1, arg2, arg3); +} + +class ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, _NSRange arg1, + _NSRange arg2, ffi.Pointer arg3)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + _NSRange arg2, + ffi.Pointer arg3)>( + _ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, _NSRange arg1, _NSRange arg2, + ffi.Pointer arg3) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + _NSRange arg2, + ffi.Pointer arg3)>( + _ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSString_NSRange_NSRange_bool_registerClosure( + fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0, _NSRange arg1, _NSRange arg2, + ffi.Pointer arg3) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + _NSRange arg2, + ffi.Pointer arg3)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + _NSRange arg2, + ffi.Pointer arg3)>()(_id, arg0, arg1, arg2, arg3); + } +} + +void _ObjCBlock_ffiVoid_NSString_bool_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer arg0, ffi.Pointer arg1)>>() + .asFunction< + void Function(ffi.Pointer arg0, + ffi.Pointer arg1)>()(arg0, arg1); +} + +final _ObjCBlock_ffiVoid_NSString_bool_closureRegistry = {}; +int _ObjCBlock_ffiVoid_NSString_bool_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_NSString_bool_registerClosure( + Function fn) { + final id = ++_ObjCBlock_ffiVoid_NSString_bool_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSString_bool_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSString_bool_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return (_ObjCBlock_ffiVoid_NSString_bool_closureRegistry[ + block.ref.target.address] + as void Function( + ffi.Pointer, ffi.Pointer))(arg0, arg1); +} + +class ObjCBlock_ffiVoid_NSString_bool extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSString_bool._(ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSString_bool.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, + ffi.Pointer arg1)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_ffiVoid_NSString_bool_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSString_bool.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, ffi.Pointer arg1) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_ffiVoid_NSString_bool_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSString_bool_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0, ffi.Pointer arg1) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>()(_id, arg0, arg1); + } +} + +abstract class NSStringEncodingConversionOptions { + static const int NSStringEncodingConversionAllowLossy = 1; + static const int NSStringEncodingConversionExternalRepresentation = 2; +} + +void _ObjCBlock_ffiVoid_ffiUnsignedShort_ffiUnsignedLong_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + int arg1) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, + ffi.UnsignedLong arg1)>>() + .asFunction< + void Function( + ffi.Pointer arg0, int arg1)>()(arg0, arg1); +} + +final _ObjCBlock_ffiVoid_ffiUnsignedShort_ffiUnsignedLong_closureRegistry = + {}; +int _ObjCBlock_ffiVoid_ffiUnsignedShort_ffiUnsignedLong_closureRegistryIndex = + 0; +ffi.Pointer + _ObjCBlock_ffiVoid_ffiUnsignedShort_ffiUnsignedLong_registerClosure( + Function fn) { + final id = + ++_ObjCBlock_ffiVoid_ffiUnsignedShort_ffiUnsignedLong_closureRegistryIndex; + _ObjCBlock_ffiVoid_ffiUnsignedShort_ffiUnsignedLong_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_ffiUnsignedShort_ffiUnsignedLong_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + int arg1) { + return (_ObjCBlock_ffiVoid_ffiUnsignedShort_ffiUnsignedLong_closureRegistry[ + block.ref.target.address] + as void Function(ffi.Pointer, int))(arg0, arg1); +} + +class ObjCBlock_ffiVoid_ffiUnsignedShort_ffiUnsignedLong + extends _ObjCBlockBase { + ObjCBlock_ffiVoid_ffiUnsignedShort_ffiUnsignedLong._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_ffiUnsignedShort_ffiUnsignedLong.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, + ffi.UnsignedLong arg1)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.UnsignedLong arg1)>( + _ObjCBlock_ffiVoid_ffiUnsignedShort_ffiUnsignedLong_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_ffiUnsignedShort_ffiUnsignedLong.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, int arg1) fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.UnsignedLong arg1)>( + _ObjCBlock_ffiVoid_ffiUnsignedShort_ffiUnsignedLong_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_ffiUnsignedShort_ffiUnsignedLong_registerClosure( + fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0, int arg1) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.UnsignedLong arg1)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + int arg1)>()(_id, arg0, arg1); + } +} + +abstract class NSLinguisticTaggerOptions { + static const int NSLinguisticTaggerOmitWords = 1; + static const int NSLinguisticTaggerOmitPunctuation = 2; + static const int NSLinguisticTaggerOmitWhitespace = 4; + static const int NSLinguisticTaggerOmitOther = 8; + static const int NSLinguisticTaggerJoinNames = 16; +} + +class NSOrthography extends NSObject { + NSOrthography._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSOrthography] that points to the same underlying object as [other]. + static NSOrthography castFrom(T other) { + return NSOrthography._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSOrthography] that wraps the given raw object pointer. + static NSOrthography castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSOrthography._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSOrthography]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSOrthography1); + } + + NSString? get dominantScript { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_dominantScript1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSDictionary? get languageMap { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_languageMap1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSOrthography initWithDominantScript_languageMap_( + NSString? script, NSDictionary? map) { + final _ret = _lib._objc_msgSend_371( + _id, + _lib._sel_initWithDominantScript_languageMap_1, + script?._id ?? ffi.nullptr, + map?._id ?? ffi.nullptr); + return NSOrthography._(_ret, _lib, retain: true, release: true); + } + + NSOrthography initWithCoder_(NSCoder? coder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr); + return NSOrthography._(_ret, _lib, retain: true, release: true); + } + + NSArray languagesForScript_(NSString? script) { + final _ret = _lib._objc_msgSend_123( + _id, _lib._sel_languagesForScript_1, script?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSString dominantLanguageForScript_(NSString? script) { + final _ret = _lib._objc_msgSend_64( + _id, _lib._sel_dominantLanguageForScript_1, script?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get dominantLanguage { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_dominantLanguage1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSArray? get allScripts { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_allScripts1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get allLanguages { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_allLanguages1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSOrthography defaultOrthographyForLanguage_( + SentryCocoa _lib, NSString? language) { + final _ret = _lib._objc_msgSend_30( + _lib._class_NSOrthography1, + _lib._sel_defaultOrthographyForLanguage_1, + language?._id ?? ffi.nullptr); + return NSOrthography._(_ret, _lib, retain: true, release: true); + } + + static NSOrthography orthographyWithDominantScript_languageMap_( + SentryCocoa _lib, NSString? script, NSDictionary? map) { + final _ret = _lib._objc_msgSend_371( + _lib._class_NSOrthography1, + _lib._sel_orthographyWithDominantScript_languageMap_1, + script?._id ?? ffi.nullptr, + map?._id ?? ffi.nullptr); + return NSOrthography._(_ret, _lib, retain: true, release: true); + } + + @override + NSOrthography init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSOrthography._(_ret, _lib, retain: true, release: true); + } + + static NSOrthography new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSOrthography1, _lib._sel_new1); + return NSOrthography._(_ret, _lib, retain: false, release: true); + } + + static NSOrthography allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSOrthography1, _lib._sel_allocWithZone_1, zone); + return NSOrthography._(_ret, _lib, retain: false, release: true); + } + + static NSOrthography alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSOrthography1, _lib._sel_alloc1); + return NSOrthography._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSOrthography1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSOrthography1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSOrthography1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSOrthography1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSOrthography1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSOrthography1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSOrthography1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSOrthography1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSOrthography1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +void _ObjCBlock_ffiVoid_ObjCObject_bool_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer arg0, ffi.Pointer arg1)>>() + .asFunction< + void Function(ffi.Pointer arg0, + ffi.Pointer arg1)>()(arg0, arg1); +} + +final _ObjCBlock_ffiVoid_ObjCObject_bool_closureRegistry = {}; +int _ObjCBlock_ffiVoid_ObjCObject_bool_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_ObjCObject_bool_registerClosure( + Function fn) { + final id = ++_ObjCBlock_ffiVoid_ObjCObject_bool_closureRegistryIndex; + _ObjCBlock_ffiVoid_ObjCObject_bool_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_ObjCObject_bool_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return (_ObjCBlock_ffiVoid_ObjCObject_bool_closureRegistry[ + block.ref.target.address] + as void Function( + ffi.Pointer, ffi.Pointer))(arg0, arg1); +} + +class ObjCBlock_ffiVoid_ObjCObject_bool extends _ObjCBlockBase { + ObjCBlock_ffiVoid_ObjCObject_bool._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_ObjCObject_bool.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, + ffi.Pointer arg1)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_ffiVoid_ObjCObject_bool_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_ObjCObject_bool.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, ffi.Pointer arg1) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_ffiVoid_ObjCObject_bool_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_ObjCObject_bool_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0, ffi.Pointer arg1) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>()(_id, arg0, arg1); + } +} + +bool _ObjCBlock_bool_ObjCObject_bool_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer arg0, ffi.Pointer arg1)>>() + .asFunction< + bool Function(ffi.Pointer arg0, + ffi.Pointer arg1)>()(arg0, arg1); +} + +final _ObjCBlock_bool_ObjCObject_bool_closureRegistry = {}; +int _ObjCBlock_bool_ObjCObject_bool_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_bool_ObjCObject_bool_registerClosure( + Function fn) { + final id = ++_ObjCBlock_bool_ObjCObject_bool_closureRegistryIndex; + _ObjCBlock_bool_ObjCObject_bool_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +bool _ObjCBlock_bool_ObjCObject_bool_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return (_ObjCBlock_bool_ObjCObject_bool_closureRegistry[ + block.ref.target.address] + as bool Function( + ffi.Pointer, ffi.Pointer))(arg0, arg1); +} + +class ObjCBlock_bool_ObjCObject_bool extends _ObjCBlockBase { + ObjCBlock_bool_ObjCObject_bool._(ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_bool_ObjCObject_bool.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer arg0, + ffi.Pointer arg1)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_bool_ObjCObject_bool_fnPtrTrampoline, false) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_bool_ObjCObject_bool.fromFunction( + SentryCocoa lib, + bool Function(ffi.Pointer arg0, ffi.Pointer arg1) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_bool_ObjCObject_bool_closureTrampoline, + false) + .cast(), + _ObjCBlock_bool_ObjCObject_bool_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + bool call(ffi.Pointer arg0, ffi.Pointer arg1) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>()(_id, arg0, arg1); + } +} + +class NSFileManager extends NSObject { + NSFileManager._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSFileManager] that points to the same underlying object as [other]. + static NSFileManager castFrom(T other) { + return NSFileManager._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSFileManager] that wraps the given raw object pointer. + static NSFileManager castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSFileManager._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSFileManager]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSFileManager1); + } + + static NSFileManager? getDefaultManager(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_402( + _lib._class_NSFileManager1, _lib._sel_defaultManager1); + return _ret.address == 0 + ? null + : NSFileManager._(_ret, _lib, retain: true, release: true); + } + + NSArray mountedVolumeURLsIncludingResourceValuesForKeys_options_( + NSArray? propertyKeys, int options) { + final _ret = _lib._objc_msgSend_403( + _id, + _lib._sel_mountedVolumeURLsIncludingResourceValuesForKeys_options_1, + propertyKeys?._id ?? ffi.nullptr, + options); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + void unmountVolumeAtURL_options_completionHandler_( + NSURL? url, int mask, ObjCBlock_ffiVoid_NSError completionHandler) { + _lib._objc_msgSend_404( + _id, + _lib._sel_unmountVolumeAtURL_options_completionHandler_1, + url?._id ?? ffi.nullptr, + mask, + completionHandler._id); + } + + NSArray contentsOfDirectoryAtURL_includingPropertiesForKeys_options_error_( + NSURL? url, + NSArray? keys, + int mask, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_405( + _id, + _lib._sel_contentsOfDirectoryAtURL_includingPropertiesForKeys_options_error_1, + url?._id ?? ffi.nullptr, + keys?._id ?? ffi.nullptr, + mask, + error); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray URLsForDirectory_inDomains_(int directory, int domainMask) { + final _ret = _lib._objc_msgSend_406( + _id, _lib._sel_URLsForDirectory_inDomains_1, directory, domainMask); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSURL URLForDirectory_inDomain_appropriateForURL_create_error_( + int directory, + int domain, + NSURL? url, + bool shouldCreate, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_407( + _id, + _lib._sel_URLForDirectory_inDomain_appropriateForURL_create_error_1, + directory, + domain, + url?._id ?? ffi.nullptr, + shouldCreate, + error); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + bool getRelationship_ofDirectoryAtURL_toItemAtURL_error_( + ffi.Pointer outRelationship, + NSURL? directoryURL, + NSURL? otherURL, + ffi.Pointer> error) { + return _lib._objc_msgSend_408( + _id, + _lib._sel_getRelationship_ofDirectoryAtURL_toItemAtURL_error_1, + outRelationship, + directoryURL?._id ?? ffi.nullptr, + otherURL?._id ?? ffi.nullptr, + error); + } + + bool getRelationship_ofDirectory_inDomain_toItemAtURL_error_( + ffi.Pointer outRelationship, + int directory, + int domainMask, + NSURL? url, + ffi.Pointer> error) { + return _lib._objc_msgSend_409( + _id, + _lib._sel_getRelationship_ofDirectory_inDomain_toItemAtURL_error_1, + outRelationship, + directory, + domainMask, + url?._id ?? ffi.nullptr, + error); + } + + bool createDirectoryAtURL_withIntermediateDirectories_attributes_error_( + NSURL? url, + bool createIntermediates, + NSDictionary? attributes, + ffi.Pointer> error) { + return _lib._objc_msgSend_410( + _id, + _lib._sel_createDirectoryAtURL_withIntermediateDirectories_attributes_error_1, + url?._id ?? ffi.nullptr, + createIntermediates, + attributes?._id ?? ffi.nullptr, + error); + } + + bool createSymbolicLinkAtURL_withDestinationURL_error_( + NSURL? url, NSURL? destURL, ffi.Pointer> error) { + return _lib._objc_msgSend_411( + _id, + _lib._sel_createSymbolicLinkAtURL_withDestinationURL_error_1, + url?._id ?? ffi.nullptr, + destURL?._id ?? ffi.nullptr, + error); + } + + NSObject? get delegate { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1); + return _ret.address == 0 + ? null + : NSObject._(_ret, _lib, retain: true, release: true); + } + + set delegate(NSObject? value) { + return _lib._objc_msgSend_387( + _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr); + } + + bool setAttributes_ofItemAtPath_error_(NSDictionary? attributes, + NSString? path, ffi.Pointer> error) { + return _lib._objc_msgSend_412( + _id, + _lib._sel_setAttributes_ofItemAtPath_error_1, + attributes?._id ?? ffi.nullptr, + path?._id ?? ffi.nullptr, + error); + } + + bool createDirectoryAtPath_withIntermediateDirectories_attributes_error_( + NSString? path, + bool createIntermediates, + NSDictionary? attributes, + ffi.Pointer> error) { + return _lib._objc_msgSend_413( + _id, + _lib._sel_createDirectoryAtPath_withIntermediateDirectories_attributes_error_1, + path?._id ?? ffi.nullptr, + createIntermediates, + attributes?._id ?? ffi.nullptr, + error); + } + + NSArray contentsOfDirectoryAtPath_error_( + NSString? path, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_414( + _id, + _lib._sel_contentsOfDirectoryAtPath_error_1, + path?._id ?? ffi.nullptr, + error); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray subpathsOfDirectoryAtPath_error_( + NSString? path, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_414( + _id, + _lib._sel_subpathsOfDirectoryAtPath_error_1, + path?._id ?? ffi.nullptr, + error); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSDictionary attributesOfItemAtPath_error_( + NSString? path, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_415( + _id, + _lib._sel_attributesOfItemAtPath_error_1, + path?._id ?? ffi.nullptr, + error); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSDictionary attributesOfFileSystemForPath_error_( + NSString? path, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_415( + _id, + _lib._sel_attributesOfFileSystemForPath_error_1, + path?._id ?? ffi.nullptr, + error); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + bool createSymbolicLinkAtPath_withDestinationPath_error_(NSString? path, + NSString? destPath, ffi.Pointer> error) { + return _lib._objc_msgSend_416( + _id, + _lib._sel_createSymbolicLinkAtPath_withDestinationPath_error_1, + path?._id ?? ffi.nullptr, + destPath?._id ?? ffi.nullptr, + error); + } + + NSString destinationOfSymbolicLinkAtPath_error_( + NSString? path, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_417( + _id, + _lib._sel_destinationOfSymbolicLinkAtPath_error_1, + path?._id ?? ffi.nullptr, + error); + return NSString._(_ret, _lib, retain: true, release: true); + } + + bool copyItemAtPath_toPath_error_(NSString? srcPath, NSString? dstPath, + ffi.Pointer> error) { + return _lib._objc_msgSend_416(_id, _lib._sel_copyItemAtPath_toPath_error_1, + srcPath?._id ?? ffi.nullptr, dstPath?._id ?? ffi.nullptr, error); + } + + bool moveItemAtPath_toPath_error_(NSString? srcPath, NSString? dstPath, + ffi.Pointer> error) { + return _lib._objc_msgSend_416(_id, _lib._sel_moveItemAtPath_toPath_error_1, + srcPath?._id ?? ffi.nullptr, dstPath?._id ?? ffi.nullptr, error); + } + + bool linkItemAtPath_toPath_error_(NSString? srcPath, NSString? dstPath, + ffi.Pointer> error) { + return _lib._objc_msgSend_416(_id, _lib._sel_linkItemAtPath_toPath_error_1, + srcPath?._id ?? ffi.nullptr, dstPath?._id ?? ffi.nullptr, error); + } + + bool removeItemAtPath_error_( + NSString? path, ffi.Pointer> error) { + return _lib._objc_msgSend_418(_id, _lib._sel_removeItemAtPath_error_1, + path?._id ?? ffi.nullptr, error); + } + + bool copyItemAtURL_toURL_error_(NSURL? srcURL, NSURL? dstURL, + ffi.Pointer> error) { + return _lib._objc_msgSend_411(_id, _lib._sel_copyItemAtURL_toURL_error_1, + srcURL?._id ?? ffi.nullptr, dstURL?._id ?? ffi.nullptr, error); + } + + bool moveItemAtURL_toURL_error_(NSURL? srcURL, NSURL? dstURL, + ffi.Pointer> error) { + return _lib._objc_msgSend_411(_id, _lib._sel_moveItemAtURL_toURL_error_1, + srcURL?._id ?? ffi.nullptr, dstURL?._id ?? ffi.nullptr, error); + } + + bool linkItemAtURL_toURL_error_(NSURL? srcURL, NSURL? dstURL, + ffi.Pointer> error) { + return _lib._objc_msgSend_411(_id, _lib._sel_linkItemAtURL_toURL_error_1, + srcURL?._id ?? ffi.nullptr, dstURL?._id ?? ffi.nullptr, error); + } + + bool removeItemAtURL_error_( + NSURL? URL, ffi.Pointer> error) { + return _lib._objc_msgSend_83( + _id, _lib._sel_removeItemAtURL_error_1, URL?._id ?? ffi.nullptr, error); + } + + bool trashItemAtURL_resultingItemURL_error_( + NSURL? url, + ffi.Pointer> outResultingURL, + ffi.Pointer> error) { + return _lib._objc_msgSend_419( + _id, + _lib._sel_trashItemAtURL_resultingItemURL_error_1, + url?._id ?? ffi.nullptr, + outResultingURL, + error); + } + + NSDictionary fileAttributesAtPath_traverseLink_(NSString? path, bool yorn) { + final _ret = _lib._objc_msgSend_420( + _id, + _lib._sel_fileAttributesAtPath_traverseLink_1, + path?._id ?? ffi.nullptr, + yorn); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + bool changeFileAttributes_atPath_(NSDictionary? attributes, NSString? path) { + return _lib._objc_msgSend_421(_id, _lib._sel_changeFileAttributes_atPath_1, + attributes?._id ?? ffi.nullptr, path?._id ?? ffi.nullptr); + } + + NSArray directoryContentsAtPath_(NSString? path) { + final _ret = _lib._objc_msgSend_123( + _id, _lib._sel_directoryContentsAtPath_1, path?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSDictionary fileSystemAttributesAtPath_(NSString? path) { + final _ret = _lib._objc_msgSend_146( + _id, _lib._sel_fileSystemAttributesAtPath_1, path?._id ?? ffi.nullptr); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSString pathContentOfSymbolicLinkAtPath_(NSString? path) { + final _ret = _lib._objc_msgSend_64(_id, + _lib._sel_pathContentOfSymbolicLinkAtPath_1, path?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + bool createSymbolicLinkAtPath_pathContent_( + NSString? path, NSString? otherpath) { + return _lib._objc_msgSend_422( + _id, + _lib._sel_createSymbolicLinkAtPath_pathContent_1, + path?._id ?? ffi.nullptr, + otherpath?._id ?? ffi.nullptr); + } + + bool createDirectoryAtPath_attributes_( + NSString? path, NSDictionary? attributes) { + return _lib._objc_msgSend_423( + _id, + _lib._sel_createDirectoryAtPath_attributes_1, + path?._id ?? ffi.nullptr, + attributes?._id ?? ffi.nullptr); + } + + bool linkPath_toPath_handler_( + NSString? src, NSString? dest, NSObject handler) { + return _lib._objc_msgSend_424(_id, _lib._sel_linkPath_toPath_handler_1, + src?._id ?? ffi.nullptr, dest?._id ?? ffi.nullptr, handler._id); + } + + bool copyPath_toPath_handler_( + NSString? src, NSString? dest, NSObject handler) { + return _lib._objc_msgSend_424(_id, _lib._sel_copyPath_toPath_handler_1, + src?._id ?? ffi.nullptr, dest?._id ?? ffi.nullptr, handler._id); + } + + bool movePath_toPath_handler_( + NSString? src, NSString? dest, NSObject handler) { + return _lib._objc_msgSend_424(_id, _lib._sel_movePath_toPath_handler_1, + src?._id ?? ffi.nullptr, dest?._id ?? ffi.nullptr, handler._id); + } + + bool removeFileAtPath_handler_(NSString? path, NSObject handler) { + return _lib._objc_msgSend_425(_id, _lib._sel_removeFileAtPath_handler_1, + path?._id ?? ffi.nullptr, handler._id); + } + + NSString? get currentDirectoryPath { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_currentDirectoryPath1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + bool changeCurrentDirectoryPath_(NSString? path) { + return _lib._objc_msgSend_59( + _id, _lib._sel_changeCurrentDirectoryPath_1, path?._id ?? ffi.nullptr); + } + + bool fileExistsAtPath_(NSString? path) { + return _lib._objc_msgSend_59( + _id, _lib._sel_fileExistsAtPath_1, path?._id ?? ffi.nullptr); + } + + bool fileExistsAtPath_isDirectory_( + NSString? path, ffi.Pointer isDirectory) { + return _lib._objc_msgSend_426(_id, _lib._sel_fileExistsAtPath_isDirectory_1, + path?._id ?? ffi.nullptr, isDirectory); + } + + bool isReadableFileAtPath_(NSString? path) { + return _lib._objc_msgSend_59( + _id, _lib._sel_isReadableFileAtPath_1, path?._id ?? ffi.nullptr); + } + + bool isWritableFileAtPath_(NSString? path) { + return _lib._objc_msgSend_59( + _id, _lib._sel_isWritableFileAtPath_1, path?._id ?? ffi.nullptr); + } + + bool isExecutableFileAtPath_(NSString? path) { + return _lib._objc_msgSend_59( + _id, _lib._sel_isExecutableFileAtPath_1, path?._id ?? ffi.nullptr); + } + + bool isDeletableFileAtPath_(NSString? path) { + return _lib._objc_msgSend_59( + _id, _lib._sel_isDeletableFileAtPath_1, path?._id ?? ffi.nullptr); + } + + bool contentsEqualAtPath_andPath_(NSString? path1, NSString? path2) { + return _lib._objc_msgSend_422(_id, _lib._sel_contentsEqualAtPath_andPath_1, + path1?._id ?? ffi.nullptr, path2?._id ?? ffi.nullptr); + } + + NSString displayNameAtPath_(NSString? path) { + final _ret = _lib._objc_msgSend_64( + _id, _lib._sel_displayNameAtPath_1, path?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSArray componentsToDisplayForPath_(NSString? path) { + final _ret = _lib._objc_msgSend_123( + _id, _lib._sel_componentsToDisplayForPath_1, path?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSObject enumeratorAtPath_(NSString? path) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_enumeratorAtPath_1, path?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject enumeratorAtURL_includingPropertiesForKeys_options_errorHandler_( + NSURL? url, + NSArray? keys, + int mask, + ObjCBlock_bool_NSURL_NSError handler) { + final _ret = _lib._objc_msgSend_427( + _id, + _lib._sel_enumeratorAtURL_includingPropertiesForKeys_options_errorHandler_1, + url?._id ?? ffi.nullptr, + keys?._id ?? ffi.nullptr, + mask, + handler._id); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSArray subpathsAtPath_(NSString? path) { + final _ret = _lib._objc_msgSend_123( + _id, _lib._sel_subpathsAtPath_1, path?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSData contentsAtPath_(NSString? path) { + final _ret = _lib._objc_msgSend_428( + _id, _lib._sel_contentsAtPath_1, path?._id ?? ffi.nullptr); + return NSData._(_ret, _lib, retain: true, release: true); + } + + bool createFileAtPath_contents_attributes_( + NSString? path, NSData? data, NSDictionary? attr) { + return _lib._objc_msgSend_429( + _id, + _lib._sel_createFileAtPath_contents_attributes_1, + path?._id ?? ffi.nullptr, + data?._id ?? ffi.nullptr, + attr?._id ?? ffi.nullptr); + } + + ffi.Pointer fileSystemRepresentationWithPath_(NSString? path) { + return _lib._objc_msgSend_430(_id, + _lib._sel_fileSystemRepresentationWithPath_1, path?._id ?? ffi.nullptr); + } + + NSString stringWithFileSystemRepresentation_length_( + ffi.Pointer str, int len) { + final _ret = _lib._objc_msgSend_431( + _id, _lib._sel_stringWithFileSystemRepresentation_length_1, str, len); + return NSString._(_ret, _lib, retain: true, release: true); + } + + bool + replaceItemAtURL_withItemAtURL_backupItemName_options_resultingItemURL_error_( + NSURL? originalItemURL, + NSURL? newItemURL, + NSString? backupItemName, + int options, + ffi.Pointer> resultingURL, + ffi.Pointer> error) { + return _lib._objc_msgSend_432( + _id, + _lib._sel_replaceItemAtURL_withItemAtURL_backupItemName_options_resultingItemURL_error_1, + originalItemURL?._id ?? ffi.nullptr, + newItemURL?._id ?? ffi.nullptr, + backupItemName?._id ?? ffi.nullptr, + options, + resultingURL, + error); + } + + bool setUbiquitous_itemAtURL_destinationURL_error_(bool flag, NSURL? url, + NSURL? destinationURL, ffi.Pointer> error) { + return _lib._objc_msgSend_433( + _id, + _lib._sel_setUbiquitous_itemAtURL_destinationURL_error_1, + flag, + url?._id ?? ffi.nullptr, + destinationURL?._id ?? ffi.nullptr, + error); + } + + bool isUbiquitousItemAtURL_(NSURL? url) { + return _lib._objc_msgSend_244( + _id, _lib._sel_isUbiquitousItemAtURL_1, url?._id ?? ffi.nullptr); + } + + bool startDownloadingUbiquitousItemAtURL_error_( + NSURL? url, ffi.Pointer> error) { + return _lib._objc_msgSend_83( + _id, + _lib._sel_startDownloadingUbiquitousItemAtURL_error_1, + url?._id ?? ffi.nullptr, + error); + } + + bool evictUbiquitousItemAtURL_error_( + NSURL? url, ffi.Pointer> error) { + return _lib._objc_msgSend_83( + _id, + _lib._sel_evictUbiquitousItemAtURL_error_1, + url?._id ?? ffi.nullptr, + error); + } + + NSURL URLForUbiquityContainerIdentifier_(NSString? containerIdentifier) { + final _ret = _lib._objc_msgSend_34( + _id, + _lib._sel_URLForUbiquityContainerIdentifier_1, + containerIdentifier?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL URLForPublishingUbiquitousItemAtURL_expirationDate_error_( + NSURL? url, + ffi.Pointer> outDate, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_434( + _id, + _lib._sel_URLForPublishingUbiquitousItemAtURL_expirationDate_error_1, + url?._id ?? ffi.nullptr, + outDate, + error); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSObject? get ubiquityIdentityToken { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_ubiquityIdentityToken1); + return _ret.address == 0 + ? null + : NSObject._(_ret, _lib, retain: true, release: true); + } + + void getFileProviderServicesForItemAtURL_completionHandler_( + NSURL? url, ObjCBlock_ffiVoid_NSDictionary_NSError completionHandler) { + _lib._objc_msgSend_435( + _id, + _lib._sel_getFileProviderServicesForItemAtURL_completionHandler_1, + url?._id ?? ffi.nullptr, + completionHandler._id); + } + + NSURL containerURLForSecurityApplicationGroupIdentifier_( + NSString? groupIdentifier) { + final _ret = _lib._objc_msgSend_34( + _id, + _lib._sel_containerURLForSecurityApplicationGroupIdentifier_1, + groupIdentifier?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL? get homeDirectoryForCurrentUser { + final _ret = + _lib._objc_msgSend_40(_id, _lib._sel_homeDirectoryForCurrentUser1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL? get temporaryDirectory { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_temporaryDirectory1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL homeDirectoryForUser_(NSString? userName) { + final _ret = _lib._objc_msgSend_34( + _id, _lib._sel_homeDirectoryForUser_1, userName?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + @override + NSFileManager init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSFileManager._(_ret, _lib, retain: true, release: true); + } + + static NSFileManager new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSFileManager1, _lib._sel_new1); + return NSFileManager._(_ret, _lib, retain: false, release: true); + } + + static NSFileManager allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSFileManager1, _lib._sel_allocWithZone_1, zone); + return NSFileManager._(_ret, _lib, retain: false, release: true); + } + + static NSFileManager alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSFileManager1, _lib._sel_alloc1); + return NSFileManager._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSFileManager1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSFileManager1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSFileManager1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSFileManager1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSFileManager1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSFileManager1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSFileManager1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSFileManager1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSFileManager1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSVolumeEnumerationOptions { + static const int NSVolumeEnumerationSkipHiddenVolumes = 2; + static const int NSVolumeEnumerationProduceFileReferenceURLs = 4; +} + +abstract class NSFileManagerUnmountOptions { + static const int NSFileManagerUnmountAllPartitionsAndEjectDisk = 1; + static const int NSFileManagerUnmountWithoutUI = 2; +} + +void _ObjCBlock_ffiVoid_NSError_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return block.ref.target + .cast< + ffi.NativeFunction arg0)>>() + .asFunction arg0)>()(arg0); +} + +final _ObjCBlock_ffiVoid_NSError_closureRegistry = {}; +int _ObjCBlock_ffiVoid_NSError_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_NSError_registerClosure(Function fn) { + final id = ++_ObjCBlock_ffiVoid_NSError_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSError_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSError_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return (_ObjCBlock_ffiVoid_NSError_closureRegistry[block.ref.target.address] + as void Function(ffi.Pointer))(arg0); +} + +class ObjCBlock_ffiVoid_NSError extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSError._(ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSError.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi + .NativeFunction arg0)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_NSError_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSError.fromFunction( + SentryCocoa lib, void Function(ffi.Pointer arg0) fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_NSError_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSError_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>>() + .asFunction< + void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>()(_id, arg0); + } +} + +abstract class NSDirectoryEnumerationOptions { + static const int NSDirectoryEnumerationSkipsSubdirectoryDescendants = 1; + static const int NSDirectoryEnumerationSkipsPackageDescendants = 2; + static const int NSDirectoryEnumerationSkipsHiddenFiles = 4; + static const int NSDirectoryEnumerationIncludesDirectoriesPostOrder = 8; + static const int NSDirectoryEnumerationProducesRelativePathURLs = 16; +} + +abstract class NSSearchPathDirectory { + static const int NSApplicationDirectory = 1; + static const int NSDemoApplicationDirectory = 2; + static const int NSDeveloperApplicationDirectory = 3; + static const int NSAdminApplicationDirectory = 4; + static const int NSLibraryDirectory = 5; + static const int NSDeveloperDirectory = 6; + static const int NSUserDirectory = 7; + static const int NSDocumentationDirectory = 8; + static const int NSDocumentDirectory = 9; + static const int NSCoreServiceDirectory = 10; + static const int NSAutosavedInformationDirectory = 11; + static const int NSDesktopDirectory = 12; + static const int NSCachesDirectory = 13; + static const int NSApplicationSupportDirectory = 14; + static const int NSDownloadsDirectory = 15; + static const int NSInputMethodsDirectory = 16; + static const int NSMoviesDirectory = 17; + static const int NSMusicDirectory = 18; + static const int NSPicturesDirectory = 19; + static const int NSPrinterDescriptionDirectory = 20; + static const int NSSharedPublicDirectory = 21; + static const int NSPreferencePanesDirectory = 22; + static const int NSApplicationScriptsDirectory = 23; + static const int NSItemReplacementDirectory = 99; + static const int NSAllApplicationsDirectory = 100; + static const int NSAllLibrariesDirectory = 101; + static const int NSTrashDirectory = 102; +} + +abstract class NSSearchPathDomainMask { + static const int NSUserDomainMask = 1; + static const int NSLocalDomainMask = 2; + static const int NSNetworkDomainMask = 4; + static const int NSSystemDomainMask = 8; + static const int NSAllDomainsMask = 65535; +} + +abstract class NSURLRelationship { + static const int NSURLRelationshipContains = 0; + static const int NSURLRelationshipSame = 1; + static const int NSURLRelationshipOther = 2; +} + +bool _ObjCBlock_bool_NSURL_NSError_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + bool Function(ffi.Pointer arg0, + ffi.Pointer arg1)>()(arg0, arg1); +} + +final _ObjCBlock_bool_NSURL_NSError_closureRegistry = {}; +int _ObjCBlock_bool_NSURL_NSError_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_bool_NSURL_NSError_registerClosure( + Function fn) { + final id = ++_ObjCBlock_bool_NSURL_NSError_closureRegistryIndex; + _ObjCBlock_bool_NSURL_NSError_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +bool _ObjCBlock_bool_NSURL_NSError_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return (_ObjCBlock_bool_NSURL_NSError_closureRegistry[ + block.ref.target.address] + as bool Function( + ffi.Pointer, ffi.Pointer))(arg0, arg1); +} + +class ObjCBlock_bool_NSURL_NSError extends _ObjCBlockBase { + ObjCBlock_bool_NSURL_NSError._(ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_bool_NSURL_NSError.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Bool Function(ffi.Pointer arg0, + ffi.Pointer arg1)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_bool_NSURL_NSError_fnPtrTrampoline, false) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_bool_NSURL_NSError.fromFunction( + SentryCocoa lib, + bool Function(ffi.Pointer arg0, ffi.Pointer arg1) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_bool_NSURL_NSError_closureTrampoline, false) + .cast(), + _ObjCBlock_bool_NSURL_NSError_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + bool call(ffi.Pointer arg0, ffi.Pointer arg1) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + bool Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>()(_id, arg0, arg1); + } +} + +abstract class NSFileManagerItemReplacementOptions { + static const int NSFileManagerItemReplacementUsingNewMetadataOnly = 1; + static const int NSFileManagerItemReplacementWithoutDeletingBackupItem = 2; +} + +void _ObjCBlock_ffiVoid_NSDictionary_NSError_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + void Function(ffi.Pointer arg0, + ffi.Pointer arg1)>()(arg0, arg1); +} + +final _ObjCBlock_ffiVoid_NSDictionary_NSError_closureRegistry = + {}; +int _ObjCBlock_ffiVoid_NSDictionary_NSError_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_NSDictionary_NSError_registerClosure( + Function fn) { + final id = ++_ObjCBlock_ffiVoid_NSDictionary_NSError_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSDictionary_NSError_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSDictionary_NSError_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return (_ObjCBlock_ffiVoid_NSDictionary_NSError_closureRegistry[ + block.ref.target.address] + as void Function( + ffi.Pointer, ffi.Pointer))(arg0, arg1); +} + +class ObjCBlock_ffiVoid_NSDictionary_NSError extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSDictionary_NSError._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSDictionary_NSError.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, + ffi.Pointer arg1)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_ffiVoid_NSDictionary_NSError_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSDictionary_NSError.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, ffi.Pointer arg1) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_ffiVoid_NSDictionary_NSError_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSDictionary_NSError_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0, ffi.Pointer arg1) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>()(_id, arg0, arg1); + } +} + +class NSMutableArray extends NSArray { + NSMutableArray._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSMutableArray] that points to the same underlying object as [other]. + static NSMutableArray castFrom(T other) { + return NSMutableArray._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSMutableArray] that wraps the given raw object pointer. + static NSMutableArray castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSMutableArray._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSMutableArray]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSMutableArray1); + } + + void addObject_(NSObject anObject) { + _lib._objc_msgSend_15(_id, _lib._sel_addObject_1, anObject._id); + } + + void insertObject_atIndex_(NSObject anObject, int index) { + _lib._objc_msgSend_438( + _id, _lib._sel_insertObject_atIndex_1, anObject._id, index); + } + + void removeLastObject() { + _lib._objc_msgSend_1(_id, _lib._sel_removeLastObject1); + } + + void removeObjectAtIndex_(int index) { + _lib._objc_msgSend_439(_id, _lib._sel_removeObjectAtIndex_1, index); + } + + void replaceObjectAtIndex_withObject_(int index, NSObject anObject) { + _lib._objc_msgSend_440( + _id, _lib._sel_replaceObjectAtIndex_withObject_1, index, anObject._id); + } + + @override + NSMutableArray init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSMutableArray._(_ret, _lib, retain: true, release: true); + } + + NSMutableArray initWithCapacity_(int numItems) { + final _ret = + _lib._objc_msgSend_60(_id, _lib._sel_initWithCapacity_1, numItems); + return NSMutableArray._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableArray initWithCoder_(NSCoder? coder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr); + return NSMutableArray._(_ret, _lib, retain: true, release: true); + } + + void addObjectsFromArray_(NSArray? otherArray) { + _lib._objc_msgSend_441( + _id, _lib._sel_addObjectsFromArray_1, otherArray?._id ?? ffi.nullptr); + } + + void exchangeObjectAtIndex_withObjectAtIndex_(int idx1, int idx2) { + _lib._objc_msgSend_442( + _id, _lib._sel_exchangeObjectAtIndex_withObjectAtIndex_1, idx1, idx2); + } + + void removeAllObjects() { + _lib._objc_msgSend_1(_id, _lib._sel_removeAllObjects1); + } + + void removeObject_inRange_(NSObject anObject, _NSRange range) { + _lib._objc_msgSend_443( + _id, _lib._sel_removeObject_inRange_1, anObject._id, range); + } + + void removeObject_(NSObject anObject) { + _lib._objc_msgSend_15(_id, _lib._sel_removeObject_1, anObject._id); + } + + void removeObjectIdenticalTo_inRange_(NSObject anObject, _NSRange range) { + _lib._objc_msgSend_443( + _id, _lib._sel_removeObjectIdenticalTo_inRange_1, anObject._id, range); + } + + void removeObjectIdenticalTo_(NSObject anObject) { + _lib._objc_msgSend_15( + _id, _lib._sel_removeObjectIdenticalTo_1, anObject._id); + } + + void removeObjectsFromIndices_numIndices_( + ffi.Pointer indices, int cnt) { + _lib._objc_msgSend_444( + _id, _lib._sel_removeObjectsFromIndices_numIndices_1, indices, cnt); + } + + void removeObjectsInArray_(NSArray? otherArray) { + _lib._objc_msgSend_441( + _id, _lib._sel_removeObjectsInArray_1, otherArray?._id ?? ffi.nullptr); + } + + void removeObjectsInRange_(_NSRange range) { + _lib._objc_msgSend_445(_id, _lib._sel_removeObjectsInRange_1, range); + } + + void replaceObjectsInRange_withObjectsFromArray_range_( + _NSRange range, NSArray? otherArray, _NSRange otherRange) { + _lib._objc_msgSend_446( + _id, + _lib._sel_replaceObjectsInRange_withObjectsFromArray_range_1, + range, + otherArray?._id ?? ffi.nullptr, + otherRange); + } + + void replaceObjectsInRange_withObjectsFromArray_( + _NSRange range, NSArray? otherArray) { + _lib._objc_msgSend_447( + _id, + _lib._sel_replaceObjectsInRange_withObjectsFromArray_1, + range, + otherArray?._id ?? ffi.nullptr); + } + + void setArray_(NSArray? otherArray) { + _lib._objc_msgSend_441( + _id, _lib._sel_setArray_1, otherArray?._id ?? ffi.nullptr); + } + + void sortUsingFunction_context_( + ffi.Pointer< + ffi.NativeFunction< + ffi.Long Function(ffi.Pointer, + ffi.Pointer, ffi.Pointer)>> + compare, + ffi.Pointer context) { + _lib._objc_msgSend_448( + _id, _lib._sel_sortUsingFunction_context_1, compare, context); + } + + void sortUsingSelector_(ffi.Pointer comparator) { + _lib._objc_msgSend_7(_id, _lib._sel_sortUsingSelector_1, comparator); + } + + void insertObjects_atIndexes_(NSArray? objects, NSIndexSet? indexes) { + _lib._objc_msgSend_449(_id, _lib._sel_insertObjects_atIndexes_1, + objects?._id ?? ffi.nullptr, indexes?._id ?? ffi.nullptr); + } + + void removeObjectsAtIndexes_(NSIndexSet? indexes) { + _lib._objc_msgSend_450( + _id, _lib._sel_removeObjectsAtIndexes_1, indexes?._id ?? ffi.nullptr); + } + + void replaceObjectsAtIndexes_withObjects_( + NSIndexSet? indexes, NSArray? objects) { + _lib._objc_msgSend_451(_id, _lib._sel_replaceObjectsAtIndexes_withObjects_1, + indexes?._id ?? ffi.nullptr, objects?._id ?? ffi.nullptr); + } + + void setObject_atIndexedSubscript_(NSObject obj, int idx) { + _lib._objc_msgSend_438( + _id, _lib._sel_setObject_atIndexedSubscript_1, obj._id, idx); + } + + void sortUsingComparator_( + ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject cmptr) { + _lib._objc_msgSend_452(_id, _lib._sel_sortUsingComparator_1, cmptr._id); + } + + void sortWithOptions_usingComparator_( + int opts, ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject cmptr) { + _lib._objc_msgSend_453( + _id, _lib._sel_sortWithOptions_usingComparator_1, opts, cmptr._id); + } + + static NSMutableArray arrayWithCapacity_(SentryCocoa _lib, int numItems) { + final _ret = _lib._objc_msgSend_60( + _lib._class_NSMutableArray1, _lib._sel_arrayWithCapacity_1, numItems); + return NSMutableArray._(_ret, _lib, retain: true, release: true); + } + + static NSMutableArray arrayWithContentsOfFile_( + SentryCocoa _lib, NSString? path) { + final _ret = _lib._objc_msgSend_454(_lib._class_NSMutableArray1, + _lib._sel_arrayWithContentsOfFile_1, path?._id ?? ffi.nullptr); + return NSMutableArray._(_ret, _lib, retain: true, release: true); + } + + static NSMutableArray arrayWithContentsOfURL_(SentryCocoa _lib, NSURL? url) { + final _ret = _lib._objc_msgSend_455(_lib._class_NSMutableArray1, + _lib._sel_arrayWithContentsOfURL_1, url?._id ?? ffi.nullptr); + return NSMutableArray._(_ret, _lib, retain: true, release: true); + } + + NSMutableArray initWithContentsOfFile_(NSString? path) { + final _ret = _lib._objc_msgSend_454( + _id, _lib._sel_initWithContentsOfFile_1, path?._id ?? ffi.nullptr); + return NSMutableArray._(_ret, _lib, retain: true, release: true); + } + + NSMutableArray initWithContentsOfURL_(NSURL? url) { + final _ret = _lib._objc_msgSend_455( + _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr); + return NSMutableArray._(_ret, _lib, retain: true, release: true); + } + + void applyDifference_(NSObject? difference) { + _lib._objc_msgSend_15( + _id, _lib._sel_applyDifference_1, difference?._id ?? ffi.nullptr); + } + + void sortUsingDescriptors_(NSArray? sortDescriptors) { + _lib._objc_msgSend_441(_id, _lib._sel_sortUsingDescriptors_1, + sortDescriptors?._id ?? ffi.nullptr); + } + + void filterUsingPredicate_(NSPredicate? predicate) { + _lib._objc_msgSend_456( + _id, _lib._sel_filterUsingPredicate_1, predicate?._id ?? ffi.nullptr); + } + + @override + NSMutableArray initWithObjects_count_( + ffi.Pointer> objects, int cnt) { + final _ret = _lib._objc_msgSend_61( + _id, _lib._sel_initWithObjects_count_1, objects, cnt); + return NSMutableArray._(_ret, _lib, retain: true, release: true); + } + + static NSMutableArray array(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSMutableArray1, _lib._sel_array1); + return NSMutableArray._(_ret, _lib, retain: true, release: true); + } + + static NSMutableArray arrayWithObject_(SentryCocoa _lib, NSObject anObject) { + final _ret = _lib._objc_msgSend_16( + _lib._class_NSMutableArray1, _lib._sel_arrayWithObject_1, anObject._id); + return NSMutableArray._(_ret, _lib, retain: true, release: true); + } + + static NSMutableArray arrayWithObjects_count_( + SentryCocoa _lib, ffi.Pointer> objects, int cnt) { + final _ret = _lib._objc_msgSend_61(_lib._class_NSMutableArray1, + _lib._sel_arrayWithObjects_count_1, objects, cnt); + return NSMutableArray._(_ret, _lib, retain: true, release: true); + } + + static NSMutableArray arrayWithObjects_(SentryCocoa _lib, NSObject firstObj) { + final _ret = _lib._objc_msgSend_16(_lib._class_NSMutableArray1, + _lib._sel_arrayWithObjects_1, firstObj._id); + return NSMutableArray._(_ret, _lib, retain: true, release: true); + } + + static NSMutableArray arrayWithArray_(SentryCocoa _lib, NSArray? array) { + final _ret = _lib._objc_msgSend_67(_lib._class_NSMutableArray1, + _lib._sel_arrayWithArray_1, array?._id ?? ffi.nullptr); + return NSMutableArray._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableArray initWithObjects_(NSObject firstObj) { + final _ret = + _lib._objc_msgSend_16(_id, _lib._sel_initWithObjects_1, firstObj._id); + return NSMutableArray._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableArray initWithArray_(NSArray? array) { + final _ret = _lib._objc_msgSend_67( + _id, _lib._sel_initWithArray_1, array?._id ?? ffi.nullptr); + return NSMutableArray._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableArray initWithArray_copyItems_(NSArray? array, bool flag) { + final _ret = _lib._objc_msgSend_118(_id, + _lib._sel_initWithArray_copyItems_1, array?._id ?? ffi.nullptr, flag); + return NSMutableArray._(_ret, _lib, retain: false, release: true); + } + + static NSArray arrayWithContentsOfURL_error_(SentryCocoa _lib, NSURL? url, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_119( + _lib._class_NSMutableArray1, + _lib._sel_arrayWithContentsOfURL_error_1, + url?._id ?? ffi.nullptr, + error); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSMutableArray new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSMutableArray1, _lib._sel_new1); + return NSMutableArray._(_ret, _lib, retain: false, release: true); + } + + static NSMutableArray allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSMutableArray1, _lib._sel_allocWithZone_1, zone); + return NSMutableArray._(_ret, _lib, retain: false, release: true); + } + + static NSMutableArray alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSMutableArray1, _lib._sel_alloc1); + return NSMutableArray._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSMutableArray1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSMutableArray1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSMutableArray1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSMutableArray1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSMutableArray1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSMutableArray1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSMutableArray1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSMutableArray1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSMutableArray1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSMutableOrderedSet extends NSOrderedSet { + NSMutableOrderedSet._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSMutableOrderedSet] that points to the same underlying object as [other]. + static NSMutableOrderedSet castFrom(T other) { + return NSMutableOrderedSet._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSMutableOrderedSet] that wraps the given raw object pointer. + static NSMutableOrderedSet castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSMutableOrderedSet._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSMutableOrderedSet]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSMutableOrderedSet1); + } + + void insertObject_atIndex_(NSObject object, int idx) { + _lib._objc_msgSend_438( + _id, _lib._sel_insertObject_atIndex_1, object._id, idx); + } + + void removeObjectAtIndex_(int idx) { + _lib._objc_msgSend_439(_id, _lib._sel_removeObjectAtIndex_1, idx); + } + + void replaceObjectAtIndex_withObject_(int idx, NSObject object) { + _lib._objc_msgSend_440( + _id, _lib._sel_replaceObjectAtIndex_withObject_1, idx, object._id); + } + + @override + NSMutableOrderedSet initWithCoder_(NSCoder? coder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr); + return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableOrderedSet init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true); + } + + NSMutableOrderedSet initWithCapacity_(int numItems) { + final _ret = + _lib._objc_msgSend_60(_id, _lib._sel_initWithCapacity_1, numItems); + return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true); + } + + void addObject_(NSObject object) { + _lib._objc_msgSend_15(_id, _lib._sel_addObject_1, object._id); + } + + void addObjects_count_( + ffi.Pointer> objects, int count) { + _lib._objc_msgSend_467(_id, _lib._sel_addObjects_count_1, objects, count); + } + + void addObjectsFromArray_(NSArray? array) { + _lib._objc_msgSend_441( + _id, _lib._sel_addObjectsFromArray_1, array?._id ?? ffi.nullptr); + } + + void exchangeObjectAtIndex_withObjectAtIndex_(int idx1, int idx2) { + _lib._objc_msgSend_442( + _id, _lib._sel_exchangeObjectAtIndex_withObjectAtIndex_1, idx1, idx2); + } + + void moveObjectsAtIndexes_toIndex_(NSIndexSet? indexes, int idx) { + _lib._objc_msgSend_468(_id, _lib._sel_moveObjectsAtIndexes_toIndex_1, + indexes?._id ?? ffi.nullptr, idx); + } + + void insertObjects_atIndexes_(NSArray? objects, NSIndexSet? indexes) { + _lib._objc_msgSend_449(_id, _lib._sel_insertObjects_atIndexes_1, + objects?._id ?? ffi.nullptr, indexes?._id ?? ffi.nullptr); + } + + void setObject_atIndex_(NSObject obj, int idx) { + _lib._objc_msgSend_438(_id, _lib._sel_setObject_atIndex_1, obj._id, idx); + } + + void setObject_atIndexedSubscript_(NSObject obj, int idx) { + _lib._objc_msgSend_438( + _id, _lib._sel_setObject_atIndexedSubscript_1, obj._id, idx); + } + + void replaceObjectsInRange_withObjects_count_( + _NSRange range, ffi.Pointer> objects, int count) { + _lib._objc_msgSend_469( + _id, + _lib._sel_replaceObjectsInRange_withObjects_count_1, + range, + objects, + count); + } + + void replaceObjectsAtIndexes_withObjects_( + NSIndexSet? indexes, NSArray? objects) { + _lib._objc_msgSend_451(_id, _lib._sel_replaceObjectsAtIndexes_withObjects_1, + indexes?._id ?? ffi.nullptr, objects?._id ?? ffi.nullptr); + } + + void removeObjectsInRange_(_NSRange range) { + _lib._objc_msgSend_445(_id, _lib._sel_removeObjectsInRange_1, range); + } + + void removeObjectsAtIndexes_(NSIndexSet? indexes) { + _lib._objc_msgSend_450( + _id, _lib._sel_removeObjectsAtIndexes_1, indexes?._id ?? ffi.nullptr); + } + + void removeAllObjects() { + _lib._objc_msgSend_1(_id, _lib._sel_removeAllObjects1); + } + + void removeObject_(NSObject object) { + _lib._objc_msgSend_15(_id, _lib._sel_removeObject_1, object._id); + } + + void removeObjectsInArray_(NSArray? array) { + _lib._objc_msgSend_441( + _id, _lib._sel_removeObjectsInArray_1, array?._id ?? ffi.nullptr); + } + + void intersectOrderedSet_(NSOrderedSet? other) { + _lib._objc_msgSend_470( + _id, _lib._sel_intersectOrderedSet_1, other?._id ?? ffi.nullptr); + } + + void minusOrderedSet_(NSOrderedSet? other) { + _lib._objc_msgSend_470( + _id, _lib._sel_minusOrderedSet_1, other?._id ?? ffi.nullptr); + } + + void unionOrderedSet_(NSOrderedSet? other) { + _lib._objc_msgSend_470( + _id, _lib._sel_unionOrderedSet_1, other?._id ?? ffi.nullptr); + } + + void intersectSet_(NSSet? other) { + _lib._objc_msgSend_471( + _id, _lib._sel_intersectSet_1, other?._id ?? ffi.nullptr); + } + + void minusSet_(NSSet? other) { + _lib._objc_msgSend_471( + _id, _lib._sel_minusSet_1, other?._id ?? ffi.nullptr); + } + + void unionSet_(NSSet? other) { + _lib._objc_msgSend_471( + _id, _lib._sel_unionSet_1, other?._id ?? ffi.nullptr); + } + + void sortUsingComparator_( + ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject cmptr) { + _lib._objc_msgSend_452(_id, _lib._sel_sortUsingComparator_1, cmptr._id); + } + + void sortWithOptions_usingComparator_( + int opts, ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject cmptr) { + _lib._objc_msgSend_453( + _id, _lib._sel_sortWithOptions_usingComparator_1, opts, cmptr._id); + } + + void sortRange_options_usingComparator_(_NSRange range, int opts, + ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject cmptr) { + _lib._objc_msgSend_472(_id, _lib._sel_sortRange_options_usingComparator_1, + range, opts, cmptr._id); + } + + static NSMutableOrderedSet orderedSetWithCapacity_( + SentryCocoa _lib, int numItems) { + final _ret = _lib._objc_msgSend_60(_lib._class_NSMutableOrderedSet1, + _lib._sel_orderedSetWithCapacity_1, numItems); + return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true); + } + + void applyDifference_(NSObject? difference) { + _lib._objc_msgSend_15( + _id, _lib._sel_applyDifference_1, difference?._id ?? ffi.nullptr); + } + + void sortUsingDescriptors_(NSArray? sortDescriptors) { + _lib._objc_msgSend_441(_id, _lib._sel_sortUsingDescriptors_1, + sortDescriptors?._id ?? ffi.nullptr); + } + + void filterUsingPredicate_(NSPredicate? p) { + _lib._objc_msgSend_456( + _id, _lib._sel_filterUsingPredicate_1, p?._id ?? ffi.nullptr); + } + + @override + NSMutableOrderedSet initWithObjects_count_( + ffi.Pointer> objects, int cnt) { + final _ret = _lib._objc_msgSend_61( + _id, _lib._sel_initWithObjects_count_1, objects, cnt); + return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true); + } + + static NSMutableOrderedSet orderedSet(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSMutableOrderedSet1, _lib._sel_orderedSet1); + return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true); + } + + static NSMutableOrderedSet orderedSetWithObject_( + SentryCocoa _lib, NSObject object) { + final _ret = _lib._objc_msgSend_16(_lib._class_NSMutableOrderedSet1, + _lib._sel_orderedSetWithObject_1, object._id); + return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true); + } + + static NSMutableOrderedSet orderedSetWithObjects_count_( + SentryCocoa _lib, ffi.Pointer> objects, int cnt) { + final _ret = _lib._objc_msgSend_61(_lib._class_NSMutableOrderedSet1, + _lib._sel_orderedSetWithObjects_count_1, objects, cnt); + return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true); + } + + static NSMutableOrderedSet orderedSetWithObjects_( + SentryCocoa _lib, NSObject firstObj) { + final _ret = _lib._objc_msgSend_16(_lib._class_NSMutableOrderedSet1, + _lib._sel_orderedSetWithObjects_1, firstObj._id); + return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true); + } + + static NSMutableOrderedSet orderedSetWithOrderedSet_( + SentryCocoa _lib, NSOrderedSet? set) { + final _ret = _lib._objc_msgSend_459(_lib._class_NSMutableOrderedSet1, + _lib._sel_orderedSetWithOrderedSet_1, set?._id ?? ffi.nullptr); + return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true); + } + + static NSMutableOrderedSet orderedSetWithOrderedSet_range_copyItems_( + SentryCocoa _lib, NSOrderedSet? set, _NSRange range, bool flag) { + final _ret = _lib._objc_msgSend_460( + _lib._class_NSMutableOrderedSet1, + _lib._sel_orderedSetWithOrderedSet_range_copyItems_1, + set?._id ?? ffi.nullptr, + range, + flag); + return NSMutableOrderedSet._(_ret, _lib, retain: false, release: true); + } + + static NSMutableOrderedSet orderedSetWithArray_( + SentryCocoa _lib, NSArray? array) { + final _ret = _lib._objc_msgSend_67(_lib._class_NSMutableOrderedSet1, + _lib._sel_orderedSetWithArray_1, array?._id ?? ffi.nullptr); + return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true); + } + + static NSMutableOrderedSet orderedSetWithArray_range_copyItems_( + SentryCocoa _lib, NSArray? array, _NSRange range, bool flag) { + final _ret = _lib._objc_msgSend_461( + _lib._class_NSMutableOrderedSet1, + _lib._sel_orderedSetWithArray_range_copyItems_1, + array?._id ?? ffi.nullptr, + range, + flag); + return NSMutableOrderedSet._(_ret, _lib, retain: false, release: true); + } + + static NSMutableOrderedSet orderedSetWithSet_(SentryCocoa _lib, NSSet? set) { + final _ret = _lib._objc_msgSend_382(_lib._class_NSMutableOrderedSet1, + _lib._sel_orderedSetWithSet_1, set?._id ?? ffi.nullptr); + return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true); + } + + static NSMutableOrderedSet orderedSetWithSet_copyItems_( + SentryCocoa _lib, NSSet? set, bool flag) { + final _ret = _lib._objc_msgSend_383(_lib._class_NSMutableOrderedSet1, + _lib._sel_orderedSetWithSet_copyItems_1, set?._id ?? ffi.nullptr, flag); + return NSMutableOrderedSet._(_ret, _lib, retain: false, release: true); + } + + @override + NSMutableOrderedSet initWithObject_(NSObject object) { + final _ret = + _lib._objc_msgSend_16(_id, _lib._sel_initWithObject_1, object._id); + return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableOrderedSet initWithObjects_(NSObject firstObj) { + final _ret = + _lib._objc_msgSend_16(_id, _lib._sel_initWithObjects_1, firstObj._id); + return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableOrderedSet initWithOrderedSet_(NSOrderedSet? set) { + final _ret = _lib._objc_msgSend_459( + _id, _lib._sel_initWithOrderedSet_1, set?._id ?? ffi.nullptr); + return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableOrderedSet initWithOrderedSet_copyItems_( + NSOrderedSet? set, bool flag) { + final _ret = _lib._objc_msgSend_462( + _id, + _lib._sel_initWithOrderedSet_copyItems_1, + set?._id ?? ffi.nullptr, + flag); + return NSMutableOrderedSet._(_ret, _lib, retain: false, release: true); + } + + @override + NSMutableOrderedSet initWithOrderedSet_range_copyItems_( + NSOrderedSet? set, _NSRange range, bool flag) { + final _ret = _lib._objc_msgSend_460( + _id, + _lib._sel_initWithOrderedSet_range_copyItems_1, + set?._id ?? ffi.nullptr, + range, + flag); + return NSMutableOrderedSet._(_ret, _lib, retain: false, release: true); + } + + @override + NSMutableOrderedSet initWithArray_(NSArray? array) { + final _ret = _lib._objc_msgSend_67( + _id, _lib._sel_initWithArray_1, array?._id ?? ffi.nullptr); + return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableOrderedSet initWithArray_copyItems_(NSArray? set, bool flag) { + final _ret = _lib._objc_msgSend_118(_id, + _lib._sel_initWithArray_copyItems_1, set?._id ?? ffi.nullptr, flag); + return NSMutableOrderedSet._(_ret, _lib, retain: false, release: true); + } + + @override + NSMutableOrderedSet initWithArray_range_copyItems_( + NSArray? set, _NSRange range, bool flag) { + final _ret = _lib._objc_msgSend_461( + _id, + _lib._sel_initWithArray_range_copyItems_1, + set?._id ?? ffi.nullptr, + range, + flag); + return NSMutableOrderedSet._(_ret, _lib, retain: false, release: true); + } + + @override + NSMutableOrderedSet initWithSet_(NSSet? set) { + final _ret = _lib._objc_msgSend_382( + _id, _lib._sel_initWithSet_1, set?._id ?? ffi.nullptr); + return NSMutableOrderedSet._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableOrderedSet initWithSet_copyItems_(NSSet? set, bool flag) { + final _ret = _lib._objc_msgSend_383( + _id, _lib._sel_initWithSet_copyItems_1, set?._id ?? ffi.nullptr, flag); + return NSMutableOrderedSet._(_ret, _lib, retain: false, release: true); + } + + static NSMutableOrderedSet new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSMutableOrderedSet1, _lib._sel_new1); + return NSMutableOrderedSet._(_ret, _lib, retain: false, release: true); + } + + static NSMutableOrderedSet allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSMutableOrderedSet1, _lib._sel_allocWithZone_1, zone); + return NSMutableOrderedSet._(_ret, _lib, retain: false, release: true); + } + + static NSMutableOrderedSet alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSMutableOrderedSet1, _lib._sel_alloc1); + return NSMutableOrderedSet._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSMutableOrderedSet1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSMutableOrderedSet1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSMutableOrderedSet1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSMutableOrderedSet1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSMutableOrderedSet1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSMutableOrderedSet1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSMutableOrderedSet1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSMutableOrderedSet1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSMutableOrderedSet1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSOrderedSet extends NSObject { + NSOrderedSet._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSOrderedSet] that points to the same underlying object as [other]. + static NSOrderedSet castFrom(T other) { + return NSOrderedSet._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSOrderedSet] that wraps the given raw object pointer. + static NSOrderedSet castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSOrderedSet._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSOrderedSet]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSOrderedSet1); + } + + int get count { + return _lib._objc_msgSend_10(_id, _lib._sel_count1); + } + + NSObject objectAtIndex_(int idx) { + final _ret = _lib._objc_msgSend_60(_id, _lib._sel_objectAtIndex_1, idx); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + int indexOfObject_(NSObject object) { + return _lib._objc_msgSend_69(_id, _lib._sel_indexOfObject_1, object._id); + } + + @override + NSOrderedSet init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSOrderedSet._(_ret, _lib, retain: true, release: true); + } + + NSOrderedSet initWithObjects_count_( + ffi.Pointer> objects, int cnt) { + final _ret = _lib._objc_msgSend_61( + _id, _lib._sel_initWithObjects_count_1, objects, cnt); + return NSOrderedSet._(_ret, _lib, retain: true, release: true); + } + + NSOrderedSet initWithCoder_(NSCoder? coder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr); + return NSOrderedSet._(_ret, _lib, retain: true, release: true); + } + + void getObjects_range_( + ffi.Pointer> objects, _NSRange range) { + _lib._objc_msgSend_68(_id, _lib._sel_getObjects_range_1, objects, range); + } + + NSArray objectsAtIndexes_(NSIndexSet? indexes) { + final _ret = _lib._objc_msgSend_105( + _id, _lib._sel_objectsAtIndexes_1, indexes?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSObject get firstObject { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_firstObject1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject get lastObject { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_lastObject1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + bool isEqualToOrderedSet_(NSOrderedSet? other) { + return _lib._objc_msgSend_457( + _id, _lib._sel_isEqualToOrderedSet_1, other?._id ?? ffi.nullptr); + } + + bool containsObject_(NSObject object) { + return _lib._objc_msgSend_0(_id, _lib._sel_containsObject_1, object._id); + } + + bool intersectsOrderedSet_(NSOrderedSet? other) { + return _lib._objc_msgSend_457( + _id, _lib._sel_intersectsOrderedSet_1, other?._id ?? ffi.nullptr); + } + + bool intersectsSet_(NSSet? set) { + return _lib._objc_msgSend_374( + _id, _lib._sel_intersectsSet_1, set?._id ?? ffi.nullptr); + } + + bool isSubsetOfOrderedSet_(NSOrderedSet? other) { + return _lib._objc_msgSend_457( + _id, _lib._sel_isSubsetOfOrderedSet_1, other?._id ?? ffi.nullptr); + } + + bool isSubsetOfSet_(NSSet? set) { + return _lib._objc_msgSend_374( + _id, _lib._sel_isSubsetOfSet_1, set?._id ?? ffi.nullptr); + } + + NSObject objectAtIndexedSubscript_(int idx) { + final _ret = + _lib._objc_msgSend_60(_id, _lib._sel_objectAtIndexedSubscript_1, idx); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSEnumerator objectEnumerator() { + final _ret = _lib._objc_msgSend_72(_id, _lib._sel_objectEnumerator1); + return NSEnumerator._(_ret, _lib, retain: true, release: true); + } + + NSEnumerator reverseObjectEnumerator() { + final _ret = _lib._objc_msgSend_72(_id, _lib._sel_reverseObjectEnumerator1); + return NSEnumerator._(_ret, _lib, retain: true, release: true); + } + + NSOrderedSet? get reversedOrderedSet { + final _ret = _lib._objc_msgSend_458(_id, _lib._sel_reversedOrderedSet1); + return _ret.address == 0 + ? null + : NSOrderedSet._(_ret, _lib, retain: true, release: true); + } + + NSArray? get array { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_array1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSSet? get set1 { + final _ret = _lib._objc_msgSend_295(_id, _lib._sel_set1); + return _ret.address == 0 + ? null + : NSSet._(_ret, _lib, retain: true, release: true); + } + + void enumerateObjectsUsingBlock_( + ObjCBlock_ffiVoid_ObjCObject_ffiUnsignedLong_bool block) { + _lib._objc_msgSend_106( + _id, _lib._sel_enumerateObjectsUsingBlock_1, block._id); + } + + void enumerateObjectsWithOptions_usingBlock_( + int opts, ObjCBlock_ffiVoid_ObjCObject_ffiUnsignedLong_bool block) { + _lib._objc_msgSend_107(_id, + _lib._sel_enumerateObjectsWithOptions_usingBlock_1, opts, block._id); + } + + void enumerateObjectsAtIndexes_options_usingBlock_(NSIndexSet? s, int opts, + ObjCBlock_ffiVoid_ObjCObject_ffiUnsignedLong_bool block) { + _lib._objc_msgSend_108( + _id, + _lib._sel_enumerateObjectsAtIndexes_options_usingBlock_1, + s?._id ?? ffi.nullptr, + opts, + block._id); + } + + int indexOfObjectPassingTest_( + ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool predicate) { + return _lib._objc_msgSend_109( + _id, _lib._sel_indexOfObjectPassingTest_1, predicate._id); + } + + int indexOfObjectWithOptions_passingTest_( + int opts, ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool predicate) { + return _lib._objc_msgSend_110(_id, + _lib._sel_indexOfObjectWithOptions_passingTest_1, opts, predicate._id); + } + + int indexOfObjectAtIndexes_options_passingTest_(NSIndexSet? s, int opts, + ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool predicate) { + return _lib._objc_msgSend_111( + _id, + _lib._sel_indexOfObjectAtIndexes_options_passingTest_1, + s?._id ?? ffi.nullptr, + opts, + predicate._id); + } + + NSIndexSet indexesOfObjectsPassingTest_( + ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool predicate) { + final _ret = _lib._objc_msgSend_112( + _id, _lib._sel_indexesOfObjectsPassingTest_1, predicate._id); + return NSIndexSet._(_ret, _lib, retain: true, release: true); + } + + NSIndexSet indexesOfObjectsWithOptions_passingTest_( + int opts, ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool predicate) { + final _ret = _lib._objc_msgSend_113( + _id, + _lib._sel_indexesOfObjectsWithOptions_passingTest_1, + opts, + predicate._id); + return NSIndexSet._(_ret, _lib, retain: true, release: true); + } + + NSIndexSet indexesOfObjectsAtIndexes_options_passingTest_(NSIndexSet? s, + int opts, ObjCBlock_bool_ObjCObject_ffiUnsignedLong_bool predicate) { + final _ret = _lib._objc_msgSend_114( + _id, + _lib._sel_indexesOfObjectsAtIndexes_options_passingTest_1, + s?._id ?? ffi.nullptr, + opts, + predicate._id); + return NSIndexSet._(_ret, _lib, retain: true, release: true); + } + + int indexOfObject_inSortedRange_options_usingComparator_( + NSObject object, + _NSRange range, + int opts, + ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject cmp) { + return _lib._objc_msgSend_117( + _id, + _lib._sel_indexOfObject_inSortedRange_options_usingComparator_1, + object._id, + range, + opts, + cmp._id); + } + + NSArray sortedArrayUsingComparator_( + ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject cmptr) { + final _ret = _lib._objc_msgSend_115( + _id, _lib._sel_sortedArrayUsingComparator_1, cmptr._id); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray sortedArrayWithOptions_usingComparator_( + int opts, ObjCBlock_NSComparisonResult_ObjCObject_ObjCObject cmptr) { + final _ret = _lib._objc_msgSend_116(_id, + _lib._sel_sortedArrayWithOptions_usingComparator_1, opts, cmptr._id); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSString? get description { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString descriptionWithLocale_(NSObject locale) { + final _ret = _lib._objc_msgSend_65( + _id, _lib._sel_descriptionWithLocale_1, locale._id); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString descriptionWithLocale_indent_(NSObject locale, int level) { + final _ret = _lib._objc_msgSend_66( + _id, _lib._sel_descriptionWithLocale_indent_1, locale._id, level); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSOrderedSet orderedSet(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSOrderedSet1, _lib._sel_orderedSet1); + return NSOrderedSet._(_ret, _lib, retain: true, release: true); + } + + static NSOrderedSet orderedSetWithObject_(SentryCocoa _lib, NSObject object) { + final _ret = _lib._objc_msgSend_16(_lib._class_NSOrderedSet1, + _lib._sel_orderedSetWithObject_1, object._id); + return NSOrderedSet._(_ret, _lib, retain: true, release: true); + } + + static NSOrderedSet orderedSetWithObjects_count_( + SentryCocoa _lib, ffi.Pointer> objects, int cnt) { + final _ret = _lib._objc_msgSend_61(_lib._class_NSOrderedSet1, + _lib._sel_orderedSetWithObjects_count_1, objects, cnt); + return NSOrderedSet._(_ret, _lib, retain: true, release: true); + } + + static NSOrderedSet orderedSetWithObjects_( + SentryCocoa _lib, NSObject firstObj) { + final _ret = _lib._objc_msgSend_16(_lib._class_NSOrderedSet1, + _lib._sel_orderedSetWithObjects_1, firstObj._id); + return NSOrderedSet._(_ret, _lib, retain: true, release: true); + } + + static NSOrderedSet orderedSetWithOrderedSet_( + SentryCocoa _lib, NSOrderedSet? set) { + final _ret = _lib._objc_msgSend_459(_lib._class_NSOrderedSet1, + _lib._sel_orderedSetWithOrderedSet_1, set?._id ?? ffi.nullptr); + return NSOrderedSet._(_ret, _lib, retain: true, release: true); + } + + static NSOrderedSet orderedSetWithOrderedSet_range_copyItems_( + SentryCocoa _lib, NSOrderedSet? set, _NSRange range, bool flag) { + final _ret = _lib._objc_msgSend_460( + _lib._class_NSOrderedSet1, + _lib._sel_orderedSetWithOrderedSet_range_copyItems_1, + set?._id ?? ffi.nullptr, + range, + flag); + return NSOrderedSet._(_ret, _lib, retain: false, release: true); + } + + static NSOrderedSet orderedSetWithArray_(SentryCocoa _lib, NSArray? array) { + final _ret = _lib._objc_msgSend_67(_lib._class_NSOrderedSet1, + _lib._sel_orderedSetWithArray_1, array?._id ?? ffi.nullptr); + return NSOrderedSet._(_ret, _lib, retain: true, release: true); + } + + static NSOrderedSet orderedSetWithArray_range_copyItems_( + SentryCocoa _lib, NSArray? array, _NSRange range, bool flag) { + final _ret = _lib._objc_msgSend_461( + _lib._class_NSOrderedSet1, + _lib._sel_orderedSetWithArray_range_copyItems_1, + array?._id ?? ffi.nullptr, + range, + flag); + return NSOrderedSet._(_ret, _lib, retain: false, release: true); + } + + static NSOrderedSet orderedSetWithSet_(SentryCocoa _lib, NSSet? set) { + final _ret = _lib._objc_msgSend_382(_lib._class_NSOrderedSet1, + _lib._sel_orderedSetWithSet_1, set?._id ?? ffi.nullptr); + return NSOrderedSet._(_ret, _lib, retain: true, release: true); + } + + static NSOrderedSet orderedSetWithSet_copyItems_( + SentryCocoa _lib, NSSet? set, bool flag) { + final _ret = _lib._objc_msgSend_383(_lib._class_NSOrderedSet1, + _lib._sel_orderedSetWithSet_copyItems_1, set?._id ?? ffi.nullptr, flag); + return NSOrderedSet._(_ret, _lib, retain: false, release: true); + } + + NSOrderedSet initWithObject_(NSObject object) { + final _ret = + _lib._objc_msgSend_16(_id, _lib._sel_initWithObject_1, object._id); + return NSOrderedSet._(_ret, _lib, retain: true, release: true); + } + + NSOrderedSet initWithObjects_(NSObject firstObj) { + final _ret = + _lib._objc_msgSend_16(_id, _lib._sel_initWithObjects_1, firstObj._id); + return NSOrderedSet._(_ret, _lib, retain: true, release: true); + } + + NSOrderedSet initWithOrderedSet_(NSOrderedSet? set) { + final _ret = _lib._objc_msgSend_459( + _id, _lib._sel_initWithOrderedSet_1, set?._id ?? ffi.nullptr); + return NSOrderedSet._(_ret, _lib, retain: true, release: true); + } + + NSOrderedSet initWithOrderedSet_copyItems_(NSOrderedSet? set, bool flag) { + final _ret = _lib._objc_msgSend_462( + _id, + _lib._sel_initWithOrderedSet_copyItems_1, + set?._id ?? ffi.nullptr, + flag); + return NSOrderedSet._(_ret, _lib, retain: false, release: true); + } + + NSOrderedSet initWithOrderedSet_range_copyItems_( + NSOrderedSet? set, _NSRange range, bool flag) { + final _ret = _lib._objc_msgSend_460( + _id, + _lib._sel_initWithOrderedSet_range_copyItems_1, + set?._id ?? ffi.nullptr, + range, + flag); + return NSOrderedSet._(_ret, _lib, retain: false, release: true); + } + + NSOrderedSet initWithArray_(NSArray? array) { + final _ret = _lib._objc_msgSend_67( + _id, _lib._sel_initWithArray_1, array?._id ?? ffi.nullptr); + return NSOrderedSet._(_ret, _lib, retain: true, release: true); + } + + NSOrderedSet initWithArray_copyItems_(NSArray? set, bool flag) { + final _ret = _lib._objc_msgSend_118(_id, + _lib._sel_initWithArray_copyItems_1, set?._id ?? ffi.nullptr, flag); + return NSOrderedSet._(_ret, _lib, retain: false, release: true); + } + + NSOrderedSet initWithArray_range_copyItems_( + NSArray? set, _NSRange range, bool flag) { + final _ret = _lib._objc_msgSend_461( + _id, + _lib._sel_initWithArray_range_copyItems_1, + set?._id ?? ffi.nullptr, + range, + flag); + return NSOrderedSet._(_ret, _lib, retain: false, release: true); + } + + NSOrderedSet initWithSet_(NSSet? set) { + final _ret = _lib._objc_msgSend_382( + _id, _lib._sel_initWithSet_1, set?._id ?? ffi.nullptr); + return NSOrderedSet._(_ret, _lib, retain: true, release: true); + } + + NSOrderedSet initWithSet_copyItems_(NSSet? set, bool flag) { + final _ret = _lib._objc_msgSend_383( + _id, _lib._sel_initWithSet_copyItems_1, set?._id ?? ffi.nullptr, flag); + return NSOrderedSet._(_ret, _lib, retain: false, release: true); + } + + NSObject differenceFromOrderedSet_withOptions_usingEquivalenceTest_( + NSOrderedSet? other, + int options, + ObjCBlock_bool_ObjCObject_ObjCObject block) { + final _ret = _lib._objc_msgSend_463( + _id, + _lib._sel_differenceFromOrderedSet_withOptions_usingEquivalenceTest_1, + other?._id ?? ffi.nullptr, + options, + block._id); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject differenceFromOrderedSet_withOptions_( + NSOrderedSet? other, int options) { + final _ret = _lib._objc_msgSend_464( + _id, + _lib._sel_differenceFromOrderedSet_withOptions_1, + other?._id ?? ffi.nullptr, + options); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject differenceFromOrderedSet_(NSOrderedSet? other) { + final _ret = _lib._objc_msgSend_459( + _id, _lib._sel_differenceFromOrderedSet_1, other?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSOrderedSet orderedSetByApplyingDifference_(NSObject? difference) { + final _ret = _lib._objc_msgSend_465( + _id, + _lib._sel_orderedSetByApplyingDifference_1, + difference?._id ?? ffi.nullptr); + return NSOrderedSet._(_ret, _lib, retain: true, release: true); + } + + @override + NSObject valueForKey_(NSString? key) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_valueForKey_1, key?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + @override + void setValue_forKey_(NSObject value, NSString? key) { + _lib._objc_msgSend_126( + _id, _lib._sel_setValue_forKey_1, value._id, key?._id ?? ffi.nullptr); + } + + @override + void addObserver_forKeyPath_options_context_(NSObject? observer, + NSString? keyPath, int options, ffi.Pointer context) { + _lib._objc_msgSend_130( + _id, + _lib._sel_addObserver_forKeyPath_options_context_1, + observer?._id ?? ffi.nullptr, + keyPath?._id ?? ffi.nullptr, + options, + context); + } + + @override + void removeObserver_forKeyPath_context_( + NSObject? observer, NSString? keyPath, ffi.Pointer context) { + _lib._objc_msgSend_131(_id, _lib._sel_removeObserver_forKeyPath_context_1, + observer?._id ?? ffi.nullptr, keyPath?._id ?? ffi.nullptr, context); + } + + @override + void removeObserver_forKeyPath_(NSObject? observer, NSString? keyPath) { + _lib._objc_msgSend_132(_id, _lib._sel_removeObserver_forKeyPath_1, + observer?._id ?? ffi.nullptr, keyPath?._id ?? ffi.nullptr); + } + + NSArray sortedArrayUsingDescriptors_(NSArray? sortDescriptors) { + final _ret = _lib._objc_msgSend_63( + _id, + _lib._sel_sortedArrayUsingDescriptors_1, + sortDescriptors?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSOrderedSet filteredOrderedSetUsingPredicate_(NSPredicate? p) { + final _ret = _lib._objc_msgSend_466(_id, + _lib._sel_filteredOrderedSetUsingPredicate_1, p?._id ?? ffi.nullptr); + return NSOrderedSet._(_ret, _lib, retain: true, release: true); + } + + static NSOrderedSet new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSOrderedSet1, _lib._sel_new1); + return NSOrderedSet._(_ret, _lib, retain: false, release: true); + } + + static NSOrderedSet allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSOrderedSet1, _lib._sel_allocWithZone_1, zone); + return NSOrderedSet._(_ret, _lib, retain: false, release: true); + } + + static NSOrderedSet alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSOrderedSet1, _lib._sel_alloc1); + return NSOrderedSet._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSOrderedSet1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSOrderedSet1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSOrderedSet1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSOrderedSet1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSOrderedSet1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSOrderedSet1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSOrderedSet1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSOrderedSet1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSOrderedSet1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSMutableSet extends NSSet { + NSMutableSet._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSMutableSet] that points to the same underlying object as [other]. + static NSMutableSet castFrom(T other) { + return NSMutableSet._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSMutableSet] that wraps the given raw object pointer. + static NSMutableSet castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSMutableSet._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSMutableSet]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSMutableSet1); + } + + void addObject_(NSObject object) { + _lib._objc_msgSend_15(_id, _lib._sel_addObject_1, object._id); + } + + void removeObject_(NSObject object) { + _lib._objc_msgSend_15(_id, _lib._sel_removeObject_1, object._id); + } + + @override + NSMutableSet initWithCoder_(NSCoder? coder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr); + return NSMutableSet._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableSet init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSMutableSet._(_ret, _lib, retain: true, release: true); + } + + NSMutableSet initWithCapacity_(int numItems) { + final _ret = + _lib._objc_msgSend_60(_id, _lib._sel_initWithCapacity_1, numItems); + return NSMutableSet._(_ret, _lib, retain: true, release: true); + } + + void addObjectsFromArray_(NSArray? array) { + _lib._objc_msgSend_441( + _id, _lib._sel_addObjectsFromArray_1, array?._id ?? ffi.nullptr); + } + + void intersectSet_(NSSet? otherSet) { + _lib._objc_msgSend_471( + _id, _lib._sel_intersectSet_1, otherSet?._id ?? ffi.nullptr); + } + + void minusSet_(NSSet? otherSet) { + _lib._objc_msgSend_471( + _id, _lib._sel_minusSet_1, otherSet?._id ?? ffi.nullptr); + } + + void removeAllObjects() { + _lib._objc_msgSend_1(_id, _lib._sel_removeAllObjects1); + } + + void unionSet_(NSSet? otherSet) { + _lib._objc_msgSend_471( + _id, _lib._sel_unionSet_1, otherSet?._id ?? ffi.nullptr); + } + + void setSet_(NSSet? otherSet) { + _lib._objc_msgSend_471( + _id, _lib._sel_setSet_1, otherSet?._id ?? ffi.nullptr); + } + + static NSMutableSet setWithCapacity_(SentryCocoa _lib, int numItems) { + final _ret = _lib._objc_msgSend_60( + _lib._class_NSMutableSet1, _lib._sel_setWithCapacity_1, numItems); + return NSMutableSet._(_ret, _lib, retain: true, release: true); + } + + void filterUsingPredicate_(NSPredicate? predicate) { + _lib._objc_msgSend_456( + _id, _lib._sel_filterUsingPredicate_1, predicate?._id ?? ffi.nullptr); + } + + @override + NSMutableSet initWithObjects_count_( + ffi.Pointer> objects, int cnt) { + final _ret = _lib._objc_msgSend_61( + _id, _lib._sel_initWithObjects_count_1, objects, cnt); + return NSMutableSet._(_ret, _lib, retain: true, release: true); + } + + static NSMutableSet set1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSMutableSet1, _lib._sel_set1); + return NSMutableSet._(_ret, _lib, retain: true, release: true); + } + + static NSMutableSet setWithObject_(SentryCocoa _lib, NSObject object) { + final _ret = _lib._objc_msgSend_16( + _lib._class_NSMutableSet1, _lib._sel_setWithObject_1, object._id); + return NSMutableSet._(_ret, _lib, retain: true, release: true); + } + + static NSMutableSet setWithObjects_count_( + SentryCocoa _lib, ffi.Pointer> objects, int cnt) { + final _ret = _lib._objc_msgSend_61(_lib._class_NSMutableSet1, + _lib._sel_setWithObjects_count_1, objects, cnt); + return NSMutableSet._(_ret, _lib, retain: true, release: true); + } + + static NSMutableSet setWithObjects_(SentryCocoa _lib, NSObject firstObj) { + final _ret = _lib._objc_msgSend_16( + _lib._class_NSMutableSet1, _lib._sel_setWithObjects_1, firstObj._id); + return NSMutableSet._(_ret, _lib, retain: true, release: true); + } + + static NSMutableSet setWithSet_(SentryCocoa _lib, NSSet? set) { + final _ret = _lib._objc_msgSend_382(_lib._class_NSMutableSet1, + _lib._sel_setWithSet_1, set?._id ?? ffi.nullptr); + return NSMutableSet._(_ret, _lib, retain: true, release: true); + } + + static NSMutableSet setWithArray_(SentryCocoa _lib, NSArray? array) { + final _ret = _lib._objc_msgSend_67(_lib._class_NSMutableSet1, + _lib._sel_setWithArray_1, array?._id ?? ffi.nullptr); + return NSMutableSet._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableSet initWithObjects_(NSObject firstObj) { + final _ret = + _lib._objc_msgSend_16(_id, _lib._sel_initWithObjects_1, firstObj._id); + return NSMutableSet._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableSet initWithSet_(NSSet? set) { + final _ret = _lib._objc_msgSend_382( + _id, _lib._sel_initWithSet_1, set?._id ?? ffi.nullptr); + return NSMutableSet._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableSet initWithSet_copyItems_(NSSet? set, bool flag) { + final _ret = _lib._objc_msgSend_383( + _id, _lib._sel_initWithSet_copyItems_1, set?._id ?? ffi.nullptr, flag); + return NSMutableSet._(_ret, _lib, retain: false, release: true); + } + + @override + NSMutableSet initWithArray_(NSArray? array) { + final _ret = _lib._objc_msgSend_67( + _id, _lib._sel_initWithArray_1, array?._id ?? ffi.nullptr); + return NSMutableSet._(_ret, _lib, retain: true, release: true); + } + + static NSMutableSet new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSMutableSet1, _lib._sel_new1); + return NSMutableSet._(_ret, _lib, retain: false, release: true); + } + + static NSMutableSet allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSMutableSet1, _lib._sel_allocWithZone_1, zone); + return NSMutableSet._(_ret, _lib, retain: false, release: true); + } + + static NSMutableSet alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSMutableSet1, _lib._sel_alloc1); + return NSMutableSet._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSMutableSet1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSMutableSet1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSMutableSet1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSMutableSet1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSMutableSet1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSMutableSet1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSMutableSet1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSMutableSet1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSMutableSet1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSKeyValueChange { + static const int NSKeyValueChangeSetting = 1; + static const int NSKeyValueChangeInsertion = 2; + static const int NSKeyValueChangeRemoval = 3; + static const int NSKeyValueChangeReplacement = 4; +} + +abstract class NSKeyValueSetMutationKind { + static const int NSKeyValueUnionSetMutation = 1; + static const int NSKeyValueMinusSetMutation = 2; + static const int NSKeyValueIntersectSetMutation = 3; + static const int NSKeyValueSetSetMutation = 4; +} + +class NSKeyedArchiver extends NSCoder { + NSKeyedArchiver._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSKeyedArchiver] that points to the same underlying object as [other]. + static NSKeyedArchiver castFrom(T other) { + return NSKeyedArchiver._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSKeyedArchiver] that wraps the given raw object pointer. + static NSKeyedArchiver castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSKeyedArchiver._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSKeyedArchiver]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSKeyedArchiver1); + } + + NSKeyedArchiver initRequiringSecureCoding_(bool requiresSecureCoding) { + final _ret = _lib._objc_msgSend_481( + _id, _lib._sel_initRequiringSecureCoding_1, requiresSecureCoding); + return NSKeyedArchiver._(_ret, _lib, retain: true, release: true); + } + + static NSData archivedDataWithRootObject_requiringSecureCoding_error_( + SentryCocoa _lib, + NSObject object, + bool requiresSecureCoding, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_482( + _lib._class_NSKeyedArchiver1, + _lib._sel_archivedDataWithRootObject_requiringSecureCoding_error_1, + object._id, + requiresSecureCoding, + error); + return NSData._(_ret, _lib, retain: true, release: true); + } + + @override + NSKeyedArchiver init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSKeyedArchiver._(_ret, _lib, retain: true, release: true); + } + + NSKeyedArchiver initForWritingWithMutableData_(NSMutableData? data) { + final _ret = _lib._objc_msgSend_487(_id, + _lib._sel_initForWritingWithMutableData_1, data?._id ?? ffi.nullptr); + return NSKeyedArchiver._(_ret, _lib, retain: true, release: true); + } + + static NSData archivedDataWithRootObject_( + SentryCocoa _lib, NSObject rootObject) { + final _ret = _lib._objc_msgSend_488(_lib._class_NSKeyedArchiver1, + _lib._sel_archivedDataWithRootObject_1, rootObject._id); + return NSData._(_ret, _lib, retain: true, release: true); + } + + static bool archiveRootObject_toFile_( + SentryCocoa _lib, NSObject rootObject, NSString? path) { + return _lib._objc_msgSend_240( + _lib._class_NSKeyedArchiver1, + _lib._sel_archiveRootObject_toFile_1, + rootObject._id, + path?._id ?? ffi.nullptr); + } + + NSObject? get delegate { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1); + return _ret.address == 0 + ? null + : NSObject._(_ret, _lib, retain: true, release: true); + } + + set delegate(NSObject? value) { + return _lib._objc_msgSend_387( + _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr); + } + + int get outputFormat { + return _lib._objc_msgSend_489(_id, _lib._sel_outputFormat1); + } + + set outputFormat(int value) { + return _lib._objc_msgSend_490(_id, _lib._sel_setOutputFormat_1, value); + } + + NSData? get encodedData { + final _ret = _lib._objc_msgSend_39(_id, _lib._sel_encodedData1); + return _ret.address == 0 + ? null + : NSData._(_ret, _lib, retain: true, release: true); + } + + void finishEncoding() { + _lib._objc_msgSend_1(_id, _lib._sel_finishEncoding1); + } + + static void setClassName_forClass_( + SentryCocoa _lib, NSString? codedName, NSObject cls) { + _lib._objc_msgSend_491( + _lib._class_NSKeyedArchiver1, + _lib._sel_setClassName_forClass_1, + codedName?._id ?? ffi.nullptr, + cls._id); + } + + static NSString classNameForClass_(SentryCocoa _lib, NSObject cls) { + final _ret = _lib._objc_msgSend_65( + _lib._class_NSKeyedArchiver1, _lib._sel_classNameForClass_1, cls._id); + return NSString._(_ret, _lib, retain: true, release: true); + } + + @override + void encodeObject_forKey_(NSObject object, NSString? key) { + _lib._objc_msgSend_126(_id, _lib._sel_encodeObject_forKey_1, object._id, + key?._id ?? ffi.nullptr); + } + + @override + void encodeConditionalObject_forKey_(NSObject object, NSString? key) { + _lib._objc_msgSend_126(_id, _lib._sel_encodeConditionalObject_forKey_1, + object._id, key?._id ?? ffi.nullptr); + } + + @override + void encodeBool_forKey_(bool value, NSString? key) { + _lib._objc_msgSend_272( + _id, _lib._sel_encodeBool_forKey_1, value, key?._id ?? ffi.nullptr); + } + + @override + void encodeInt_forKey_(int value, NSString? key) { + _lib._objc_msgSend_273( + _id, _lib._sel_encodeInt_forKey_1, value, key?._id ?? ffi.nullptr); + } + + @override + void encodeInt32_forKey_(int value, NSString? key) { + _lib._objc_msgSend_274( + _id, _lib._sel_encodeInt32_forKey_1, value, key?._id ?? ffi.nullptr); + } + + @override + void encodeInt64_forKey_(int value, NSString? key) { + _lib._objc_msgSend_275( + _id, _lib._sel_encodeInt64_forKey_1, value, key?._id ?? ffi.nullptr); + } + + @override + void encodeFloat_forKey_(double value, NSString? key) { + _lib._objc_msgSend_276( + _id, _lib._sel_encodeFloat_forKey_1, value, key?._id ?? ffi.nullptr); + } + + @override + void encodeDouble_forKey_(double value, NSString? key) { + _lib._objc_msgSend_277( + _id, _lib._sel_encodeDouble_forKey_1, value, key?._id ?? ffi.nullptr); + } + + @override + void encodeBytes_length_forKey_( + ffi.Pointer bytes, int length, NSString? key) { + _lib._objc_msgSend_278(_id, _lib._sel_encodeBytes_length_forKey_1, bytes, + length, key?._id ?? ffi.nullptr); + } + + @override + bool get requiresSecureCoding { + return _lib._objc_msgSend_12(_id, _lib._sel_requiresSecureCoding1); + } + + set requiresSecureCoding(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setRequiresSecureCoding_1, value); + } + + static NSKeyedArchiver new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSKeyedArchiver1, _lib._sel_new1); + return NSKeyedArchiver._(_ret, _lib, retain: false, release: true); + } + + static NSKeyedArchiver allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSKeyedArchiver1, _lib._sel_allocWithZone_1, zone); + return NSKeyedArchiver._(_ret, _lib, retain: false, release: true); + } + + static NSKeyedArchiver alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSKeyedArchiver1, _lib._sel_alloc1); + return NSKeyedArchiver._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSKeyedArchiver1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSKeyedArchiver1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSKeyedArchiver1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSKeyedArchiver1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSKeyedArchiver1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSKeyedArchiver1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSKeyedArchiver1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSKeyedArchiver1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSKeyedArchiver1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSMutableData extends NSData { + NSMutableData._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSMutableData] that points to the same underlying object as [other]. + static NSMutableData castFrom(T other) { + return NSMutableData._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSMutableData] that wraps the given raw object pointer. + static NSMutableData castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSMutableData._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSMutableData]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSMutableData1); + } + + ffi.Pointer get mutableBytes { + return _lib._objc_msgSend_19(_id, _lib._sel_mutableBytes1); + } + + @override + int get length { + return _lib._objc_msgSend_10(_id, _lib._sel_length1); + } + + set length(int value) { + return _lib._objc_msgSend_483(_id, _lib._sel_setLength_1, value); + } + + void appendBytes_length_(ffi.Pointer bytes, int length) { + _lib._objc_msgSend_21(_id, _lib._sel_appendBytes_length_1, bytes, length); + } + + void appendData_(NSData? other) { + _lib._objc_msgSend_263( + _id, _lib._sel_appendData_1, other?._id ?? ffi.nullptr); + } + + void increaseLengthBy_(int extraLength) { + _lib._objc_msgSend_439(_id, _lib._sel_increaseLengthBy_1, extraLength); + } + + void replaceBytesInRange_withBytes_( + _NSRange range, ffi.Pointer bytes) { + _lib._objc_msgSend_484( + _id, _lib._sel_replaceBytesInRange_withBytes_1, range, bytes); + } + + void resetBytesInRange_(_NSRange range) { + _lib._objc_msgSend_445(_id, _lib._sel_resetBytesInRange_1, range); + } + + void setData_(NSData? data) { + _lib._objc_msgSend_263(_id, _lib._sel_setData_1, data?._id ?? ffi.nullptr); + } + + void replaceBytesInRange_withBytes_length_(_NSRange range, + ffi.Pointer replacementBytes, int replacementLength) { + _lib._objc_msgSend_485( + _id, + _lib._sel_replaceBytesInRange_withBytes_length_1, + range, + replacementBytes, + replacementLength); + } + + static NSMutableData dataWithCapacity_(SentryCocoa _lib, int aNumItems) { + final _ret = _lib._objc_msgSend_60( + _lib._class_NSMutableData1, _lib._sel_dataWithCapacity_1, aNumItems); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + static NSMutableData dataWithLength_(SentryCocoa _lib, int length) { + final _ret = _lib._objc_msgSend_60( + _lib._class_NSMutableData1, _lib._sel_dataWithLength_1, length); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + NSMutableData initWithCapacity_(int capacity) { + final _ret = + _lib._objc_msgSend_60(_id, _lib._sel_initWithCapacity_1, capacity); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + NSMutableData initWithLength_(int length) { + final _ret = _lib._objc_msgSend_60(_id, _lib._sel_initWithLength_1, length); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + bool decompressUsingAlgorithm_error_( + int algorithm, ffi.Pointer> error) { + return _lib._objc_msgSend_486( + _id, _lib._sel_decompressUsingAlgorithm_error_1, algorithm, error); + } + + bool compressUsingAlgorithm_error_( + int algorithm, ffi.Pointer> error) { + return _lib._objc_msgSend_486( + _id, _lib._sel_compressUsingAlgorithm_error_1, algorithm, error); + } + + static NSMutableData data(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSMutableData1, _lib._sel_data1); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + static NSMutableData dataWithBytes_length_( + SentryCocoa _lib, ffi.Pointer bytes, int length) { + final _ret = _lib._objc_msgSend_252(_lib._class_NSMutableData1, + _lib._sel_dataWithBytes_length_1, bytes, length); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + static NSMutableData dataWithBytesNoCopy_length_( + SentryCocoa _lib, ffi.Pointer bytes, int length) { + final _ret = _lib._objc_msgSend_252(_lib._class_NSMutableData1, + _lib._sel_dataWithBytesNoCopy_length_1, bytes, length); + return NSMutableData._(_ret, _lib, retain: false, release: true); + } + + static NSMutableData dataWithBytesNoCopy_length_freeWhenDone_( + SentryCocoa _lib, ffi.Pointer bytes, int length, bool b) { + final _ret = _lib._objc_msgSend_253(_lib._class_NSMutableData1, + _lib._sel_dataWithBytesNoCopy_length_freeWhenDone_1, bytes, length, b); + return NSMutableData._(_ret, _lib, retain: false, release: true); + } + + static NSMutableData dataWithContentsOfFile_options_error_( + SentryCocoa _lib, + NSString? path, + int readOptionsMask, + ffi.Pointer> errorPtr) { + final _ret = _lib._objc_msgSend_254( + _lib._class_NSMutableData1, + _lib._sel_dataWithContentsOfFile_options_error_1, + path?._id ?? ffi.nullptr, + readOptionsMask, + errorPtr); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + static NSMutableData dataWithContentsOfURL_options_error_( + SentryCocoa _lib, + NSURL? url, + int readOptionsMask, + ffi.Pointer> errorPtr) { + final _ret = _lib._objc_msgSend_255( + _lib._class_NSMutableData1, + _lib._sel_dataWithContentsOfURL_options_error_1, + url?._id ?? ffi.nullptr, + readOptionsMask, + errorPtr); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + static NSMutableData dataWithContentsOfFile_( + SentryCocoa _lib, NSString? path) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSMutableData1, + _lib._sel_dataWithContentsOfFile_1, path?._id ?? ffi.nullptr); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + static NSMutableData dataWithContentsOfURL_(SentryCocoa _lib, NSURL? url) { + final _ret = _lib._objc_msgSend_241(_lib._class_NSMutableData1, + _lib._sel_dataWithContentsOfURL_1, url?._id ?? ffi.nullptr); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableData initWithBytes_length_(ffi.Pointer bytes, int length) { + final _ret = _lib._objc_msgSend_252( + _id, _lib._sel_initWithBytes_length_1, bytes, length); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableData initWithBytesNoCopy_length_( + ffi.Pointer bytes, int length) { + final _ret = _lib._objc_msgSend_252( + _id, _lib._sel_initWithBytesNoCopy_length_1, bytes, length); + return NSMutableData._(_ret, _lib, retain: false, release: true); + } + + @override + NSMutableData initWithBytesNoCopy_length_freeWhenDone_( + ffi.Pointer bytes, int length, bool b) { + final _ret = _lib._objc_msgSend_253(_id, + _lib._sel_initWithBytesNoCopy_length_freeWhenDone_1, bytes, length, b); + return NSMutableData._(_ret, _lib, retain: false, release: true); + } + + @override + NSMutableData initWithBytesNoCopy_length_deallocator_( + ffi.Pointer bytes, + int length, + ObjCBlock_ffiVoid_ffiVoid_ffiUnsignedLong deallocator) { + final _ret = _lib._objc_msgSend_256( + _id, + _lib._sel_initWithBytesNoCopy_length_deallocator_1, + bytes, + length, + deallocator._id); + return NSMutableData._(_ret, _lib, retain: false, release: true); + } + + @override + NSMutableData initWithContentsOfFile_options_error_(NSString? path, + int readOptionsMask, ffi.Pointer> errorPtr) { + final _ret = _lib._objc_msgSend_254( + _id, + _lib._sel_initWithContentsOfFile_options_error_1, + path?._id ?? ffi.nullptr, + readOptionsMask, + errorPtr); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableData initWithContentsOfURL_options_error_(NSURL? url, + int readOptionsMask, ffi.Pointer> errorPtr) { + final _ret = _lib._objc_msgSend_255( + _id, + _lib._sel_initWithContentsOfURL_options_error_1, + url?._id ?? ffi.nullptr, + readOptionsMask, + errorPtr); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableData initWithContentsOfFile_(NSString? path) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithContentsOfFile_1, path?._id ?? ffi.nullptr); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableData initWithContentsOfURL_(NSURL? url) { + final _ret = _lib._objc_msgSend_241( + _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableData initWithData_(NSData? data) { + final _ret = _lib._objc_msgSend_257( + _id, _lib._sel_initWithData_1, data?._id ?? ffi.nullptr); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + static NSMutableData dataWithData_(SentryCocoa _lib, NSData? data) { + final _ret = _lib._objc_msgSend_257(_lib._class_NSMutableData1, + _lib._sel_dataWithData_1, data?._id ?? ffi.nullptr); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableData initWithBase64EncodedString_options_( + NSString? base64String, int options) { + final _ret = _lib._objc_msgSend_258( + _id, + _lib._sel_initWithBase64EncodedString_options_1, + base64String?._id ?? ffi.nullptr, + options); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableData initWithBase64EncodedData_options_( + NSData? base64Data, int options) { + final _ret = _lib._objc_msgSend_260( + _id, + _lib._sel_initWithBase64EncodedData_options_1, + base64Data?._id ?? ffi.nullptr, + options); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableData decompressedDataUsingAlgorithm_error_( + int algorithm, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_262(_id, + _lib._sel_decompressedDataUsingAlgorithm_error_1, algorithm, error); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableData compressedDataUsingAlgorithm_error_( + int algorithm, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_262( + _id, _lib._sel_compressedDataUsingAlgorithm_error_1, algorithm, error); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + static NSObject dataWithContentsOfMappedFile_( + SentryCocoa _lib, NSString? path) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSMutableData1, + _lib._sel_dataWithContentsOfMappedFile_1, path?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableData init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSMutableData._(_ret, _lib, retain: true, release: true); + } + + static NSMutableData new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSMutableData1, _lib._sel_new1); + return NSMutableData._(_ret, _lib, retain: false, release: true); + } + + static NSMutableData allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSMutableData1, _lib._sel_allocWithZone_1, zone); + return NSMutableData._(_ret, _lib, retain: false, release: true); + } + + static NSMutableData alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSMutableData1, _lib._sel_alloc1); + return NSMutableData._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSMutableData1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSMutableData1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSMutableData1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSMutableData1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSMutableData1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSMutableData1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSMutableData1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSMutableData1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSMutableData1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSPropertyListFormat { + static const int NSPropertyListOpenStepFormat = 1; + static const int NSPropertyListXMLFormat_v1_0 = 100; + static const int NSPropertyListBinaryFormat_v1_0 = 200; +} + +class NSThread extends NSObject { + NSThread._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSThread] that points to the same underlying object as [other]. + static NSThread castFrom(T other) { + return NSThread._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSThread] that wraps the given raw object pointer. + static NSThread castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSThread._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSThread]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSThread1); + } + + static NSThread? getCurrentThread(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_496(_lib._class_NSThread1, _lib._sel_currentThread1); + return _ret.address == 0 + ? null + : NSThread._(_ret, _lib, retain: true, release: true); + } + + static void detachNewThreadWithBlock_( + SentryCocoa _lib, ObjCBlock_ffiVoid block) { + _lib._objc_msgSend_497( + _lib._class_NSThread1, _lib._sel_detachNewThreadWithBlock_1, block._id); + } + + static void detachNewThreadSelector_toTarget_withObject_(SentryCocoa _lib, + ffi.Pointer selector, NSObject target, NSObject argument) { + _lib._objc_msgSend_498( + _lib._class_NSThread1, + _lib._sel_detachNewThreadSelector_toTarget_withObject_1, + selector, + target._id, + argument._id); + } + + static bool isMultiThreaded(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSThread1, _lib._sel_isMultiThreaded1); + } + + NSMutableDictionary? get threadDictionary { + final _ret = _lib._objc_msgSend_503(_id, _lib._sel_threadDictionary1); + return _ret.address == 0 + ? null + : NSMutableDictionary._(_ret, _lib, retain: true, release: true); + } + + static void sleepUntilDate_(SentryCocoa _lib, NSDate? date) { + _lib._objc_msgSend_504(_lib._class_NSThread1, _lib._sel_sleepUntilDate_1, + date?._id ?? ffi.nullptr); + } + + static void sleepForTimeInterval_(SentryCocoa _lib, double ti) { + _lib._objc_msgSend_505( + _lib._class_NSThread1, _lib._sel_sleepForTimeInterval_1, ti); + } + + static void exit(SentryCocoa _lib) { + _lib._objc_msgSend_1(_lib._class_NSThread1, _lib._sel_exit1); + } + + double get threadPriority { + return _lib._objc_msgSend_155(_id, _lib._sel_threadPriority1); + } + + set threadPriority(double value) { + return _lib._objc_msgSend_506(_id, _lib._sel_setThreadPriority_1, value); + } + + int get qualityOfService { + return _lib._objc_msgSend_507(_id, _lib._sel_qualityOfService1); + } + + set qualityOfService(int value) { + return _lib._objc_msgSend_508(_id, _lib._sel_setQualityOfService_1, value); + } + + static NSArray? getCallStackReturnAddresses(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSThread1, _lib._sel_callStackReturnAddresses1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSArray? getCallStackSymbols(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSThread1, _lib._sel_callStackSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSString? get name { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set name(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setName_1, value?._id ?? ffi.nullptr); + } + + int get stackSize { + return _lib._objc_msgSend_10(_id, _lib._sel_stackSize1); + } + + set stackSize(int value) { + return _lib._objc_msgSend_483(_id, _lib._sel_setStackSize_1, value); + } + + bool get isMainThread { + return _lib._objc_msgSend_12(_id, _lib._sel_isMainThread1); + } + + static NSThread? getMainThread(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_496(_lib._class_NSThread1, _lib._sel_mainThread1); + return _ret.address == 0 + ? null + : NSThread._(_ret, _lib, retain: true, release: true); + } + + @override + NSThread init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSThread._(_ret, _lib, retain: true, release: true); + } + + NSThread initWithTarget_selector_object_( + NSObject target, ffi.Pointer selector, NSObject argument) { + final _ret = _lib._objc_msgSend_510( + _id, + _lib._sel_initWithTarget_selector_object_1, + target._id, + selector, + argument._id); + return NSThread._(_ret, _lib, retain: true, release: true); + } + + NSThread initWithBlock_(ObjCBlock_ffiVoid block) { + final _ret = + _lib._objc_msgSend_511(_id, _lib._sel_initWithBlock_1, block._id); + return NSThread._(_ret, _lib, retain: true, release: true); + } + + bool get executing { + return _lib._objc_msgSend_12(_id, _lib._sel_isExecuting1); + } + + bool get finished { + return _lib._objc_msgSend_12(_id, _lib._sel_isFinished1); + } + + bool get cancelled { + return _lib._objc_msgSend_12(_id, _lib._sel_isCancelled1); + } + + void cancel() { + _lib._objc_msgSend_1(_id, _lib._sel_cancel1); + } + + void start() { + _lib._objc_msgSend_1(_id, _lib._sel_start1); + } + + void main() { + _lib._objc_msgSend_1(_id, _lib._sel_main1); + } + + static NSThread new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSThread1, _lib._sel_new1); + return NSThread._(_ret, _lib, retain: false, release: true); + } + + static NSThread allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSThread1, _lib._sel_allocWithZone_1, zone); + return NSThread._(_ret, _lib, retain: false, release: true); + } + + static NSThread alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSThread1, _lib._sel_alloc1); + return NSThread._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSThread1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSThread1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSThread1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSThread1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSThread1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSThread1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSThread1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSThread1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSThread1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +void _ObjCBlock_ffiVoid_fnPtrTrampoline(ffi.Pointer<_ObjCBlock> block) { + return block.ref.target + .cast>() + .asFunction()(); +} + +final _ObjCBlock_ffiVoid_closureRegistry = {}; +int _ObjCBlock_ffiVoid_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_registerClosure(Function fn) { + final id = ++_ObjCBlock_ffiVoid_closureRegistryIndex; + _ObjCBlock_ffiVoid_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_closureTrampoline(ffi.Pointer<_ObjCBlock> block) { + return (_ObjCBlock_ffiVoid_closureRegistry[block.ref.target.address] as void + Function())(); +} + +class ObjCBlock_ffiVoid extends _ObjCBlockBase { + ObjCBlock_ffiVoid._(ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid.fromFunctionPointer( + SentryCocoa lib, ffi.Pointer> ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block)>( + _ObjCBlock_ffiVoid_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid.fromFunction(SentryCocoa lib, void Function() fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block)>( + _ObjCBlock_ffiVoid_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call() { + return _id.ref.invoke + .cast< + ffi + .NativeFunction block)>>() + .asFunction block)>()(_id); + } +} + +class NSMutableDictionary extends NSDictionary { + NSMutableDictionary._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSMutableDictionary] that points to the same underlying object as [other]. + static NSMutableDictionary castFrom(T other) { + return NSMutableDictionary._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSMutableDictionary] that wraps the given raw object pointer. + static NSMutableDictionary castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSMutableDictionary._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSMutableDictionary]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSMutableDictionary1); + } + + void removeObjectForKey_(NSObject aKey) { + _lib._objc_msgSend_15(_id, _lib._sel_removeObjectForKey_1, aKey._id); + } + + void setObject_forKey_(NSObject anObject, NSObject? aKey) { + _lib._objc_msgSend_499(_id, _lib._sel_setObject_forKey_1, anObject._id, + aKey?._id ?? ffi.nullptr); + } + + @override + NSMutableDictionary init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSMutableDictionary._(_ret, _lib, retain: true, release: true); + } + + NSMutableDictionary initWithCapacity_(int numItems) { + final _ret = + _lib._objc_msgSend_60(_id, _lib._sel_initWithCapacity_1, numItems); + return NSMutableDictionary._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableDictionary initWithCoder_(NSCoder? coder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr); + return NSMutableDictionary._(_ret, _lib, retain: true, release: true); + } + + void addEntriesFromDictionary_(NSDictionary? otherDictionary) { + _lib._objc_msgSend_476(_id, _lib._sel_addEntriesFromDictionary_1, + otherDictionary?._id ?? ffi.nullptr); + } + + void removeAllObjects() { + _lib._objc_msgSend_1(_id, _lib._sel_removeAllObjects1); + } + + void removeObjectsForKeys_(NSArray? keyArray) { + _lib._objc_msgSend_441( + _id, _lib._sel_removeObjectsForKeys_1, keyArray?._id ?? ffi.nullptr); + } + + void setDictionary_(NSDictionary? otherDictionary) { + _lib._objc_msgSend_476( + _id, _lib._sel_setDictionary_1, otherDictionary?._id ?? ffi.nullptr); + } + + void setObject_forKeyedSubscript_(NSObject obj, NSObject? key) { + _lib._objc_msgSend_499(_id, _lib._sel_setObject_forKeyedSubscript_1, + obj._id, key?._id ?? ffi.nullptr); + } + + static NSMutableDictionary dictionaryWithCapacity_( + SentryCocoa _lib, int numItems) { + final _ret = _lib._objc_msgSend_60(_lib._class_NSMutableDictionary1, + _lib._sel_dictionaryWithCapacity_1, numItems); + return NSMutableDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSMutableDictionary dictionaryWithContentsOfFile_( + SentryCocoa _lib, NSString? path) { + final _ret = _lib._objc_msgSend_500(_lib._class_NSMutableDictionary1, + _lib._sel_dictionaryWithContentsOfFile_1, path?._id ?? ffi.nullptr); + return NSMutableDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSMutableDictionary dictionaryWithContentsOfURL_( + SentryCocoa _lib, NSURL? url) { + final _ret = _lib._objc_msgSend_501(_lib._class_NSMutableDictionary1, + _lib._sel_dictionaryWithContentsOfURL_1, url?._id ?? ffi.nullptr); + return NSMutableDictionary._(_ret, _lib, retain: true, release: true); + } + + NSMutableDictionary initWithContentsOfFile_(NSString? path) { + final _ret = _lib._objc_msgSend_500( + _id, _lib._sel_initWithContentsOfFile_1, path?._id ?? ffi.nullptr); + return NSMutableDictionary._(_ret, _lib, retain: true, release: true); + } + + NSMutableDictionary initWithContentsOfURL_(NSURL? url) { + final _ret = _lib._objc_msgSend_501( + _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr); + return NSMutableDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSMutableDictionary dictionaryWithSharedKeySet_( + SentryCocoa _lib, NSObject keyset) { + final _ret = _lib._objc_msgSend_502(_lib._class_NSMutableDictionary1, + _lib._sel_dictionaryWithSharedKeySet_1, keyset._id); + return NSMutableDictionary._(_ret, _lib, retain: true, release: true); + } + + void setValue_forKey_(NSObject value, NSString? key) { + _lib._objc_msgSend_126( + _id, _lib._sel_setValue_forKey_1, value._id, key?._id ?? ffi.nullptr); + } + + @override + NSMutableDictionary initWithObjects_forKeys_count_( + ffi.Pointer> objects, + ffi.Pointer> keys, + int cnt) { + final _ret = _lib._objc_msgSend_137( + _id, _lib._sel_initWithObjects_forKeys_count_1, objects, keys, cnt); + return NSMutableDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSMutableDictionary dictionary(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSMutableDictionary1, _lib._sel_dictionary1); + return NSMutableDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSMutableDictionary dictionaryWithObject_forKey_( + SentryCocoa _lib, NSObject object, NSObject? key) { + final _ret = _lib._objc_msgSend_148( + _lib._class_NSMutableDictionary1, + _lib._sel_dictionaryWithObject_forKey_1, + object._id, + key?._id ?? ffi.nullptr); + return NSMutableDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSMutableDictionary dictionaryWithObjects_forKeys_count_( + SentryCocoa _lib, + ffi.Pointer> objects, + ffi.Pointer> keys, + int cnt) { + final _ret = _lib._objc_msgSend_137(_lib._class_NSMutableDictionary1, + _lib._sel_dictionaryWithObjects_forKeys_count_1, objects, keys, cnt); + return NSMutableDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSMutableDictionary dictionaryWithObjectsAndKeys_( + SentryCocoa _lib, NSObject firstObject) { + final _ret = _lib._objc_msgSend_16(_lib._class_NSMutableDictionary1, + _lib._sel_dictionaryWithObjectsAndKeys_1, firstObject._id); + return NSMutableDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSMutableDictionary dictionaryWithDictionary_( + SentryCocoa _lib, NSDictionary? dict) { + final _ret = _lib._objc_msgSend_149(_lib._class_NSMutableDictionary1, + _lib._sel_dictionaryWithDictionary_1, dict?._id ?? ffi.nullptr); + return NSMutableDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSMutableDictionary dictionaryWithObjects_forKeys_( + SentryCocoa _lib, NSArray? objects, NSArray? keys) { + final _ret = _lib._objc_msgSend_150( + _lib._class_NSMutableDictionary1, + _lib._sel_dictionaryWithObjects_forKeys_1, + objects?._id ?? ffi.nullptr, + keys?._id ?? ffi.nullptr); + return NSMutableDictionary._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableDictionary initWithObjectsAndKeys_(NSObject firstObject) { + final _ret = _lib._objc_msgSend_16( + _id, _lib._sel_initWithObjectsAndKeys_1, firstObject._id); + return NSMutableDictionary._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableDictionary initWithDictionary_(NSDictionary? otherDictionary) { + final _ret = _lib._objc_msgSend_149(_id, _lib._sel_initWithDictionary_1, + otherDictionary?._id ?? ffi.nullptr); + return NSMutableDictionary._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableDictionary initWithDictionary_copyItems_( + NSDictionary? otherDictionary, bool flag) { + final _ret = _lib._objc_msgSend_151( + _id, + _lib._sel_initWithDictionary_copyItems_1, + otherDictionary?._id ?? ffi.nullptr, + flag); + return NSMutableDictionary._(_ret, _lib, retain: false, release: true); + } + + @override + NSMutableDictionary initWithObjects_forKeys_( + NSArray? objects, NSArray? keys) { + final _ret = _lib._objc_msgSend_150( + _id, + _lib._sel_initWithObjects_forKeys_1, + objects?._id ?? ffi.nullptr, + keys?._id ?? ffi.nullptr); + return NSMutableDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSDictionary dictionaryWithContentsOfURL_error_(SentryCocoa _lib, + NSURL? url, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_152( + _lib._class_NSMutableDictionary1, + _lib._sel_dictionaryWithContentsOfURL_error_1, + url?._id ?? ffi.nullptr, + error); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSObject sharedKeySetForKeys_(SentryCocoa _lib, NSArray? keys) { + final _ret = _lib._objc_msgSend_67(_lib._class_NSMutableDictionary1, + _lib._sel_sharedKeySetForKeys_1, keys?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSMutableDictionary new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSMutableDictionary1, _lib._sel_new1); + return NSMutableDictionary._(_ret, _lib, retain: false, release: true); + } + + static NSMutableDictionary allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSMutableDictionary1, _lib._sel_allocWithZone_1, zone); + return NSMutableDictionary._(_ret, _lib, retain: false, release: true); + } + + static NSMutableDictionary alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSMutableDictionary1, _lib._sel_alloc1); + return NSMutableDictionary._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSMutableDictionary1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSMutableDictionary1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSMutableDictionary1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSMutableDictionary1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSMutableDictionary1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSMutableDictionary1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSMutableDictionary1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSMutableDictionary1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSMutableDictionary1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSQualityOfService { + static const int NSQualityOfServiceUserInteractive = 33; + static const int NSQualityOfServiceUserInitiated = 25; + static const int NSQualityOfServiceUtility = 17; + static const int NSQualityOfServiceBackground = 9; + static const int NSQualityOfServiceDefault = -1; +} + +class NSArchiver extends NSCoder { + NSArchiver._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSArchiver] that points to the same underlying object as [other]. + static NSArchiver castFrom(T other) { + return NSArchiver._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSArchiver] that wraps the given raw object pointer. + static NSArchiver castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSArchiver._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSArchiver]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSArchiver1); + } + + NSArchiver initForWritingWithMutableData_(NSMutableData? mdata) { + final _ret = _lib._objc_msgSend_487(_id, + _lib._sel_initForWritingWithMutableData_1, mdata?._id ?? ffi.nullptr); + return NSArchiver._(_ret, _lib, retain: true, release: true); + } + + NSMutableData? get archiverData { + final _ret = _lib._objc_msgSend_514(_id, _lib._sel_archiverData1); + return _ret.address == 0 + ? null + : NSMutableData._(_ret, _lib, retain: true, release: true); + } + + @override + void encodeRootObject_(NSObject rootObject) { + _lib._objc_msgSend_15(_id, _lib._sel_encodeRootObject_1, rootObject._id); + } + + @override + void encodeConditionalObject_(NSObject object) { + _lib._objc_msgSend_15(_id, _lib._sel_encodeConditionalObject_1, object._id); + } + + static NSData archivedDataWithRootObject_( + SentryCocoa _lib, NSObject rootObject) { + final _ret = _lib._objc_msgSend_488(_lib._class_NSArchiver1, + _lib._sel_archivedDataWithRootObject_1, rootObject._id); + return NSData._(_ret, _lib, retain: true, release: true); + } + + static bool archiveRootObject_toFile_( + SentryCocoa _lib, NSObject rootObject, NSString? path) { + return _lib._objc_msgSend_240( + _lib._class_NSArchiver1, + _lib._sel_archiveRootObject_toFile_1, + rootObject._id, + path?._id ?? ffi.nullptr); + } + + void encodeClassName_intoClassName_( + NSString? trueName, NSString? inArchiveName) { + _lib._objc_msgSend_515(_id, _lib._sel_encodeClassName_intoClassName_1, + trueName?._id ?? ffi.nullptr, inArchiveName?._id ?? ffi.nullptr); + } + + NSString classNameEncodedForTrueClassName_(NSString? trueName) { + final _ret = _lib._objc_msgSend_64( + _id, + _lib._sel_classNameEncodedForTrueClassName_1, + trueName?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + void replaceObject_withObject_(NSObject object, NSObject newObject) { + _lib._objc_msgSend_499( + _id, _lib._sel_replaceObject_withObject_1, object._id, newObject._id); + } + + @override + NSArchiver init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSArchiver._(_ret, _lib, retain: true, release: true); + } + + static NSArchiver new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSArchiver1, _lib._sel_new1); + return NSArchiver._(_ret, _lib, retain: false, release: true); + } + + static NSArchiver allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSArchiver1, _lib._sel_allocWithZone_1, zone); + return NSArchiver._(_ret, _lib, retain: false, release: true); + } + + static NSArchiver alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSArchiver1, _lib._sel_alloc1); + return NSArchiver._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSArchiver1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSArchiver1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSArchiver1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSArchiver1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSArchiver1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSArchiver1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSArchiver1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSArchiver1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSArchiver1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSPortCoder extends NSCoder { + NSPortCoder._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSPortCoder] that points to the same underlying object as [other]. + static NSPortCoder castFrom(T other) { + return NSPortCoder._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSPortCoder] that wraps the given raw object pointer. + static NSPortCoder castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSPortCoder._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSPortCoder]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSPortCoder1); + } + + bool isBycopy() { + return _lib._objc_msgSend_12(_id, _lib._sel_isBycopy1); + } + + bool isByref() { + return _lib._objc_msgSend_12(_id, _lib._sel_isByref1); + } + + void encodePortObject_(NSPort? aport) { + _lib._objc_msgSend_552( + _id, _lib._sel_encodePortObject_1, aport?._id ?? ffi.nullptr); + } + + NSPort decodePortObject() { + final _ret = _lib._objc_msgSend_517(_id, _lib._sel_decodePortObject1); + return NSPort._(_ret, _lib, retain: true, release: true); + } + + NSConnection connection() { + final _ret = _lib._objc_msgSend_536(_id, _lib._sel_connection1); + return NSConnection._(_ret, _lib, retain: true, release: true); + } + + static NSObject portCoderWithReceivePort_sendPort_components_( + SentryCocoa _lib, NSPort? rcvPort, NSPort? sndPort, NSArray? comps) { + final _ret = _lib._objc_msgSend_553( + _lib._class_NSPortCoder1, + _lib._sel_portCoderWithReceivePort_sendPort_components_1, + rcvPort?._id ?? ffi.nullptr, + sndPort?._id ?? ffi.nullptr, + comps?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject initWithReceivePort_sendPort_components_( + NSPort? rcvPort, NSPort? sndPort, NSArray? comps) { + final _ret = _lib._objc_msgSend_553( + _id, + _lib._sel_initWithReceivePort_sendPort_components_1, + rcvPort?._id ?? ffi.nullptr, + sndPort?._id ?? ffi.nullptr, + comps?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void dispatch() { + _lib._objc_msgSend_1(_id, _lib._sel_dispatch1); + } + + @override + NSPortCoder init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSPortCoder._(_ret, _lib, retain: true, release: true); + } + + static NSPortCoder new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSPortCoder1, _lib._sel_new1); + return NSPortCoder._(_ret, _lib, retain: false, release: true); + } + + static NSPortCoder allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSPortCoder1, _lib._sel_allocWithZone_1, zone); + return NSPortCoder._(_ret, _lib, retain: false, release: true); + } + + static NSPortCoder alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSPortCoder1, _lib._sel_alloc1); + return NSPortCoder._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSPortCoder1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSPortCoder1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSPortCoder1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSPortCoder1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSPortCoder1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSPortCoder1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSPortCoder1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSPortCoder1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSPortCoder1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSPort extends NSObject { + NSPort._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSPort] that points to the same underlying object as [other]. + static NSPort castFrom(T other) { + return NSPort._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSPort] that wraps the given raw object pointer. + static NSPort castFromPointer(SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSPort._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSPort]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSPort1); + } + + static NSPort port(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_517(_lib._class_NSPort1, _lib._sel_port1); + return NSPort._(_ret, _lib, retain: true, release: true); + } + + void invalidate() { + _lib._objc_msgSend_1(_id, _lib._sel_invalidate1); + } + + bool get valid { + return _lib._objc_msgSend_12(_id, _lib._sel_isValid1); + } + + void setDelegate_(NSObject? anObject) { + _lib._objc_msgSend_15( + _id, _lib._sel_setDelegate_1, anObject?._id ?? ffi.nullptr); + } + + NSObject delegate() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void scheduleInRunLoop_forMode_(NSRunLoop? runLoop, NSString mode) { + _lib._objc_msgSend_533(_id, _lib._sel_scheduleInRunLoop_forMode_1, + runLoop?._id ?? ffi.nullptr, mode._id); + } + + void removeFromRunLoop_forMode_(NSRunLoop? runLoop, NSString mode) { + _lib._objc_msgSend_533(_id, _lib._sel_removeFromRunLoop_forMode_1, + runLoop?._id ?? ffi.nullptr, mode._id); + } + + int get reservedSpaceLength { + return _lib._objc_msgSend_10(_id, _lib._sel_reservedSpaceLength1); + } + + bool sendBeforeDate_components_from_reserved_( + NSDate? limitDate, + NSMutableArray? components, + NSPort? receivePort, + int headerSpaceReserved) { + return _lib._objc_msgSend_534( + _id, + _lib._sel_sendBeforeDate_components_from_reserved_1, + limitDate?._id ?? ffi.nullptr, + components?._id ?? ffi.nullptr, + receivePort?._id ?? ffi.nullptr, + headerSpaceReserved); + } + + bool sendBeforeDate_msgid_components_from_reserved_( + NSDate? limitDate, + int msgID, + NSMutableArray? components, + NSPort? receivePort, + int headerSpaceReserved) { + return _lib._objc_msgSend_535( + _id, + _lib._sel_sendBeforeDate_msgid_components_from_reserved_1, + limitDate?._id ?? ffi.nullptr, + msgID, + components?._id ?? ffi.nullptr, + receivePort?._id ?? ffi.nullptr, + headerSpaceReserved); + } + + void addConnection_toRunLoop_forMode_( + NSConnection? conn, NSRunLoop? runLoop, NSString mode) { + _lib._objc_msgSend_551(_id, _lib._sel_addConnection_toRunLoop_forMode_1, + conn?._id ?? ffi.nullptr, runLoop?._id ?? ffi.nullptr, mode._id); + } + + void removeConnection_fromRunLoop_forMode_( + NSConnection? conn, NSRunLoop? runLoop, NSString mode) { + _lib._objc_msgSend_551( + _id, + _lib._sel_removeConnection_fromRunLoop_forMode_1, + conn?._id ?? ffi.nullptr, + runLoop?._id ?? ffi.nullptr, + mode._id); + } + + @override + NSPort init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSPort._(_ret, _lib, retain: true, release: true); + } + + static NSPort new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSPort1, _lib._sel_new1); + return NSPort._(_ret, _lib, retain: false, release: true); + } + + static NSPort allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSPort1, _lib._sel_allocWithZone_1, zone); + return NSPort._(_ret, _lib, retain: false, release: true); + } + + static NSPort alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSPort1, _lib._sel_alloc1); + return NSPort._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSPort1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSPort1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSPort1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSPort1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSPort1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSPort1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSPort1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSPort1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSPort1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSRunLoop extends NSObject { + NSRunLoop._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSRunLoop] that points to the same underlying object as [other]. + static NSRunLoop castFrom(T other) { + return NSRunLoop._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSRunLoop] that wraps the given raw object pointer. + static NSRunLoop castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSRunLoop._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSRunLoop]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSRunLoop1); + } + + static NSRunLoop? getCurrentRunLoop(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_518( + _lib._class_NSRunLoop1, _lib._sel_currentRunLoop1); + return _ret.address == 0 + ? null + : NSRunLoop._(_ret, _lib, retain: true, release: true); + } + + static NSRunLoop? getMainRunLoop(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_518(_lib._class_NSRunLoop1, _lib._sel_mainRunLoop1); + return _ret.address == 0 + ? null + : NSRunLoop._(_ret, _lib, retain: true, release: true); + } + + NSString get currentMode { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_currentMode1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + ffi.Pointer<__CFRunLoop> getCFRunLoop() { + return _lib._objc_msgSend_519(_id, _lib._sel_getCFRunLoop1); + } + + void addTimer_forMode_(NSTimer? timer, NSString mode) { + _lib._objc_msgSend_526( + _id, _lib._sel_addTimer_forMode_1, timer?._id ?? ffi.nullptr, mode._id); + } + + void addPort_forMode_(NSPort? aPort, NSString mode) { + _lib._objc_msgSend_527( + _id, _lib._sel_addPort_forMode_1, aPort?._id ?? ffi.nullptr, mode._id); + } + + void removePort_forMode_(NSPort? aPort, NSString mode) { + _lib._objc_msgSend_527(_id, _lib._sel_removePort_forMode_1, + aPort?._id ?? ffi.nullptr, mode._id); + } + + NSDate limitDateForMode_(NSString mode) { + final _ret = + _lib._objc_msgSend_528(_id, _lib._sel_limitDateForMode_1, mode._id); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + void acceptInputForMode_beforeDate_(NSString mode, NSDate? limitDate) { + _lib._objc_msgSend_529(_id, _lib._sel_acceptInputForMode_beforeDate_1, + mode._id, limitDate?._id ?? ffi.nullptr); + } + + void run() { + _lib._objc_msgSend_1(_id, _lib._sel_run1); + } + + void runUntilDate_(NSDate? limitDate) { + _lib._objc_msgSend_504( + _id, _lib._sel_runUntilDate_1, limitDate?._id ?? ffi.nullptr); + } + + bool runMode_beforeDate_(NSString mode, NSDate? limitDate) { + return _lib._objc_msgSend_530(_id, _lib._sel_runMode_beforeDate_1, mode._id, + limitDate?._id ?? ffi.nullptr); + } + + void configureAsServer() { + _lib._objc_msgSend_1(_id, _lib._sel_configureAsServer1); + } + + void performInModes_block_(NSArray? modes, ObjCBlock_ffiVoid block) { + _lib._objc_msgSend_531(_id, _lib._sel_performInModes_block_1, + modes?._id ?? ffi.nullptr, block._id); + } + + void performBlock_(ObjCBlock_ffiVoid block) { + _lib._objc_msgSend_497(_id, _lib._sel_performBlock_1, block._id); + } + + void performSelector_target_argument_order_modes_( + ffi.Pointer aSelector, + NSObject target, + NSObject arg, + int order, + NSArray? modes) { + _lib._objc_msgSend_532( + _id, + _lib._sel_performSelector_target_argument_order_modes_1, + aSelector, + target._id, + arg._id, + order, + modes?._id ?? ffi.nullptr); + } + + void cancelPerformSelector_target_argument_( + ffi.Pointer aSelector, NSObject target, NSObject arg) { + _lib._objc_msgSend_498( + _id, + _lib._sel_cancelPerformSelector_target_argument_1, + aSelector, + target._id, + arg._id); + } + + void cancelPerformSelectorsWithTarget_(NSObject target) { + _lib._objc_msgSend_15( + _id, _lib._sel_cancelPerformSelectorsWithTarget_1, target._id); + } + + @override + NSRunLoop init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSRunLoop._(_ret, _lib, retain: true, release: true); + } + + static NSRunLoop new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSRunLoop1, _lib._sel_new1); + return NSRunLoop._(_ret, _lib, retain: false, release: true); + } + + static NSRunLoop allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSRunLoop1, _lib._sel_allocWithZone_1, zone); + return NSRunLoop._(_ret, _lib, retain: false, release: true); + } + + static NSRunLoop alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSRunLoop1, _lib._sel_alloc1); + return NSRunLoop._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSRunLoop1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSRunLoop1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSRunLoop1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSRunLoop1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSRunLoop1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSRunLoop1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSRunLoop1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSRunLoop1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSRunLoop1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class __CFRunLoop extends ffi.Opaque {} + +class NSTimer extends NSObject { + NSTimer._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSTimer] that points to the same underlying object as [other]. + static NSTimer castFrom(T other) { + return NSTimer._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSTimer] that wraps the given raw object pointer. + static NSTimer castFromPointer(SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSTimer._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSTimer]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSTimer1); + } + + static NSTimer timerWithTimeInterval_invocation_repeats_( + SentryCocoa _lib, double ti, NSInvocation? invocation, bool yesOrNo) { + final _ret = _lib._objc_msgSend_520( + _lib._class_NSTimer1, + _lib._sel_timerWithTimeInterval_invocation_repeats_1, + ti, + invocation?._id ?? ffi.nullptr, + yesOrNo); + return NSTimer._(_ret, _lib, retain: true, release: true); + } + + static NSTimer scheduledTimerWithTimeInterval_invocation_repeats_( + SentryCocoa _lib, double ti, NSInvocation? invocation, bool yesOrNo) { + final _ret = _lib._objc_msgSend_520( + _lib._class_NSTimer1, + _lib._sel_scheduledTimerWithTimeInterval_invocation_repeats_1, + ti, + invocation?._id ?? ffi.nullptr, + yesOrNo); + return NSTimer._(_ret, _lib, retain: true, release: true); + } + + static NSTimer timerWithTimeInterval_target_selector_userInfo_repeats_( + SentryCocoa _lib, + double ti, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject userInfo, + bool yesOrNo) { + final _ret = _lib._objc_msgSend_521( + _lib._class_NSTimer1, + _lib._sel_timerWithTimeInterval_target_selector_userInfo_repeats_1, + ti, + aTarget._id, + aSelector, + userInfo._id, + yesOrNo); + return NSTimer._(_ret, _lib, retain: true, release: true); + } + + static NSTimer + scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_( + SentryCocoa _lib, + double ti, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject userInfo, + bool yesOrNo) { + final _ret = _lib._objc_msgSend_521( + _lib._class_NSTimer1, + _lib._sel_scheduledTimerWithTimeInterval_target_selector_userInfo_repeats_1, + ti, + aTarget._id, + aSelector, + userInfo._id, + yesOrNo); + return NSTimer._(_ret, _lib, retain: true, release: true); + } + + static NSTimer timerWithTimeInterval_repeats_block_(SentryCocoa _lib, + double interval, bool repeats, ObjCBlock_ffiVoid_NSTimer block) { + final _ret = _lib._objc_msgSend_522( + _lib._class_NSTimer1, + _lib._sel_timerWithTimeInterval_repeats_block_1, + interval, + repeats, + block._id); + return NSTimer._(_ret, _lib, retain: true, release: true); + } + + static NSTimer scheduledTimerWithTimeInterval_repeats_block_(SentryCocoa _lib, + double interval, bool repeats, ObjCBlock_ffiVoid_NSTimer block) { + final _ret = _lib._objc_msgSend_522( + _lib._class_NSTimer1, + _lib._sel_scheduledTimerWithTimeInterval_repeats_block_1, + interval, + repeats, + block._id); + return NSTimer._(_ret, _lib, retain: true, release: true); + } + + NSTimer initWithFireDate_interval_repeats_block_(NSDate? date, + double interval, bool repeats, ObjCBlock_ffiVoid_NSTimer block) { + final _ret = _lib._objc_msgSend_523( + _id, + _lib._sel_initWithFireDate_interval_repeats_block_1, + date?._id ?? ffi.nullptr, + interval, + repeats, + block._id); + return NSTimer._(_ret, _lib, retain: true, release: true); + } + + NSTimer initWithFireDate_interval_target_selector_userInfo_repeats_( + NSDate? date, + double ti, + NSObject t, + ffi.Pointer s, + NSObject ui, + bool rep) { + final _ret = _lib._objc_msgSend_524( + _id, + _lib._sel_initWithFireDate_interval_target_selector_userInfo_repeats_1, + date?._id ?? ffi.nullptr, + ti, + t._id, + s, + ui._id, + rep); + return NSTimer._(_ret, _lib, retain: true, release: true); + } + + void fire() { + _lib._objc_msgSend_1(_id, _lib._sel_fire1); + } + + NSDate? get fireDate { + final _ret = _lib._objc_msgSend_162(_id, _lib._sel_fireDate1); + return _ret.address == 0 + ? null + : NSDate._(_ret, _lib, retain: true, release: true); + } + + set fireDate(NSDate? value) { + return _lib._objc_msgSend_525( + _id, _lib._sel_setFireDate_1, value?._id ?? ffi.nullptr); + } + + double get timeInterval { + return _lib._objc_msgSend_155(_id, _lib._sel_timeInterval1); + } + + double get tolerance { + return _lib._objc_msgSend_155(_id, _lib._sel_tolerance1); + } + + set tolerance(double value) { + return _lib._objc_msgSend_506(_id, _lib._sel_setTolerance_1, value); + } + + void invalidate() { + _lib._objc_msgSend_1(_id, _lib._sel_invalidate1); + } + + bool get valid { + return _lib._objc_msgSend_12(_id, _lib._sel_isValid1); + } + + NSObject get userInfo { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_userInfo1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + @override + NSTimer init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSTimer._(_ret, _lib, retain: true, release: true); + } + + static NSTimer new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSTimer1, _lib._sel_new1); + return NSTimer._(_ret, _lib, retain: false, release: true); + } + + static NSTimer allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSTimer1, _lib._sel_allocWithZone_1, zone); + return NSTimer._(_ret, _lib, retain: false, release: true); + } + + static NSTimer alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSTimer1, _lib._sel_alloc1); + return NSTimer._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSTimer1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSTimer1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSTimer1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSTimer1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSTimer1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSTimer1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSTimer1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSTimer1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSTimer1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +void _ObjCBlock_ffiVoid_NSTimer_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return block.ref.target + .cast< + ffi.NativeFunction arg0)>>() + .asFunction arg0)>()(arg0); +} + +final _ObjCBlock_ffiVoid_NSTimer_closureRegistry = {}; +int _ObjCBlock_ffiVoid_NSTimer_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_NSTimer_registerClosure(Function fn) { + final id = ++_ObjCBlock_ffiVoid_NSTimer_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSTimer_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSTimer_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return (_ObjCBlock_ffiVoid_NSTimer_closureRegistry[block.ref.target.address] + as void Function(ffi.Pointer))(arg0); +} + +class ObjCBlock_ffiVoid_NSTimer extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSTimer._(ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSTimer.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi + .NativeFunction arg0)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_NSTimer_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSTimer.fromFunction( + SentryCocoa lib, void Function(ffi.Pointer arg0) fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_NSTimer_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSTimer_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>>() + .asFunction< + void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>()(_id, arg0); + } +} + +class NSConnection extends NSObject { + NSConnection._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSConnection] that points to the same underlying object as [other]. + static NSConnection castFrom(T other) { + return NSConnection._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSConnection] that wraps the given raw object pointer. + static NSConnection castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSConnection._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSConnection]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSConnection1); + } + + NSDictionary? get statistics { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_statistics1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSArray allConnections(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSConnection1, _lib._sel_allConnections1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSConnection defaultConnection(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_536( + _lib._class_NSConnection1, _lib._sel_defaultConnection1); + return NSConnection._(_ret, _lib, retain: true, release: true); + } + + static NSConnection connectionWithRegisteredName_host_( + SentryCocoa _lib, NSString? name, NSString? hostName) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSConnection1, + _lib._sel_connectionWithRegisteredName_host_1, + name?._id ?? ffi.nullptr, + hostName?._id ?? ffi.nullptr); + return NSConnection._(_ret, _lib, retain: true, release: true); + } + + static NSConnection connectionWithRegisteredName_host_usingNameServer_( + SentryCocoa _lib, + NSString? name, + NSString? hostName, + NSPortNameServer? server) { + final _ret = _lib._objc_msgSend_541( + _lib._class_NSConnection1, + _lib._sel_connectionWithRegisteredName_host_usingNameServer_1, + name?._id ?? ffi.nullptr, + hostName?._id ?? ffi.nullptr, + server?._id ?? ffi.nullptr); + return NSConnection._(_ret, _lib, retain: true, release: true); + } + + static NSDistantObject rootProxyForConnectionWithRegisteredName_host_( + SentryCocoa _lib, NSString? name, NSString? hostName) { + final _ret = _lib._objc_msgSend_544( + _lib._class_NSConnection1, + _lib._sel_rootProxyForConnectionWithRegisteredName_host_1, + name?._id ?? ffi.nullptr, + hostName?._id ?? ffi.nullptr); + return NSDistantObject._(_ret, _lib, retain: true, release: true); + } + + static NSDistantObject + rootProxyForConnectionWithRegisteredName_host_usingNameServer_( + SentryCocoa _lib, + NSString? name, + NSString? hostName, + NSPortNameServer? server) { + final _ret = _lib._objc_msgSend_545( + _lib._class_NSConnection1, + _lib._sel_rootProxyForConnectionWithRegisteredName_host_usingNameServer_1, + name?._id ?? ffi.nullptr, + hostName?._id ?? ffi.nullptr, + server?._id ?? ffi.nullptr); + return NSDistantObject._(_ret, _lib, retain: true, release: true); + } + + static NSConnection serviceConnectionWithName_rootObject_usingNameServer_( + SentryCocoa _lib, + NSString? name, + NSObject root, + NSPortNameServer? server) { + final _ret = _lib._objc_msgSend_546( + _lib._class_NSConnection1, + _lib._sel_serviceConnectionWithName_rootObject_usingNameServer_1, + name?._id ?? ffi.nullptr, + root._id, + server?._id ?? ffi.nullptr); + return NSConnection._(_ret, _lib, retain: true, release: true); + } + + static NSConnection serviceConnectionWithName_rootObject_( + SentryCocoa _lib, NSString? name, NSObject root) { + final _ret = _lib._objc_msgSend_163( + _lib._class_NSConnection1, + _lib._sel_serviceConnectionWithName_rootObject_1, + name?._id ?? ffi.nullptr, + root._id); + return NSConnection._(_ret, _lib, retain: true, release: true); + } + + double get requestTimeout { + return _lib._objc_msgSend_155(_id, _lib._sel_requestTimeout1); + } + + set requestTimeout(double value) { + return _lib._objc_msgSend_506(_id, _lib._sel_setRequestTimeout_1, value); + } + + double get replyTimeout { + return _lib._objc_msgSend_155(_id, _lib._sel_replyTimeout1); + } + + set replyTimeout(double value) { + return _lib._objc_msgSend_506(_id, _lib._sel_setReplyTimeout_1, value); + } + + NSObject get rootObject { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_rootObject1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + set rootObject(NSObject value) { + return _lib._objc_msgSend_387(_id, _lib._sel_setRootObject_1, value._id); + } + + NSObject? get delegate { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1); + return _ret.address == 0 + ? null + : NSObject._(_ret, _lib, retain: true, release: true); + } + + set delegate(NSObject? value) { + return _lib._objc_msgSend_387( + _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr); + } + + bool get independentConversationQueueing { + return _lib._objc_msgSend_12( + _id, _lib._sel_independentConversationQueueing1); + } + + set independentConversationQueueing(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setIndependentConversationQueueing_1, value); + } + + bool get valid { + return _lib._objc_msgSend_12(_id, _lib._sel_isValid1); + } + + NSDistantObject? get rootProxy { + final _ret = _lib._objc_msgSend_547(_id, _lib._sel_rootProxy1); + return _ret.address == 0 + ? null + : NSDistantObject._(_ret, _lib, retain: true, release: true); + } + + void invalidate() { + _lib._objc_msgSend_1(_id, _lib._sel_invalidate1); + } + + void addRequestMode_(NSString? rmode) { + _lib._objc_msgSend_192( + _id, _lib._sel_addRequestMode_1, rmode?._id ?? ffi.nullptr); + } + + void removeRequestMode_(NSString? rmode) { + _lib._objc_msgSend_192( + _id, _lib._sel_removeRequestMode_1, rmode?._id ?? ffi.nullptr); + } + + NSArray? get requestModes { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_requestModes1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + bool registerName_(NSString? name) { + return _lib._objc_msgSend_59( + _id, _lib._sel_registerName_1, name?._id ?? ffi.nullptr); + } + + bool registerName_withNameServer_(NSString? name, NSPortNameServer? server) { + return _lib._objc_msgSend_548(_id, _lib._sel_registerName_withNameServer_1, + name?._id ?? ffi.nullptr, server?._id ?? ffi.nullptr); + } + + static NSConnection connectionWithReceivePort_sendPort_( + SentryCocoa _lib, NSPort? receivePort, NSPort? sendPort) { + final _ret = _lib._objc_msgSend_549( + _lib._class_NSConnection1, + _lib._sel_connectionWithReceivePort_sendPort_1, + receivePort?._id ?? ffi.nullptr, + sendPort?._id ?? ffi.nullptr); + return NSConnection._(_ret, _lib, retain: true, release: true); + } + + static NSObject currentConversation(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSConnection1, _lib._sel_currentConversation1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSConnection initWithReceivePort_sendPort_( + NSPort? receivePort, NSPort? sendPort) { + final _ret = _lib._objc_msgSend_549( + _id, + _lib._sel_initWithReceivePort_sendPort_1, + receivePort?._id ?? ffi.nullptr, + sendPort?._id ?? ffi.nullptr); + return NSConnection._(_ret, _lib, retain: true, release: true); + } + + NSPort? get sendPort { + final _ret = _lib._objc_msgSend_517(_id, _lib._sel_sendPort1); + return _ret.address == 0 + ? null + : NSPort._(_ret, _lib, retain: true, release: true); + } + + NSPort? get receivePort { + final _ret = _lib._objc_msgSend_517(_id, _lib._sel_receivePort1); + return _ret.address == 0 + ? null + : NSPort._(_ret, _lib, retain: true, release: true); + } + + void enableMultipleThreads() { + _lib._objc_msgSend_1(_id, _lib._sel_enableMultipleThreads1); + } + + bool get multipleThreadsEnabled { + return _lib._objc_msgSend_12(_id, _lib._sel_multipleThreadsEnabled1); + } + + void addRunLoop_(NSRunLoop? runloop) { + _lib._objc_msgSend_550( + _id, _lib._sel_addRunLoop_1, runloop?._id ?? ffi.nullptr); + } + + void removeRunLoop_(NSRunLoop? runloop) { + _lib._objc_msgSend_550( + _id, _lib._sel_removeRunLoop_1, runloop?._id ?? ffi.nullptr); + } + + void runInNewThread() { + _lib._objc_msgSend_1(_id, _lib._sel_runInNewThread1); + } + + NSArray? get remoteObjects { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_remoteObjects1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get localObjects { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_localObjects1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + void dispatchWithComponents_(NSArray? components) { + _lib._objc_msgSend_441(_id, _lib._sel_dispatchWithComponents_1, + components?._id ?? ffi.nullptr); + } + + @override + NSConnection init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSConnection._(_ret, _lib, retain: true, release: true); + } + + static NSConnection new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSConnection1, _lib._sel_new1); + return NSConnection._(_ret, _lib, retain: false, release: true); + } + + static NSConnection allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSConnection1, _lib._sel_allocWithZone_1, zone); + return NSConnection._(_ret, _lib, retain: false, release: true); + } + + static NSConnection alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSConnection1, _lib._sel_alloc1); + return NSConnection._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSConnection1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSConnection1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSConnection1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSConnection1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSConnection1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSConnection1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSConnection1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSConnection1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSConnection1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSPortNameServer extends NSObject { + NSPortNameServer._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSPortNameServer] that points to the same underlying object as [other]. + static NSPortNameServer castFrom(T other) { + return NSPortNameServer._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSPortNameServer] that wraps the given raw object pointer. + static NSPortNameServer castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSPortNameServer._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSPortNameServer]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSPortNameServer1); + } + + static NSPortNameServer systemDefaultPortNameServer(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_537( + _lib._class_NSPortNameServer1, _lib._sel_systemDefaultPortNameServer1); + return NSPortNameServer._(_ret, _lib, retain: true, release: true); + } + + NSPort portForName_(NSString? name) { + final _ret = _lib._objc_msgSend_538( + _id, _lib._sel_portForName_1, name?._id ?? ffi.nullptr); + return NSPort._(_ret, _lib, retain: true, release: true); + } + + NSPort portForName_host_(NSString? name, NSString? host) { + final _ret = _lib._objc_msgSend_539(_id, _lib._sel_portForName_host_1, + name?._id ?? ffi.nullptr, host?._id ?? ffi.nullptr); + return NSPort._(_ret, _lib, retain: true, release: true); + } + + bool registerPort_name_(NSPort? port, NSString? name) { + return _lib._objc_msgSend_540(_id, _lib._sel_registerPort_name_1, + port?._id ?? ffi.nullptr, name?._id ?? ffi.nullptr); + } + + bool removePortForName_(NSString? name) { + return _lib._objc_msgSend_59( + _id, _lib._sel_removePortForName_1, name?._id ?? ffi.nullptr); + } + + @override + NSPortNameServer init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSPortNameServer._(_ret, _lib, retain: true, release: true); + } + + static NSPortNameServer new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSPortNameServer1, _lib._sel_new1); + return NSPortNameServer._(_ret, _lib, retain: false, release: true); + } + + static NSPortNameServer allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSPortNameServer1, _lib._sel_allocWithZone_1, zone); + return NSPortNameServer._(_ret, _lib, retain: false, release: true); + } + + static NSPortNameServer alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSPortNameServer1, _lib._sel_alloc1); + return NSPortNameServer._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSPortNameServer1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSPortNameServer1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSPortNameServer1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSPortNameServer1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSPortNameServer1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSPortNameServer1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSPortNameServer1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSPortNameServer1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSPortNameServer1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSDistantObject extends NSProxy { + NSDistantObject._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSDistantObject] that points to the same underlying object as [other]. + static NSDistantObject castFrom(T other) { + return NSDistantObject._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSDistantObject] that wraps the given raw object pointer. + static NSDistantObject castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSDistantObject._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSDistantObject]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSDistantObject1); + } + + static NSObject proxyWithTarget_connection_( + SentryCocoa _lib, NSObject target, NSConnection? connection) { + final _ret = _lib._objc_msgSend_542( + _lib._class_NSDistantObject1, + _lib._sel_proxyWithTarget_connection_1, + target._id, + connection?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSDistantObject initWithTarget_connection_( + NSObject target, NSConnection? connection) { + final _ret = _lib._objc_msgSend_542( + _id, + _lib._sel_initWithTarget_connection_1, + target._id, + connection?._id ?? ffi.nullptr); + return NSDistantObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject proxyWithLocal_connection_( + SentryCocoa _lib, NSObject target, NSConnection? connection) { + final _ret = _lib._objc_msgSend_542( + _lib._class_NSDistantObject1, + _lib._sel_proxyWithLocal_connection_1, + target._id, + connection?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSDistantObject initWithLocal_connection_( + NSObject target, NSConnection? connection) { + final _ret = _lib._objc_msgSend_542( + _id, + _lib._sel_initWithLocal_connection_1, + target._id, + connection?._id ?? ffi.nullptr); + return NSDistantObject._(_ret, _lib, retain: true, release: true); + } + + NSDistantObject initWithCoder_(NSCoder? inCoder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, inCoder?._id ?? ffi.nullptr); + return NSDistantObject._(_ret, _lib, retain: true, release: true); + } + + void setProtocolForProxy_(Protocol? proto) { + _lib._objc_msgSend_543( + _id, _lib._sel_setProtocolForProxy_1, proto?._id ?? ffi.nullptr); + } + + NSConnection? get connectionForProxy { + final _ret = _lib._objc_msgSend_536(_id, _lib._sel_connectionForProxy1); + return _ret.address == 0 + ? null + : NSConnection._(_ret, _lib, retain: true, release: true); + } + + static NSObject alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSDistantObject1, _lib._sel_alloc1); + return NSObject._(_ret, _lib, retain: false, release: true); + } + + static bool respondsToSelector_( + SentryCocoa _lib, ffi.Pointer aSelector) { + return _lib._objc_msgSend_4(_lib._class_NSDistantObject1, + _lib._sel_respondsToSelector_1, aSelector); + } +} + +class NSProxy extends _ObjCWrapper { + NSProxy._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSProxy] that points to the same underlying object as [other]. + static NSProxy castFrom(T other) { + return NSProxy._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSProxy] that wraps the given raw object pointer. + static NSProxy castFromPointer(SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSProxy._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSProxy]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSProxy1); + } + + static NSObject alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSProxy1, _lib._sel_alloc1); + return NSObject._(_ret, _lib, retain: false, release: true); + } + + static NSObject allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSProxy1, _lib._sel_allocWithZone_1, zone); + return NSObject._(_ret, _lib, retain: false, release: true); + } + + static NSObject class1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSProxy1, _lib._sel_class1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void forwardInvocation_(NSInvocation? invocation) { + _lib._objc_msgSend_392( + _id, _lib._sel_forwardInvocation_1, invocation?._id ?? ffi.nullptr); + } + + NSMethodSignature methodSignatureForSelector_(ffi.Pointer sel) { + final _ret = _lib._objc_msgSend_393( + _id, _lib._sel_methodSignatureForSelector_1, sel); + return NSMethodSignature._(_ret, _lib, retain: true, release: true); + } + + void dealloc() { + _lib._objc_msgSend_1(_id, _lib._sel_dealloc1); + } + + void finalize() { + _lib._objc_msgSend_1(_id, _lib._sel_finalize1); + } + + NSString? get description { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get debugDescription { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_debugDescription1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + static bool respondsToSelector_( + SentryCocoa _lib, ffi.Pointer aSelector) { + return _lib._objc_msgSend_4( + _lib._class_NSProxy1, _lib._sel_respondsToSelector_1, aSelector); + } + + bool allowsWeakReference() { + return _lib._objc_msgSend_12(_id, _lib._sel_allowsWeakReference1); + } + + bool retainWeakReference() { + return _lib._objc_msgSend_12(_id, _lib._sel_retainWeakReference1); + } +} + +class NSClassDescription extends NSObject { + NSClassDescription._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSClassDescription] that points to the same underlying object as [other]. + static NSClassDescription castFrom(T other) { + return NSClassDescription._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSClassDescription] that wraps the given raw object pointer. + static NSClassDescription castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSClassDescription._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSClassDescription]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSClassDescription1); + } + + static void registerClassDescription_forClass_( + SentryCocoa _lib, NSClassDescription? description, NSObject aClass) { + _lib._objc_msgSend_555( + _lib._class_NSClassDescription1, + _lib._sel_registerClassDescription_forClass_1, + description?._id ?? ffi.nullptr, + aClass._id); + } + + static void invalidateClassDescriptionCache(SentryCocoa _lib) { + _lib._objc_msgSend_1(_lib._class_NSClassDescription1, + _lib._sel_invalidateClassDescriptionCache1); + } + + static NSClassDescription classDescriptionForClass_( + SentryCocoa _lib, NSObject aClass) { + final _ret = _lib._objc_msgSend_556(_lib._class_NSClassDescription1, + _lib._sel_classDescriptionForClass_1, aClass._id); + return NSClassDescription._(_ret, _lib, retain: true, release: true); + } + + @override + NSArray? get attributeKeys { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_attributeKeys1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + @override + NSArray? get toOneRelationshipKeys { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_toOneRelationshipKeys1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + @override + NSArray? get toManyRelationshipKeys { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_toManyRelationshipKeys1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + @override + NSString inverseForRelationshipKey_(NSString? relationshipKey) { + final _ret = _lib._objc_msgSend_64( + _id, + _lib._sel_inverseForRelationshipKey_1, + relationshipKey?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + @override + NSClassDescription init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSClassDescription._(_ret, _lib, retain: true, release: true); + } + + static NSClassDescription new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSClassDescription1, _lib._sel_new1); + return NSClassDescription._(_ret, _lib, retain: false, release: true); + } + + static NSClassDescription allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSClassDescription1, _lib._sel_allocWithZone_1, zone); + return NSClassDescription._(_ret, _lib, retain: false, release: true); + } + + static NSClassDescription alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSClassDescription1, _lib._sel_alloc1); + return NSClassDescription._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSClassDescription1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSClassDescription1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSClassDescription1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSClassDescription1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSClassDescription1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSClassDescription1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSClassDescription1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSClassDescription1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSClassDescription1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSScriptObjectSpecifier extends NSObject { + NSScriptObjectSpecifier._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSScriptObjectSpecifier] that points to the same underlying object as [other]. + static NSScriptObjectSpecifier castFrom(T other) { + return NSScriptObjectSpecifier._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSScriptObjectSpecifier] that wraps the given raw object pointer. + static NSScriptObjectSpecifier castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSScriptObjectSpecifier._(other, lib, + retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSScriptObjectSpecifier]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSScriptObjectSpecifier1); + } + + static NSScriptObjectSpecifier objectSpecifierWithDescriptor_( + SentryCocoa _lib, NSAppleEventDescriptor? descriptor) { + final _ret = _lib._objc_msgSend_580( + _lib._class_NSScriptObjectSpecifier1, + _lib._sel_objectSpecifierWithDescriptor_1, + descriptor?._id ?? ffi.nullptr); + return NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true); + } + + NSScriptObjectSpecifier initWithContainerSpecifier_key_( + NSScriptObjectSpecifier? container, NSString? property) { + final _ret = _lib._objc_msgSend_581( + _id, + _lib._sel_initWithContainerSpecifier_key_1, + container?._id ?? ffi.nullptr, + property?._id ?? ffi.nullptr); + return NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true); + } + + NSScriptObjectSpecifier + initWithContainerClassDescription_containerSpecifier_key_( + NSScriptClassDescription? classDesc, + NSScriptObjectSpecifier? container, + NSString? property) { + final _ret = _lib._objc_msgSend_598( + _id, + _lib._sel_initWithContainerClassDescription_containerSpecifier_key_1, + classDesc?._id ?? ffi.nullptr, + container?._id ?? ffi.nullptr, + property?._id ?? ffi.nullptr); + return NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true); + } + + NSScriptObjectSpecifier initWithCoder_(NSCoder? inCoder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, inCoder?._id ?? ffi.nullptr); + return NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true); + } + + NSScriptObjectSpecifier? get childSpecifier { + final _ret = _lib._objc_msgSend_588(_id, _lib._sel_childSpecifier1); + return _ret.address == 0 + ? null + : NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true); + } + + set childSpecifier(NSScriptObjectSpecifier? value) { + return _lib._objc_msgSend_589( + _id, _lib._sel_setChildSpecifier_1, value?._id ?? ffi.nullptr); + } + + NSScriptObjectSpecifier? get containerSpecifier { + final _ret = _lib._objc_msgSend_588(_id, _lib._sel_containerSpecifier1); + return _ret.address == 0 + ? null + : NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true); + } + + set containerSpecifier(NSScriptObjectSpecifier? value) { + return _lib._objc_msgSend_589( + _id, _lib._sel_setContainerSpecifier_1, value?._id ?? ffi.nullptr); + } + + bool get containerIsObjectBeingTested { + return _lib._objc_msgSend_12(_id, _lib._sel_containerIsObjectBeingTested1); + } + + set containerIsObjectBeingTested(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setContainerIsObjectBeingTested_1, value); + } + + bool get containerIsRangeContainerObject { + return _lib._objc_msgSend_12( + _id, _lib._sel_containerIsRangeContainerObject1); + } + + set containerIsRangeContainerObject(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setContainerIsRangeContainerObject_1, value); + } + + NSString? get key { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_key1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set key(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setKey_1, value?._id ?? ffi.nullptr); + } + + NSScriptClassDescription? get containerClassDescription { + final _ret = + _lib._objc_msgSend_584(_id, _lib._sel_containerClassDescription1); + return _ret.address == 0 + ? null + : NSScriptClassDescription._(_ret, _lib, retain: true, release: true); + } + + set containerClassDescription(NSScriptClassDescription? value) { + return _lib._objc_msgSend_599(_id, _lib._sel_setContainerClassDescription_1, + value?._id ?? ffi.nullptr); + } + + NSScriptClassDescription? get keyClassDescription { + final _ret = _lib._objc_msgSend_584(_id, _lib._sel_keyClassDescription1); + return _ret.address == 0 + ? null + : NSScriptClassDescription._(_ret, _lib, retain: true, release: true); + } + + ffi.Pointer indicesOfObjectsByEvaluatingWithContainer_count_( + NSObject container, ffi.Pointer count) { + return _lib._objc_msgSend_600( + _id, + _lib._sel_indicesOfObjectsByEvaluatingWithContainer_count_1, + container._id, + count); + } + + NSObject objectsByEvaluatingWithContainers_(NSObject containers) { + final _ret = _lib._objc_msgSend_16( + _id, _lib._sel_objectsByEvaluatingWithContainers_1, containers._id); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject get objectsByEvaluatingSpecifier { + final _ret = + _lib._objc_msgSend_2(_id, _lib._sel_objectsByEvaluatingSpecifier1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + int get evaluationErrorNumber { + return _lib._objc_msgSend_78(_id, _lib._sel_evaluationErrorNumber1); + } + + set evaluationErrorNumber(int value) { + return _lib._objc_msgSend_590( + _id, _lib._sel_setEvaluationErrorNumber_1, value); + } + + NSScriptObjectSpecifier? get evaluationErrorSpecifier { + final _ret = + _lib._objc_msgSend_588(_id, _lib._sel_evaluationErrorSpecifier1); + return _ret.address == 0 + ? null + : NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true); + } + + NSAppleEventDescriptor? get descriptor { + final _ret = _lib._objc_msgSend_558(_id, _lib._sel_descriptor1); + return _ret.address == 0 + ? null + : NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + @override + NSScriptObjectSpecifier init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true); + } + + static NSScriptObjectSpecifier new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSScriptObjectSpecifier1, _lib._sel_new1); + return NSScriptObjectSpecifier._(_ret, _lib, retain: false, release: true); + } + + static NSScriptObjectSpecifier allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSScriptObjectSpecifier1, _lib._sel_allocWithZone_1, zone); + return NSScriptObjectSpecifier._(_ret, _lib, retain: false, release: true); + } + + static NSScriptObjectSpecifier alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSScriptObjectSpecifier1, _lib._sel_alloc1); + return NSScriptObjectSpecifier._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSScriptObjectSpecifier1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSScriptObjectSpecifier1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSScriptObjectSpecifier1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSScriptObjectSpecifier1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSScriptObjectSpecifier1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSScriptObjectSpecifier1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSScriptObjectSpecifier1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSScriptObjectSpecifier1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSScriptObjectSpecifier1, + _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSAppleEventDescriptor extends NSObject { + NSAppleEventDescriptor._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSAppleEventDescriptor] that points to the same underlying object as [other]. + static NSAppleEventDescriptor castFrom(T other) { + return NSAppleEventDescriptor._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSAppleEventDescriptor] that wraps the given raw object pointer. + static NSAppleEventDescriptor castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSAppleEventDescriptor._(other, lib, + retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSAppleEventDescriptor]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSAppleEventDescriptor1); + } + + static NSAppleEventDescriptor nullDescriptor(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_558( + _lib._class_NSAppleEventDescriptor1, _lib._sel_nullDescriptor1); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + static NSAppleEventDescriptor descriptorWithDescriptorType_bytes_length_( + SentryCocoa _lib, + int descriptorType, + ffi.Pointer bytes, + int byteCount) { + final _ret = _lib._objc_msgSend_559( + _lib._class_NSAppleEventDescriptor1, + _lib._sel_descriptorWithDescriptorType_bytes_length_1, + descriptorType, + bytes, + byteCount); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + static NSAppleEventDescriptor descriptorWithDescriptorType_data_( + SentryCocoa _lib, int descriptorType, NSData? data) { + final _ret = _lib._objc_msgSend_560( + _lib._class_NSAppleEventDescriptor1, + _lib._sel_descriptorWithDescriptorType_data_1, + descriptorType, + data?._id ?? ffi.nullptr); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + static NSAppleEventDescriptor descriptorWithBoolean_( + SentryCocoa _lib, int boolean) { + final _ret = _lib._objc_msgSend_561(_lib._class_NSAppleEventDescriptor1, + _lib._sel_descriptorWithBoolean_1, boolean); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + static NSAppleEventDescriptor descriptorWithEnumCode_( + SentryCocoa _lib, int enumerator) { + final _ret = _lib._objc_msgSend_562(_lib._class_NSAppleEventDescriptor1, + _lib._sel_descriptorWithEnumCode_1, enumerator); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + static NSAppleEventDescriptor descriptorWithInt32_( + SentryCocoa _lib, int signedInt) { + final _ret = _lib._objc_msgSend_563(_lib._class_NSAppleEventDescriptor1, + _lib._sel_descriptorWithInt32_1, signedInt); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + static NSAppleEventDescriptor descriptorWithDouble_( + SentryCocoa _lib, double doubleValue) { + final _ret = _lib._objc_msgSend_564(_lib._class_NSAppleEventDescriptor1, + _lib._sel_descriptorWithDouble_1, doubleValue); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + static NSAppleEventDescriptor descriptorWithTypeCode_( + SentryCocoa _lib, int typeCode) { + final _ret = _lib._objc_msgSend_562(_lib._class_NSAppleEventDescriptor1, + _lib._sel_descriptorWithTypeCode_1, typeCode); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + static NSAppleEventDescriptor descriptorWithString_( + SentryCocoa _lib, NSString? string) { + final _ret = _lib._objc_msgSend_565(_lib._class_NSAppleEventDescriptor1, + _lib._sel_descriptorWithString_1, string?._id ?? ffi.nullptr); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + static NSAppleEventDescriptor descriptorWithDate_( + SentryCocoa _lib, NSDate? date) { + final _ret = _lib._objc_msgSend_566(_lib._class_NSAppleEventDescriptor1, + _lib._sel_descriptorWithDate_1, date?._id ?? ffi.nullptr); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + static NSAppleEventDescriptor descriptorWithFileURL_( + SentryCocoa _lib, NSURL? fileURL) { + final _ret = _lib._objc_msgSend_567(_lib._class_NSAppleEventDescriptor1, + _lib._sel_descriptorWithFileURL_1, fileURL?._id ?? ffi.nullptr); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + static NSAppleEventDescriptor + appleEventWithEventClass_eventID_targetDescriptor_returnID_transactionID_( + SentryCocoa _lib, + int eventClass, + int eventID, + NSAppleEventDescriptor? targetDescriptor, + int returnID, + int transactionID) { + final _ret = _lib._objc_msgSend_568( + _lib._class_NSAppleEventDescriptor1, + _lib._sel_appleEventWithEventClass_eventID_targetDescriptor_returnID_transactionID_1, + eventClass, + eventID, + targetDescriptor?._id ?? ffi.nullptr, + returnID, + transactionID); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + static NSAppleEventDescriptor listDescriptor(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_558( + _lib._class_NSAppleEventDescriptor1, _lib._sel_listDescriptor1); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + static NSAppleEventDescriptor recordDescriptor(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_558( + _lib._class_NSAppleEventDescriptor1, _lib._sel_recordDescriptor1); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + static NSAppleEventDescriptor currentProcessDescriptor(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_558(_lib._class_NSAppleEventDescriptor1, + _lib._sel_currentProcessDescriptor1); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + static NSAppleEventDescriptor descriptorWithProcessIdentifier_( + SentryCocoa _lib, int processIdentifier) { + final _ret = _lib._objc_msgSend_563(_lib._class_NSAppleEventDescriptor1, + _lib._sel_descriptorWithProcessIdentifier_1, processIdentifier); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + static NSAppleEventDescriptor descriptorWithBundleIdentifier_( + SentryCocoa _lib, NSString? bundleIdentifier) { + final _ret = _lib._objc_msgSend_565( + _lib._class_NSAppleEventDescriptor1, + _lib._sel_descriptorWithBundleIdentifier_1, + bundleIdentifier?._id ?? ffi.nullptr); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + static NSAppleEventDescriptor descriptorWithApplicationURL_( + SentryCocoa _lib, NSURL? applicationURL) { + final _ret = _lib._objc_msgSend_567( + _lib._class_NSAppleEventDescriptor1, + _lib._sel_descriptorWithApplicationURL_1, + applicationURL?._id ?? ffi.nullptr); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + NSAppleEventDescriptor initWithAEDescNoCopy_(ffi.Pointer aeDesc) { + final _ret = + _lib._objc_msgSend_569(_id, _lib._sel_initWithAEDescNoCopy_1, aeDesc); + return NSAppleEventDescriptor._(_ret, _lib, retain: false, release: true); + } + + NSAppleEventDescriptor initWithDescriptorType_bytes_length_( + int descriptorType, ffi.Pointer bytes, int byteCount) { + final _ret = _lib._objc_msgSend_570( + _id, + _lib._sel_initWithDescriptorType_bytes_length_1, + descriptorType, + bytes, + byteCount); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + NSAppleEventDescriptor initWithDescriptorType_data_( + int descriptorType, NSData? data) { + final _ret = _lib._objc_msgSend_571( + _id, + _lib._sel_initWithDescriptorType_data_1, + descriptorType, + data?._id ?? ffi.nullptr); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + NSAppleEventDescriptor + initWithEventClass_eventID_targetDescriptor_returnID_transactionID_( + int eventClass, + int eventID, + NSAppleEventDescriptor? targetDescriptor, + int returnID, + int transactionID) { + final _ret = _lib._objc_msgSend_572( + _id, + _lib._sel_initWithEventClass_eventID_targetDescriptor_returnID_transactionID_1, + eventClass, + eventID, + targetDescriptor?._id ?? ffi.nullptr, + returnID, + transactionID); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + NSAppleEventDescriptor initListDescriptor() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_initListDescriptor1); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + NSAppleEventDescriptor initRecordDescriptor() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_initRecordDescriptor1); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + ffi.Pointer get aeDesc { + return _lib._objc_msgSend_573(_id, _lib._sel_aeDesc1); + } + + int get descriptorType { + return _lib._objc_msgSend_197(_id, _lib._sel_descriptorType1); + } + + NSData? get data { + final _ret = _lib._objc_msgSend_39(_id, _lib._sel_data1); + return _ret.address == 0 + ? null + : NSData._(_ret, _lib, retain: true, release: true); + } + + int get booleanValue { + return _lib._objc_msgSend_216(_id, _lib._sel_booleanValue1); + } + + int get enumCodeValue { + return _lib._objc_msgSend_197(_id, _lib._sel_enumCodeValue1); + } + + int get int32Value { + return _lib._objc_msgSend_219(_id, _lib._sel_int32Value1); + } + + double get doubleValue { + return _lib._objc_msgSend_155(_id, _lib._sel_doubleValue1); + } + + int get typeCodeValue { + return _lib._objc_msgSend_197(_id, _lib._sel_typeCodeValue1); + } + + NSString? get stringValue { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_stringValue1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSDate? get dateValue { + final _ret = _lib._objc_msgSend_162(_id, _lib._sel_dateValue1); + return _ret.address == 0 + ? null + : NSDate._(_ret, _lib, retain: true, release: true); + } + + NSURL? get fileURLValue { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_fileURLValue1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + int get eventClass { + return _lib._objc_msgSend_197(_id, _lib._sel_eventClass1); + } + + int get eventID { + return _lib._objc_msgSend_197(_id, _lib._sel_eventID1); + } + + int get returnID { + return _lib._objc_msgSend_217(_id, _lib._sel_returnID1); + } + + int get transactionID { + return _lib._objc_msgSend_219(_id, _lib._sel_transactionID1); + } + + void setParamDescriptor_forKeyword_( + NSAppleEventDescriptor? descriptor, int keyword) { + _lib._objc_msgSend_574(_id, _lib._sel_setParamDescriptor_forKeyword_1, + descriptor?._id ?? ffi.nullptr, keyword); + } + + NSAppleEventDescriptor paramDescriptorForKeyword_(int keyword) { + final _ret = _lib._objc_msgSend_562( + _id, _lib._sel_paramDescriptorForKeyword_1, keyword); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + void removeParamDescriptorWithKeyword_(int keyword) { + _lib._objc_msgSend_575( + _id, _lib._sel_removeParamDescriptorWithKeyword_1, keyword); + } + + void setAttributeDescriptor_forKeyword_( + NSAppleEventDescriptor? descriptor, int keyword) { + _lib._objc_msgSend_574(_id, _lib._sel_setAttributeDescriptor_forKeyword_1, + descriptor?._id ?? ffi.nullptr, keyword); + } + + NSAppleEventDescriptor attributeDescriptorForKeyword_(int keyword) { + final _ret = _lib._objc_msgSend_562( + _id, _lib._sel_attributeDescriptorForKeyword_1, keyword); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + NSAppleEventDescriptor sendEventWithOptions_timeout_error_(int sendOptions, + double timeoutInSeconds, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_576( + _id, + _lib._sel_sendEventWithOptions_timeout_error_1, + sendOptions, + timeoutInSeconds, + error); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + bool get isRecordDescriptor { + return _lib._objc_msgSend_12(_id, _lib._sel_isRecordDescriptor1); + } + + int get numberOfItems { + return _lib._objc_msgSend_78(_id, _lib._sel_numberOfItems1); + } + + void insertDescriptor_atIndex_( + NSAppleEventDescriptor? descriptor, int index) { + _lib._objc_msgSend_577(_id, _lib._sel_insertDescriptor_atIndex_1, + descriptor?._id ?? ffi.nullptr, index); + } + + NSAppleEventDescriptor descriptorAtIndex_(int index) { + final _ret = + _lib._objc_msgSend_578(_id, _lib._sel_descriptorAtIndex_1, index); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + void removeDescriptorAtIndex_(int index) { + _lib._objc_msgSend_394(_id, _lib._sel_removeDescriptorAtIndex_1, index); + } + + void setDescriptor_forKeyword_( + NSAppleEventDescriptor? descriptor, int keyword) { + _lib._objc_msgSend_574(_id, _lib._sel_setDescriptor_forKeyword_1, + descriptor?._id ?? ffi.nullptr, keyword); + } + + NSAppleEventDescriptor descriptorForKeyword_(int keyword) { + final _ret = + _lib._objc_msgSend_562(_id, _lib._sel_descriptorForKeyword_1, keyword); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + void removeDescriptorWithKeyword_(int keyword) { + _lib._objc_msgSend_575( + _id, _lib._sel_removeDescriptorWithKeyword_1, keyword); + } + + int keywordForDescriptorAtIndex_(int index) { + return _lib._objc_msgSend_579( + _id, _lib._sel_keywordForDescriptorAtIndex_1, index); + } + + NSAppleEventDescriptor coerceToDescriptorType_(int descriptorType) { + final _ret = _lib._objc_msgSend_562( + _id, _lib._sel_coerceToDescriptorType_1, descriptorType); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + @override + NSAppleEventDescriptor init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + static NSAppleEventDescriptor new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSAppleEventDescriptor1, _lib._sel_new1); + return NSAppleEventDescriptor._(_ret, _lib, retain: false, release: true); + } + + static NSAppleEventDescriptor allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSAppleEventDescriptor1, _lib._sel_allocWithZone_1, zone); + return NSAppleEventDescriptor._(_ret, _lib, retain: false, release: true); + } + + static NSAppleEventDescriptor alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSAppleEventDescriptor1, _lib._sel_alloc1); + return NSAppleEventDescriptor._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSAppleEventDescriptor1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSAppleEventDescriptor1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSAppleEventDescriptor1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSAppleEventDescriptor1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSAppleEventDescriptor1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSAppleEventDescriptor1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSAppleEventDescriptor1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSAppleEventDescriptor1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSAppleEventDescriptor1, + _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +@ffi.Packed(2) +class AEDesc extends ffi.Struct { + @ffi.UnsignedInt() + external int descriptorType; + + external ffi.Pointer> dataHandle; +} + +class OpaqueAEDataStorageType extends ffi.Opaque {} + +abstract class NSAppleEventSendOptions { + static const int NSAppleEventSendNoReply = 1; + static const int NSAppleEventSendQueueReply = 2; + static const int NSAppleEventSendWaitForReply = 3; + static const int NSAppleEventSendNeverInteract = 16; + static const int NSAppleEventSendCanInteract = 32; + static const int NSAppleEventSendAlwaysInteract = 48; + static const int NSAppleEventSendCanSwitchLayer = 64; + static const int NSAppleEventSendDontRecord = 4096; + static const int NSAppleEventSendDontExecute = 8192; + static const int NSAppleEventSendDontAnnotate = 65536; + static const int NSAppleEventSendDefaultOptions = 35; +} + +class NSScriptClassDescription extends NSClassDescription { + NSScriptClassDescription._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSScriptClassDescription] that points to the same underlying object as [other]. + static NSScriptClassDescription castFrom(T other) { + return NSScriptClassDescription._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSScriptClassDescription] that wraps the given raw object pointer. + static NSScriptClassDescription castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSScriptClassDescription._(other, lib, + retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSScriptClassDescription]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSScriptClassDescription1); + } + + static NSScriptClassDescription classDescriptionForClass_( + SentryCocoa _lib, NSObject aClass) { + final _ret = _lib._objc_msgSend_582(_lib._class_NSScriptClassDescription1, + _lib._sel_classDescriptionForClass_1, aClass._id); + return NSScriptClassDescription._(_ret, _lib, retain: true, release: true); + } + + NSScriptClassDescription initWithSuiteName_className_dictionary_( + NSString? suiteName, + NSString? className, + NSDictionary? classDeclaration) { + final _ret = _lib._objc_msgSend_583( + _id, + _lib._sel_initWithSuiteName_className_dictionary_1, + suiteName?._id ?? ffi.nullptr, + className?._id ?? ffi.nullptr, + classDeclaration?._id ?? ffi.nullptr); + return NSScriptClassDescription._(_ret, _lib, retain: true, release: true); + } + + NSString? get suiteName { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_suiteName1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get className { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_className1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get implementationClassName { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_implementationClassName1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSScriptClassDescription? get superclassDescription { + final _ret = _lib._objc_msgSend_584(_id, _lib._sel_superclassDescription1); + return _ret.address == 0 + ? null + : NSScriptClassDescription._(_ret, _lib, retain: true, release: true); + } + + int get appleEventCode { + return _lib._objc_msgSend_197(_id, _lib._sel_appleEventCode1); + } + + bool matchesAppleEventCode_(int appleEventCode) { + return _lib._objc_msgSend_179( + _id, _lib._sel_matchesAppleEventCode_1, appleEventCode); + } + + bool supportsCommand_(NSScriptCommandDescription? commandDescription) { + return _lib._objc_msgSend_594(_id, _lib._sel_supportsCommand_1, + commandDescription?._id ?? ffi.nullptr); + } + + ffi.Pointer selectorForCommand_( + NSScriptCommandDescription? commandDescription) { + return _lib._objc_msgSend_595(_id, _lib._sel_selectorForCommand_1, + commandDescription?._id ?? ffi.nullptr); + } + + NSString typeForKey_(NSString? key) { + final _ret = _lib._objc_msgSend_64( + _id, _lib._sel_typeForKey_1, key?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSScriptClassDescription classDescriptionForKey_(NSString? key) { + final _ret = _lib._objc_msgSend_596( + _id, _lib._sel_classDescriptionForKey_1, key?._id ?? ffi.nullptr); + return NSScriptClassDescription._(_ret, _lib, retain: true, release: true); + } + + int appleEventCodeForKey_(NSString? key) { + return _lib._objc_msgSend_585( + _id, _lib._sel_appleEventCodeForKey_1, key?._id ?? ffi.nullptr); + } + + NSString keyWithAppleEventCode_(int appleEventCode) { + final _ret = _lib._objc_msgSend_597( + _id, _lib._sel_keyWithAppleEventCode_1, appleEventCode); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get defaultSubcontainerAttributeKey { + final _ret = + _lib._objc_msgSend_20(_id, _lib._sel_defaultSubcontainerAttributeKey1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + bool isLocationRequiredToCreateForKey_(NSString? toManyRelationshipKey) { + return _lib._objc_msgSend_59( + _id, + _lib._sel_isLocationRequiredToCreateForKey_1, + toManyRelationshipKey?._id ?? ffi.nullptr); + } + + bool hasPropertyForKey_(NSString? key) { + return _lib._objc_msgSend_59( + _id, _lib._sel_hasPropertyForKey_1, key?._id ?? ffi.nullptr); + } + + bool hasOrderedToManyRelationshipForKey_(NSString? key) { + return _lib._objc_msgSend_59( + _id, + _lib._sel_hasOrderedToManyRelationshipForKey_1, + key?._id ?? ffi.nullptr); + } + + bool hasReadablePropertyForKey_(NSString? key) { + return _lib._objc_msgSend_59( + _id, _lib._sel_hasReadablePropertyForKey_1, key?._id ?? ffi.nullptr); + } + + bool hasWritablePropertyForKey_(NSString? key) { + return _lib._objc_msgSend_59( + _id, _lib._sel_hasWritablePropertyForKey_1, key?._id ?? ffi.nullptr); + } + + bool isReadOnlyKey_(NSString? key) { + return _lib._objc_msgSend_59( + _id, _lib._sel_isReadOnlyKey_1, key?._id ?? ffi.nullptr); + } + + static void registerClassDescription_forClass_( + SentryCocoa _lib, NSClassDescription? description, NSObject aClass) { + _lib._objc_msgSend_555( + _lib._class_NSScriptClassDescription1, + _lib._sel_registerClassDescription_forClass_1, + description?._id ?? ffi.nullptr, + aClass._id); + } + + static void invalidateClassDescriptionCache(SentryCocoa _lib) { + _lib._objc_msgSend_1(_lib._class_NSScriptClassDescription1, + _lib._sel_invalidateClassDescriptionCache1); + } + + @override + NSScriptClassDescription init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSScriptClassDescription._(_ret, _lib, retain: true, release: true); + } + + static NSScriptClassDescription new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSScriptClassDescription1, _lib._sel_new1); + return NSScriptClassDescription._(_ret, _lib, retain: false, release: true); + } + + static NSScriptClassDescription allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSScriptClassDescription1, _lib._sel_allocWithZone_1, zone); + return NSScriptClassDescription._(_ret, _lib, retain: false, release: true); + } + + static NSScriptClassDescription alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSScriptClassDescription1, _lib._sel_alloc1); + return NSScriptClassDescription._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSScriptClassDescription1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSScriptClassDescription1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSScriptClassDescription1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSScriptClassDescription1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSScriptClassDescription1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSScriptClassDescription1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSScriptClassDescription1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSScriptClassDescription1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSScriptClassDescription1, + _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSScriptCommandDescription extends NSObject { + NSScriptCommandDescription._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSScriptCommandDescription] that points to the same underlying object as [other]. + static NSScriptCommandDescription castFrom(T other) { + return NSScriptCommandDescription._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSScriptCommandDescription] that wraps the given raw object pointer. + static NSScriptCommandDescription castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSScriptCommandDescription._(other, lib, + retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSScriptCommandDescription]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSScriptCommandDescription1); + } + + @override + NSObject init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSScriptCommandDescription initWithSuiteName_commandName_dictionary_( + NSString? suiteName, + NSString? commandName, + NSDictionary? commandDeclaration) { + final _ret = _lib._objc_msgSend_583( + _id, + _lib._sel_initWithSuiteName_commandName_dictionary_1, + suiteName?._id ?? ffi.nullptr, + commandName?._id ?? ffi.nullptr, + commandDeclaration?._id ?? ffi.nullptr); + return NSScriptCommandDescription._(_ret, _lib, + retain: true, release: true); + } + + NSScriptCommandDescription initWithCoder_(NSCoder? inCoder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, inCoder?._id ?? ffi.nullptr); + return NSScriptCommandDescription._(_ret, _lib, + retain: true, release: true); + } + + NSString? get suiteName { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_suiteName1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get commandName { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_commandName1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + int get appleEventClassCode { + return _lib._objc_msgSend_197(_id, _lib._sel_appleEventClassCode1); + } + + int get appleEventCode { + return _lib._objc_msgSend_197(_id, _lib._sel_appleEventCode1); + } + + NSString? get commandClassName { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_commandClassName1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get returnType { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_returnType1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + int get appleEventCodeForReturnType { + return _lib._objc_msgSend_197(_id, _lib._sel_appleEventCodeForReturnType1); + } + + NSArray? get argumentNames { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_argumentNames1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSString typeForArgumentWithName_(NSString? argumentName) { + final _ret = _lib._objc_msgSend_64(_id, _lib._sel_typeForArgumentWithName_1, + argumentName?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + int appleEventCodeForArgumentWithName_(NSString? argumentName) { + return _lib._objc_msgSend_585( + _id, + _lib._sel_appleEventCodeForArgumentWithName_1, + argumentName?._id ?? ffi.nullptr); + } + + bool isOptionalArgumentWithName_(NSString? argumentName) { + return _lib._objc_msgSend_59(_id, _lib._sel_isOptionalArgumentWithName_1, + argumentName?._id ?? ffi.nullptr); + } + + NSScriptCommand createCommandInstance() { + final _ret = _lib._objc_msgSend_592(_id, _lib._sel_createCommandInstance1); + return NSScriptCommand._(_ret, _lib, retain: true, release: true); + } + + NSScriptCommand createCommandInstanceWithZone_(ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_593( + _id, _lib._sel_createCommandInstanceWithZone_1, zone); + return NSScriptCommand._(_ret, _lib, retain: true, release: true); + } + + static NSScriptCommandDescription new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSScriptCommandDescription1, _lib._sel_new1); + return NSScriptCommandDescription._(_ret, _lib, + retain: false, release: true); + } + + static NSScriptCommandDescription allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3(_lib._class_NSScriptCommandDescription1, + _lib._sel_allocWithZone_1, zone); + return NSScriptCommandDescription._(_ret, _lib, + retain: false, release: true); + } + + static NSScriptCommandDescription alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSScriptCommandDescription1, _lib._sel_alloc1); + return NSScriptCommandDescription._(_ret, _lib, + retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSScriptCommandDescription1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSScriptCommandDescription1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSScriptCommandDescription1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSScriptCommandDescription1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSScriptCommandDescription1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSScriptCommandDescription1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSScriptCommandDescription1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSScriptCommandDescription1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSScriptCommandDescription1, + _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSScriptCommand extends NSObject { + NSScriptCommand._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSScriptCommand] that points to the same underlying object as [other]. + static NSScriptCommand castFrom(T other) { + return NSScriptCommand._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSScriptCommand] that wraps the given raw object pointer. + static NSScriptCommand castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSScriptCommand._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSScriptCommand]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSScriptCommand1); + } + + NSScriptCommand initWithCommandDescription_( + NSScriptCommandDescription? commandDef) { + final _ret = _lib._objc_msgSend_586(_id, + _lib._sel_initWithCommandDescription_1, commandDef?._id ?? ffi.nullptr); + return NSScriptCommand._(_ret, _lib, retain: true, release: true); + } + + NSScriptCommand initWithCoder_(NSCoder? inCoder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, inCoder?._id ?? ffi.nullptr); + return NSScriptCommand._(_ret, _lib, retain: true, release: true); + } + + NSScriptCommandDescription? get commandDescription { + final _ret = _lib._objc_msgSend_587(_id, _lib._sel_commandDescription1); + return _ret.address == 0 + ? null + : NSScriptCommandDescription._(_ret, _lib, retain: true, release: true); + } + + NSObject get directParameter { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_directParameter1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + set directParameter(NSObject value) { + return _lib._objc_msgSend_387( + _id, _lib._sel_setDirectParameter_1, value._id); + } + + NSScriptObjectSpecifier? get receiversSpecifier { + final _ret = _lib._objc_msgSend_588(_id, _lib._sel_receiversSpecifier1); + return _ret.address == 0 + ? null + : NSScriptObjectSpecifier._(_ret, _lib, retain: true, release: true); + } + + set receiversSpecifier(NSScriptObjectSpecifier? value) { + return _lib._objc_msgSend_589( + _id, _lib._sel_setReceiversSpecifier_1, value?._id ?? ffi.nullptr); + } + + NSObject get evaluatedReceivers { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_evaluatedReceivers1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSDictionary? get arguments { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_arguments1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + set arguments(NSDictionary? value) { + return _lib._objc_msgSend_171( + _id, _lib._sel_setArguments_1, value?._id ?? ffi.nullptr); + } + + NSDictionary? get evaluatedArguments { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_evaluatedArguments1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + bool get wellFormed { + return _lib._objc_msgSend_12(_id, _lib._sel_isWellFormed1); + } + + NSObject performDefaultImplementation() { + final _ret = + _lib._objc_msgSend_2(_id, _lib._sel_performDefaultImplementation1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject executeCommand() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_executeCommand1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + int get scriptErrorNumber { + return _lib._objc_msgSend_78(_id, _lib._sel_scriptErrorNumber1); + } + + set scriptErrorNumber(int value) { + return _lib._objc_msgSend_590(_id, _lib._sel_setScriptErrorNumber_1, value); + } + + NSAppleEventDescriptor? get scriptErrorOffendingObjectDescriptor { + final _ret = _lib._objc_msgSend_558( + _id, _lib._sel_scriptErrorOffendingObjectDescriptor1); + return _ret.address == 0 + ? null + : NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + set scriptErrorOffendingObjectDescriptor(NSAppleEventDescriptor? value) { + return _lib._objc_msgSend_591( + _id, + _lib._sel_setScriptErrorOffendingObjectDescriptor_1, + value?._id ?? ffi.nullptr); + } + + NSAppleEventDescriptor? get scriptErrorExpectedTypeDescriptor { + final _ret = _lib._objc_msgSend_558( + _id, _lib._sel_scriptErrorExpectedTypeDescriptor1); + return _ret.address == 0 + ? null + : NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + set scriptErrorExpectedTypeDescriptor(NSAppleEventDescriptor? value) { + return _lib._objc_msgSend_591( + _id, + _lib._sel_setScriptErrorExpectedTypeDescriptor_1, + value?._id ?? ffi.nullptr); + } + + NSString? get scriptErrorString { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_scriptErrorString1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set scriptErrorString(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setScriptErrorString_1, value?._id ?? ffi.nullptr); + } + + static NSScriptCommand currentCommand(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_592( + _lib._class_NSScriptCommand1, _lib._sel_currentCommand1); + return NSScriptCommand._(_ret, _lib, retain: true, release: true); + } + + NSAppleEventDescriptor? get appleEvent { + final _ret = _lib._objc_msgSend_558(_id, _lib._sel_appleEvent1); + return _ret.address == 0 + ? null + : NSAppleEventDescriptor._(_ret, _lib, retain: true, release: true); + } + + void suspendExecution() { + _lib._objc_msgSend_1(_id, _lib._sel_suspendExecution1); + } + + void resumeExecutionWithResult_(NSObject result) { + _lib._objc_msgSend_15( + _id, _lib._sel_resumeExecutionWithResult_1, result._id); + } + + @override + NSScriptCommand init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSScriptCommand._(_ret, _lib, retain: true, release: true); + } + + static NSScriptCommand new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSScriptCommand1, _lib._sel_new1); + return NSScriptCommand._(_ret, _lib, retain: false, release: true); + } + + static NSScriptCommand allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSScriptCommand1, _lib._sel_allocWithZone_1, zone); + return NSScriptCommand._(_ret, _lib, retain: false, release: true); + } + + static NSScriptCommand alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSScriptCommand1, _lib._sel_alloc1); + return NSScriptCommand._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSScriptCommand1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSScriptCommand1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSScriptCommand1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSScriptCommand1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSScriptCommand1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSScriptCommand1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSScriptCommand1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSScriptCommand1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSScriptCommand1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSItemProvider extends NSObject { + NSItemProvider._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSItemProvider] that points to the same underlying object as [other]. + static NSItemProvider castFrom(T other) { + return NSItemProvider._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSItemProvider] that wraps the given raw object pointer. + static NSItemProvider castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSItemProvider._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSItemProvider]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSItemProvider1); + } + + @override + NSItemProvider init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSItemProvider._(_ret, _lib, retain: true, release: true); + } + + void registerDataRepresentationForTypeIdentifier_visibility_loadHandler_( + NSString? typeIdentifier, + int visibility, + ObjCBlock_NSProgress_ffiVoidNSDataNSError loadHandler) { + _lib._objc_msgSend_623( + _id, + _lib._sel_registerDataRepresentationForTypeIdentifier_visibility_loadHandler_1, + typeIdentifier?._id ?? ffi.nullptr, + visibility, + loadHandler._id); + } + + void + registerFileRepresentationForTypeIdentifier_fileOptions_visibility_loadHandler_( + NSString? typeIdentifier, + int fileOptions, + int visibility, + ObjCBlock_NSProgress_ffiVoidNSURLboolNSError loadHandler) { + _lib._objc_msgSend_624( + _id, + _lib._sel_registerFileRepresentationForTypeIdentifier_fileOptions_visibility_loadHandler_1, + typeIdentifier?._id ?? ffi.nullptr, + fileOptions, + visibility, + loadHandler._id); + } + + NSArray? get registeredTypeIdentifiers { + final _ret = + _lib._objc_msgSend_79(_id, _lib._sel_registeredTypeIdentifiers1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray registeredTypeIdentifiersWithFileOptions_(int fileOptions) { + final _ret = _lib._objc_msgSend_625( + _id, _lib._sel_registeredTypeIdentifiersWithFileOptions_1, fileOptions); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + bool hasItemConformingToTypeIdentifier_(NSString? typeIdentifier) { + return _lib._objc_msgSend_59( + _id, + _lib._sel_hasItemConformingToTypeIdentifier_1, + typeIdentifier?._id ?? ffi.nullptr); + } + + bool hasRepresentationConformingToTypeIdentifier_fileOptions_( + NSString? typeIdentifier, int fileOptions) { + return _lib._objc_msgSend_626( + _id, + _lib._sel_hasRepresentationConformingToTypeIdentifier_fileOptions_1, + typeIdentifier?._id ?? ffi.nullptr, + fileOptions); + } + + NSProgress loadDataRepresentationForTypeIdentifier_completionHandler_( + NSString? typeIdentifier, + ObjCBlock_ffiVoid_NSData_NSError completionHandler) { + final _ret = _lib._objc_msgSend_627( + _id, + _lib._sel_loadDataRepresentationForTypeIdentifier_completionHandler_1, + typeIdentifier?._id ?? ffi.nullptr, + completionHandler._id); + return NSProgress._(_ret, _lib, retain: true, release: true); + } + + NSProgress loadFileRepresentationForTypeIdentifier_completionHandler_( + NSString? typeIdentifier, + ObjCBlock_ffiVoid_NSURL_NSError completionHandler) { + final _ret = _lib._objc_msgSend_628( + _id, + _lib._sel_loadFileRepresentationForTypeIdentifier_completionHandler_1, + typeIdentifier?._id ?? ffi.nullptr, + completionHandler._id); + return NSProgress._(_ret, _lib, retain: true, release: true); + } + + NSProgress loadInPlaceFileRepresentationForTypeIdentifier_completionHandler_( + NSString? typeIdentifier, + ObjCBlock_ffiVoid_NSURL_bool_NSError completionHandler) { + final _ret = _lib._objc_msgSend_629( + _id, + _lib._sel_loadInPlaceFileRepresentationForTypeIdentifier_completionHandler_1, + typeIdentifier?._id ?? ffi.nullptr, + completionHandler._id); + return NSProgress._(_ret, _lib, retain: true, release: true); + } + + NSString? get suggestedName { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_suggestedName1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set suggestedName(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setSuggestedName_1, value?._id ?? ffi.nullptr); + } + + NSItemProvider initWithObject_(NSObject? object) { + final _ret = _lib._objc_msgSend_16( + _id, _lib._sel_initWithObject_1, object?._id ?? ffi.nullptr); + return NSItemProvider._(_ret, _lib, retain: true, release: true); + } + + void registerObject_visibility_(NSObject? object, int visibility) { + _lib._objc_msgSend_630(_id, _lib._sel_registerObject_visibility_1, + object?._id ?? ffi.nullptr, visibility); + } + + void registerObjectOfClass_visibility_loadHandler_( + NSObject? aClass, + int visibility, + ObjCBlock_NSProgress_ffiVoidObjCObjectNSError loadHandler) { + _lib._objc_msgSend_631( + _id, + _lib._sel_registerObjectOfClass_visibility_loadHandler_1, + aClass?._id ?? ffi.nullptr, + visibility, + loadHandler._id); + } + + bool canLoadObjectOfClass_(NSObject? aClass) { + return _lib._objc_msgSend_0( + _id, _lib._sel_canLoadObjectOfClass_1, aClass?._id ?? ffi.nullptr); + } + + NSProgress loadObjectOfClass_completionHandler_(NSObject? aClass, + ObjCBlock_ffiVoid_ObjCObject_NSError completionHandler) { + final _ret = _lib._objc_msgSend_632( + _id, + _lib._sel_loadObjectOfClass_completionHandler_1, + aClass?._id ?? ffi.nullptr, + completionHandler._id); + return NSProgress._(_ret, _lib, retain: true, release: true); + } + + NSItemProvider initWithItem_typeIdentifier_( + NSObject? item, NSString? typeIdentifier) { + final _ret = _lib._objc_msgSend_287( + _id, + _lib._sel_initWithItem_typeIdentifier_1, + item?._id ?? ffi.nullptr, + typeIdentifier?._id ?? ffi.nullptr); + return NSItemProvider._(_ret, _lib, retain: true, release: true); + } + + NSItemProvider initWithContentsOfURL_(NSURL? fileURL) { + final _ret = _lib._objc_msgSend_241( + _id, _lib._sel_initWithContentsOfURL_1, fileURL?._id ?? ffi.nullptr); + return NSItemProvider._(_ret, _lib, retain: true, release: true); + } + + void registerItemForTypeIdentifier_loadHandler_( + NSString? typeIdentifier, + ObjCBlock_ffiVoid_ffiVoidObjCObjectNSError_ObjCObject_NSDictionary + loadHandler) { + _lib._objc_msgSend_633( + _id, + _lib._sel_registerItemForTypeIdentifier_loadHandler_1, + typeIdentifier?._id ?? ffi.nullptr, + loadHandler._id); + } + + void loadItemForTypeIdentifier_options_completionHandler_( + NSString? typeIdentifier, + NSDictionary? options, + ObjCBlock_ffiVoid_ObjCObject_NSError completionHandler) { + _lib._objc_msgSend_634( + _id, + _lib._sel_loadItemForTypeIdentifier_options_completionHandler_1, + typeIdentifier?._id ?? ffi.nullptr, + options?._id ?? ffi.nullptr, + completionHandler._id); + } + + ObjCBlock_ffiVoid_ffiVoidObjCObjectNSError_ObjCObject_NSDictionary + get previewImageHandler { + final _ret = _lib._objc_msgSend_635(_id, _lib._sel_previewImageHandler1); + return ObjCBlock_ffiVoid_ffiVoidObjCObjectNSError_ObjCObject_NSDictionary._( + _ret, _lib); + } + + set previewImageHandler( + ObjCBlock_ffiVoid_ffiVoidObjCObjectNSError_ObjCObject_NSDictionary + value) { + return _lib._objc_msgSend_636( + _id, _lib._sel_setPreviewImageHandler_1, value._id); + } + + void loadPreviewImageWithOptions_completionHandler_(NSDictionary? options, + ObjCBlock_ffiVoid_ObjCObject_NSError completionHandler) { + _lib._objc_msgSend_637( + _id, + _lib._sel_loadPreviewImageWithOptions_completionHandler_1, + options?._id ?? ffi.nullptr, + completionHandler._id); + } + + static NSItemProvider new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSItemProvider1, _lib._sel_new1); + return NSItemProvider._(_ret, _lib, retain: false, release: true); + } + + static NSItemProvider allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSItemProvider1, _lib._sel_allocWithZone_1, zone); + return NSItemProvider._(_ret, _lib, retain: false, release: true); + } + + static NSItemProvider alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSItemProvider1, _lib._sel_alloc1); + return NSItemProvider._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSItemProvider1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSItemProvider1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSItemProvider1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSItemProvider1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSItemProvider1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSItemProvider1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSItemProvider1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSItemProvider1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSItemProvider1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSItemProviderRepresentationVisibility { + static const int NSItemProviderRepresentationVisibilityAll = 0; + static const int NSItemProviderRepresentationVisibilityTeam = 1; + static const int NSItemProviderRepresentationVisibilityGroup = 2; + static const int NSItemProviderRepresentationVisibilityOwnProcess = 3; +} + +ffi.Pointer + _ObjCBlock_NSProgress_ffiVoidNSDataNSError_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer<_ObjCBlock> arg0) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer<_ObjCBlock> arg0)>>() + .asFunction< + ffi.Pointer Function( + ffi.Pointer<_ObjCBlock> arg0)>()(arg0); +} + +final _ObjCBlock_NSProgress_ffiVoidNSDataNSError_closureRegistry = + {}; +int _ObjCBlock_NSProgress_ffiVoidNSDataNSError_closureRegistryIndex = 0; +ffi.Pointer + _ObjCBlock_NSProgress_ffiVoidNSDataNSError_registerClosure(Function fn) { + final id = ++_ObjCBlock_NSProgress_ffiVoidNSDataNSError_closureRegistryIndex; + _ObjCBlock_NSProgress_ffiVoidNSDataNSError_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +ffi.Pointer + _ObjCBlock_NSProgress_ffiVoidNSDataNSError_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer<_ObjCBlock> arg0) { + return (_ObjCBlock_NSProgress_ffiVoidNSDataNSError_closureRegistry[ + block.ref.target.address] + as ffi.Pointer Function(ffi.Pointer<_ObjCBlock>))(arg0); +} + +class ObjCBlock_NSProgress_ffiVoidNSDataNSError extends _ObjCBlockBase { + ObjCBlock_NSProgress_ffiVoidNSDataNSError._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_NSProgress_ffiVoidNSDataNSError.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer<_ObjCBlock> arg0)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Pointer Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer<_ObjCBlock> arg0)>( + _ObjCBlock_NSProgress_ffiVoidNSDataNSError_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_NSProgress_ffiVoidNSDataNSError.fromFunction(SentryCocoa lib, + ffi.Pointer Function(ffi.Pointer<_ObjCBlock> arg0) fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Pointer Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer<_ObjCBlock> arg0)>( + _ObjCBlock_NSProgress_ffiVoidNSDataNSError_closureTrampoline) + .cast(), + _ObjCBlock_NSProgress_ffiVoidNSDataNSError_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + ffi.Pointer call(ffi.Pointer<_ObjCBlock> arg0) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer<_ObjCBlock> arg0)>>() + .asFunction< + ffi.Pointer Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer<_ObjCBlock> arg0)>()(_id, arg0); + } +} + +class NSProgress extends NSObject { + NSProgress._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSProgress] that points to the same underlying object as [other]. + static NSProgress castFrom(T other) { + return NSProgress._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSProgress] that wraps the given raw object pointer. + static NSProgress castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSProgress._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSProgress]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSProgress1); + } + + static NSProgress currentProgress(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_609( + _lib._class_NSProgress1, _lib._sel_currentProgress1); + return NSProgress._(_ret, _lib, retain: true, release: true); + } + + static NSProgress progressWithTotalUnitCount_( + SentryCocoa _lib, int unitCount) { + final _ret = _lib._objc_msgSend_610(_lib._class_NSProgress1, + _lib._sel_progressWithTotalUnitCount_1, unitCount); + return NSProgress._(_ret, _lib, retain: true, release: true); + } + + static NSProgress discreteProgressWithTotalUnitCount_( + SentryCocoa _lib, int unitCount) { + final _ret = _lib._objc_msgSend_610(_lib._class_NSProgress1, + _lib._sel_discreteProgressWithTotalUnitCount_1, unitCount); + return NSProgress._(_ret, _lib, retain: true, release: true); + } + + static NSProgress progressWithTotalUnitCount_parent_pendingUnitCount_( + SentryCocoa _lib, + int unitCount, + NSProgress? parent, + int portionOfParentTotalUnitCount) { + final _ret = _lib._objc_msgSend_611( + _lib._class_NSProgress1, + _lib._sel_progressWithTotalUnitCount_parent_pendingUnitCount_1, + unitCount, + parent?._id ?? ffi.nullptr, + portionOfParentTotalUnitCount); + return NSProgress._(_ret, _lib, retain: true, release: true); + } + + NSProgress initWithParent_userInfo_( + NSProgress? parentProgressOrNil, NSObject? userInfoOrNil) { + final _ret = _lib._objc_msgSend_612( + _id, + _lib._sel_initWithParent_userInfo_1, + parentProgressOrNil?._id ?? ffi.nullptr, + userInfoOrNil?._id ?? ffi.nullptr); + return NSProgress._(_ret, _lib, retain: true, release: true); + } + + void becomeCurrentWithPendingUnitCount_(int unitCount) { + _lib._objc_msgSend_613( + _id, _lib._sel_becomeCurrentWithPendingUnitCount_1, unitCount); + } + + void performAsCurrentWithPendingUnitCount_usingBlock_( + int unitCount, ObjCBlock_ffiVoid work) { + _lib._objc_msgSend_614( + _id, + _lib._sel_performAsCurrentWithPendingUnitCount_usingBlock_1, + unitCount, + work._id); + } + + void resignCurrent() { + _lib._objc_msgSend_1(_id, _lib._sel_resignCurrent1); + } + + void addChild_withPendingUnitCount_(NSProgress? child, int inUnitCount) { + _lib._objc_msgSend_615(_id, _lib._sel_addChild_withPendingUnitCount_1, + child?._id ?? ffi.nullptr, inUnitCount); + } + + int get totalUnitCount { + return _lib._objc_msgSend_616(_id, _lib._sel_totalUnitCount1); + } + + set totalUnitCount(int value) { + return _lib._objc_msgSend_617(_id, _lib._sel_setTotalUnitCount_1, value); + } + + int get completedUnitCount { + return _lib._objc_msgSend_616(_id, _lib._sel_completedUnitCount1); + } + + set completedUnitCount(int value) { + return _lib._objc_msgSend_617( + _id, _lib._sel_setCompletedUnitCount_1, value); + } + + NSString? get localizedDescription { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_localizedDescription1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set localizedDescription(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setLocalizedDescription_1, value?._id ?? ffi.nullptr); + } + + NSString? get localizedAdditionalDescription { + final _ret = + _lib._objc_msgSend_20(_id, _lib._sel_localizedAdditionalDescription1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set localizedAdditionalDescription(NSString? value) { + return _lib._objc_msgSend_509( + _id, + _lib._sel_setLocalizedAdditionalDescription_1, + value?._id ?? ffi.nullptr); + } + + bool get cancellable { + return _lib._objc_msgSend_12(_id, _lib._sel_isCancellable1); + } + + set cancellable(bool value) { + return _lib._objc_msgSend_492(_id, _lib._sel_setCancellable_1, value); + } + + bool get pausable { + return _lib._objc_msgSend_12(_id, _lib._sel_isPausable1); + } + + set pausable(bool value) { + return _lib._objc_msgSend_492(_id, _lib._sel_setPausable_1, value); + } + + bool get cancelled { + return _lib._objc_msgSend_12(_id, _lib._sel_isCancelled1); + } + + bool get paused { + return _lib._objc_msgSend_12(_id, _lib._sel_isPaused1); + } + + ObjCBlock_ffiVoid get cancellationHandler { + final _ret = _lib._objc_msgSend_618(_id, _lib._sel_cancellationHandler1); + return ObjCBlock_ffiVoid._(_ret, _lib); + } + + set cancellationHandler(ObjCBlock_ffiVoid value) { + return _lib._objc_msgSend_619( + _id, _lib._sel_setCancellationHandler_1, value._id); + } + + ObjCBlock_ffiVoid get pausingHandler { + final _ret = _lib._objc_msgSend_618(_id, _lib._sel_pausingHandler1); + return ObjCBlock_ffiVoid._(_ret, _lib); + } + + set pausingHandler(ObjCBlock_ffiVoid value) { + return _lib._objc_msgSend_619( + _id, _lib._sel_setPausingHandler_1, value._id); + } + + ObjCBlock_ffiVoid get resumingHandler { + final _ret = _lib._objc_msgSend_618(_id, _lib._sel_resumingHandler1); + return ObjCBlock_ffiVoid._(_ret, _lib); + } + + set resumingHandler(ObjCBlock_ffiVoid value) { + return _lib._objc_msgSend_619( + _id, _lib._sel_setResumingHandler_1, value._id); + } + + void setUserInfoObject_forKey_(NSObject objectOrNil, NSString key) { + _lib._objc_msgSend_126( + _id, _lib._sel_setUserInfoObject_forKey_1, objectOrNil._id, key._id); + } + + bool get indeterminate { + return _lib._objc_msgSend_12(_id, _lib._sel_isIndeterminate1); + } + + double get fractionCompleted { + return _lib._objc_msgSend_155(_id, _lib._sel_fractionCompleted1); + } + + bool get finished { + return _lib._objc_msgSend_12(_id, _lib._sel_isFinished1); + } + + void cancel() { + _lib._objc_msgSend_1(_id, _lib._sel_cancel1); + } + + void pause() { + _lib._objc_msgSend_1(_id, _lib._sel_pause1); + } + + void resume() { + _lib._objc_msgSend_1(_id, _lib._sel_resume1); + } + + NSObject? get userInfo { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_userInfo1); + return _ret.address == 0 + ? null + : NSObject._(_ret, _lib, retain: true, release: true); + } + + NSString get kind { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_kind1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + set kind(NSString value) { + return _lib._objc_msgSend_509(_id, _lib._sel_setKind_1, value._id); + } + + NSNumber? get estimatedTimeRemaining { + final _ret = _lib._objc_msgSend_198(_id, _lib._sel_estimatedTimeRemaining1); + return _ret.address == 0 + ? null + : NSNumber._(_ret, _lib, retain: true, release: true); + } + + set estimatedTimeRemaining(NSNumber? value) { + return _lib._objc_msgSend_620( + _id, _lib._sel_setEstimatedTimeRemaining_1, value?._id ?? ffi.nullptr); + } + + NSNumber? get throughput { + final _ret = _lib._objc_msgSend_198(_id, _lib._sel_throughput1); + return _ret.address == 0 + ? null + : NSNumber._(_ret, _lib, retain: true, release: true); + } + + set throughput(NSNumber? value) { + return _lib._objc_msgSend_620( + _id, _lib._sel_setThroughput_1, value?._id ?? ffi.nullptr); + } + + NSString get fileOperationKind { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_fileOperationKind1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + set fileOperationKind(NSString value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setFileOperationKind_1, value._id); + } + + NSURL? get fileURL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_fileURL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + set fileURL(NSURL? value) { + return _lib._objc_msgSend_621( + _id, _lib._sel_setFileURL_1, value?._id ?? ffi.nullptr); + } + + NSNumber? get fileTotalCount { + final _ret = _lib._objc_msgSend_198(_id, _lib._sel_fileTotalCount1); + return _ret.address == 0 + ? null + : NSNumber._(_ret, _lib, retain: true, release: true); + } + + set fileTotalCount(NSNumber? value) { + return _lib._objc_msgSend_620( + _id, _lib._sel_setFileTotalCount_1, value?._id ?? ffi.nullptr); + } + + NSNumber? get fileCompletedCount { + final _ret = _lib._objc_msgSend_198(_id, _lib._sel_fileCompletedCount1); + return _ret.address == 0 + ? null + : NSNumber._(_ret, _lib, retain: true, release: true); + } + + set fileCompletedCount(NSNumber? value) { + return _lib._objc_msgSend_620( + _id, _lib._sel_setFileCompletedCount_1, value?._id ?? ffi.nullptr); + } + + void publish() { + _lib._objc_msgSend_1(_id, _lib._sel_publish1); + } + + void unpublish() { + _lib._objc_msgSend_1(_id, _lib._sel_unpublish1); + } + + static NSObject addSubscriberForFileURL_withPublishingHandler_( + SentryCocoa _lib, + NSURL? url, + ObjCBlock_ffiVoid_NSProgress publishingHandler) { + final _ret = _lib._objc_msgSend_622( + _lib._class_NSProgress1, + _lib._sel_addSubscriberForFileURL_withPublishingHandler_1, + url?._id ?? ffi.nullptr, + publishingHandler._id); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static void removeSubscriber_(SentryCocoa _lib, NSObject subscriber) { + _lib._objc_msgSend_15( + _lib._class_NSProgress1, _lib._sel_removeSubscriber_1, subscriber._id); + } + + bool get old { + return _lib._objc_msgSend_12(_id, _lib._sel_isOld1); + } + + @override + NSProgress init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSProgress._(_ret, _lib, retain: true, release: true); + } + + static NSProgress new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSProgress1, _lib._sel_new1); + return NSProgress._(_ret, _lib, retain: false, release: true); + } + + static NSProgress allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSProgress1, _lib._sel_allocWithZone_1, zone); + return NSProgress._(_ret, _lib, retain: false, release: true); + } + + static NSProgress alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSProgress1, _lib._sel_alloc1); + return NSProgress._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSProgress1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSProgress1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSProgress1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSProgress1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSProgress1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSProgress1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSProgress1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSProgress1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSProgress1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +ffi.Pointer<_ObjCBlock> _ObjCBlock_ffiVoid_NSProgress_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Pointer<_ObjCBlock> Function(ffi.Pointer arg0)>>() + .asFunction< + ffi.Pointer<_ObjCBlock> Function( + ffi.Pointer arg0)>()(arg0); +} + +final _ObjCBlock_ffiVoid_NSProgress_closureRegistry = {}; +int _ObjCBlock_ffiVoid_NSProgress_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_NSProgress_registerClosure( + Function fn) { + final id = ++_ObjCBlock_ffiVoid_NSProgress_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSProgress_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +ffi.Pointer<_ObjCBlock> _ObjCBlock_ffiVoid_NSProgress_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return (_ObjCBlock_ffiVoid_NSProgress_closureRegistry[ + block.ref.target.address] + as ffi.Pointer<_ObjCBlock> Function(ffi.Pointer))(arg0); +} + +class ObjCBlock_ffiVoid_NSProgress extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSProgress._(ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSProgress.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer<_ObjCBlock> Function( + ffi.Pointer arg0)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Pointer<_ObjCBlock> Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_NSProgress_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSProgress.fromFunction(SentryCocoa lib, + ffi.Pointer<_ObjCBlock> Function(ffi.Pointer arg0) fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Pointer<_ObjCBlock> Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_NSProgress_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSProgress_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + ffi.Pointer<_ObjCBlock> call(ffi.Pointer arg0) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Pointer<_ObjCBlock> Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>>() + .asFunction< + ffi.Pointer<_ObjCBlock> Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>()(_id, arg0); + } +} + +void _ObjCBlock_ffiVoid_NSData_NSError_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + void Function(ffi.Pointer arg0, + ffi.Pointer arg1)>()(arg0, arg1); +} + +final _ObjCBlock_ffiVoid_NSData_NSError_closureRegistry = {}; +int _ObjCBlock_ffiVoid_NSData_NSError_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_NSData_NSError_registerClosure( + Function fn) { + final id = ++_ObjCBlock_ffiVoid_NSData_NSError_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSData_NSError_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSData_NSError_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return (_ObjCBlock_ffiVoid_NSData_NSError_closureRegistry[ + block.ref.target.address] + as void Function( + ffi.Pointer, ffi.Pointer))(arg0, arg1); +} + +class ObjCBlock_ffiVoid_NSData_NSError extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSData_NSError._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSData_NSError.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, + ffi.Pointer arg1)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_ffiVoid_NSData_NSError_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSData_NSError.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, ffi.Pointer arg1) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_ffiVoid_NSData_NSError_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSData_NSError_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0, ffi.Pointer arg1) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>()(_id, arg0, arg1); + } +} + +abstract class NSItemProviderFileOptions { + static const int NSItemProviderFileOptionOpenInPlace = 1; +} + +ffi.Pointer + _ObjCBlock_NSProgress_ffiVoidNSURLboolNSError_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer<_ObjCBlock> arg0) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer<_ObjCBlock> arg0)>>() + .asFunction< + ffi.Pointer Function( + ffi.Pointer<_ObjCBlock> arg0)>()(arg0); +} + +final _ObjCBlock_NSProgress_ffiVoidNSURLboolNSError_closureRegistry = + {}; +int _ObjCBlock_NSProgress_ffiVoidNSURLboolNSError_closureRegistryIndex = 0; +ffi.Pointer + _ObjCBlock_NSProgress_ffiVoidNSURLboolNSError_registerClosure(Function fn) { + final id = + ++_ObjCBlock_NSProgress_ffiVoidNSURLboolNSError_closureRegistryIndex; + _ObjCBlock_NSProgress_ffiVoidNSURLboolNSError_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +ffi.Pointer + _ObjCBlock_NSProgress_ffiVoidNSURLboolNSError_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer<_ObjCBlock> arg0) { + return (_ObjCBlock_NSProgress_ffiVoidNSURLboolNSError_closureRegistry[ + block.ref.target.address] + as ffi.Pointer Function(ffi.Pointer<_ObjCBlock>))(arg0); +} + +class ObjCBlock_NSProgress_ffiVoidNSURLboolNSError extends _ObjCBlockBase { + ObjCBlock_NSProgress_ffiVoidNSURLboolNSError._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_NSProgress_ffiVoidNSURLboolNSError.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer<_ObjCBlock> arg0)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Pointer Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer<_ObjCBlock> arg0)>( + _ObjCBlock_NSProgress_ffiVoidNSURLboolNSError_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_NSProgress_ffiVoidNSURLboolNSError.fromFunction(SentryCocoa lib, + ffi.Pointer Function(ffi.Pointer<_ObjCBlock> arg0) fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Pointer Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer<_ObjCBlock> arg0)>( + _ObjCBlock_NSProgress_ffiVoidNSURLboolNSError_closureTrampoline) + .cast(), + _ObjCBlock_NSProgress_ffiVoidNSURLboolNSError_registerClosure( + fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + ffi.Pointer call(ffi.Pointer<_ObjCBlock> arg0) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer<_ObjCBlock> arg0)>>() + .asFunction< + ffi.Pointer Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer<_ObjCBlock> arg0)>()(_id, arg0); + } +} + +void _ObjCBlock_ffiVoid_NSURL_bool_NSError_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + bool arg1, + ffi.Pointer arg2) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, ffi.Bool arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function(ffi.Pointer arg0, bool arg1, + ffi.Pointer arg2)>()(arg0, arg1, arg2); +} + +final _ObjCBlock_ffiVoid_NSURL_bool_NSError_closureRegistry = {}; +int _ObjCBlock_ffiVoid_NSURL_bool_NSError_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_NSURL_bool_NSError_registerClosure( + Function fn) { + final id = ++_ObjCBlock_ffiVoid_NSURL_bool_NSError_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSURL_bool_NSError_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSURL_bool_NSError_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + bool arg1, + ffi.Pointer arg2) { + return (_ObjCBlock_ffiVoid_NSURL_bool_NSError_closureRegistry[ + block.ref.target.address] + as void Function(ffi.Pointer, bool, + ffi.Pointer))(arg0, arg1, arg2); +} + +class ObjCBlock_ffiVoid_NSURL_bool_NSError extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSURL_bool_NSError._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSURL_bool_NSError.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, ffi.Bool arg1, + ffi.Pointer arg2)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Bool arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_NSURL_bool_NSError_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSURL_bool_NSError.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, bool arg1, + ffi.Pointer arg2) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Bool arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_NSURL_bool_NSError_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSURL_bool_NSError_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call( + ffi.Pointer arg0, bool arg1, ffi.Pointer arg2) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Bool arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + bool arg1, + ffi.Pointer arg2)>()(_id, arg0, arg1, arg2); + } +} + +void _ObjCBlock_ffiVoid_NSURL_NSError_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + void Function(ffi.Pointer arg0, + ffi.Pointer arg1)>()(arg0, arg1); +} + +final _ObjCBlock_ffiVoid_NSURL_NSError_closureRegistry = {}; +int _ObjCBlock_ffiVoid_NSURL_NSError_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_NSURL_NSError_registerClosure( + Function fn) { + final id = ++_ObjCBlock_ffiVoid_NSURL_NSError_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSURL_NSError_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSURL_NSError_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return (_ObjCBlock_ffiVoid_NSURL_NSError_closureRegistry[ + block.ref.target.address] + as void Function( + ffi.Pointer, ffi.Pointer))(arg0, arg1); +} + +class ObjCBlock_ffiVoid_NSURL_NSError extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSURL_NSError._(ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSURL_NSError.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, + ffi.Pointer arg1)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_ffiVoid_NSURL_NSError_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSURL_NSError.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, ffi.Pointer arg1) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_ffiVoid_NSURL_NSError_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSURL_NSError_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0, ffi.Pointer arg1) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>()(_id, arg0, arg1); + } +} + +ffi.Pointer + _ObjCBlock_NSProgress_ffiVoidObjCObjectNSError_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer<_ObjCBlock> arg0) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer<_ObjCBlock> arg0)>>() + .asFunction< + ffi.Pointer Function( + ffi.Pointer<_ObjCBlock> arg0)>()(arg0); +} + +final _ObjCBlock_NSProgress_ffiVoidObjCObjectNSError_closureRegistry = + {}; +int _ObjCBlock_NSProgress_ffiVoidObjCObjectNSError_closureRegistryIndex = 0; +ffi.Pointer + _ObjCBlock_NSProgress_ffiVoidObjCObjectNSError_registerClosure( + Function fn) { + final id = + ++_ObjCBlock_NSProgress_ffiVoidObjCObjectNSError_closureRegistryIndex; + _ObjCBlock_NSProgress_ffiVoidObjCObjectNSError_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +ffi.Pointer + _ObjCBlock_NSProgress_ffiVoidObjCObjectNSError_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer<_ObjCBlock> arg0) { + return (_ObjCBlock_NSProgress_ffiVoidObjCObjectNSError_closureRegistry[ + block.ref.target.address] + as ffi.Pointer Function(ffi.Pointer<_ObjCBlock>))(arg0); +} + +class ObjCBlock_NSProgress_ffiVoidObjCObjectNSError extends _ObjCBlockBase { + ObjCBlock_NSProgress_ffiVoidObjCObjectNSError._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_NSProgress_ffiVoidObjCObjectNSError.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer<_ObjCBlock> arg0)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Pointer Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer<_ObjCBlock> arg0)>( + _ObjCBlock_NSProgress_ffiVoidObjCObjectNSError_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_NSProgress_ffiVoidObjCObjectNSError.fromFunction(SentryCocoa lib, + ffi.Pointer Function(ffi.Pointer<_ObjCBlock> arg0) fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Pointer Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer<_ObjCBlock> arg0)>( + _ObjCBlock_NSProgress_ffiVoidObjCObjectNSError_closureTrampoline) + .cast(), + _ObjCBlock_NSProgress_ffiVoidObjCObjectNSError_registerClosure( + fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + ffi.Pointer call(ffi.Pointer<_ObjCBlock> arg0) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer<_ObjCBlock> arg0)>>() + .asFunction< + ffi.Pointer Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer<_ObjCBlock> arg0)>()(_id, arg0); + } +} + +void _ObjCBlock_ffiVoid_ObjCObject_NSError_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + void Function(ffi.Pointer arg0, + ffi.Pointer arg1)>()(arg0, arg1); +} + +final _ObjCBlock_ffiVoid_ObjCObject_NSError_closureRegistry = {}; +int _ObjCBlock_ffiVoid_ObjCObject_NSError_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_ObjCObject_NSError_registerClosure( + Function fn) { + final id = ++_ObjCBlock_ffiVoid_ObjCObject_NSError_closureRegistryIndex; + _ObjCBlock_ffiVoid_ObjCObject_NSError_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_ObjCObject_NSError_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return (_ObjCBlock_ffiVoid_ObjCObject_NSError_closureRegistry[ + block.ref.target.address] + as void Function( + ffi.Pointer, ffi.Pointer))(arg0, arg1); +} + +class ObjCBlock_ffiVoid_ObjCObject_NSError extends _ObjCBlockBase { + ObjCBlock_ffiVoid_ObjCObject_NSError._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_ObjCObject_NSError.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, + ffi.Pointer arg1)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_ffiVoid_ObjCObject_NSError_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_ObjCObject_NSError.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, ffi.Pointer arg1) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_ffiVoid_ObjCObject_NSError_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_ObjCObject_NSError_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0, ffi.Pointer arg1) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>()(_id, arg0, arg1); + } +} + +void + _ObjCBlock_ffiVoid_ffiVoidObjCObjectNSError_ObjCObject_NSDictionary_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer<_ObjCBlock> arg0, + ffi.Pointer arg1, + ffi.Pointer arg2) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>()(arg0, arg1, arg2); +} + +final _ObjCBlock_ffiVoid_ffiVoidObjCObjectNSError_ObjCObject_NSDictionary_closureRegistry = + {}; +int _ObjCBlock_ffiVoid_ffiVoidObjCObjectNSError_ObjCObject_NSDictionary_closureRegistryIndex = + 0; +ffi.Pointer + _ObjCBlock_ffiVoid_ffiVoidObjCObjectNSError_ObjCObject_NSDictionary_registerClosure( + Function fn) { + final id = + ++_ObjCBlock_ffiVoid_ffiVoidObjCObjectNSError_ObjCObject_NSDictionary_closureRegistryIndex; + _ObjCBlock_ffiVoid_ffiVoidObjCObjectNSError_ObjCObject_NSDictionary_closureRegistry[ + id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void + _ObjCBlock_ffiVoid_ffiVoidObjCObjectNSError_ObjCObject_NSDictionary_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer<_ObjCBlock> arg0, + ffi.Pointer arg1, + ffi.Pointer arg2) { + return (_ObjCBlock_ffiVoid_ffiVoidObjCObjectNSError_ObjCObject_NSDictionary_closureRegistry[ + block.ref.target.address] + as void Function(ffi.Pointer<_ObjCBlock>, ffi.Pointer, + ffi.Pointer))(arg0, arg1, arg2); +} + +class ObjCBlock_ffiVoid_ffiVoidObjCObjectNSError_ObjCObject_NSDictionary + extends _ObjCBlockBase { + ObjCBlock_ffiVoid_ffiVoidObjCObjectNSError_ObjCObject_NSDictionary._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_ffiVoidObjCObjectNSError_ObjCObject_NSDictionary.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer<_ObjCBlock> arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_ffiVoidObjCObjectNSError_ObjCObject_NSDictionary_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_ffiVoidObjCObjectNSError_ObjCObject_NSDictionary.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer<_ObjCBlock> arg0, ffi.Pointer arg1, + ffi.Pointer arg2) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer<_ObjCBlock> arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_ffiVoidObjCObjectNSError_ObjCObject_NSDictionary_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_ffiVoidObjCObjectNSError_ObjCObject_NSDictionary_registerClosure( + fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer<_ObjCBlock> arg0, ffi.Pointer arg1, + ffi.Pointer arg2) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer<_ObjCBlock> arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer<_ObjCBlock> arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>()(_id, arg0, arg1, arg2); + } +} + +class NSMutableString extends NSString { + NSMutableString._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSMutableString] that points to the same underlying object as [other]. + static NSMutableString castFrom(T other) { + return NSMutableString._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSMutableString] that wraps the given raw object pointer. + static NSMutableString castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSMutableString._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSMutableString]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSMutableString1); + } + + void replaceCharactersInRange_withString_(_NSRange range, NSString? aString) { + _lib._objc_msgSend_638(_id, _lib._sel_replaceCharactersInRange_withString_1, + range, aString?._id ?? ffi.nullptr); + } + + void insertString_atIndex_(NSString? aString, int loc) { + _lib._objc_msgSend_639(_id, _lib._sel_insertString_atIndex_1, + aString?._id ?? ffi.nullptr, loc); + } + + void deleteCharactersInRange_(_NSRange range) { + _lib._objc_msgSend_445(_id, _lib._sel_deleteCharactersInRange_1, range); + } + + void appendString_(NSString? aString) { + _lib._objc_msgSend_192( + _id, _lib._sel_appendString_1, aString?._id ?? ffi.nullptr); + } + + void appendFormat_(NSString? format) { + _lib._objc_msgSend_192( + _id, _lib._sel_appendFormat_1, format?._id ?? ffi.nullptr); + } + + void setString_(NSString? aString) { + _lib._objc_msgSend_192( + _id, _lib._sel_setString_1, aString?._id ?? ffi.nullptr); + } + + int replaceOccurrencesOfString_withString_options_range_(NSString? target, + NSString? replacement, int options, _NSRange searchRange) { + return _lib._objc_msgSend_640( + _id, + _lib._sel_replaceOccurrencesOfString_withString_options_range_1, + target?._id ?? ffi.nullptr, + replacement?._id ?? ffi.nullptr, + options, + searchRange); + } + + bool applyTransform_reverse_range_updatedRange_(NSString transform, + bool reverse, _NSRange range, ffi.Pointer<_NSRange> resultingRange) { + return _lib._objc_msgSend_641( + _id, + _lib._sel_applyTransform_reverse_range_updatedRange_1, + transform._id, + reverse, + range, + resultingRange); + } + + NSMutableString initWithCapacity_(int capacity) { + final _ret = + _lib._objc_msgSend_642(_id, _lib._sel_initWithCapacity_1, capacity); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + static NSMutableString stringWithCapacity_(SentryCocoa _lib, int capacity) { + final _ret = _lib._objc_msgSend_642( + _lib._class_NSMutableString1, _lib._sel_stringWithCapacity_1, capacity); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableString init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableString initWithCoder_(NSCoder? coder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + static ffi.Pointer getAvailableStringEncodings( + SentryCocoa _lib) { + return _lib._objc_msgSend_333( + _lib._class_NSMutableString1, _lib._sel_availableStringEncodings1); + } + + static NSString localizedNameOfStringEncoding_( + SentryCocoa _lib, int encoding) { + final _ret = _lib._objc_msgSend_308(_lib._class_NSMutableString1, + _lib._sel_localizedNameOfStringEncoding_1, encoding); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static int getDefaultCStringEncoding(SentryCocoa _lib) { + return _lib._objc_msgSend_10( + _lib._class_NSMutableString1, _lib._sel_defaultCStringEncoding1); + } + + @override + NSMutableString initWithCharactersNoCopy_length_freeWhenDone_( + ffi.Pointer characters, int length, bool freeBuffer) { + final _ret = _lib._objc_msgSend_344( + _id, + _lib._sel_initWithCharactersNoCopy_length_freeWhenDone_1, + characters, + length, + freeBuffer); + return NSMutableString._(_ret, _lib, retain: false, release: true); + } + + @override + NSMutableString initWithCharactersNoCopy_length_deallocator_( + ffi.Pointer chars, + int len, + ObjCBlock_ffiVoid_ffiUnsignedShort_ffiUnsignedLong deallocator) { + final _ret = _lib._objc_msgSend_345( + _id, + _lib._sel_initWithCharactersNoCopy_length_deallocator_1, + chars, + len, + deallocator._id); + return NSMutableString._(_ret, _lib, retain: false, release: true); + } + + @override + NSMutableString initWithCharacters_length_( + ffi.Pointer characters, int length) { + final _ret = _lib._objc_msgSend_346( + _id, _lib._sel_initWithCharacters_length_1, characters, length); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableString initWithUTF8String_( + ffi.Pointer nullTerminatedCString) { + final _ret = _lib._objc_msgSend_347( + _id, _lib._sel_initWithUTF8String_1, nullTerminatedCString); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableString initWithString_(NSString? aString) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithString_1, aString?._id ?? ffi.nullptr); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableString initWithFormat_(NSString? format) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithFormat_1, format?._id ?? ffi.nullptr); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableString initWithFormat_arguments_( + NSString? format, ffi.Pointer<__va_list_tag> argList) { + final _ret = _lib._objc_msgSend_348( + _id, + _lib._sel_initWithFormat_arguments_1, + format?._id ?? ffi.nullptr, + argList); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableString initWithFormat_locale_(NSString? format, NSObject locale) { + final _ret = _lib._objc_msgSend_163(_id, _lib._sel_initWithFormat_locale_1, + format?._id ?? ffi.nullptr, locale._id); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableString initWithFormat_locale_arguments_( + NSString? format, NSObject locale, ffi.Pointer<__va_list_tag> argList) { + final _ret = _lib._objc_msgSend_349( + _id, + _lib._sel_initWithFormat_locale_arguments_1, + format?._id ?? ffi.nullptr, + locale._id, + argList); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableString initWithValidatedFormat_validFormatSpecifiers_error_( + NSString? format, + NSString? validFormatSpecifiers, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_350( + _id, + _lib._sel_initWithValidatedFormat_validFormatSpecifiers_error_1, + format?._id ?? ffi.nullptr, + validFormatSpecifiers?._id ?? ffi.nullptr, + error); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableString initWithValidatedFormat_validFormatSpecifiers_locale_error_( + NSString? format, + NSString? validFormatSpecifiers, + NSObject locale, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_351( + _id, + _lib._sel_initWithValidatedFormat_validFormatSpecifiers_locale_error_1, + format?._id ?? ffi.nullptr, + validFormatSpecifiers?._id ?? ffi.nullptr, + locale._id, + error); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableString + initWithValidatedFormat_validFormatSpecifiers_arguments_error_( + NSString? format, + NSString? validFormatSpecifiers, + ffi.Pointer<__va_list_tag> argList, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_352( + _id, + _lib._sel_initWithValidatedFormat_validFormatSpecifiers_arguments_error_1, + format?._id ?? ffi.nullptr, + validFormatSpecifiers?._id ?? ffi.nullptr, + argList, + error); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableString + initWithValidatedFormat_validFormatSpecifiers_locale_arguments_error_( + NSString? format, + NSString? validFormatSpecifiers, + NSObject locale, + ffi.Pointer<__va_list_tag> argList, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_353( + _id, + _lib._sel_initWithValidatedFormat_validFormatSpecifiers_locale_arguments_error_1, + format?._id ?? ffi.nullptr, + validFormatSpecifiers?._id ?? ffi.nullptr, + locale._id, + argList, + error); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableString initWithData_encoding_(NSData? data, int encoding) { + final _ret = _lib._objc_msgSend_354(_id, _lib._sel_initWithData_encoding_1, + data?._id ?? ffi.nullptr, encoding); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableString initWithBytes_length_encoding_( + ffi.Pointer bytes, int len, int encoding) { + final _ret = _lib._objc_msgSend_355( + _id, _lib._sel_initWithBytes_length_encoding_1, bytes, len, encoding); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableString initWithBytesNoCopy_length_encoding_freeWhenDone_( + ffi.Pointer bytes, int len, int encoding, bool freeBuffer) { + final _ret = _lib._objc_msgSend_356( + _id, + _lib._sel_initWithBytesNoCopy_length_encoding_freeWhenDone_1, + bytes, + len, + encoding, + freeBuffer); + return NSMutableString._(_ret, _lib, retain: false, release: true); + } + + @override + NSMutableString initWithBytesNoCopy_length_encoding_deallocator_( + ffi.Pointer bytes, + int len, + int encoding, + ObjCBlock_ffiVoid_ffiVoid_ffiUnsignedLong deallocator) { + final _ret = _lib._objc_msgSend_357( + _id, + _lib._sel_initWithBytesNoCopy_length_encoding_deallocator_1, + bytes, + len, + encoding, + deallocator._id); + return NSMutableString._(_ret, _lib, retain: false, release: true); + } + + static NSMutableString string(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSMutableString1, _lib._sel_string1); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + static NSMutableString stringWithString_(SentryCocoa _lib, NSString? string) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSMutableString1, + _lib._sel_stringWithString_1, string?._id ?? ffi.nullptr); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + static NSMutableString stringWithCharacters_length_( + SentryCocoa _lib, ffi.Pointer characters, int length) { + final _ret = _lib._objc_msgSend_346(_lib._class_NSMutableString1, + _lib._sel_stringWithCharacters_length_1, characters, length); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + static NSMutableString stringWithUTF8String_( + SentryCocoa _lib, ffi.Pointer nullTerminatedCString) { + final _ret = _lib._objc_msgSend_347(_lib._class_NSMutableString1, + _lib._sel_stringWithUTF8String_1, nullTerminatedCString); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + static NSMutableString stringWithFormat_(SentryCocoa _lib, NSString? format) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSMutableString1, + _lib._sel_stringWithFormat_1, format?._id ?? ffi.nullptr); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + static NSMutableString localizedStringWithFormat_( + SentryCocoa _lib, NSString? format) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSMutableString1, + _lib._sel_localizedStringWithFormat_1, format?._id ?? ffi.nullptr); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + static NSMutableString stringWithValidatedFormat_validFormatSpecifiers_error_( + SentryCocoa _lib, + NSString? format, + NSString? validFormatSpecifiers, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_350( + _lib._class_NSMutableString1, + _lib._sel_stringWithValidatedFormat_validFormatSpecifiers_error_1, + format?._id ?? ffi.nullptr, + validFormatSpecifiers?._id ?? ffi.nullptr, + error); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + static NSMutableString + localizedStringWithValidatedFormat_validFormatSpecifiers_error_( + SentryCocoa _lib, + NSString? format, + NSString? validFormatSpecifiers, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_350( + _lib._class_NSMutableString1, + _lib._sel_localizedStringWithValidatedFormat_validFormatSpecifiers_error_1, + format?._id ?? ffi.nullptr, + validFormatSpecifiers?._id ?? ffi.nullptr, + error); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableString initWithCString_encoding_( + ffi.Pointer nullTerminatedCString, int encoding) { + final _ret = _lib._objc_msgSend_358(_id, + _lib._sel_initWithCString_encoding_1, nullTerminatedCString, encoding); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + static NSMutableString stringWithCString_encoding_( + SentryCocoa _lib, ffi.Pointer cString, int enc) { + final _ret = _lib._objc_msgSend_358(_lib._class_NSMutableString1, + _lib._sel_stringWithCString_encoding_1, cString, enc); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableString initWithContentsOfURL_encoding_error_( + NSURL? url, int enc, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_359( + _id, + _lib._sel_initWithContentsOfURL_encoding_error_1, + url?._id ?? ffi.nullptr, + enc, + error); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableString initWithContentsOfFile_encoding_error_( + NSString? path, int enc, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_360( + _id, + _lib._sel_initWithContentsOfFile_encoding_error_1, + path?._id ?? ffi.nullptr, + enc, + error); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + static NSMutableString stringWithContentsOfURL_encoding_error_( + SentryCocoa _lib, + NSURL? url, + int enc, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_359( + _lib._class_NSMutableString1, + _lib._sel_stringWithContentsOfURL_encoding_error_1, + url?._id ?? ffi.nullptr, + enc, + error); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + static NSMutableString stringWithContentsOfFile_encoding_error_( + SentryCocoa _lib, + NSString? path, + int enc, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_360( + _lib._class_NSMutableString1, + _lib._sel_stringWithContentsOfFile_encoding_error_1, + path?._id ?? ffi.nullptr, + enc, + error); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableString initWithContentsOfURL_usedEncoding_error_( + NSURL? url, + ffi.Pointer enc, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_361( + _id, + _lib._sel_initWithContentsOfURL_usedEncoding_error_1, + url?._id ?? ffi.nullptr, + enc, + error); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableString initWithContentsOfFile_usedEncoding_error_( + NSString? path, + ffi.Pointer enc, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_362( + _id, + _lib._sel_initWithContentsOfFile_usedEncoding_error_1, + path?._id ?? ffi.nullptr, + enc, + error); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + static NSMutableString stringWithContentsOfURL_usedEncoding_error_( + SentryCocoa _lib, + NSURL? url, + ffi.Pointer enc, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_361( + _lib._class_NSMutableString1, + _lib._sel_stringWithContentsOfURL_usedEncoding_error_1, + url?._id ?? ffi.nullptr, + enc, + error); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + static NSMutableString stringWithContentsOfFile_usedEncoding_error_( + SentryCocoa _lib, + NSString? path, + ffi.Pointer enc, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_362( + _lib._class_NSMutableString1, + _lib._sel_stringWithContentsOfFile_usedEncoding_error_1, + path?._id ?? ffi.nullptr, + enc, + error); + return NSMutableString._(_ret, _lib, retain: true, release: true); + } + + static int + stringEncodingForData_encodingOptions_convertedString_usedLossyConversion_( + SentryCocoa _lib, + NSData? data, + NSDictionary? opts, + ffi.Pointer> string, + ffi.Pointer usedLossyConversion) { + return _lib._objc_msgSend_363( + _lib._class_NSMutableString1, + _lib._sel_stringEncodingForData_encodingOptions_convertedString_usedLossyConversion_1, + data?._id ?? ffi.nullptr, + opts?._id ?? ffi.nullptr, + string, + usedLossyConversion); + } + + static NSObject stringWithContentsOfFile_(SentryCocoa _lib, NSString? path) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSMutableString1, + _lib._sel_stringWithContentsOfFile_1, path?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject stringWithContentsOfURL_(SentryCocoa _lib, NSURL? url) { + final _ret = _lib._objc_msgSend_241(_lib._class_NSMutableString1, + _lib._sel_stringWithContentsOfURL_1, url?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject stringWithCString_length_( + SentryCocoa _lib, ffi.Pointer bytes, int length) { + final _ret = _lib._objc_msgSend_358(_lib._class_NSMutableString1, + _lib._sel_stringWithCString_length_1, bytes, length); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject stringWithCString_( + SentryCocoa _lib, ffi.Pointer bytes) { + final _ret = _lib._objc_msgSend_347( + _lib._class_NSMutableString1, _lib._sel_stringWithCString_1, bytes); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSString pathWithComponents_(SentryCocoa _lib, NSArray? components) { + final _ret = _lib._objc_msgSend_369(_lib._class_NSMutableString1, + _lib._sel_pathWithComponents_1, components?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSMutableString new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSMutableString1, _lib._sel_new1); + return NSMutableString._(_ret, _lib, retain: false, release: true); + } + + static NSMutableString allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSMutableString1, _lib._sel_allocWithZone_1, zone); + return NSMutableString._(_ret, _lib, retain: false, release: true); + } + + static NSMutableString alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSMutableString1, _lib._sel_alloc1); + return NSMutableString._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSMutableString1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSMutableString1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSMutableString1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSMutableString1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSMutableString1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSMutableString1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSMutableString1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSMutableString1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSMutableString1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSNotification extends NSObject { + NSNotification._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSNotification] that points to the same underlying object as [other]. + static NSNotification castFrom(T other) { + return NSNotification._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSNotification] that wraps the given raw object pointer. + static NSNotification castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSNotification._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSNotification]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSNotification1); + } + + NSString get name { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSObject get object { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_object1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSDictionary? get userInfo { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_userInfo1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSNotification initWithName_object_userInfo_( + NSString name, NSObject object, NSDictionary? userInfo) { + final _ret = _lib._objc_msgSend_643( + _id, + _lib._sel_initWithName_object_userInfo_1, + name._id, + object._id, + userInfo?._id ?? ffi.nullptr); + return NSNotification._(_ret, _lib, retain: true, release: true); + } + + NSNotification initWithCoder_(NSCoder? coder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr); + return NSNotification._(_ret, _lib, retain: true, release: true); + } + + static NSNotification notificationWithName_object_( + SentryCocoa _lib, NSString aName, NSObject anObject) { + final _ret = _lib._objc_msgSend_163(_lib._class_NSNotification1, + _lib._sel_notificationWithName_object_1, aName._id, anObject._id); + return NSNotification._(_ret, _lib, retain: true, release: true); + } + + static NSNotification notificationWithName_object_userInfo_(SentryCocoa _lib, + NSString aName, NSObject anObject, NSDictionary? aUserInfo) { + final _ret = _lib._objc_msgSend_643( + _lib._class_NSNotification1, + _lib._sel_notificationWithName_object_userInfo_1, + aName._id, + anObject._id, + aUserInfo?._id ?? ffi.nullptr); + return NSNotification._(_ret, _lib, retain: true, release: true); + } + + @override + NSNotification init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSNotification._(_ret, _lib, retain: true, release: true); + } + + static NSNotification new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSNotification1, _lib._sel_new1); + return NSNotification._(_ret, _lib, retain: false, release: true); + } + + static NSNotification allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSNotification1, _lib._sel_allocWithZone_1, zone); + return NSNotification._(_ret, _lib, retain: false, release: true); + } + + static NSNotification alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSNotification1, _lib._sel_alloc1); + return NSNotification._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSNotification1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSNotification1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSNotification1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSNotification1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSNotification1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSNotification1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSNotification1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSNotification1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSNotification1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSBundle extends NSObject { + NSBundle._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSBundle] that points to the same underlying object as [other]. + static NSBundle castFrom(T other) { + return NSBundle._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSBundle] that wraps the given raw object pointer. + static NSBundle castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSBundle._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSBundle]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSBundle1); + } + + static NSBundle? getMainBundle(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_644(_lib._class_NSBundle1, _lib._sel_mainBundle1); + return _ret.address == 0 + ? null + : NSBundle._(_ret, _lib, retain: true, release: true); + } + + static NSBundle bundleWithPath_(SentryCocoa _lib, NSString? path) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSBundle1, + _lib._sel_bundleWithPath_1, path?._id ?? ffi.nullptr); + return NSBundle._(_ret, _lib, retain: true, release: true); + } + + NSBundle initWithPath_(NSString? path) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithPath_1, path?._id ?? ffi.nullptr); + return NSBundle._(_ret, _lib, retain: true, release: true); + } + + static NSBundle bundleWithURL_(SentryCocoa _lib, NSURL? url) { + final _ret = _lib._objc_msgSend_241(_lib._class_NSBundle1, + _lib._sel_bundleWithURL_1, url?._id ?? ffi.nullptr); + return NSBundle._(_ret, _lib, retain: true, release: true); + } + + NSBundle initWithURL_(NSURL? url) { + final _ret = _lib._objc_msgSend_241( + _id, _lib._sel_initWithURL_1, url?._id ?? ffi.nullptr); + return NSBundle._(_ret, _lib, retain: true, release: true); + } + + static NSBundle bundleForClass_(SentryCocoa _lib, NSObject aClass) { + final _ret = _lib._objc_msgSend_645( + _lib._class_NSBundle1, _lib._sel_bundleForClass_1, aClass._id); + return NSBundle._(_ret, _lib, retain: true, release: true); + } + + static NSBundle bundleWithIdentifier_( + SentryCocoa _lib, NSString? identifier) { + final _ret = _lib._objc_msgSend_646(_lib._class_NSBundle1, + _lib._sel_bundleWithIdentifier_1, identifier?._id ?? ffi.nullptr); + return NSBundle._(_ret, _lib, retain: true, release: true); + } + + static NSArray? getAllBundles(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_79(_lib._class_NSBundle1, _lib._sel_allBundles1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSArray? getAllFrameworks(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_79(_lib._class_NSBundle1, _lib._sel_allFrameworks1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + bool load() { + return _lib._objc_msgSend_12(_id, _lib._sel_load1); + } + + bool get loaded { + return _lib._objc_msgSend_12(_id, _lib._sel_isLoaded1); + } + + bool unload() { + return _lib._objc_msgSend_12(_id, _lib._sel_unload1); + } + + bool preflightAndReturnError_(ffi.Pointer> error) { + return _lib._objc_msgSend_225( + _id, _lib._sel_preflightAndReturnError_1, error); + } + + bool loadAndReturnError_(ffi.Pointer> error) { + return _lib._objc_msgSend_225(_id, _lib._sel_loadAndReturnError_1, error); + } + + NSURL? get bundleURL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_bundleURL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL? get resourceURL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_resourceURL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL? get executableURL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_executableURL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL URLForAuxiliaryExecutable_(NSString? executableName) { + final _ret = _lib._objc_msgSend_34( + _id, + _lib._sel_URLForAuxiliaryExecutable_1, + executableName?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL? get privateFrameworksURL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_privateFrameworksURL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL? get sharedFrameworksURL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_sharedFrameworksURL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL? get sharedSupportURL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_sharedSupportURL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL? get builtInPlugInsURL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_builtInPlugInsURL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL? get appStoreReceiptURL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_appStoreReceiptURL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + NSString? get bundlePath { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_bundlePath1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get resourcePath { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_resourcePath1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get executablePath { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_executablePath1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString pathForAuxiliaryExecutable_(NSString? executableName) { + final _ret = _lib._objc_msgSend_64( + _id, + _lib._sel_pathForAuxiliaryExecutable_1, + executableName?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get privateFrameworksPath { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_privateFrameworksPath1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get sharedFrameworksPath { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_sharedFrameworksPath1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get sharedSupportPath { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_sharedSupportPath1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get builtInPlugInsPath { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_builtInPlugInsPath1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + static NSURL URLForResource_withExtension_subdirectory_inBundleWithURL_( + SentryCocoa _lib, + NSString? name, + NSString? ext, + NSString? subpath, + NSURL? bundleURL) { + final _ret = _lib._objc_msgSend_647( + _lib._class_NSBundle1, + _lib._sel_URLForResource_withExtension_subdirectory_inBundleWithURL_1, + name?._id ?? ffi.nullptr, + ext?._id ?? ffi.nullptr, + subpath?._id ?? ffi.nullptr, + bundleURL?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + static NSArray URLsForResourcesWithExtension_subdirectory_inBundleWithURL_( + SentryCocoa _lib, NSString? ext, NSString? subpath, NSURL? bundleURL) { + final _ret = _lib._objc_msgSend_648( + _lib._class_NSBundle1, + _lib._sel_URLsForResourcesWithExtension_subdirectory_inBundleWithURL_1, + ext?._id ?? ffi.nullptr, + subpath?._id ?? ffi.nullptr, + bundleURL?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSURL URLForResource_withExtension_(NSString? name, NSString? ext) { + final _ret = _lib._objc_msgSend_649( + _id, + _lib._sel_URLForResource_withExtension_1, + name?._id ?? ffi.nullptr, + ext?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL URLForResource_withExtension_subdirectory_( + NSString? name, NSString? ext, NSString? subpath) { + final _ret = _lib._objc_msgSend_650( + _id, + _lib._sel_URLForResource_withExtension_subdirectory_1, + name?._id ?? ffi.nullptr, + ext?._id ?? ffi.nullptr, + subpath?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSURL URLForResource_withExtension_subdirectory_localization_(NSString? name, + NSString? ext, NSString? subpath, NSString? localizationName) { + final _ret = _lib._objc_msgSend_651( + _id, + _lib._sel_URLForResource_withExtension_subdirectory_localization_1, + name?._id ?? ffi.nullptr, + ext?._id ?? ffi.nullptr, + subpath?._id ?? ffi.nullptr, + localizationName?._id ?? ffi.nullptr); + return NSURL._(_ret, _lib, retain: true, release: true); + } + + NSArray URLsForResourcesWithExtension_subdirectory_( + NSString? ext, NSString? subpath) { + final _ret = _lib._objc_msgSend_652( + _id, + _lib._sel_URLsForResourcesWithExtension_subdirectory_1, + ext?._id ?? ffi.nullptr, + subpath?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray URLsForResourcesWithExtension_subdirectory_localization_( + NSString? ext, NSString? subpath, NSString? localizationName) { + final _ret = _lib._objc_msgSend_653( + _id, + _lib._sel_URLsForResourcesWithExtension_subdirectory_localization_1, + ext?._id ?? ffi.nullptr, + subpath?._id ?? ffi.nullptr, + localizationName?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSString pathForResource_ofType_inDirectory_( + SentryCocoa _lib, NSString? name, NSString? ext, NSString? bundlePath) { + final _ret = _lib._objc_msgSend_654( + _lib._class_NSBundle1, + _lib._sel_pathForResource_ofType_inDirectory_1, + name?._id ?? ffi.nullptr, + ext?._id ?? ffi.nullptr, + bundlePath?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSArray pathsForResourcesOfType_inDirectory_( + SentryCocoa _lib, NSString? ext, NSString? bundlePath) { + final _ret = _lib._objc_msgSend_652( + _lib._class_NSBundle1, + _lib._sel_pathsForResourcesOfType_inDirectory_1, + ext?._id ?? ffi.nullptr, + bundlePath?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSString pathForResource_ofType_(NSString? name, NSString? ext) { + final _ret = _lib._objc_msgSend_339(_id, _lib._sel_pathForResource_ofType_1, + name?._id ?? ffi.nullptr, ext?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString pathForResource_ofType_inDirectory_forLocalization_(NSString? name, + NSString? ext, NSString? subpath, NSString? localizationName) { + final _ret = _lib._objc_msgSend_655( + _id, + _lib._sel_pathForResource_ofType_inDirectory_forLocalization_1, + name?._id ?? ffi.nullptr, + ext?._id ?? ffi.nullptr, + subpath?._id ?? ffi.nullptr, + localizationName?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSArray pathsForResourcesOfType_inDirectory_forLocalization_( + NSString? ext, NSString? subpath, NSString? localizationName) { + final _ret = _lib._objc_msgSend_653( + _id, + _lib._sel_pathsForResourcesOfType_inDirectory_forLocalization_1, + ext?._id ?? ffi.nullptr, + subpath?._id ?? ffi.nullptr, + localizationName?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSString localizedStringForKey_value_table_( + NSString? key, NSString? value, NSString? tableName) { + final _ret = _lib._objc_msgSend_654( + _id, + _lib._sel_localizedStringForKey_value_table_1, + key?._id ?? ffi.nullptr, + value?._id ?? ffi.nullptr, + tableName?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSAttributedString localizedAttributedStringForKey_value_table_( + NSString? key, NSString? value, NSString? tableName) { + final _ret = _lib._objc_msgSend_676( + _id, + _lib._sel_localizedAttributedStringForKey_value_table_1, + key?._id ?? ffi.nullptr, + value?._id ?? ffi.nullptr, + tableName?._id ?? ffi.nullptr); + return NSAttributedString._(_ret, _lib, retain: true, release: true); + } + + NSString? get bundleIdentifier { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_bundleIdentifier1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSDictionary? get infoDictionary { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_infoDictionary1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSDictionary? get localizedInfoDictionary { + final _ret = + _lib._objc_msgSend_170(_id, _lib._sel_localizedInfoDictionary1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSObject objectForInfoDictionaryKey_(NSString? key) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_objectForInfoDictionaryKey_1, key?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject classNamed_(NSString? className) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_classNamed_1, className?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject get principalClass { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_principalClass1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSArray? get preferredLocalizations { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_preferredLocalizations1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get localizations { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_localizations1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSString? get developmentLocalization { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_developmentLocalization1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + static NSArray preferredLocalizationsFromArray_( + SentryCocoa _lib, NSArray? localizationsArray) { + final _ret = _lib._objc_msgSend_63( + _lib._class_NSBundle1, + _lib._sel_preferredLocalizationsFromArray_1, + localizationsArray?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSArray preferredLocalizationsFromArray_forPreferences_( + SentryCocoa _lib, + NSArray? localizationsArray, + NSArray? preferencesArray) { + final _ret = _lib._objc_msgSend_677( + _lib._class_NSBundle1, + _lib._sel_preferredLocalizationsFromArray_forPreferences_1, + localizationsArray?._id ?? ffi.nullptr, + preferencesArray?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get executableArchitectures { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_executableArchitectures1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + void setPreservationPriority_forTags_(double priority, NSSet? tags) { + _lib._objc_msgSend_678(_id, _lib._sel_setPreservationPriority_forTags_1, + priority, tags?._id ?? ffi.nullptr); + } + + double preservationPriorityForTag_(NSString? tag) { + return _lib._objc_msgSend_284( + _id, _lib._sel_preservationPriorityForTag_1, tag?._id ?? ffi.nullptr); + } + + @override + NSBundle init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSBundle._(_ret, _lib, retain: true, release: true); + } + + static NSBundle new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSBundle1, _lib._sel_new1); + return NSBundle._(_ret, _lib, retain: false, release: true); + } + + static NSBundle allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSBundle1, _lib._sel_allocWithZone_1, zone); + return NSBundle._(_ret, _lib, retain: false, release: true); + } + + static NSBundle alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSBundle1, _lib._sel_alloc1); + return NSBundle._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSBundle1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSBundle1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSBundle1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSBundle1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSBundle1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSBundle1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSBundle1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSBundle1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSBundle1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSAttributedString extends NSObject { + NSAttributedString._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSAttributedString] that points to the same underlying object as [other]. + static NSAttributedString castFrom(T other) { + return NSAttributedString._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSAttributedString] that wraps the given raw object pointer. + static NSAttributedString castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSAttributedString._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSAttributedString]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSAttributedString1); + } + + NSString? get string { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_string1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSDictionary attributesAtIndex_effectiveRange_( + int location, ffi.Pointer<_NSRange> range) { + final _ret = _lib._objc_msgSend_656( + _id, _lib._sel_attributesAtIndex_effectiveRange_1, location, range); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + int get length { + return _lib._objc_msgSend_10(_id, _lib._sel_length1); + } + + NSObject attribute_atIndex_effectiveRange_( + NSString attrName, int location, ffi.Pointer<_NSRange> range) { + final _ret = _lib._objc_msgSend_657( + _id, + _lib._sel_attribute_atIndex_effectiveRange_1, + attrName._id, + location, + range); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSAttributedString attributedSubstringFromRange_(_NSRange range) { + final _ret = _lib._objc_msgSend_658( + _id, _lib._sel_attributedSubstringFromRange_1, range); + return NSAttributedString._(_ret, _lib, retain: true, release: true); + } + + NSDictionary attributesAtIndex_longestEffectiveRange_inRange_( + int location, ffi.Pointer<_NSRange> range, _NSRange rangeLimit) { + final _ret = _lib._objc_msgSend_659( + _id, + _lib._sel_attributesAtIndex_longestEffectiveRange_inRange_1, + location, + range, + rangeLimit); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSObject attribute_atIndex_longestEffectiveRange_inRange_(NSString attrName, + int location, ffi.Pointer<_NSRange> range, _NSRange rangeLimit) { + final _ret = _lib._objc_msgSend_660( + _id, + _lib._sel_attribute_atIndex_longestEffectiveRange_inRange_1, + attrName._id, + location, + range, + rangeLimit); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + bool isEqualToAttributedString_(NSAttributedString? other) { + return _lib._objc_msgSend_661( + _id, _lib._sel_isEqualToAttributedString_1, other?._id ?? ffi.nullptr); + } + + NSAttributedString initWithString_(NSString? str) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithString_1, str?._id ?? ffi.nullptr); + return NSAttributedString._(_ret, _lib, retain: true, release: true); + } + + NSAttributedString initWithString_attributes_( + NSString? str, NSDictionary? attrs) { + final _ret = _lib._objc_msgSend_371( + _id, + _lib._sel_initWithString_attributes_1, + str?._id ?? ffi.nullptr, + attrs?._id ?? ffi.nullptr); + return NSAttributedString._(_ret, _lib, retain: true, release: true); + } + + NSAttributedString initWithAttributedString_(NSAttributedString? attrStr) { + final _ret = _lib._objc_msgSend_662( + _id, _lib._sel_initWithAttributedString_1, attrStr?._id ?? ffi.nullptr); + return NSAttributedString._(_ret, _lib, retain: true, release: true); + } + + void enumerateAttributesInRange_options_usingBlock_(_NSRange enumerationRange, + int opts, ObjCBlock_ffiVoid_NSDictionary_NSRange_bool block) { + _lib._objc_msgSend_663( + _id, + _lib._sel_enumerateAttributesInRange_options_usingBlock_1, + enumerationRange, + opts, + block._id); + } + + void enumerateAttribute_inRange_options_usingBlock_( + NSString attrName, + _NSRange enumerationRange, + int opts, + ObjCBlock_ffiVoid_ObjCObject_NSRange_bool block) { + _lib._objc_msgSend_664( + _id, + _lib._sel_enumerateAttribute_inRange_options_usingBlock_1, + attrName._id, + enumerationRange, + opts, + block._id); + } + + NSAttributedString initWithContentsOfMarkdownFileAtURL_options_baseURL_error_( + NSURL? markdownFile, + NSAttributedStringMarkdownParsingOptions? options, + NSURL? baseURL, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_669( + _id, + _lib._sel_initWithContentsOfMarkdownFileAtURL_options_baseURL_error_1, + markdownFile?._id ?? ffi.nullptr, + options?._id ?? ffi.nullptr, + baseURL?._id ?? ffi.nullptr, + error); + return NSAttributedString._(_ret, _lib, retain: true, release: true); + } + + NSAttributedString initWithMarkdown_options_baseURL_error_( + NSData? markdown, + NSAttributedStringMarkdownParsingOptions? options, + NSURL? baseURL, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_670( + _id, + _lib._sel_initWithMarkdown_options_baseURL_error_1, + markdown?._id ?? ffi.nullptr, + options?._id ?? ffi.nullptr, + baseURL?._id ?? ffi.nullptr, + error); + return NSAttributedString._(_ret, _lib, retain: true, release: true); + } + + NSAttributedString initWithMarkdownString_options_baseURL_error_( + NSString? markdownString, + NSAttributedStringMarkdownParsingOptions? options, + NSURL? baseURL, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_671( + _id, + _lib._sel_initWithMarkdownString_options_baseURL_error_1, + markdownString?._id ?? ffi.nullptr, + options?._id ?? ffi.nullptr, + baseURL?._id ?? ffi.nullptr, + error); + return NSAttributedString._(_ret, _lib, retain: true, release: true); + } + + NSAttributedString initWithFormat_options_locale_( + NSAttributedString? format, int options, NSLocale? locale) { + final _ret = _lib._objc_msgSend_672( + _id, + _lib._sel_initWithFormat_options_locale_1, + format?._id ?? ffi.nullptr, + options, + locale?._id ?? ffi.nullptr); + return NSAttributedString._(_ret, _lib, retain: true, release: true); + } + + NSAttributedString initWithFormat_options_locale_arguments_( + NSAttributedString? format, + int options, + NSLocale? locale, + ffi.Pointer<__va_list_tag> arguments) { + final _ret = _lib._objc_msgSend_673( + _id, + _lib._sel_initWithFormat_options_locale_arguments_1, + format?._id ?? ffi.nullptr, + options, + locale?._id ?? ffi.nullptr, + arguments); + return NSAttributedString._(_ret, _lib, retain: true, release: true); + } + + static NSAttributedString localizedAttributedStringWithFormat_( + SentryCocoa _lib, NSAttributedString? format) { + final _ret = _lib._objc_msgSend_662( + _lib._class_NSAttributedString1, + _lib._sel_localizedAttributedStringWithFormat_1, + format?._id ?? ffi.nullptr); + return NSAttributedString._(_ret, _lib, retain: true, release: true); + } + + static NSAttributedString localizedAttributedStringWithFormat_options_( + SentryCocoa _lib, NSAttributedString? format, int options) { + final _ret = _lib._objc_msgSend_674( + _lib._class_NSAttributedString1, + _lib._sel_localizedAttributedStringWithFormat_options_1, + format?._id ?? ffi.nullptr, + options); + return NSAttributedString._(_ret, _lib, retain: true, release: true); + } + + NSAttributedString attributedStringByInflectingString() { + final _ret = _lib._objc_msgSend_675( + _id, _lib._sel_attributedStringByInflectingString1); + return NSAttributedString._(_ret, _lib, retain: true, release: true); + } + + @override + NSAttributedString init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSAttributedString._(_ret, _lib, retain: true, release: true); + } + + static NSAttributedString new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSAttributedString1, _lib._sel_new1); + return NSAttributedString._(_ret, _lib, retain: false, release: true); + } + + static NSAttributedString allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSAttributedString1, _lib._sel_allocWithZone_1, zone); + return NSAttributedString._(_ret, _lib, retain: false, release: true); + } + + static NSAttributedString alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSAttributedString1, _lib._sel_alloc1); + return NSAttributedString._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSAttributedString1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSAttributedString1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSAttributedString1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSAttributedString1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSAttributedString1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSAttributedString1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSAttributedString1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSAttributedString1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSAttributedString1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSAttributedStringEnumerationOptions { + static const int NSAttributedStringEnumerationReverse = 2; + static const int + NSAttributedStringEnumerationLongestEffectiveRangeNotRequired = 1048576; +} + +void _ObjCBlock_ffiVoid_NSDictionary_NSRange_bool_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + ffi.Pointer arg2) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, _NSRange arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function(ffi.Pointer arg0, _NSRange arg1, + ffi.Pointer arg2)>()(arg0, arg1, arg2); +} + +final _ObjCBlock_ffiVoid_NSDictionary_NSRange_bool_closureRegistry = + {}; +int _ObjCBlock_ffiVoid_NSDictionary_NSRange_bool_closureRegistryIndex = 0; +ffi.Pointer + _ObjCBlock_ffiVoid_NSDictionary_NSRange_bool_registerClosure(Function fn) { + final id = + ++_ObjCBlock_ffiVoid_NSDictionary_NSRange_bool_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSDictionary_NSRange_bool_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSDictionary_NSRange_bool_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + ffi.Pointer arg2) { + return (_ObjCBlock_ffiVoid_NSDictionary_NSRange_bool_closureRegistry[ + block.ref.target.address] + as void Function(ffi.Pointer, _NSRange, + ffi.Pointer))(arg0, arg1, arg2); +} + +class ObjCBlock_ffiVoid_NSDictionary_NSRange_bool extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSDictionary_NSRange_bool._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSDictionary_NSRange_bool.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, _NSRange arg1, + ffi.Pointer arg2)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_NSDictionary_NSRange_bool_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSDictionary_NSRange_bool.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, _NSRange arg1, + ffi.Pointer arg2) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_NSDictionary_NSRange_bool_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSDictionary_NSRange_bool_registerClosure( + fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call( + ffi.Pointer arg0, _NSRange arg1, ffi.Pointer arg2) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + ffi.Pointer arg2)>()(_id, arg0, arg1, arg2); + } +} + +void _ObjCBlock_ffiVoid_ObjCObject_NSRange_bool_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + ffi.Pointer arg2) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, _NSRange arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function(ffi.Pointer arg0, _NSRange arg1, + ffi.Pointer arg2)>()(arg0, arg1, arg2); +} + +final _ObjCBlock_ffiVoid_ObjCObject_NSRange_bool_closureRegistry = + {}; +int _ObjCBlock_ffiVoid_ObjCObject_NSRange_bool_closureRegistryIndex = 0; +ffi.Pointer + _ObjCBlock_ffiVoid_ObjCObject_NSRange_bool_registerClosure(Function fn) { + final id = ++_ObjCBlock_ffiVoid_ObjCObject_NSRange_bool_closureRegistryIndex; + _ObjCBlock_ffiVoid_ObjCObject_NSRange_bool_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_ObjCObject_NSRange_bool_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + ffi.Pointer arg2) { + return (_ObjCBlock_ffiVoid_ObjCObject_NSRange_bool_closureRegistry[ + block.ref.target.address] + as void Function(ffi.Pointer, _NSRange, + ffi.Pointer))(arg0, arg1, arg2); +} + +class ObjCBlock_ffiVoid_ObjCObject_NSRange_bool extends _ObjCBlockBase { + ObjCBlock_ffiVoid_ObjCObject_NSRange_bool._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_ObjCObject_NSRange_bool.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, _NSRange arg1, + ffi.Pointer arg2)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_ObjCObject_NSRange_bool_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_ObjCObject_NSRange_bool.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, _NSRange arg1, + ffi.Pointer arg2) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_ObjCObject_NSRange_bool_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_ObjCObject_NSRange_bool_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call( + ffi.Pointer arg0, _NSRange arg1, ffi.Pointer arg2) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + _NSRange arg1, + ffi.Pointer arg2)>()(_id, arg0, arg1, arg2); + } +} + +class NSAttributedStringMarkdownParsingOptions extends NSObject { + NSAttributedStringMarkdownParsingOptions._( + ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSAttributedStringMarkdownParsingOptions] that points to the same underlying object as [other]. + static NSAttributedStringMarkdownParsingOptions + castFrom(T other) { + return NSAttributedStringMarkdownParsingOptions._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSAttributedStringMarkdownParsingOptions] that wraps the given raw object pointer. + static NSAttributedStringMarkdownParsingOptions castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSAttributedStringMarkdownParsingOptions._(other, lib, + retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSAttributedStringMarkdownParsingOptions]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSAttributedStringMarkdownParsingOptions1); + } + + @override + NSAttributedStringMarkdownParsingOptions init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSAttributedStringMarkdownParsingOptions._(_ret, _lib, + retain: true, release: true); + } + + bool get allowsExtendedAttributes { + return _lib._objc_msgSend_12(_id, _lib._sel_allowsExtendedAttributes1); + } + + set allowsExtendedAttributes(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setAllowsExtendedAttributes_1, value); + } + + int get interpretedSyntax { + return _lib._objc_msgSend_665(_id, _lib._sel_interpretedSyntax1); + } + + set interpretedSyntax(int value) { + return _lib._objc_msgSend_666(_id, _lib._sel_setInterpretedSyntax_1, value); + } + + int get failurePolicy { + return _lib._objc_msgSend_667(_id, _lib._sel_failurePolicy1); + } + + set failurePolicy(int value) { + return _lib._objc_msgSend_668(_id, _lib._sel_setFailurePolicy_1, value); + } + + NSString? get languageCode { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_languageCode1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set languageCode(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setLanguageCode_1, value?._id ?? ffi.nullptr); + } + + bool get appliesSourcePositionAttributes { + return _lib._objc_msgSend_12( + _id, _lib._sel_appliesSourcePositionAttributes1); + } + + set appliesSourcePositionAttributes(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setAppliesSourcePositionAttributes_1, value); + } + + static NSAttributedStringMarkdownParsingOptions new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSAttributedStringMarkdownParsingOptions1, _lib._sel_new1); + return NSAttributedStringMarkdownParsingOptions._(_ret, _lib, + retain: false, release: true); + } + + static NSAttributedStringMarkdownParsingOptions allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSAttributedStringMarkdownParsingOptions1, + _lib._sel_allocWithZone_1, + zone); + return NSAttributedStringMarkdownParsingOptions._(_ret, _lib, + retain: false, release: true); + } + + static NSAttributedStringMarkdownParsingOptions alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSAttributedStringMarkdownParsingOptions1, + _lib._sel_alloc1); + return NSAttributedStringMarkdownParsingOptions._(_ret, _lib, + retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSAttributedStringMarkdownParsingOptions1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSAttributedStringMarkdownParsingOptions1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSAttributedStringMarkdownParsingOptions1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSAttributedStringMarkdownParsingOptions1, + _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSAttributedStringMarkdownParsingOptions1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSAttributedStringMarkdownParsingOptions1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSAttributedStringMarkdownParsingOptions1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSAttributedStringMarkdownParsingOptions1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSAttributedStringMarkdownParsingOptions1, + _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSAttributedStringMarkdownInterpretedSyntax { + static const int NSAttributedStringMarkdownInterpretedSyntaxFull = 0; + static const int NSAttributedStringMarkdownInterpretedSyntaxInlineOnly = 1; + static const int + NSAttributedStringMarkdownInterpretedSyntaxInlineOnlyPreservingWhitespace = + 2; +} + +abstract class NSAttributedStringMarkdownParsingFailurePolicy { + static const int NSAttributedStringMarkdownParsingFailureReturnError = 0; + static const int + NSAttributedStringMarkdownParsingFailureReturnPartiallyParsedIfPossible = + 1; +} + +abstract class NSAttributedStringFormattingOptions { + static const int + NSAttributedStringFormattingInsertArgumentAttributesWithoutMerging = 1; + static const int NSAttributedStringFormattingApplyReplacementIndexAttribute = + 2; +} + +class NSMutableAttributedString extends NSAttributedString { + NSMutableAttributedString._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSMutableAttributedString] that points to the same underlying object as [other]. + static NSMutableAttributedString castFrom(T other) { + return NSMutableAttributedString._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSMutableAttributedString] that wraps the given raw object pointer. + static NSMutableAttributedString castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSMutableAttributedString._(other, lib, + retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSMutableAttributedString]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSMutableAttributedString1); + } + + void replaceCharactersInRange_withString_(_NSRange range, NSString? str) { + _lib._objc_msgSend_638(_id, _lib._sel_replaceCharactersInRange_withString_1, + range, str?._id ?? ffi.nullptr); + } + + void setAttributes_range_(NSDictionary? attrs, _NSRange range) { + _lib._objc_msgSend_679( + _id, _lib._sel_setAttributes_range_1, attrs?._id ?? ffi.nullptr, range); + } + + NSMutableString? get mutableString { + final _ret = _lib._objc_msgSend_680(_id, _lib._sel_mutableString1); + return _ret.address == 0 + ? null + : NSMutableString._(_ret, _lib, retain: true, release: true); + } + + void addAttribute_value_range_( + NSString name, NSObject value, _NSRange range) { + _lib._objc_msgSend_681( + _id, _lib._sel_addAttribute_value_range_1, name._id, value._id, range); + } + + void addAttributes_range_(NSDictionary? attrs, _NSRange range) { + _lib._objc_msgSend_679( + _id, _lib._sel_addAttributes_range_1, attrs?._id ?? ffi.nullptr, range); + } + + void removeAttribute_range_(NSString name, _NSRange range) { + _lib._objc_msgSend_682( + _id, _lib._sel_removeAttribute_range_1, name._id, range); + } + + void replaceCharactersInRange_withAttributedString_( + _NSRange range, NSAttributedString? attrString) { + _lib._objc_msgSend_683( + _id, + _lib._sel_replaceCharactersInRange_withAttributedString_1, + range, + attrString?._id ?? ffi.nullptr); + } + + void insertAttributedString_atIndex_( + NSAttributedString? attrString, int loc) { + _lib._objc_msgSend_684(_id, _lib._sel_insertAttributedString_atIndex_1, + attrString?._id ?? ffi.nullptr, loc); + } + + void appendAttributedString_(NSAttributedString? attrString) { + _lib._objc_msgSend_685(_id, _lib._sel_appendAttributedString_1, + attrString?._id ?? ffi.nullptr); + } + + void deleteCharactersInRange_(_NSRange range) { + _lib._objc_msgSend_445(_id, _lib._sel_deleteCharactersInRange_1, range); + } + + void setAttributedString_(NSAttributedString? attrString) { + _lib._objc_msgSend_685( + _id, _lib._sel_setAttributedString_1, attrString?._id ?? ffi.nullptr); + } + + void beginEditing() { + _lib._objc_msgSend_1(_id, _lib._sel_beginEditing1); + } + + void endEditing() { + _lib._objc_msgSend_1(_id, _lib._sel_endEditing1); + } + + void appendLocalizedFormat_(NSAttributedString? format) { + _lib._objc_msgSend_685( + _id, _lib._sel_appendLocalizedFormat_1, format?._id ?? ffi.nullptr); + } + + @override + NSMutableAttributedString initWithString_(NSString? str) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithString_1, str?._id ?? ffi.nullptr); + return NSMutableAttributedString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableAttributedString initWithString_attributes_( + NSString? str, NSDictionary? attrs) { + final _ret = _lib._objc_msgSend_371( + _id, + _lib._sel_initWithString_attributes_1, + str?._id ?? ffi.nullptr, + attrs?._id ?? ffi.nullptr); + return NSMutableAttributedString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableAttributedString initWithAttributedString_( + NSAttributedString? attrStr) { + final _ret = _lib._objc_msgSend_662( + _id, _lib._sel_initWithAttributedString_1, attrStr?._id ?? ffi.nullptr); + return NSMutableAttributedString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableAttributedString + initWithContentsOfMarkdownFileAtURL_options_baseURL_error_( + NSURL? markdownFile, + NSAttributedStringMarkdownParsingOptions? options, + NSURL? baseURL, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_669( + _id, + _lib._sel_initWithContentsOfMarkdownFileAtURL_options_baseURL_error_1, + markdownFile?._id ?? ffi.nullptr, + options?._id ?? ffi.nullptr, + baseURL?._id ?? ffi.nullptr, + error); + return NSMutableAttributedString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableAttributedString initWithMarkdown_options_baseURL_error_( + NSData? markdown, + NSAttributedStringMarkdownParsingOptions? options, + NSURL? baseURL, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_670( + _id, + _lib._sel_initWithMarkdown_options_baseURL_error_1, + markdown?._id ?? ffi.nullptr, + options?._id ?? ffi.nullptr, + baseURL?._id ?? ffi.nullptr, + error); + return NSMutableAttributedString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableAttributedString initWithMarkdownString_options_baseURL_error_( + NSString? markdownString, + NSAttributedStringMarkdownParsingOptions? options, + NSURL? baseURL, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_671( + _id, + _lib._sel_initWithMarkdownString_options_baseURL_error_1, + markdownString?._id ?? ffi.nullptr, + options?._id ?? ffi.nullptr, + baseURL?._id ?? ffi.nullptr, + error); + return NSMutableAttributedString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableAttributedString initWithFormat_options_locale_( + NSAttributedString? format, int options, NSLocale? locale) { + final _ret = _lib._objc_msgSend_672( + _id, + _lib._sel_initWithFormat_options_locale_1, + format?._id ?? ffi.nullptr, + options, + locale?._id ?? ffi.nullptr); + return NSMutableAttributedString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableAttributedString initWithFormat_options_locale_arguments_( + NSAttributedString? format, + int options, + NSLocale? locale, + ffi.Pointer<__va_list_tag> arguments) { + final _ret = _lib._objc_msgSend_673( + _id, + _lib._sel_initWithFormat_options_locale_arguments_1, + format?._id ?? ffi.nullptr, + options, + locale?._id ?? ffi.nullptr, + arguments); + return NSMutableAttributedString._(_ret, _lib, retain: true, release: true); + } + + static NSMutableAttributedString localizedAttributedStringWithFormat_( + SentryCocoa _lib, NSAttributedString? format) { + final _ret = _lib._objc_msgSend_662( + _lib._class_NSMutableAttributedString1, + _lib._sel_localizedAttributedStringWithFormat_1, + format?._id ?? ffi.nullptr); + return NSMutableAttributedString._(_ret, _lib, retain: true, release: true); + } + + static NSMutableAttributedString localizedAttributedStringWithFormat_options_( + SentryCocoa _lib, NSAttributedString? format, int options) { + final _ret = _lib._objc_msgSend_674( + _lib._class_NSMutableAttributedString1, + _lib._sel_localizedAttributedStringWithFormat_options_1, + format?._id ?? ffi.nullptr, + options); + return NSMutableAttributedString._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableAttributedString init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSMutableAttributedString._(_ret, _lib, retain: true, release: true); + } + + static NSMutableAttributedString new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSMutableAttributedString1, _lib._sel_new1); + return NSMutableAttributedString._(_ret, _lib, + retain: false, release: true); + } + + static NSMutableAttributedString allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3(_lib._class_NSMutableAttributedString1, + _lib._sel_allocWithZone_1, zone); + return NSMutableAttributedString._(_ret, _lib, + retain: false, release: true); + } + + static NSMutableAttributedString alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSMutableAttributedString1, _lib._sel_alloc1); + return NSMutableAttributedString._(_ret, _lib, + retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSMutableAttributedString1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSMutableAttributedString1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSMutableAttributedString1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSMutableAttributedString1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSMutableAttributedString1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSMutableAttributedString1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSMutableAttributedString1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSMutableAttributedString1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSMutableAttributedString1, + _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSDateFormatter extends NSFormatter { + NSDateFormatter._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSDateFormatter] that points to the same underlying object as [other]. + static NSDateFormatter castFrom(T other) { + return NSDateFormatter._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSDateFormatter] that wraps the given raw object pointer. + static NSDateFormatter castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSDateFormatter._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSDateFormatter]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSDateFormatter1); + } + + int get formattingContext { + return _lib._objc_msgSend_690(_id, _lib._sel_formattingContext1); + } + + set formattingContext(int value) { + return _lib._objc_msgSend_691(_id, _lib._sel_setFormattingContext_1, value); + } + + bool getObjectValue_forString_range_error_( + ffi.Pointer> obj, + NSString? string, + ffi.Pointer<_NSRange> rangep, + ffi.Pointer> error) { + return _lib._objc_msgSend_692( + _id, + _lib._sel_getObjectValue_forString_range_error_1, + obj, + string?._id ?? ffi.nullptr, + rangep, + error); + } + + NSString stringFromDate_(NSDate? date) { + final _ret = _lib._objc_msgSend_167( + _id, _lib._sel_stringFromDate_1, date?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSDate dateFromString_(NSString? string) { + final _ret = _lib._objc_msgSend_528( + _id, _lib._sel_dateFromString_1, string?._id ?? ffi.nullptr); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + static NSString localizedStringFromDate_dateStyle_timeStyle_( + SentryCocoa _lib, NSDate? date, int dstyle, int tstyle) { + final _ret = _lib._objc_msgSend_693( + _lib._class_NSDateFormatter1, + _lib._sel_localizedStringFromDate_dateStyle_timeStyle_1, + date?._id ?? ffi.nullptr, + dstyle, + tstyle); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString dateFormatFromTemplate_options_locale_( + SentryCocoa _lib, NSString? tmplate, int opts, NSLocale? locale) { + final _ret = _lib._objc_msgSend_694( + _lib._class_NSDateFormatter1, + _lib._sel_dateFormatFromTemplate_options_locale_1, + tmplate?._id ?? ffi.nullptr, + opts, + locale?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static int getDefaultFormatterBehavior(SentryCocoa _lib) { + return _lib._objc_msgSend_695( + _lib._class_NSDateFormatter1, _lib._sel_defaultFormatterBehavior1); + } + + static void setDefaultFormatterBehavior(SentryCocoa _lib, int value) { + return _lib._objc_msgSend_696(_lib._class_NSDateFormatter1, + _lib._sel_setDefaultFormatterBehavior_1, value); + } + + void setLocalizedDateFormatFromTemplate_(NSString? dateFormatTemplate) { + _lib._objc_msgSend_192(_id, _lib._sel_setLocalizedDateFormatFromTemplate_1, + dateFormatTemplate?._id ?? ffi.nullptr); + } + + NSString? get dateFormat { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_dateFormat1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set dateFormat(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setDateFormat_1, value?._id ?? ffi.nullptr); + } + + int get dateStyle { + return _lib._objc_msgSend_697(_id, _lib._sel_dateStyle1); + } + + set dateStyle(int value) { + return _lib._objc_msgSend_698(_id, _lib._sel_setDateStyle_1, value); + } + + int get timeStyle { + return _lib._objc_msgSend_697(_id, _lib._sel_timeStyle1); + } + + set timeStyle(int value) { + return _lib._objc_msgSend_698(_id, _lib._sel_setTimeStyle_1, value); + } + + NSLocale? get locale { + final _ret = _lib._objc_msgSend_182(_id, _lib._sel_locale1); + return _ret.address == 0 + ? null + : NSLocale._(_ret, _lib, retain: true, release: true); + } + + set locale(NSLocale? value) { + return _lib._objc_msgSend_699( + _id, _lib._sel_setLocale_1, value?._id ?? ffi.nullptr); + } + + bool get generatesCalendarDates { + return _lib._objc_msgSend_12(_id, _lib._sel_generatesCalendarDates1); + } + + set generatesCalendarDates(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setGeneratesCalendarDates_1, value); + } + + int get formatterBehavior { + return _lib._objc_msgSend_695(_id, _lib._sel_formatterBehavior1); + } + + set formatterBehavior(int value) { + return _lib._objc_msgSend_696(_id, _lib._sel_setFormatterBehavior_1, value); + } + + NSTimeZone? get timeZone { + final _ret = _lib._objc_msgSend_168(_id, _lib._sel_timeZone1); + return _ret.address == 0 + ? null + : NSTimeZone._(_ret, _lib, retain: true, release: true); + } + + set timeZone(NSTimeZone? value) { + return _lib._objc_msgSend_169( + _id, _lib._sel_setTimeZone_1, value?._id ?? ffi.nullptr); + } + + NSCalendar? get calendar { + final _ret = _lib._objc_msgSend_700(_id, _lib._sel_calendar1); + return _ret.address == 0 + ? null + : NSCalendar._(_ret, _lib, retain: true, release: true); + } + + set calendar(NSCalendar? value) { + return _lib._objc_msgSend_706( + _id, _lib._sel_setCalendar_1, value?._id ?? ffi.nullptr); + } + + bool get lenient { + return _lib._objc_msgSend_12(_id, _lib._sel_isLenient1); + } + + set lenient(bool value) { + return _lib._objc_msgSend_492(_id, _lib._sel_setLenient_1, value); + } + + NSDate? get twoDigitStartDate { + final _ret = _lib._objc_msgSend_162(_id, _lib._sel_twoDigitStartDate1); + return _ret.address == 0 + ? null + : NSDate._(_ret, _lib, retain: true, release: true); + } + + set twoDigitStartDate(NSDate? value) { + return _lib._objc_msgSend_525( + _id, _lib._sel_setTwoDigitStartDate_1, value?._id ?? ffi.nullptr); + } + + NSDate? get defaultDate { + final _ret = _lib._objc_msgSend_162(_id, _lib._sel_defaultDate1); + return _ret.address == 0 + ? null + : NSDate._(_ret, _lib, retain: true, release: true); + } + + set defaultDate(NSDate? value) { + return _lib._objc_msgSend_525( + _id, _lib._sel_setDefaultDate_1, value?._id ?? ffi.nullptr); + } + + NSArray? get eraSymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_eraSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set eraSymbols(NSArray? value) { + return _lib._objc_msgSend_731( + _id, _lib._sel_setEraSymbols_1, value?._id ?? ffi.nullptr); + } + + NSArray? get monthSymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_monthSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set monthSymbols(NSArray? value) { + return _lib._objc_msgSend_731( + _id, _lib._sel_setMonthSymbols_1, value?._id ?? ffi.nullptr); + } + + NSArray? get shortMonthSymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_shortMonthSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set shortMonthSymbols(NSArray? value) { + return _lib._objc_msgSend_731( + _id, _lib._sel_setShortMonthSymbols_1, value?._id ?? ffi.nullptr); + } + + NSArray? get weekdaySymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_weekdaySymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set weekdaySymbols(NSArray? value) { + return _lib._objc_msgSend_731( + _id, _lib._sel_setWeekdaySymbols_1, value?._id ?? ffi.nullptr); + } + + NSArray? get shortWeekdaySymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_shortWeekdaySymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set shortWeekdaySymbols(NSArray? value) { + return _lib._objc_msgSend_731( + _id, _lib._sel_setShortWeekdaySymbols_1, value?._id ?? ffi.nullptr); + } + + NSString? get AMSymbol { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_AMSymbol1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set AMSymbol(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setAMSymbol_1, value?._id ?? ffi.nullptr); + } + + NSString? get PMSymbol { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_PMSymbol1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set PMSymbol(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setPMSymbol_1, value?._id ?? ffi.nullptr); + } + + NSArray? get longEraSymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_longEraSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set longEraSymbols(NSArray? value) { + return _lib._objc_msgSend_731( + _id, _lib._sel_setLongEraSymbols_1, value?._id ?? ffi.nullptr); + } + + NSArray? get veryShortMonthSymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_veryShortMonthSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set veryShortMonthSymbols(NSArray? value) { + return _lib._objc_msgSend_731( + _id, _lib._sel_setVeryShortMonthSymbols_1, value?._id ?? ffi.nullptr); + } + + NSArray? get standaloneMonthSymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_standaloneMonthSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set standaloneMonthSymbols(NSArray? value) { + return _lib._objc_msgSend_731( + _id, _lib._sel_setStandaloneMonthSymbols_1, value?._id ?? ffi.nullptr); + } + + NSArray? get shortStandaloneMonthSymbols { + final _ret = + _lib._objc_msgSend_79(_id, _lib._sel_shortStandaloneMonthSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set shortStandaloneMonthSymbols(NSArray? value) { + return _lib._objc_msgSend_731(_id, + _lib._sel_setShortStandaloneMonthSymbols_1, value?._id ?? ffi.nullptr); + } + + NSArray? get veryShortStandaloneMonthSymbols { + final _ret = + _lib._objc_msgSend_79(_id, _lib._sel_veryShortStandaloneMonthSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set veryShortStandaloneMonthSymbols(NSArray? value) { + return _lib._objc_msgSend_731( + _id, + _lib._sel_setVeryShortStandaloneMonthSymbols_1, + value?._id ?? ffi.nullptr); + } + + NSArray? get veryShortWeekdaySymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_veryShortWeekdaySymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set veryShortWeekdaySymbols(NSArray? value) { + return _lib._objc_msgSend_731( + _id, _lib._sel_setVeryShortWeekdaySymbols_1, value?._id ?? ffi.nullptr); + } + + NSArray? get standaloneWeekdaySymbols { + final _ret = + _lib._objc_msgSend_79(_id, _lib._sel_standaloneWeekdaySymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set standaloneWeekdaySymbols(NSArray? value) { + return _lib._objc_msgSend_731(_id, _lib._sel_setStandaloneWeekdaySymbols_1, + value?._id ?? ffi.nullptr); + } + + NSArray? get shortStandaloneWeekdaySymbols { + final _ret = + _lib._objc_msgSend_79(_id, _lib._sel_shortStandaloneWeekdaySymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set shortStandaloneWeekdaySymbols(NSArray? value) { + return _lib._objc_msgSend_731( + _id, + _lib._sel_setShortStandaloneWeekdaySymbols_1, + value?._id ?? ffi.nullptr); + } + + NSArray? get veryShortStandaloneWeekdaySymbols { + final _ret = _lib._objc_msgSend_79( + _id, _lib._sel_veryShortStandaloneWeekdaySymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set veryShortStandaloneWeekdaySymbols(NSArray? value) { + return _lib._objc_msgSend_731( + _id, + _lib._sel_setVeryShortStandaloneWeekdaySymbols_1, + value?._id ?? ffi.nullptr); + } + + NSArray? get quarterSymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_quarterSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set quarterSymbols(NSArray? value) { + return _lib._objc_msgSend_731( + _id, _lib._sel_setQuarterSymbols_1, value?._id ?? ffi.nullptr); + } + + NSArray? get shortQuarterSymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_shortQuarterSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set shortQuarterSymbols(NSArray? value) { + return _lib._objc_msgSend_731( + _id, _lib._sel_setShortQuarterSymbols_1, value?._id ?? ffi.nullptr); + } + + NSArray? get standaloneQuarterSymbols { + final _ret = + _lib._objc_msgSend_79(_id, _lib._sel_standaloneQuarterSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set standaloneQuarterSymbols(NSArray? value) { + return _lib._objc_msgSend_731(_id, _lib._sel_setStandaloneQuarterSymbols_1, + value?._id ?? ffi.nullptr); + } + + NSArray? get shortStandaloneQuarterSymbols { + final _ret = + _lib._objc_msgSend_79(_id, _lib._sel_shortStandaloneQuarterSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set shortStandaloneQuarterSymbols(NSArray? value) { + return _lib._objc_msgSend_731( + _id, + _lib._sel_setShortStandaloneQuarterSymbols_1, + value?._id ?? ffi.nullptr); + } + + NSDate? get gregorianStartDate { + final _ret = _lib._objc_msgSend_162(_id, _lib._sel_gregorianStartDate1); + return _ret.address == 0 + ? null + : NSDate._(_ret, _lib, retain: true, release: true); + } + + set gregorianStartDate(NSDate? value) { + return _lib._objc_msgSend_525( + _id, _lib._sel_setGregorianStartDate_1, value?._id ?? ffi.nullptr); + } + + bool get doesRelativeDateFormatting { + return _lib._objc_msgSend_12(_id, _lib._sel_doesRelativeDateFormatting1); + } + + set doesRelativeDateFormatting(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setDoesRelativeDateFormatting_1, value); + } + + NSObject initWithDateFormat_allowNaturalLanguage_( + NSString? format, bool flag) { + final _ret = _lib._objc_msgSend_29( + _id, + _lib._sel_initWithDateFormat_allowNaturalLanguage_1, + format?._id ?? ffi.nullptr, + flag); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + bool allowsNaturalLanguage() { + return _lib._objc_msgSend_12(_id, _lib._sel_allowsNaturalLanguage1); + } + + @override + NSDateFormatter init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSDateFormatter._(_ret, _lib, retain: true, release: true); + } + + static NSDateFormatter new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSDateFormatter1, _lib._sel_new1); + return NSDateFormatter._(_ret, _lib, retain: false, release: true); + } + + static NSDateFormatter allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSDateFormatter1, _lib._sel_allocWithZone_1, zone); + return NSDateFormatter._(_ret, _lib, retain: false, release: true); + } + + static NSDateFormatter alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSDateFormatter1, _lib._sel_alloc1); + return NSDateFormatter._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSDateFormatter1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSDateFormatter1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSDateFormatter1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSDateFormatter1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSDateFormatter1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSDateFormatter1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSDateFormatter1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSDateFormatter1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSDateFormatter1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSFormatter extends NSObject { + NSFormatter._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSFormatter] that points to the same underlying object as [other]. + static NSFormatter castFrom(T other) { + return NSFormatter._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSFormatter] that wraps the given raw object pointer. + static NSFormatter castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSFormatter._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSFormatter]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSFormatter1); + } + + NSString stringForObjectValue_(NSObject obj) { + final _ret = + _lib._objc_msgSend_65(_id, _lib._sel_stringForObjectValue_1, obj._id); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSAttributedString attributedStringForObjectValue_withDefaultAttributes_( + NSObject obj, NSDictionary? attrs) { + final _ret = _lib._objc_msgSend_686( + _id, + _lib._sel_attributedStringForObjectValue_withDefaultAttributes_1, + obj._id, + attrs?._id ?? ffi.nullptr); + return NSAttributedString._(_ret, _lib, retain: true, release: true); + } + + NSString editingStringForObjectValue_(NSObject obj) { + final _ret = _lib._objc_msgSend_65( + _id, _lib._sel_editingStringForObjectValue_1, obj._id); + return NSString._(_ret, _lib, retain: true, release: true); + } + + bool getObjectValue_forString_errorDescription_( + ffi.Pointer> obj, + NSString? string, + ffi.Pointer> error) { + return _lib._objc_msgSend_687( + _id, + _lib._sel_getObjectValue_forString_errorDescription_1, + obj, + string?._id ?? ffi.nullptr, + error); + } + + bool isPartialStringValid_newEditingString_errorDescription_( + NSString? partialString, + ffi.Pointer> newString, + ffi.Pointer> error) { + return _lib._objc_msgSend_688( + _id, + _lib._sel_isPartialStringValid_newEditingString_errorDescription_1, + partialString?._id ?? ffi.nullptr, + newString, + error); + } + + bool + isPartialStringValid_proposedSelectedRange_originalString_originalSelectedRange_errorDescription_( + ffi.Pointer> partialStringPtr, + ffi.Pointer<_NSRange> proposedSelRangePtr, + NSString? origString, + _NSRange origSelRange, + ffi.Pointer> error) { + return _lib._objc_msgSend_689( + _id, + _lib._sel_isPartialStringValid_proposedSelectedRange_originalString_originalSelectedRange_errorDescription_1, + partialStringPtr, + proposedSelRangePtr, + origString?._id ?? ffi.nullptr, + origSelRange, + error); + } + + @override + NSFormatter init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSFormatter._(_ret, _lib, retain: true, release: true); + } + + static NSFormatter new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSFormatter1, _lib._sel_new1); + return NSFormatter._(_ret, _lib, retain: false, release: true); + } + + static NSFormatter allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSFormatter1, _lib._sel_allocWithZone_1, zone); + return NSFormatter._(_ret, _lib, retain: false, release: true); + } + + static NSFormatter alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSFormatter1, _lib._sel_alloc1); + return NSFormatter._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSFormatter1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSFormatter1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSFormatter1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSFormatter1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSFormatter1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSFormatter1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSFormatter1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSFormatter1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSFormatter1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSFormattingContext { + static const int NSFormattingContextUnknown = 0; + static const int NSFormattingContextDynamic = 1; + static const int NSFormattingContextStandalone = 2; + static const int NSFormattingContextListItem = 3; + static const int NSFormattingContextBeginningOfSentence = 4; + static const int NSFormattingContextMiddleOfSentence = 5; +} + +abstract class NSDateFormatterStyle { + static const int NSDateFormatterNoStyle = 0; + static const int NSDateFormatterShortStyle = 1; + static const int NSDateFormatterMediumStyle = 2; + static const int NSDateFormatterLongStyle = 3; + static const int NSDateFormatterFullStyle = 4; +} + +abstract class NSDateFormatterBehavior { + static const int NSDateFormatterBehaviorDefault = 0; + static const int NSDateFormatterBehavior10_0 = 1000; + static const int NSDateFormatterBehavior10_4 = 1040; +} + +class NSCalendar extends NSObject { + NSCalendar._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSCalendar] that points to the same underlying object as [other]. + static NSCalendar castFrom(T other) { + return NSCalendar._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSCalendar] that wraps the given raw object pointer. + static NSCalendar castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSCalendar._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSCalendar]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSCalendar1); + } + + static NSCalendar? getCurrentCalendar(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_700( + _lib._class_NSCalendar1, _lib._sel_currentCalendar1); + return _ret.address == 0 + ? null + : NSCalendar._(_ret, _lib, retain: true, release: true); + } + + static NSCalendar? getAutoupdatingCurrentCalendar(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_700( + _lib._class_NSCalendar1, _lib._sel_autoupdatingCurrentCalendar1); + return _ret.address == 0 + ? null + : NSCalendar._(_ret, _lib, retain: true, release: true); + } + + static NSCalendar calendarWithIdentifier_( + SentryCocoa _lib, NSString calendarIdentifierConstant) { + final _ret = _lib._objc_msgSend_701(_lib._class_NSCalendar1, + _lib._sel_calendarWithIdentifier_1, calendarIdentifierConstant._id); + return NSCalendar._(_ret, _lib, retain: true, release: true); + } + + @override + NSCalendar init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSCalendar._(_ret, _lib, retain: true, release: true); + } + + NSObject initWithCalendarIdentifier_(NSString ident) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithCalendarIdentifier_1, ident._id); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSString get calendarIdentifier { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_calendarIdentifier1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSLocale? get locale { + final _ret = _lib._objc_msgSend_182(_id, _lib._sel_locale1); + return _ret.address == 0 + ? null + : NSLocale._(_ret, _lib, retain: true, release: true); + } + + set locale(NSLocale? value) { + return _lib._objc_msgSend_699( + _id, _lib._sel_setLocale_1, value?._id ?? ffi.nullptr); + } + + NSTimeZone? get timeZone { + final _ret = _lib._objc_msgSend_168(_id, _lib._sel_timeZone1); + return _ret.address == 0 + ? null + : NSTimeZone._(_ret, _lib, retain: true, release: true); + } + + set timeZone(NSTimeZone? value) { + return _lib._objc_msgSend_169( + _id, _lib._sel_setTimeZone_1, value?._id ?? ffi.nullptr); + } + + int get firstWeekday { + return _lib._objc_msgSend_10(_id, _lib._sel_firstWeekday1); + } + + set firstWeekday(int value) { + return _lib._objc_msgSend_483(_id, _lib._sel_setFirstWeekday_1, value); + } + + int get minimumDaysInFirstWeek { + return _lib._objc_msgSend_10(_id, _lib._sel_minimumDaysInFirstWeek1); + } + + set minimumDaysInFirstWeek(int value) { + return _lib._objc_msgSend_483( + _id, _lib._sel_setMinimumDaysInFirstWeek_1, value); + } + + NSArray? get eraSymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_eraSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get longEraSymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_longEraSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get monthSymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_monthSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get shortMonthSymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_shortMonthSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get veryShortMonthSymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_veryShortMonthSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get standaloneMonthSymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_standaloneMonthSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get shortStandaloneMonthSymbols { + final _ret = + _lib._objc_msgSend_79(_id, _lib._sel_shortStandaloneMonthSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get veryShortStandaloneMonthSymbols { + final _ret = + _lib._objc_msgSend_79(_id, _lib._sel_veryShortStandaloneMonthSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get weekdaySymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_weekdaySymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get shortWeekdaySymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_shortWeekdaySymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get veryShortWeekdaySymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_veryShortWeekdaySymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get standaloneWeekdaySymbols { + final _ret = + _lib._objc_msgSend_79(_id, _lib._sel_standaloneWeekdaySymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get shortStandaloneWeekdaySymbols { + final _ret = + _lib._objc_msgSend_79(_id, _lib._sel_shortStandaloneWeekdaySymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get veryShortStandaloneWeekdaySymbols { + final _ret = _lib._objc_msgSend_79( + _id, _lib._sel_veryShortStandaloneWeekdaySymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get quarterSymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_quarterSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get shortQuarterSymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_shortQuarterSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get standaloneQuarterSymbols { + final _ret = + _lib._objc_msgSend_79(_id, _lib._sel_standaloneQuarterSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get shortStandaloneQuarterSymbols { + final _ret = + _lib._objc_msgSend_79(_id, _lib._sel_shortStandaloneQuarterSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSString? get AMSymbol { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_AMSymbol1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get PMSymbol { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_PMSymbol1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + void minimumRangeOfUnit_(ffi.Pointer<_NSRange> stret, int unit) { + _lib._objc_msgSend_702(stret, _id, _lib._sel_minimumRangeOfUnit_1, unit); + } + + void maximumRangeOfUnit_(ffi.Pointer<_NSRange> stret, int unit) { + _lib._objc_msgSend_702(stret, _id, _lib._sel_maximumRangeOfUnit_1, unit); + } + + void rangeOfUnit_inUnit_forDate_( + ffi.Pointer<_NSRange> stret, int smaller, int larger, NSDate? date) { + _lib._objc_msgSend_703(stret, _id, _lib._sel_rangeOfUnit_inUnit_forDate_1, + smaller, larger, date?._id ?? ffi.nullptr); + } + + int ordinalityOfUnit_inUnit_forDate_(int smaller, int larger, NSDate? date) { + return _lib._objc_msgSend_704( + _id, + _lib._sel_ordinalityOfUnit_inUnit_forDate_1, + smaller, + larger, + date?._id ?? ffi.nullptr); + } + + bool rangeOfUnit_startDate_interval_forDate_( + int unit, + ffi.Pointer> datep, + ffi.Pointer tip, + NSDate? date) { + return _lib._objc_msgSend_705( + _id, + _lib._sel_rangeOfUnit_startDate_interval_forDate_1, + unit, + datep, + tip, + date?._id ?? ffi.nullptr); + } + + NSDate dateFromComponents_(NSDateComponents? comps) { + final _ret = _lib._objc_msgSend_710( + _id, _lib._sel_dateFromComponents_1, comps?._id ?? ffi.nullptr); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + NSDateComponents components_fromDate_(int unitFlags, NSDate? date) { + final _ret = _lib._objc_msgSend_711(_id, _lib._sel_components_fromDate_1, + unitFlags, date?._id ?? ffi.nullptr); + return NSDateComponents._(_ret, _lib, retain: true, release: true); + } + + NSDate dateByAddingComponents_toDate_options_( + NSDateComponents? comps, NSDate? date, int opts) { + final _ret = _lib._objc_msgSend_712( + _id, + _lib._sel_dateByAddingComponents_toDate_options_1, + comps?._id ?? ffi.nullptr, + date?._id ?? ffi.nullptr, + opts); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + NSDateComponents components_fromDate_toDate_options_( + int unitFlags, NSDate? startingDate, NSDate? resultDate, int opts) { + final _ret = _lib._objc_msgSend_713( + _id, + _lib._sel_components_fromDate_toDate_options_1, + unitFlags, + startingDate?._id ?? ffi.nullptr, + resultDate?._id ?? ffi.nullptr, + opts); + return NSDateComponents._(_ret, _lib, retain: true, release: true); + } + + void getEra_year_month_day_fromDate_( + ffi.Pointer eraValuePointer, + ffi.Pointer yearValuePointer, + ffi.Pointer monthValuePointer, + ffi.Pointer dayValuePointer, + NSDate? date) { + _lib._objc_msgSend_714( + _id, + _lib._sel_getEra_year_month_day_fromDate_1, + eraValuePointer, + yearValuePointer, + monthValuePointer, + dayValuePointer, + date?._id ?? ffi.nullptr); + } + + void getEra_yearForWeekOfYear_weekOfYear_weekday_fromDate_( + ffi.Pointer eraValuePointer, + ffi.Pointer yearValuePointer, + ffi.Pointer weekValuePointer, + ffi.Pointer weekdayValuePointer, + NSDate? date) { + _lib._objc_msgSend_714( + _id, + _lib._sel_getEra_yearForWeekOfYear_weekOfYear_weekday_fromDate_1, + eraValuePointer, + yearValuePointer, + weekValuePointer, + weekdayValuePointer, + date?._id ?? ffi.nullptr); + } + + void getHour_minute_second_nanosecond_fromDate_( + ffi.Pointer hourValuePointer, + ffi.Pointer minuteValuePointer, + ffi.Pointer secondValuePointer, + ffi.Pointer nanosecondValuePointer, + NSDate? date) { + _lib._objc_msgSend_714( + _id, + _lib._sel_getHour_minute_second_nanosecond_fromDate_1, + hourValuePointer, + minuteValuePointer, + secondValuePointer, + nanosecondValuePointer, + date?._id ?? ffi.nullptr); + } + + int component_fromDate_(int unit, NSDate? date) { + return _lib._objc_msgSend_715( + _id, _lib._sel_component_fromDate_1, unit, date?._id ?? ffi.nullptr); + } + + NSDate dateWithEra_year_month_day_hour_minute_second_nanosecond_( + int eraValue, + int yearValue, + int monthValue, + int dayValue, + int hourValue, + int minuteValue, + int secondValue, + int nanosecondValue) { + final _ret = _lib._objc_msgSend_716( + _id, + _lib._sel_dateWithEra_year_month_day_hour_minute_second_nanosecond_1, + eraValue, + yearValue, + monthValue, + dayValue, + hourValue, + minuteValue, + secondValue, + nanosecondValue); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + NSDate + dateWithEra_yearForWeekOfYear_weekOfYear_weekday_hour_minute_second_nanosecond_( + int eraValue, + int yearValue, + int weekValue, + int weekdayValue, + int hourValue, + int minuteValue, + int secondValue, + int nanosecondValue) { + final _ret = _lib._objc_msgSend_716( + _id, + _lib._sel_dateWithEra_yearForWeekOfYear_weekOfYear_weekday_hour_minute_second_nanosecond_1, + eraValue, + yearValue, + weekValue, + weekdayValue, + hourValue, + minuteValue, + secondValue, + nanosecondValue); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + NSDate startOfDayForDate_(NSDate? date) { + final _ret = _lib._objc_msgSend_158( + _id, _lib._sel_startOfDayForDate_1, date?._id ?? ffi.nullptr); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + NSDateComponents componentsInTimeZone_fromDate_( + NSTimeZone? timezone, NSDate? date) { + final _ret = _lib._objc_msgSend_717( + _id, + _lib._sel_componentsInTimeZone_fromDate_1, + timezone?._id ?? ffi.nullptr, + date?._id ?? ffi.nullptr); + return NSDateComponents._(_ret, _lib, retain: true, release: true); + } + + int compareDate_toDate_toUnitGranularity_( + NSDate? date1, NSDate? date2, int unit) { + return _lib._objc_msgSend_718( + _id, + _lib._sel_compareDate_toDate_toUnitGranularity_1, + date1?._id ?? ffi.nullptr, + date2?._id ?? ffi.nullptr, + unit); + } + + bool isDate_equalToDate_toUnitGranularity_( + NSDate? date1, NSDate? date2, int unit) { + return _lib._objc_msgSend_719( + _id, + _lib._sel_isDate_equalToDate_toUnitGranularity_1, + date1?._id ?? ffi.nullptr, + date2?._id ?? ffi.nullptr, + unit); + } + + bool isDate_inSameDayAsDate_(NSDate? date1, NSDate? date2) { + return _lib._objc_msgSend_720(_id, _lib._sel_isDate_inSameDayAsDate_1, + date1?._id ?? ffi.nullptr, date2?._id ?? ffi.nullptr); + } + + bool isDateInToday_(NSDate? date) { + return _lib._objc_msgSend_160( + _id, _lib._sel_isDateInToday_1, date?._id ?? ffi.nullptr); + } + + bool isDateInYesterday_(NSDate? date) { + return _lib._objc_msgSend_160( + _id, _lib._sel_isDateInYesterday_1, date?._id ?? ffi.nullptr); + } + + bool isDateInTomorrow_(NSDate? date) { + return _lib._objc_msgSend_160( + _id, _lib._sel_isDateInTomorrow_1, date?._id ?? ffi.nullptr); + } + + bool isDateInWeekend_(NSDate? date) { + return _lib._objc_msgSend_160( + _id, _lib._sel_isDateInWeekend_1, date?._id ?? ffi.nullptr); + } + + bool rangeOfWeekendStartDate_interval_containingDate_( + ffi.Pointer> datep, + ffi.Pointer tip, + NSDate? date) { + return _lib._objc_msgSend_721( + _id, + _lib._sel_rangeOfWeekendStartDate_interval_containingDate_1, + datep, + tip, + date?._id ?? ffi.nullptr); + } + + bool nextWeekendStartDate_interval_options_afterDate_( + ffi.Pointer> datep, + ffi.Pointer tip, + int options, + NSDate? date) { + return _lib._objc_msgSend_722( + _id, + _lib._sel_nextWeekendStartDate_interval_options_afterDate_1, + datep, + tip, + options, + date?._id ?? ffi.nullptr); + } + + NSDateComponents components_fromDateComponents_toDateComponents_options_( + int unitFlags, + NSDateComponents? startingDateComp, + NSDateComponents? resultDateComp, + int options) { + final _ret = _lib._objc_msgSend_723( + _id, + _lib._sel_components_fromDateComponents_toDateComponents_options_1, + unitFlags, + startingDateComp?._id ?? ffi.nullptr, + resultDateComp?._id ?? ffi.nullptr, + options); + return NSDateComponents._(_ret, _lib, retain: true, release: true); + } + + NSDate dateByAddingUnit_value_toDate_options_( + int unit, int value, NSDate? date, int options) { + final _ret = _lib._objc_msgSend_724( + _id, + _lib._sel_dateByAddingUnit_value_toDate_options_1, + unit, + value, + date?._id ?? ffi.nullptr, + options); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + void enumerateDatesStartingAfterDate_matchingComponents_options_usingBlock_( + NSDate? start, + NSDateComponents? comps, + int opts, + ObjCBlock_ffiVoid_NSDate_bool_bool block) { + _lib._objc_msgSend_725( + _id, + _lib._sel_enumerateDatesStartingAfterDate_matchingComponents_options_usingBlock_1, + start?._id ?? ffi.nullptr, + comps?._id ?? ffi.nullptr, + opts, + block._id); + } + + NSDate nextDateAfterDate_matchingComponents_options_( + NSDate? date, NSDateComponents? comps, int options) { + final _ret = _lib._objc_msgSend_726( + _id, + _lib._sel_nextDateAfterDate_matchingComponents_options_1, + date?._id ?? ffi.nullptr, + comps?._id ?? ffi.nullptr, + options); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + NSDate nextDateAfterDate_matchingUnit_value_options_( + NSDate? date, int unit, int value, int options) { + final _ret = _lib._objc_msgSend_727( + _id, + _lib._sel_nextDateAfterDate_matchingUnit_value_options_1, + date?._id ?? ffi.nullptr, + unit, + value, + options); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + NSDate nextDateAfterDate_matchingHour_minute_second_options_(NSDate? date, + int hourValue, int minuteValue, int secondValue, int options) { + final _ret = _lib._objc_msgSend_728( + _id, + _lib._sel_nextDateAfterDate_matchingHour_minute_second_options_1, + date?._id ?? ffi.nullptr, + hourValue, + minuteValue, + secondValue, + options); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + NSDate dateBySettingUnit_value_ofDate_options_( + int unit, int v, NSDate? date, int opts) { + final _ret = _lib._objc_msgSend_724( + _id, + _lib._sel_dateBySettingUnit_value_ofDate_options_1, + unit, + v, + date?._id ?? ffi.nullptr, + opts); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + NSDate dateBySettingHour_minute_second_ofDate_options_( + int h, int m, int s, NSDate? date, int opts) { + final _ret = _lib._objc_msgSend_729( + _id, + _lib._sel_dateBySettingHour_minute_second_ofDate_options_1, + h, + m, + s, + date?._id ?? ffi.nullptr, + opts); + return NSDate._(_ret, _lib, retain: true, release: true); + } + + bool date_matchesComponents_(NSDate? date, NSDateComponents? components) { + return _lib._objc_msgSend_730(_id, _lib._sel_date_matchesComponents_1, + date?._id ?? ffi.nullptr, components?._id ?? ffi.nullptr); + } + + static NSCalendar new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSCalendar1, _lib._sel_new1); + return NSCalendar._(_ret, _lib, retain: false, release: true); + } + + static NSCalendar allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSCalendar1, _lib._sel_allocWithZone_1, zone); + return NSCalendar._(_ret, _lib, retain: false, release: true); + } + + static NSCalendar alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSCalendar1, _lib._sel_alloc1); + return NSCalendar._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSCalendar1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSCalendar1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSCalendar1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSCalendar1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSCalendar1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSCalendar1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSCalendar1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSCalendar1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSCalendar1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSCalendarUnit { + static const int NSCalendarUnitEra = 2; + static const int NSCalendarUnitYear = 4; + static const int NSCalendarUnitMonth = 8; + static const int NSCalendarUnitDay = 16; + static const int NSCalendarUnitHour = 32; + static const int NSCalendarUnitMinute = 64; + static const int NSCalendarUnitSecond = 128; + static const int NSCalendarUnitWeekday = 512; + static const int NSCalendarUnitWeekdayOrdinal = 1024; + static const int NSCalendarUnitQuarter = 2048; + static const int NSCalendarUnitWeekOfMonth = 4096; + static const int NSCalendarUnitWeekOfYear = 8192; + static const int NSCalendarUnitYearForWeekOfYear = 16384; + static const int NSCalendarUnitNanosecond = 32768; + static const int NSCalendarUnitCalendar = 1048576; + static const int NSCalendarUnitTimeZone = 2097152; + static const int NSEraCalendarUnit = 2; + static const int NSYearCalendarUnit = 4; + static const int NSMonthCalendarUnit = 8; + static const int NSDayCalendarUnit = 16; + static const int NSHourCalendarUnit = 32; + static const int NSMinuteCalendarUnit = 64; + static const int NSSecondCalendarUnit = 128; + static const int NSWeekCalendarUnit = 256; + static const int NSWeekdayCalendarUnit = 512; + static const int NSWeekdayOrdinalCalendarUnit = 1024; + static const int NSQuarterCalendarUnit = 2048; + static const int NSWeekOfMonthCalendarUnit = 4096; + static const int NSWeekOfYearCalendarUnit = 8192; + static const int NSYearForWeekOfYearCalendarUnit = 16384; + static const int NSCalendarCalendarUnit = 1048576; + static const int NSTimeZoneCalendarUnit = 2097152; +} + +class NSDateComponents extends NSObject { + NSDateComponents._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSDateComponents] that points to the same underlying object as [other]. + static NSDateComponents castFrom(T other) { + return NSDateComponents._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSDateComponents] that wraps the given raw object pointer. + static NSDateComponents castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSDateComponents._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSDateComponents]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSDateComponents1); + } + + NSCalendar? get calendar { + final _ret = _lib._objc_msgSend_700(_id, _lib._sel_calendar1); + return _ret.address == 0 + ? null + : NSCalendar._(_ret, _lib, retain: true, release: true); + } + + set calendar(NSCalendar? value) { + return _lib._objc_msgSend_706( + _id, _lib._sel_setCalendar_1, value?._id ?? ffi.nullptr); + } + + NSTimeZone? get timeZone { + final _ret = _lib._objc_msgSend_168(_id, _lib._sel_timeZone1); + return _ret.address == 0 + ? null + : NSTimeZone._(_ret, _lib, retain: true, release: true); + } + + set timeZone(NSTimeZone? value) { + return _lib._objc_msgSend_169( + _id, _lib._sel_setTimeZone_1, value?._id ?? ffi.nullptr); + } + + int get era { + return _lib._objc_msgSend_78(_id, _lib._sel_era1); + } + + set era(int value) { + return _lib._objc_msgSend_590(_id, _lib._sel_setEra_1, value); + } + + int get year { + return _lib._objc_msgSend_78(_id, _lib._sel_year1); + } + + set year(int value) { + return _lib._objc_msgSend_590(_id, _lib._sel_setYear_1, value); + } + + int get month { + return _lib._objc_msgSend_78(_id, _lib._sel_month1); + } + + set month(int value) { + return _lib._objc_msgSend_590(_id, _lib._sel_setMonth_1, value); + } + + int get day { + return _lib._objc_msgSend_78(_id, _lib._sel_day1); + } + + set day(int value) { + return _lib._objc_msgSend_590(_id, _lib._sel_setDay_1, value); + } + + int get hour { + return _lib._objc_msgSend_78(_id, _lib._sel_hour1); + } + + set hour(int value) { + return _lib._objc_msgSend_590(_id, _lib._sel_setHour_1, value); + } + + int get minute { + return _lib._objc_msgSend_78(_id, _lib._sel_minute1); + } + + set minute(int value) { + return _lib._objc_msgSend_590(_id, _lib._sel_setMinute_1, value); + } + + int get second { + return _lib._objc_msgSend_78(_id, _lib._sel_second1); + } + + set second(int value) { + return _lib._objc_msgSend_590(_id, _lib._sel_setSecond_1, value); + } + + int get nanosecond { + return _lib._objc_msgSend_78(_id, _lib._sel_nanosecond1); + } + + set nanosecond(int value) { + return _lib._objc_msgSend_590(_id, _lib._sel_setNanosecond_1, value); + } + + int get weekday { + return _lib._objc_msgSend_78(_id, _lib._sel_weekday1); + } + + set weekday(int value) { + return _lib._objc_msgSend_590(_id, _lib._sel_setWeekday_1, value); + } + + int get weekdayOrdinal { + return _lib._objc_msgSend_78(_id, _lib._sel_weekdayOrdinal1); + } + + set weekdayOrdinal(int value) { + return _lib._objc_msgSend_590(_id, _lib._sel_setWeekdayOrdinal_1, value); + } + + int get quarter { + return _lib._objc_msgSend_78(_id, _lib._sel_quarter1); + } + + set quarter(int value) { + return _lib._objc_msgSend_590(_id, _lib._sel_setQuarter_1, value); + } + + int get weekOfMonth { + return _lib._objc_msgSend_78(_id, _lib._sel_weekOfMonth1); + } + + set weekOfMonth(int value) { + return _lib._objc_msgSend_590(_id, _lib._sel_setWeekOfMonth_1, value); + } + + int get weekOfYear { + return _lib._objc_msgSend_78(_id, _lib._sel_weekOfYear1); + } + + set weekOfYear(int value) { + return _lib._objc_msgSend_590(_id, _lib._sel_setWeekOfYear_1, value); + } + + int get yearForWeekOfYear { + return _lib._objc_msgSend_78(_id, _lib._sel_yearForWeekOfYear1); + } + + set yearForWeekOfYear(int value) { + return _lib._objc_msgSend_590(_id, _lib._sel_setYearForWeekOfYear_1, value); + } + + bool get leapMonth { + return _lib._objc_msgSend_12(_id, _lib._sel_isLeapMonth1); + } + + set leapMonth(bool value) { + return _lib._objc_msgSend_492(_id, _lib._sel_setLeapMonth_1, value); + } + + NSDate? get date { + final _ret = _lib._objc_msgSend_162(_id, _lib._sel_date1); + return _ret.address == 0 + ? null + : NSDate._(_ret, _lib, retain: true, release: true); + } + + int week() { + return _lib._objc_msgSend_78(_id, _lib._sel_week1); + } + + void setWeek_(int v) { + _lib._objc_msgSend_394(_id, _lib._sel_setWeek_1, v); + } + + void setValue_forComponent_(int value, int unit) { + _lib._objc_msgSend_707(_id, _lib._sel_setValue_forComponent_1, value, unit); + } + + int valueForComponent_(int unit) { + return _lib._objc_msgSend_708(_id, _lib._sel_valueForComponent_1, unit); + } + + bool get validDate { + return _lib._objc_msgSend_12(_id, _lib._sel_isValidDate1); + } + + bool isValidDateInCalendar_(NSCalendar? calendar) { + return _lib._objc_msgSend_709( + _id, _lib._sel_isValidDateInCalendar_1, calendar?._id ?? ffi.nullptr); + } + + @override + NSDateComponents init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSDateComponents._(_ret, _lib, retain: true, release: true); + } + + static NSDateComponents new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSDateComponents1, _lib._sel_new1); + return NSDateComponents._(_ret, _lib, retain: false, release: true); + } + + static NSDateComponents allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSDateComponents1, _lib._sel_allocWithZone_1, zone); + return NSDateComponents._(_ret, _lib, retain: false, release: true); + } + + static NSDateComponents alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSDateComponents1, _lib._sel_alloc1); + return NSDateComponents._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSDateComponents1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSDateComponents1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSDateComponents1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSDateComponents1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSDateComponents1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSDateComponents1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSDateComponents1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSDateComponents1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSDateComponents1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSCalendarOptions { + static const int NSCalendarWrapComponents = 1; + static const int NSCalendarMatchStrictly = 2; + static const int NSCalendarSearchBackwards = 4; + static const int NSCalendarMatchPreviousTimePreservingSmallerUnits = 256; + static const int NSCalendarMatchNextTimePreservingSmallerUnits = 512; + static const int NSCalendarMatchNextTime = 1024; + static const int NSCalendarMatchFirst = 4096; + static const int NSCalendarMatchLast = 8192; +} + +void _ObjCBlock_ffiVoid_NSDate_bool_bool_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + bool arg1, + ffi.Pointer arg2) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, ffi.Bool arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function(ffi.Pointer arg0, bool arg1, + ffi.Pointer arg2)>()(arg0, arg1, arg2); +} + +final _ObjCBlock_ffiVoid_NSDate_bool_bool_closureRegistry = {}; +int _ObjCBlock_ffiVoid_NSDate_bool_bool_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_NSDate_bool_bool_registerClosure( + Function fn) { + final id = ++_ObjCBlock_ffiVoid_NSDate_bool_bool_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSDate_bool_bool_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSDate_bool_bool_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + bool arg1, + ffi.Pointer arg2) { + return (_ObjCBlock_ffiVoid_NSDate_bool_bool_closureRegistry[ + block.ref.target.address] + as void Function(ffi.Pointer, bool, + ffi.Pointer))(arg0, arg1, arg2); +} + +class ObjCBlock_ffiVoid_NSDate_bool_bool extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSDate_bool_bool._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSDate_bool_bool.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, ffi.Bool arg1, + ffi.Pointer arg2)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Bool arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_NSDate_bool_bool_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSDate_bool_bool.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, bool arg1, + ffi.Pointer arg2) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Bool arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_NSDate_bool_bool_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSDate_bool_bool_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call( + ffi.Pointer arg0, bool arg1, ffi.Pointer arg2) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Bool arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + bool arg1, + ffi.Pointer arg2)>()(_id, arg0, arg1, arg2); + } +} + +class NSNumberFormatter extends NSFormatter { + NSNumberFormatter._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSNumberFormatter] that points to the same underlying object as [other]. + static NSNumberFormatter castFrom(T other) { + return NSNumberFormatter._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSNumberFormatter] that wraps the given raw object pointer. + static NSNumberFormatter castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSNumberFormatter._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSNumberFormatter]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSNumberFormatter1); + } + + int get formattingContext { + return _lib._objc_msgSend_690(_id, _lib._sel_formattingContext1); + } + + set formattingContext(int value) { + return _lib._objc_msgSend_691(_id, _lib._sel_setFormattingContext_1, value); + } + + bool getObjectValue_forString_range_error_( + ffi.Pointer> obj, + NSString? string, + ffi.Pointer<_NSRange> rangep, + ffi.Pointer> error) { + return _lib._objc_msgSend_692( + _id, + _lib._sel_getObjectValue_forString_range_error_1, + obj, + string?._id ?? ffi.nullptr, + rangep, + error); + } + + NSString stringFromNumber_(NSNumber? number) { + final _ret = _lib._objc_msgSend_732( + _id, _lib._sel_stringFromNumber_1, number?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSNumber numberFromString_(NSString? string) { + final _ret = _lib._objc_msgSend_733( + _id, _lib._sel_numberFromString_1, string?._id ?? ffi.nullptr); + return NSNumber._(_ret, _lib, retain: true, release: true); + } + + static NSString localizedStringFromNumber_numberStyle_( + SentryCocoa _lib, NSNumber? num, int nstyle) { + final _ret = _lib._objc_msgSend_734( + _lib._class_NSNumberFormatter1, + _lib._sel_localizedStringFromNumber_numberStyle_1, + num?._id ?? ffi.nullptr, + nstyle); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static int defaultFormatterBehavior(SentryCocoa _lib) { + return _lib._objc_msgSend_735( + _lib._class_NSNumberFormatter1, _lib._sel_defaultFormatterBehavior1); + } + + static void setDefaultFormatterBehavior_(SentryCocoa _lib, int behavior) { + _lib._objc_msgSend_736(_lib._class_NSNumberFormatter1, + _lib._sel_setDefaultFormatterBehavior_1, behavior); + } + + int get numberStyle { + return _lib._objc_msgSend_737(_id, _lib._sel_numberStyle1); + } + + set numberStyle(int value) { + return _lib._objc_msgSend_738(_id, _lib._sel_setNumberStyle_1, value); + } + + NSLocale? get locale { + final _ret = _lib._objc_msgSend_182(_id, _lib._sel_locale1); + return _ret.address == 0 + ? null + : NSLocale._(_ret, _lib, retain: true, release: true); + } + + set locale(NSLocale? value) { + return _lib._objc_msgSend_699( + _id, _lib._sel_setLocale_1, value?._id ?? ffi.nullptr); + } + + bool get generatesDecimalNumbers { + return _lib._objc_msgSend_12(_id, _lib._sel_generatesDecimalNumbers1); + } + + set generatesDecimalNumbers(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setGeneratesDecimalNumbers_1, value); + } + + int get formatterBehavior { + return _lib._objc_msgSend_735(_id, _lib._sel_formatterBehavior1); + } + + set formatterBehavior(int value) { + return _lib._objc_msgSend_739(_id, _lib._sel_setFormatterBehavior_1, value); + } + + NSString? get negativeFormat { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_negativeFormat1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set negativeFormat(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setNegativeFormat_1, value?._id ?? ffi.nullptr); + } + + NSDictionary? get textAttributesForNegativeValues { + final _ret = + _lib._objc_msgSend_170(_id, _lib._sel_textAttributesForNegativeValues1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + set textAttributesForNegativeValues(NSDictionary? value) { + return _lib._objc_msgSend_171( + _id, + _lib._sel_setTextAttributesForNegativeValues_1, + value?._id ?? ffi.nullptr); + } + + NSString? get positiveFormat { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_positiveFormat1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set positiveFormat(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setPositiveFormat_1, value?._id ?? ffi.nullptr); + } + + NSDictionary? get textAttributesForPositiveValues { + final _ret = + _lib._objc_msgSend_170(_id, _lib._sel_textAttributesForPositiveValues1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + set textAttributesForPositiveValues(NSDictionary? value) { + return _lib._objc_msgSend_171( + _id, + _lib._sel_setTextAttributesForPositiveValues_1, + value?._id ?? ffi.nullptr); + } + + bool get allowsFloats { + return _lib._objc_msgSend_12(_id, _lib._sel_allowsFloats1); + } + + set allowsFloats(bool value) { + return _lib._objc_msgSend_492(_id, _lib._sel_setAllowsFloats_1, value); + } + + NSString? get decimalSeparator { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_decimalSeparator1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set decimalSeparator(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setDecimalSeparator_1, value?._id ?? ffi.nullptr); + } + + bool get alwaysShowsDecimalSeparator { + return _lib._objc_msgSend_12(_id, _lib._sel_alwaysShowsDecimalSeparator1); + } + + set alwaysShowsDecimalSeparator(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setAlwaysShowsDecimalSeparator_1, value); + } + + NSString? get currencyDecimalSeparator { + final _ret = + _lib._objc_msgSend_20(_id, _lib._sel_currencyDecimalSeparator1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set currencyDecimalSeparator(NSString? value) { + return _lib._objc_msgSend_509(_id, _lib._sel_setCurrencyDecimalSeparator_1, + value?._id ?? ffi.nullptr); + } + + bool get usesGroupingSeparator { + return _lib._objc_msgSend_12(_id, _lib._sel_usesGroupingSeparator1); + } + + set usesGroupingSeparator(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setUsesGroupingSeparator_1, value); + } + + NSString? get groupingSeparator { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_groupingSeparator1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set groupingSeparator(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setGroupingSeparator_1, value?._id ?? ffi.nullptr); + } + + NSString? get zeroSymbol { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_zeroSymbol1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set zeroSymbol(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setZeroSymbol_1, value?._id ?? ffi.nullptr); + } + + NSDictionary? get textAttributesForZero { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_textAttributesForZero1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + set textAttributesForZero(NSDictionary? value) { + return _lib._objc_msgSend_171( + _id, _lib._sel_setTextAttributesForZero_1, value?._id ?? ffi.nullptr); + } + + NSString? get nilSymbol { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_nilSymbol1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set nilSymbol(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setNilSymbol_1, value?._id ?? ffi.nullptr); + } + + NSDictionary? get textAttributesForNil { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_textAttributesForNil1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + set textAttributesForNil(NSDictionary? value) { + return _lib._objc_msgSend_171( + _id, _lib._sel_setTextAttributesForNil_1, value?._id ?? ffi.nullptr); + } + + NSString? get notANumberSymbol { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_notANumberSymbol1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set notANumberSymbol(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setNotANumberSymbol_1, value?._id ?? ffi.nullptr); + } + + NSDictionary? get textAttributesForNotANumber { + final _ret = + _lib._objc_msgSend_170(_id, _lib._sel_textAttributesForNotANumber1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + set textAttributesForNotANumber(NSDictionary? value) { + return _lib._objc_msgSend_171(_id, + _lib._sel_setTextAttributesForNotANumber_1, value?._id ?? ffi.nullptr); + } + + NSString? get positiveInfinitySymbol { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_positiveInfinitySymbol1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set positiveInfinitySymbol(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setPositiveInfinitySymbol_1, value?._id ?? ffi.nullptr); + } + + NSDictionary? get textAttributesForPositiveInfinity { + final _ret = _lib._objc_msgSend_170( + _id, _lib._sel_textAttributesForPositiveInfinity1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + set textAttributesForPositiveInfinity(NSDictionary? value) { + return _lib._objc_msgSend_171( + _id, + _lib._sel_setTextAttributesForPositiveInfinity_1, + value?._id ?? ffi.nullptr); + } + + NSString? get negativeInfinitySymbol { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_negativeInfinitySymbol1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set negativeInfinitySymbol(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setNegativeInfinitySymbol_1, value?._id ?? ffi.nullptr); + } + + NSDictionary? get textAttributesForNegativeInfinity { + final _ret = _lib._objc_msgSend_170( + _id, _lib._sel_textAttributesForNegativeInfinity1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + set textAttributesForNegativeInfinity(NSDictionary? value) { + return _lib._objc_msgSend_171( + _id, + _lib._sel_setTextAttributesForNegativeInfinity_1, + value?._id ?? ffi.nullptr); + } + + NSString? get positivePrefix { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_positivePrefix1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set positivePrefix(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setPositivePrefix_1, value?._id ?? ffi.nullptr); + } + + NSString? get positiveSuffix { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_positiveSuffix1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set positiveSuffix(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setPositiveSuffix_1, value?._id ?? ffi.nullptr); + } + + NSString? get negativePrefix { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_negativePrefix1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set negativePrefix(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setNegativePrefix_1, value?._id ?? ffi.nullptr); + } + + NSString? get negativeSuffix { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_negativeSuffix1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set negativeSuffix(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setNegativeSuffix_1, value?._id ?? ffi.nullptr); + } + + NSString? get currencyCode { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_currencyCode1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set currencyCode(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setCurrencyCode_1, value?._id ?? ffi.nullptr); + } + + NSString? get currencySymbol { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_currencySymbol1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set currencySymbol(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setCurrencySymbol_1, value?._id ?? ffi.nullptr); + } + + NSString? get internationalCurrencySymbol { + final _ret = + _lib._objc_msgSend_20(_id, _lib._sel_internationalCurrencySymbol1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set internationalCurrencySymbol(NSString? value) { + return _lib._objc_msgSend_509(_id, + _lib._sel_setInternationalCurrencySymbol_1, value?._id ?? ffi.nullptr); + } + + NSString? get percentSymbol { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_percentSymbol1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set percentSymbol(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setPercentSymbol_1, value?._id ?? ffi.nullptr); + } + + NSString? get perMillSymbol { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_perMillSymbol1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set perMillSymbol(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setPerMillSymbol_1, value?._id ?? ffi.nullptr); + } + + NSString? get minusSign { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_minusSign1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set minusSign(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setMinusSign_1, value?._id ?? ffi.nullptr); + } + + NSString? get plusSign { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_plusSign1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set plusSign(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setPlusSign_1, value?._id ?? ffi.nullptr); + } + + NSString? get exponentSymbol { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_exponentSymbol1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set exponentSymbol(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setExponentSymbol_1, value?._id ?? ffi.nullptr); + } + + int get groupingSize { + return _lib._objc_msgSend_10(_id, _lib._sel_groupingSize1); + } + + set groupingSize(int value) { + return _lib._objc_msgSend_483(_id, _lib._sel_setGroupingSize_1, value); + } + + int get secondaryGroupingSize { + return _lib._objc_msgSend_10(_id, _lib._sel_secondaryGroupingSize1); + } + + set secondaryGroupingSize(int value) { + return _lib._objc_msgSend_483( + _id, _lib._sel_setSecondaryGroupingSize_1, value); + } + + NSNumber? get multiplier { + final _ret = _lib._objc_msgSend_198(_id, _lib._sel_multiplier1); + return _ret.address == 0 + ? null + : NSNumber._(_ret, _lib, retain: true, release: true); + } + + set multiplier(NSNumber? value) { + return _lib._objc_msgSend_620( + _id, _lib._sel_setMultiplier_1, value?._id ?? ffi.nullptr); + } + + int get formatWidth { + return _lib._objc_msgSend_10(_id, _lib._sel_formatWidth1); + } + + set formatWidth(int value) { + return _lib._objc_msgSend_483(_id, _lib._sel_setFormatWidth_1, value); + } + + NSString? get paddingCharacter { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_paddingCharacter1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set paddingCharacter(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setPaddingCharacter_1, value?._id ?? ffi.nullptr); + } + + int get paddingPosition { + return _lib._objc_msgSend_740(_id, _lib._sel_paddingPosition1); + } + + set paddingPosition(int value) { + return _lib._objc_msgSend_741(_id, _lib._sel_setPaddingPosition_1, value); + } + + int get roundingMode { + return _lib._objc_msgSend_742(_id, _lib._sel_roundingMode1); + } + + set roundingMode(int value) { + return _lib._objc_msgSend_743(_id, _lib._sel_setRoundingMode_1, value); + } + + NSNumber? get roundingIncrement { + final _ret = _lib._objc_msgSend_198(_id, _lib._sel_roundingIncrement1); + return _ret.address == 0 + ? null + : NSNumber._(_ret, _lib, retain: true, release: true); + } + + set roundingIncrement(NSNumber? value) { + return _lib._objc_msgSend_620( + _id, _lib._sel_setRoundingIncrement_1, value?._id ?? ffi.nullptr); + } + + int get minimumIntegerDigits { + return _lib._objc_msgSend_10(_id, _lib._sel_minimumIntegerDigits1); + } + + set minimumIntegerDigits(int value) { + return _lib._objc_msgSend_483( + _id, _lib._sel_setMinimumIntegerDigits_1, value); + } + + int get maximumIntegerDigits { + return _lib._objc_msgSend_10(_id, _lib._sel_maximumIntegerDigits1); + } + + set maximumIntegerDigits(int value) { + return _lib._objc_msgSend_483( + _id, _lib._sel_setMaximumIntegerDigits_1, value); + } + + int get minimumFractionDigits { + return _lib._objc_msgSend_10(_id, _lib._sel_minimumFractionDigits1); + } + + set minimumFractionDigits(int value) { + return _lib._objc_msgSend_483( + _id, _lib._sel_setMinimumFractionDigits_1, value); + } + + int get maximumFractionDigits { + return _lib._objc_msgSend_10(_id, _lib._sel_maximumFractionDigits1); + } + + set maximumFractionDigits(int value) { + return _lib._objc_msgSend_483( + _id, _lib._sel_setMaximumFractionDigits_1, value); + } + + NSNumber? get minimum { + final _ret = _lib._objc_msgSend_198(_id, _lib._sel_minimum1); + return _ret.address == 0 + ? null + : NSNumber._(_ret, _lib, retain: true, release: true); + } + + set minimum(NSNumber? value) { + return _lib._objc_msgSend_620( + _id, _lib._sel_setMinimum_1, value?._id ?? ffi.nullptr); + } + + NSNumber? get maximum { + final _ret = _lib._objc_msgSend_198(_id, _lib._sel_maximum1); + return _ret.address == 0 + ? null + : NSNumber._(_ret, _lib, retain: true, release: true); + } + + set maximum(NSNumber? value) { + return _lib._objc_msgSend_620( + _id, _lib._sel_setMaximum_1, value?._id ?? ffi.nullptr); + } + + NSString? get currencyGroupingSeparator { + final _ret = + _lib._objc_msgSend_20(_id, _lib._sel_currencyGroupingSeparator1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set currencyGroupingSeparator(NSString? value) { + return _lib._objc_msgSend_509(_id, _lib._sel_setCurrencyGroupingSeparator_1, + value?._id ?? ffi.nullptr); + } + + bool get lenient { + return _lib._objc_msgSend_12(_id, _lib._sel_isLenient1); + } + + set lenient(bool value) { + return _lib._objc_msgSend_492(_id, _lib._sel_setLenient_1, value); + } + + bool get usesSignificantDigits { + return _lib._objc_msgSend_12(_id, _lib._sel_usesSignificantDigits1); + } + + set usesSignificantDigits(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setUsesSignificantDigits_1, value); + } + + int get minimumSignificantDigits { + return _lib._objc_msgSend_10(_id, _lib._sel_minimumSignificantDigits1); + } + + set minimumSignificantDigits(int value) { + return _lib._objc_msgSend_483( + _id, _lib._sel_setMinimumSignificantDigits_1, value); + } + + int get maximumSignificantDigits { + return _lib._objc_msgSend_10(_id, _lib._sel_maximumSignificantDigits1); + } + + set maximumSignificantDigits(int value) { + return _lib._objc_msgSend_483( + _id, _lib._sel_setMaximumSignificantDigits_1, value); + } + + bool get partialStringValidationEnabled { + return _lib._objc_msgSend_12( + _id, _lib._sel_isPartialStringValidationEnabled1); + } + + set partialStringValidationEnabled(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setPartialStringValidationEnabled_1, value); + } + + bool get hasThousandSeparators { + return _lib._objc_msgSend_12(_id, _lib._sel_hasThousandSeparators1); + } + + set hasThousandSeparators(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setHasThousandSeparators_1, value); + } + + NSString? get thousandSeparator { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_thousandSeparator1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set thousandSeparator(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setThousandSeparator_1, value?._id ?? ffi.nullptr); + } + + bool get localizesFormat { + return _lib._objc_msgSend_12(_id, _lib._sel_localizesFormat1); + } + + set localizesFormat(bool value) { + return _lib._objc_msgSend_492(_id, _lib._sel_setLocalizesFormat_1, value); + } + + NSString? get format { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_format1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set format(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setFormat_1, value?._id ?? ffi.nullptr); + } + + NSAttributedString? get attributedStringForZero { + final _ret = + _lib._objc_msgSend_675(_id, _lib._sel_attributedStringForZero1); + return _ret.address == 0 + ? null + : NSAttributedString._(_ret, _lib, retain: true, release: true); + } + + set attributedStringForZero(NSAttributedString? value) { + return _lib._objc_msgSend_744( + _id, _lib._sel_setAttributedStringForZero_1, value?._id ?? ffi.nullptr); + } + + NSAttributedString? get attributedStringForNil { + final _ret = _lib._objc_msgSend_675(_id, _lib._sel_attributedStringForNil1); + return _ret.address == 0 + ? null + : NSAttributedString._(_ret, _lib, retain: true, release: true); + } + + set attributedStringForNil(NSAttributedString? value) { + return _lib._objc_msgSend_744( + _id, _lib._sel_setAttributedStringForNil_1, value?._id ?? ffi.nullptr); + } + + NSAttributedString? get attributedStringForNotANumber { + final _ret = + _lib._objc_msgSend_675(_id, _lib._sel_attributedStringForNotANumber1); + return _ret.address == 0 + ? null + : NSAttributedString._(_ret, _lib, retain: true, release: true); + } + + set attributedStringForNotANumber(NSAttributedString? value) { + return _lib._objc_msgSend_744( + _id, + _lib._sel_setAttributedStringForNotANumber_1, + value?._id ?? ffi.nullptr); + } + + NSDecimalNumberHandler? get roundingBehavior { + final _ret = _lib._objc_msgSend_745(_id, _lib._sel_roundingBehavior1); + return _ret.address == 0 + ? null + : NSDecimalNumberHandler._(_ret, _lib, retain: true, release: true); + } + + set roundingBehavior(NSDecimalNumberHandler? value) { + return _lib._objc_msgSend_747( + _id, _lib._sel_setRoundingBehavior_1, value?._id ?? ffi.nullptr); + } + + @override + NSNumberFormatter init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSNumberFormatter._(_ret, _lib, retain: true, release: true); + } + + static NSNumberFormatter new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSNumberFormatter1, _lib._sel_new1); + return NSNumberFormatter._(_ret, _lib, retain: false, release: true); + } + + static NSNumberFormatter allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSNumberFormatter1, _lib._sel_allocWithZone_1, zone); + return NSNumberFormatter._(_ret, _lib, retain: false, release: true); + } + + static NSNumberFormatter alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSNumberFormatter1, _lib._sel_alloc1); + return NSNumberFormatter._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSNumberFormatter1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSNumberFormatter1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSNumberFormatter1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSNumberFormatter1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSNumberFormatter1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSNumberFormatter1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSNumberFormatter1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSNumberFormatter1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSNumberFormatter1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSNumberFormatterStyle { + static const int NSNumberFormatterNoStyle = 0; + static const int NSNumberFormatterDecimalStyle = 1; + static const int NSNumberFormatterCurrencyStyle = 2; + static const int NSNumberFormatterPercentStyle = 3; + static const int NSNumberFormatterScientificStyle = 4; + static const int NSNumberFormatterSpellOutStyle = 5; + static const int NSNumberFormatterOrdinalStyle = 6; + static const int NSNumberFormatterCurrencyISOCodeStyle = 8; + static const int NSNumberFormatterCurrencyPluralStyle = 9; + static const int NSNumberFormatterCurrencyAccountingStyle = 10; +} + +abstract class NSNumberFormatterBehavior { + static const int NSNumberFormatterBehaviorDefault = 0; + static const int NSNumberFormatterBehavior10_0 = 1000; + static const int NSNumberFormatterBehavior10_4 = 1040; +} + +abstract class NSNumberFormatterPadPosition { + static const int NSNumberFormatterPadBeforePrefix = 0; + static const int NSNumberFormatterPadAfterPrefix = 1; + static const int NSNumberFormatterPadBeforeSuffix = 2; + static const int NSNumberFormatterPadAfterSuffix = 3; +} + +abstract class NSNumberFormatterRoundingMode { + static const int NSNumberFormatterRoundCeiling = 0; + static const int NSNumberFormatterRoundFloor = 1; + static const int NSNumberFormatterRoundDown = 2; + static const int NSNumberFormatterRoundUp = 3; + static const int NSNumberFormatterRoundHalfEven = 4; + static const int NSNumberFormatterRoundHalfDown = 5; + static const int NSNumberFormatterRoundHalfUp = 6; +} + +class NSDecimalNumberHandler extends NSObject { + NSDecimalNumberHandler._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSDecimalNumberHandler] that points to the same underlying object as [other]. + static NSDecimalNumberHandler castFrom(T other) { + return NSDecimalNumberHandler._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSDecimalNumberHandler] that wraps the given raw object pointer. + static NSDecimalNumberHandler castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSDecimalNumberHandler._(other, lib, + retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSDecimalNumberHandler]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSDecimalNumberHandler1); + } + + static NSDecimalNumberHandler? getDefaultDecimalNumberHandler( + SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_745(_lib._class_NSDecimalNumberHandler1, + _lib._sel_defaultDecimalNumberHandler1); + return _ret.address == 0 + ? null + : NSDecimalNumberHandler._(_ret, _lib, retain: true, release: true); + } + + NSDecimalNumberHandler + initWithRoundingMode_scale_raiseOnExactness_raiseOnOverflow_raiseOnUnderflow_raiseOnDivideByZero_( + int roundingMode, + int scale, + bool exact, + bool overflow, + bool underflow, + bool divideByZero) { + final _ret = _lib._objc_msgSend_746( + _id, + _lib._sel_initWithRoundingMode_scale_raiseOnExactness_raiseOnOverflow_raiseOnUnderflow_raiseOnDivideByZero_1, + roundingMode, + scale, + exact, + overflow, + underflow, + divideByZero); + return NSDecimalNumberHandler._(_ret, _lib, retain: true, release: true); + } + + static NSDecimalNumberHandler + decimalNumberHandlerWithRoundingMode_scale_raiseOnExactness_raiseOnOverflow_raiseOnUnderflow_raiseOnDivideByZero_( + SentryCocoa _lib, + int roundingMode, + int scale, + bool exact, + bool overflow, + bool underflow, + bool divideByZero) { + final _ret = _lib._objc_msgSend_746( + _lib._class_NSDecimalNumberHandler1, + _lib._sel_decimalNumberHandlerWithRoundingMode_scale_raiseOnExactness_raiseOnOverflow_raiseOnUnderflow_raiseOnDivideByZero_1, + roundingMode, + scale, + exact, + overflow, + underflow, + divideByZero); + return NSDecimalNumberHandler._(_ret, _lib, retain: true, release: true); + } + + @override + NSDecimalNumberHandler init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSDecimalNumberHandler._(_ret, _lib, retain: true, release: true); + } + + static NSDecimalNumberHandler new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSDecimalNumberHandler1, _lib._sel_new1); + return NSDecimalNumberHandler._(_ret, _lib, retain: false, release: true); + } + + static NSDecimalNumberHandler allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSDecimalNumberHandler1, _lib._sel_allocWithZone_1, zone); + return NSDecimalNumberHandler._(_ret, _lib, retain: false, release: true); + } + + static NSDecimalNumberHandler alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSDecimalNumberHandler1, _lib._sel_alloc1); + return NSDecimalNumberHandler._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSDecimalNumberHandler1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSDecimalNumberHandler1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSDecimalNumberHandler1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSDecimalNumberHandler1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSDecimalNumberHandler1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSDecimalNumberHandler1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSDecimalNumberHandler1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSDecimalNumberHandler1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSDecimalNumberHandler1, + _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSRoundingMode { + static const int NSRoundPlain = 0; + static const int NSRoundDown = 1; + static const int NSRoundUp = 2; + static const int NSRoundBankers = 3; +} + +class NSScanner extends NSObject { + NSScanner._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSScanner] that points to the same underlying object as [other]. + static NSScanner castFrom(T other) { + return NSScanner._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSScanner] that wraps the given raw object pointer. + static NSScanner castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSScanner._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSScanner]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSScanner1); + } + + NSString? get string { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_string1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + int get scanLocation { + return _lib._objc_msgSend_10(_id, _lib._sel_scanLocation1); + } + + set scanLocation(int value) { + return _lib._objc_msgSend_483(_id, _lib._sel_setScanLocation_1, value); + } + + NSCharacterSet? get charactersToBeSkipped { + final _ret = _lib._objc_msgSend_174(_id, _lib._sel_charactersToBeSkipped1); + return _ret.address == 0 + ? null + : NSCharacterSet._(_ret, _lib, retain: true, release: true); + } + + set charactersToBeSkipped(NSCharacterSet? value) { + return _lib._objc_msgSend_748( + _id, _lib._sel_setCharactersToBeSkipped_1, value?._id ?? ffi.nullptr); + } + + bool get caseSensitive { + return _lib._objc_msgSend_12(_id, _lib._sel_caseSensitive1); + } + + set caseSensitive(bool value) { + return _lib._objc_msgSend_492(_id, _lib._sel_setCaseSensitive_1, value); + } + + NSObject get locale { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_locale1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + set locale(NSObject value) { + return _lib._objc_msgSend_387(_id, _lib._sel_setLocale_1, value._id); + } + + NSScanner initWithString_(NSString? string) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithString_1, string?._id ?? ffi.nullptr); + return NSScanner._(_ret, _lib, retain: true, release: true); + } + + bool scanInt_(ffi.Pointer result) { + return _lib._objc_msgSend_749(_id, _lib._sel_scanInt_1, result); + } + + bool scanInteger_(ffi.Pointer result) { + return _lib._objc_msgSend_750(_id, _lib._sel_scanInteger_1, result); + } + + bool scanLongLong_(ffi.Pointer result) { + return _lib._objc_msgSend_751(_id, _lib._sel_scanLongLong_1, result); + } + + bool scanUnsignedLongLong_(ffi.Pointer result) { + return _lib._objc_msgSend_752( + _id, _lib._sel_scanUnsignedLongLong_1, result); + } + + bool scanFloat_(ffi.Pointer result) { + return _lib._objc_msgSend_753(_id, _lib._sel_scanFloat_1, result); + } + + bool scanDouble_(ffi.Pointer result) { + return _lib._objc_msgSend_754(_id, _lib._sel_scanDouble_1, result); + } + + bool scanHexInt_(ffi.Pointer result) { + return _lib._objc_msgSend_755(_id, _lib._sel_scanHexInt_1, result); + } + + bool scanHexLongLong_(ffi.Pointer result) { + return _lib._objc_msgSend_752(_id, _lib._sel_scanHexLongLong_1, result); + } + + bool scanHexFloat_(ffi.Pointer result) { + return _lib._objc_msgSend_753(_id, _lib._sel_scanHexFloat_1, result); + } + + bool scanHexDouble_(ffi.Pointer result) { + return _lib._objc_msgSend_754(_id, _lib._sel_scanHexDouble_1, result); + } + + bool scanString_intoString_( + NSString? string, ffi.Pointer> result) { + return _lib._objc_msgSend_756(_id, _lib._sel_scanString_intoString_1, + string?._id ?? ffi.nullptr, result); + } + + bool scanCharactersFromSet_intoString_( + NSCharacterSet? set, ffi.Pointer> result) { + return _lib._objc_msgSend_757( + _id, + _lib._sel_scanCharactersFromSet_intoString_1, + set?._id ?? ffi.nullptr, + result); + } + + bool scanUpToString_intoString_( + NSString? string, ffi.Pointer> result) { + return _lib._objc_msgSend_756(_id, _lib._sel_scanUpToString_intoString_1, + string?._id ?? ffi.nullptr, result); + } + + bool scanUpToCharactersFromSet_intoString_( + NSCharacterSet? set, ffi.Pointer> result) { + return _lib._objc_msgSend_757( + _id, + _lib._sel_scanUpToCharactersFromSet_intoString_1, + set?._id ?? ffi.nullptr, + result); + } + + bool get atEnd { + return _lib._objc_msgSend_12(_id, _lib._sel_isAtEnd1); + } + + static NSScanner scannerWithString_(SentryCocoa _lib, NSString? string) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSScanner1, + _lib._sel_scannerWithString_1, string?._id ?? ffi.nullptr); + return NSScanner._(_ret, _lib, retain: true, release: true); + } + + static NSObject localizedScannerWithString_( + SentryCocoa _lib, NSString? string) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSScanner1, + _lib._sel_localizedScannerWithString_1, string?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + bool scanDecimal_(ffi.Pointer dcm) { + return _lib._objc_msgSend_758(_id, _lib._sel_scanDecimal_1, dcm); + } + + @override + NSScanner init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSScanner._(_ret, _lib, retain: true, release: true); + } + + static NSScanner new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSScanner1, _lib._sel_new1); + return NSScanner._(_ret, _lib, retain: false, release: true); + } + + static NSScanner allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSScanner1, _lib._sel_allocWithZone_1, zone); + return NSScanner._(_ret, _lib, retain: false, release: true); + } + + static NSScanner alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSScanner1, _lib._sel_alloc1); + return NSScanner._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSScanner1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSScanner1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSScanner1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSScanner1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSScanner1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSScanner1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSScanner1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSScanner1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSScanner1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSDecimal extends ffi.Opaque {} + +class NSException extends NSObject { + NSException._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSException] that points to the same underlying object as [other]. + static NSException castFrom(T other) { + return NSException._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSException] that wraps the given raw object pointer. + static NSException castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSException._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSException]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSException1); + } + + static NSException exceptionWithName_reason_userInfo_(SentryCocoa _lib, + NSString name, NSString? reason, NSDictionary? userInfo) { + final _ret = _lib._objc_msgSend_759( + _lib._class_NSException1, + _lib._sel_exceptionWithName_reason_userInfo_1, + name._id, + reason?._id ?? ffi.nullptr, + userInfo?._id ?? ffi.nullptr); + return NSException._(_ret, _lib, retain: true, release: true); + } + + NSException initWithName_reason_userInfo_( + NSString aName, NSString? aReason, NSDictionary? aUserInfo) { + final _ret = _lib._objc_msgSend_583( + _id, + _lib._sel_initWithName_reason_userInfo_1, + aName._id, + aReason?._id ?? ffi.nullptr, + aUserInfo?._id ?? ffi.nullptr); + return NSException._(_ret, _lib, retain: true, release: true); + } + + NSString get name { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get reason { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_reason1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSDictionary? get userInfo { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_userInfo1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSArray? get callStackReturnAddresses { + final _ret = + _lib._objc_msgSend_79(_id, _lib._sel_callStackReturnAddresses1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get callStackSymbols { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_callStackSymbols1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + void raise() { + _lib._objc_msgSend_1(_id, _lib._sel_raise1); + } + + static void raise_format_(SentryCocoa _lib, NSString name, NSString? format) { + _lib._objc_msgSend_515(_lib._class_NSException1, _lib._sel_raise_format_1, + name._id, format?._id ?? ffi.nullptr); + } + + static void raise_format_arguments_(SentryCocoa _lib, NSString name, + NSString? format, ffi.Pointer<__va_list_tag> argList) { + _lib._objc_msgSend_760( + _lib._class_NSException1, + _lib._sel_raise_format_arguments_1, + name._id, + format?._id ?? ffi.nullptr, + argList); + } + + @override + NSException init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSException._(_ret, _lib, retain: true, release: true); + } + + static NSException new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSException1, _lib._sel_new1); + return NSException._(_ret, _lib, retain: false, release: true); + } + + static NSException allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSException1, _lib._sel_allocWithZone_1, zone); + return NSException._(_ret, _lib, retain: false, release: true); + } + + static NSException alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSException1, _lib._sel_alloc1); + return NSException._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSException1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSException1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSException1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSException1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSException1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSException1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSException1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSException1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSException1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSFileHandle extends NSObject { + NSFileHandle._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSFileHandle] that points to the same underlying object as [other]. + static NSFileHandle castFrom(T other) { + return NSFileHandle._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSFileHandle] that wraps the given raw object pointer. + static NSFileHandle castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSFileHandle._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSFileHandle]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSFileHandle1); + } + + NSData? get availableData { + final _ret = _lib._objc_msgSend_39(_id, _lib._sel_availableData1); + return _ret.address == 0 + ? null + : NSData._(_ret, _lib, retain: true, release: true); + } + + NSFileHandle initWithFileDescriptor_closeOnDealloc_(int fd, bool closeopt) { + final _ret = _lib._objc_msgSend_761( + _id, _lib._sel_initWithFileDescriptor_closeOnDealloc_1, fd, closeopt); + return NSFileHandle._(_ret, _lib, retain: true, release: true); + } + + NSFileHandle initWithCoder_(NSCoder? coder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, coder?._id ?? ffi.nullptr); + return NSFileHandle._(_ret, _lib, retain: true, release: true); + } + + NSData readDataToEndOfFileAndReturnError_( + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_762( + _id, _lib._sel_readDataToEndOfFileAndReturnError_1, error); + return NSData._(_ret, _lib, retain: true, release: true); + } + + NSData readDataUpToLength_error_( + int length, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_763( + _id, _lib._sel_readDataUpToLength_error_1, length, error); + return NSData._(_ret, _lib, retain: true, release: true); + } + + bool writeData_error_( + NSData? data, ffi.Pointer> error) { + return _lib._objc_msgSend_764( + _id, _lib._sel_writeData_error_1, data?._id ?? ffi.nullptr, error); + } + + bool getOffset_error_(ffi.Pointer offsetInFile, + ffi.Pointer> error) { + return _lib._objc_msgSend_765( + _id, _lib._sel_getOffset_error_1, offsetInFile, error); + } + + bool seekToEndReturningOffset_error_( + ffi.Pointer offsetInFile, + ffi.Pointer> error) { + return _lib._objc_msgSend_765( + _id, _lib._sel_seekToEndReturningOffset_error_1, offsetInFile, error); + } + + bool seekToOffset_error_( + int offset, ffi.Pointer> error) { + return _lib._objc_msgSend_766( + _id, _lib._sel_seekToOffset_error_1, offset, error); + } + + bool truncateAtOffset_error_( + int offset, ffi.Pointer> error) { + return _lib._objc_msgSend_766( + _id, _lib._sel_truncateAtOffset_error_1, offset, error); + } + + bool synchronizeAndReturnError_(ffi.Pointer> error) { + return _lib._objc_msgSend_225( + _id, _lib._sel_synchronizeAndReturnError_1, error); + } + + bool closeAndReturnError_(ffi.Pointer> error) { + return _lib._objc_msgSend_225(_id, _lib._sel_closeAndReturnError_1, error); + } + + static NSFileHandle? getFileHandleWithStandardInput(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_767( + _lib._class_NSFileHandle1, _lib._sel_fileHandleWithStandardInput1); + return _ret.address == 0 + ? null + : NSFileHandle._(_ret, _lib, retain: true, release: true); + } + + static NSFileHandle? getFileHandleWithStandardOutput(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_767( + _lib._class_NSFileHandle1, _lib._sel_fileHandleWithStandardOutput1); + return _ret.address == 0 + ? null + : NSFileHandle._(_ret, _lib, retain: true, release: true); + } + + static NSFileHandle? getFileHandleWithStandardError(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_767( + _lib._class_NSFileHandle1, _lib._sel_fileHandleWithStandardError1); + return _ret.address == 0 + ? null + : NSFileHandle._(_ret, _lib, retain: true, release: true); + } + + static NSFileHandle? getFileHandleWithNullDevice(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_767( + _lib._class_NSFileHandle1, _lib._sel_fileHandleWithNullDevice1); + return _ret.address == 0 + ? null + : NSFileHandle._(_ret, _lib, retain: true, release: true); + } + + static NSFileHandle fileHandleForReadingAtPath_( + SentryCocoa _lib, NSString? path) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSFileHandle1, + _lib._sel_fileHandleForReadingAtPath_1, path?._id ?? ffi.nullptr); + return NSFileHandle._(_ret, _lib, retain: true, release: true); + } + + static NSFileHandle fileHandleForWritingAtPath_( + SentryCocoa _lib, NSString? path) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSFileHandle1, + _lib._sel_fileHandleForWritingAtPath_1, path?._id ?? ffi.nullptr); + return NSFileHandle._(_ret, _lib, retain: true, release: true); + } + + static NSFileHandle fileHandleForUpdatingAtPath_( + SentryCocoa _lib, NSString? path) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSFileHandle1, + _lib._sel_fileHandleForUpdatingAtPath_1, path?._id ?? ffi.nullptr); + return NSFileHandle._(_ret, _lib, retain: true, release: true); + } + + static NSFileHandle fileHandleForReadingFromURL_error_(SentryCocoa _lib, + NSURL? url, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_768( + _lib._class_NSFileHandle1, + _lib._sel_fileHandleForReadingFromURL_error_1, + url?._id ?? ffi.nullptr, + error); + return NSFileHandle._(_ret, _lib, retain: true, release: true); + } + + static NSFileHandle fileHandleForWritingToURL_error_(SentryCocoa _lib, + NSURL? url, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_768( + _lib._class_NSFileHandle1, + _lib._sel_fileHandleForWritingToURL_error_1, + url?._id ?? ffi.nullptr, + error); + return NSFileHandle._(_ret, _lib, retain: true, release: true); + } + + static NSFileHandle fileHandleForUpdatingURL_error_(SentryCocoa _lib, + NSURL? url, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_768( + _lib._class_NSFileHandle1, + _lib._sel_fileHandleForUpdatingURL_error_1, + url?._id ?? ffi.nullptr, + error); + return NSFileHandle._(_ret, _lib, retain: true, release: true); + } + + void readInBackgroundAndNotifyForModes_(NSArray? modes) { + _lib._objc_msgSend_441(_id, _lib._sel_readInBackgroundAndNotifyForModes_1, + modes?._id ?? ffi.nullptr); + } + + void readInBackgroundAndNotify() { + _lib._objc_msgSend_1(_id, _lib._sel_readInBackgroundAndNotify1); + } + + void readToEndOfFileInBackgroundAndNotifyForModes_(NSArray? modes) { + _lib._objc_msgSend_441( + _id, + _lib._sel_readToEndOfFileInBackgroundAndNotifyForModes_1, + modes?._id ?? ffi.nullptr); + } + + void readToEndOfFileInBackgroundAndNotify() { + _lib._objc_msgSend_1(_id, _lib._sel_readToEndOfFileInBackgroundAndNotify1); + } + + void acceptConnectionInBackgroundAndNotifyForModes_(NSArray? modes) { + _lib._objc_msgSend_441( + _id, + _lib._sel_acceptConnectionInBackgroundAndNotifyForModes_1, + modes?._id ?? ffi.nullptr); + } + + void acceptConnectionInBackgroundAndNotify() { + _lib._objc_msgSend_1(_id, _lib._sel_acceptConnectionInBackgroundAndNotify1); + } + + void waitForDataInBackgroundAndNotifyForModes_(NSArray? modes) { + _lib._objc_msgSend_441( + _id, + _lib._sel_waitForDataInBackgroundAndNotifyForModes_1, + modes?._id ?? ffi.nullptr); + } + + void waitForDataInBackgroundAndNotify() { + _lib._objc_msgSend_1(_id, _lib._sel_waitForDataInBackgroundAndNotify1); + } + + ObjCBlock_ffiVoid_NSFileHandle get readabilityHandler { + final _ret = _lib._objc_msgSend_769(_id, _lib._sel_readabilityHandler1); + return ObjCBlock_ffiVoid_NSFileHandle._(_ret, _lib); + } + + set readabilityHandler(ObjCBlock_ffiVoid_NSFileHandle value) { + return _lib._objc_msgSend_770( + _id, _lib._sel_setReadabilityHandler_1, value._id); + } + + ObjCBlock_ffiVoid_NSFileHandle get writeabilityHandler { + final _ret = _lib._objc_msgSend_769(_id, _lib._sel_writeabilityHandler1); + return ObjCBlock_ffiVoid_NSFileHandle._(_ret, _lib); + } + + set writeabilityHandler(ObjCBlock_ffiVoid_NSFileHandle value) { + return _lib._objc_msgSend_770( + _id, _lib._sel_setWriteabilityHandler_1, value._id); + } + + NSFileHandle initWithFileDescriptor_(int fd) { + final _ret = + _lib._objc_msgSend_771(_id, _lib._sel_initWithFileDescriptor_1, fd); + return NSFileHandle._(_ret, _lib, retain: true, release: true); + } + + int get fileDescriptor { + return _lib._objc_msgSend_219(_id, _lib._sel_fileDescriptor1); + } + + NSData readDataToEndOfFile() { + final _ret = _lib._objc_msgSend_39(_id, _lib._sel_readDataToEndOfFile1); + return NSData._(_ret, _lib, retain: true, release: true); + } + + NSData readDataOfLength_(int length) { + final _ret = + _lib._objc_msgSend_330(_id, _lib._sel_readDataOfLength_1, length); + return NSData._(_ret, _lib, retain: true, release: true); + } + + void writeData_(NSData? data) { + _lib._objc_msgSend_263( + _id, _lib._sel_writeData_1, data?._id ?? ffi.nullptr); + } + + int get offsetInFile { + return _lib._objc_msgSend_154(_id, _lib._sel_offsetInFile1); + } + + int seekToEndOfFile() { + return _lib._objc_msgSend_154(_id, _lib._sel_seekToEndOfFile1); + } + + void seekToFileOffset_(int offset) { + _lib._objc_msgSend_772(_id, _lib._sel_seekToFileOffset_1, offset); + } + + void truncateFileAtOffset_(int offset) { + _lib._objc_msgSend_772(_id, _lib._sel_truncateFileAtOffset_1, offset); + } + + void synchronizeFile() { + _lib._objc_msgSend_1(_id, _lib._sel_synchronizeFile1); + } + + void closeFile() { + _lib._objc_msgSend_1(_id, _lib._sel_closeFile1); + } + + @override + NSFileHandle init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSFileHandle._(_ret, _lib, retain: true, release: true); + } + + static NSFileHandle new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSFileHandle1, _lib._sel_new1); + return NSFileHandle._(_ret, _lib, retain: false, release: true); + } + + static NSFileHandle allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSFileHandle1, _lib._sel_allocWithZone_1, zone); + return NSFileHandle._(_ret, _lib, retain: false, release: true); + } + + static NSFileHandle alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSFileHandle1, _lib._sel_alloc1); + return NSFileHandle._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSFileHandle1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSFileHandle1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSFileHandle1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSFileHandle1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSFileHandle1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSFileHandle1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSFileHandle1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSFileHandle1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSFileHandle1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +void _ObjCBlock_ffiVoid_NSFileHandle_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return block.ref.target + .cast< + ffi.NativeFunction arg0)>>() + .asFunction arg0)>()(arg0); +} + +final _ObjCBlock_ffiVoid_NSFileHandle_closureRegistry = {}; +int _ObjCBlock_ffiVoid_NSFileHandle_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_NSFileHandle_registerClosure( + Function fn) { + final id = ++_ObjCBlock_ffiVoid_NSFileHandle_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSFileHandle_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSFileHandle_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return (_ObjCBlock_ffiVoid_NSFileHandle_closureRegistry[block + .ref.target.address] as void Function(ffi.Pointer))(arg0); +} + +class ObjCBlock_ffiVoid_NSFileHandle extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSFileHandle._(ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSFileHandle.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi + .NativeFunction arg0)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_NSFileHandle_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSFileHandle.fromFunction( + SentryCocoa lib, void Function(ffi.Pointer arg0) fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_NSFileHandle_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSFileHandle_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>>() + .asFunction< + void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>()(_id, arg0); + } +} + +class NSHTTPCookieStorage extends NSObject { + NSHTTPCookieStorage._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSHTTPCookieStorage] that points to the same underlying object as [other]. + static NSHTTPCookieStorage castFrom(T other) { + return NSHTTPCookieStorage._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSHTTPCookieStorage] that wraps the given raw object pointer. + static NSHTTPCookieStorage castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSHTTPCookieStorage._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSHTTPCookieStorage]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSHTTPCookieStorage1); + } + + static NSHTTPCookieStorage? getSharedHTTPCookieStorage(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_773( + _lib._class_NSHTTPCookieStorage1, _lib._sel_sharedHTTPCookieStorage1); + return _ret.address == 0 + ? null + : NSHTTPCookieStorage._(_ret, _lib, retain: true, release: true); + } + + static NSHTTPCookieStorage sharedCookieStorageForGroupContainerIdentifier_( + SentryCocoa _lib, NSString? identifier) { + final _ret = _lib._objc_msgSend_774( + _lib._class_NSHTTPCookieStorage1, + _lib._sel_sharedCookieStorageForGroupContainerIdentifier_1, + identifier?._id ?? ffi.nullptr); + return NSHTTPCookieStorage._(_ret, _lib, retain: true, release: true); + } + + NSArray? get cookies { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_cookies1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + void setCookie_(NSHTTPCookie? cookie) { + _lib._objc_msgSend_777( + _id, _lib._sel_setCookie_1, cookie?._id ?? ffi.nullptr); + } + + void deleteCookie_(NSHTTPCookie? cookie) { + _lib._objc_msgSend_777( + _id, _lib._sel_deleteCookie_1, cookie?._id ?? ffi.nullptr); + } + + void removeCookiesSinceDate_(NSDate? date) { + _lib._objc_msgSend_504( + _id, _lib._sel_removeCookiesSinceDate_1, date?._id ?? ffi.nullptr); + } + + NSArray cookiesForURL_(NSURL? URL) { + final _ret = _lib._objc_msgSend_124( + _id, _lib._sel_cookiesForURL_1, URL?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + void setCookies_forURL_mainDocumentURL_( + NSArray? cookies, NSURL? URL, NSURL? mainDocumentURL) { + _lib._objc_msgSend_778( + _id, + _lib._sel_setCookies_forURL_mainDocumentURL_1, + cookies?._id ?? ffi.nullptr, + URL?._id ?? ffi.nullptr, + mainDocumentURL?._id ?? ffi.nullptr); + } + + int get cookieAcceptPolicy { + return _lib._objc_msgSend_779(_id, _lib._sel_cookieAcceptPolicy1); + } + + set cookieAcceptPolicy(int value) { + return _lib._objc_msgSend_780( + _id, _lib._sel_setCookieAcceptPolicy_1, value); + } + + NSArray sortedCookiesUsingDescriptors_(NSArray? sortOrder) { + final _ret = _lib._objc_msgSend_63( + _id, + _lib._sel_sortedCookiesUsingDescriptors_1, + sortOrder?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + void storeCookies_forTask_(NSArray? cookies, NSURLSessionTask? task) { + _lib._objc_msgSend_800(_id, _lib._sel_storeCookies_forTask_1, + cookies?._id ?? ffi.nullptr, task?._id ?? ffi.nullptr); + } + + void getCookiesForTask_completionHandler_( + NSURLSessionTask? task, ObjCBlock_ffiVoid_NSArray completionHandler) { + _lib._objc_msgSend_801(_id, _lib._sel_getCookiesForTask_completionHandler_1, + task?._id ?? ffi.nullptr, completionHandler._id); + } + + @override + NSHTTPCookieStorage init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSHTTPCookieStorage._(_ret, _lib, retain: true, release: true); + } + + static NSHTTPCookieStorage new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSHTTPCookieStorage1, _lib._sel_new1); + return NSHTTPCookieStorage._(_ret, _lib, retain: false, release: true); + } + + static NSHTTPCookieStorage allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSHTTPCookieStorage1, _lib._sel_allocWithZone_1, zone); + return NSHTTPCookieStorage._(_ret, _lib, retain: false, release: true); + } + + static NSHTTPCookieStorage alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSHTTPCookieStorage1, _lib._sel_alloc1); + return NSHTTPCookieStorage._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSHTTPCookieStorage1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSHTTPCookieStorage1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSHTTPCookieStorage1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSHTTPCookieStorage1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSHTTPCookieStorage1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSHTTPCookieStorage1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSHTTPCookieStorage1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSHTTPCookieStorage1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSHTTPCookieStorage1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSHTTPCookie extends NSObject { + NSHTTPCookie._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSHTTPCookie] that points to the same underlying object as [other]. + static NSHTTPCookie castFrom(T other) { + return NSHTTPCookie._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSHTTPCookie] that wraps the given raw object pointer. + static NSHTTPCookie castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSHTTPCookie._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSHTTPCookie]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSHTTPCookie1); + } + + NSHTTPCookie initWithProperties_(NSDictionary? properties) { + final _ret = _lib._objc_msgSend_149( + _id, _lib._sel_initWithProperties_1, properties?._id ?? ffi.nullptr); + return NSHTTPCookie._(_ret, _lib, retain: true, release: true); + } + + static NSHTTPCookie cookieWithProperties_( + SentryCocoa _lib, NSDictionary? properties) { + final _ret = _lib._objc_msgSend_775(_lib._class_NSHTTPCookie1, + _lib._sel_cookieWithProperties_1, properties?._id ?? ffi.nullptr); + return NSHTTPCookie._(_ret, _lib, retain: true, release: true); + } + + static NSDictionary requestHeaderFieldsWithCookies_( + SentryCocoa _lib, NSArray? cookies) { + final _ret = _lib._objc_msgSend_475( + _lib._class_NSHTTPCookie1, + _lib._sel_requestHeaderFieldsWithCookies_1, + cookies?._id ?? ffi.nullptr); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSArray cookiesWithResponseHeaderFields_forURL_( + SentryCocoa _lib, NSDictionary? headerFields, NSURL? URL) { + final _ret = _lib._objc_msgSend_776( + _lib._class_NSHTTPCookie1, + _lib._sel_cookiesWithResponseHeaderFields_forURL_1, + headerFields?._id ?? ffi.nullptr, + URL?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSDictionary? get properties { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_properties1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + int get version { + return _lib._objc_msgSend_10(_id, _lib._sel_version1); + } + + NSString? get name { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get value { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_value1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSDate? get expiresDate { + final _ret = _lib._objc_msgSend_162(_id, _lib._sel_expiresDate1); + return _ret.address == 0 + ? null + : NSDate._(_ret, _lib, retain: true, release: true); + } + + bool get sessionOnly { + return _lib._objc_msgSend_12(_id, _lib._sel_isSessionOnly1); + } + + NSString? get domain { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_domain1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get path { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_path1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + bool get secure { + return _lib._objc_msgSend_12(_id, _lib._sel_isSecure1); + } + + bool get HTTPOnly { + return _lib._objc_msgSend_12(_id, _lib._sel_isHTTPOnly1); + } + + NSString? get comment { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_comment1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSURL? get commentURL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_commentURL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + NSArray? get portList { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_portList1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSString get sameSitePolicy { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_sameSitePolicy1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + @override + NSHTTPCookie init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSHTTPCookie._(_ret, _lib, retain: true, release: true); + } + + static NSHTTPCookie new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSHTTPCookie1, _lib._sel_new1); + return NSHTTPCookie._(_ret, _lib, retain: false, release: true); + } + + static NSHTTPCookie allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSHTTPCookie1, _lib._sel_allocWithZone_1, zone); + return NSHTTPCookie._(_ret, _lib, retain: false, release: true); + } + + static NSHTTPCookie alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSHTTPCookie1, _lib._sel_alloc1); + return NSHTTPCookie._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSHTTPCookie1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSHTTPCookie1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSHTTPCookie1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSHTTPCookie1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSHTTPCookie1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSHTTPCookie1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSHTTPCookie1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSHTTPCookie1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSHTTPCookie1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSHTTPCookieAcceptPolicy { + static const int NSHTTPCookieAcceptPolicyAlways = 0; + static const int NSHTTPCookieAcceptPolicyNever = 1; + static const int NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain = 2; +} + +class NSURLSessionTask extends NSObject { + NSURLSessionTask._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSURLSessionTask] that points to the same underlying object as [other]. + static NSURLSessionTask castFrom(T other) { + return NSURLSessionTask._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSURLSessionTask] that wraps the given raw object pointer. + static NSURLSessionTask castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSURLSessionTask._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSURLSessionTask]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSURLSessionTask1); + } + + int get taskIdentifier { + return _lib._objc_msgSend_10(_id, _lib._sel_taskIdentifier1); + } + + NSURLRequest? get originalRequest { + final _ret = _lib._objc_msgSend_795(_id, _lib._sel_originalRequest1); + return _ret.address == 0 + ? null + : NSURLRequest._(_ret, _lib, retain: true, release: true); + } + + NSURLRequest? get currentRequest { + final _ret = _lib._objc_msgSend_795(_id, _lib._sel_currentRequest1); + return _ret.address == 0 + ? null + : NSURLRequest._(_ret, _lib, retain: true, release: true); + } + + NSURLResponse? get response { + final _ret = _lib._objc_msgSend_797(_id, _lib._sel_response1); + return _ret.address == 0 + ? null + : NSURLResponse._(_ret, _lib, retain: true, release: true); + } + + NSObject? get delegate { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1); + return _ret.address == 0 + ? null + : NSObject._(_ret, _lib, retain: true, release: true); + } + + set delegate(NSObject? value) { + return _lib._objc_msgSend_387( + _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr); + } + + NSProgress? get progress { + final _ret = _lib._objc_msgSend_609(_id, _lib._sel_progress1); + return _ret.address == 0 + ? null + : NSProgress._(_ret, _lib, retain: true, release: true); + } + + NSDate? get earliestBeginDate { + final _ret = _lib._objc_msgSend_162(_id, _lib._sel_earliestBeginDate1); + return _ret.address == 0 + ? null + : NSDate._(_ret, _lib, retain: true, release: true); + } + + set earliestBeginDate(NSDate? value) { + return _lib._objc_msgSend_525( + _id, _lib._sel_setEarliestBeginDate_1, value?._id ?? ffi.nullptr); + } + + int get countOfBytesClientExpectsToSend { + return _lib._objc_msgSend_616( + _id, _lib._sel_countOfBytesClientExpectsToSend1); + } + + set countOfBytesClientExpectsToSend(int value) { + return _lib._objc_msgSend_617( + _id, _lib._sel_setCountOfBytesClientExpectsToSend_1, value); + } + + int get countOfBytesClientExpectsToReceive { + return _lib._objc_msgSend_616( + _id, _lib._sel_countOfBytesClientExpectsToReceive1); + } + + set countOfBytesClientExpectsToReceive(int value) { + return _lib._objc_msgSend_617( + _id, _lib._sel_setCountOfBytesClientExpectsToReceive_1, value); + } + + int get countOfBytesSent { + return _lib._objc_msgSend_616(_id, _lib._sel_countOfBytesSent1); + } + + int get countOfBytesReceived { + return _lib._objc_msgSend_616(_id, _lib._sel_countOfBytesReceived1); + } + + int get countOfBytesExpectedToSend { + return _lib._objc_msgSend_616(_id, _lib._sel_countOfBytesExpectedToSend1); + } + + int get countOfBytesExpectedToReceive { + return _lib._objc_msgSend_616( + _id, _lib._sel_countOfBytesExpectedToReceive1); + } + + NSString? get taskDescription { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_taskDescription1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set taskDescription(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setTaskDescription_1, value?._id ?? ffi.nullptr); + } + + void cancel() { + _lib._objc_msgSend_1(_id, _lib._sel_cancel1); + } + + int get state { + return _lib._objc_msgSend_798(_id, _lib._sel_state1); + } + + NSError? get error { + final _ret = _lib._objc_msgSend_298(_id, _lib._sel_error1); + return _ret.address == 0 + ? null + : NSError._(_ret, _lib, retain: true, release: true); + } + + void suspend() { + _lib._objc_msgSend_1(_id, _lib._sel_suspend1); + } + + void resume() { + _lib._objc_msgSend_1(_id, _lib._sel_resume1); + } + + double get priority { + return _lib._objc_msgSend_221(_id, _lib._sel_priority1); + } + + set priority(double value) { + return _lib._objc_msgSend_799(_id, _lib._sel_setPriority_1, value); + } + + bool get prefersIncrementalDelivery { + return _lib._objc_msgSend_12(_id, _lib._sel_prefersIncrementalDelivery1); + } + + set prefersIncrementalDelivery(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setPrefersIncrementalDelivery_1, value); + } + + @override + NSURLSessionTask init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSURLSessionTask._(_ret, _lib, retain: true, release: true); + } + + static NSURLSessionTask new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSURLSessionTask1, _lib._sel_new1); + return NSURLSessionTask._(_ret, _lib, retain: false, release: true); + } + + static NSURLSessionTask allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSURLSessionTask1, _lib._sel_allocWithZone_1, zone); + return NSURLSessionTask._(_ret, _lib, retain: false, release: true); + } + + static NSURLSessionTask alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSURLSessionTask1, _lib._sel_alloc1); + return NSURLSessionTask._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSURLSessionTask1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSURLSessionTask1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSURLSessionTask1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLSessionTask1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSURLSessionTask1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSURLSessionTask1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSURLSessionTask1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSURLSessionTask1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLSessionTask1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSURLRequest extends NSObject { + NSURLRequest._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSURLRequest] that points to the same underlying object as [other]. + static NSURLRequest castFrom(T other) { + return NSURLRequest._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSURLRequest] that wraps the given raw object pointer. + static NSURLRequest castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSURLRequest._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSURLRequest]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSURLRequest1); + } + + static NSURLRequest requestWithURL_(SentryCocoa _lib, NSURL? URL) { + final _ret = _lib._objc_msgSend_241(_lib._class_NSURLRequest1, + _lib._sel_requestWithURL_1, URL?._id ?? ffi.nullptr); + return NSURLRequest._(_ret, _lib, retain: true, release: true); + } + + static bool getSupportsSecureCoding(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLRequest1, _lib._sel_supportsSecureCoding1); + } + + static NSURLRequest requestWithURL_cachePolicy_timeoutInterval_( + SentryCocoa _lib, NSURL? URL, int cachePolicy, double timeoutInterval) { + final _ret = _lib._objc_msgSend_781( + _lib._class_NSURLRequest1, + _lib._sel_requestWithURL_cachePolicy_timeoutInterval_1, + URL?._id ?? ffi.nullptr, + cachePolicy, + timeoutInterval); + return NSURLRequest._(_ret, _lib, retain: true, release: true); + } + + NSURLRequest initWithURL_(NSURL? URL) { + final _ret = _lib._objc_msgSend_241( + _id, _lib._sel_initWithURL_1, URL?._id ?? ffi.nullptr); + return NSURLRequest._(_ret, _lib, retain: true, release: true); + } + + NSURLRequest initWithURL_cachePolicy_timeoutInterval_( + NSURL? URL, int cachePolicy, double timeoutInterval) { + final _ret = _lib._objc_msgSend_781( + _id, + _lib._sel_initWithURL_cachePolicy_timeoutInterval_1, + URL?._id ?? ffi.nullptr, + cachePolicy, + timeoutInterval); + return NSURLRequest._(_ret, _lib, retain: true, release: true); + } + + NSURL? get URL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_URL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + int get cachePolicy { + return _lib._objc_msgSend_782(_id, _lib._sel_cachePolicy1); + } + + double get timeoutInterval { + return _lib._objc_msgSend_155(_id, _lib._sel_timeoutInterval1); + } + + NSURL? get mainDocumentURL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_mainDocumentURL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + int get networkServiceType { + return _lib._objc_msgSend_783(_id, _lib._sel_networkServiceType1); + } + + bool get allowsCellularAccess { + return _lib._objc_msgSend_12(_id, _lib._sel_allowsCellularAccess1); + } + + bool get allowsExpensiveNetworkAccess { + return _lib._objc_msgSend_12(_id, _lib._sel_allowsExpensiveNetworkAccess1); + } + + bool get allowsConstrainedNetworkAccess { + return _lib._objc_msgSend_12( + _id, _lib._sel_allowsConstrainedNetworkAccess1); + } + + bool get assumesHTTP3Capable { + return _lib._objc_msgSend_12(_id, _lib._sel_assumesHTTP3Capable1); + } + + int get attribution { + return _lib._objc_msgSend_784(_id, _lib._sel_attribution1); + } + + bool get requiresDNSSECValidation { + return _lib._objc_msgSend_12(_id, _lib._sel_requiresDNSSECValidation1); + } + + NSString? get HTTPMethod { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_HTTPMethod1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSDictionary? get allHTTPHeaderFields { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_allHTTPHeaderFields1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSString valueForHTTPHeaderField_(NSString? field) { + final _ret = _lib._objc_msgSend_64( + _id, _lib._sel_valueForHTTPHeaderField_1, field?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSData? get HTTPBody { + final _ret = _lib._objc_msgSend_39(_id, _lib._sel_HTTPBody1); + return _ret.address == 0 + ? null + : NSData._(_ret, _lib, retain: true, release: true); + } + + NSInputStream? get HTTPBodyStream { + final _ret = _lib._objc_msgSend_794(_id, _lib._sel_HTTPBodyStream1); + return _ret.address == 0 + ? null + : NSInputStream._(_ret, _lib, retain: true, release: true); + } + + bool get HTTPShouldHandleCookies { + return _lib._objc_msgSend_12(_id, _lib._sel_HTTPShouldHandleCookies1); + } + + bool get HTTPShouldUsePipelining { + return _lib._objc_msgSend_12(_id, _lib._sel_HTTPShouldUsePipelining1); + } + + @override + NSURLRequest init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSURLRequest._(_ret, _lib, retain: true, release: true); + } + + static NSURLRequest new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSURLRequest1, _lib._sel_new1); + return NSURLRequest._(_ret, _lib, retain: false, release: true); + } + + static NSURLRequest allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSURLRequest1, _lib._sel_allocWithZone_1, zone); + return NSURLRequest._(_ret, _lib, retain: false, release: true); + } + + static NSURLRequest alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSURLRequest1, _lib._sel_alloc1); + return NSURLRequest._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSURLRequest1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSURLRequest1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLRequest1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLRequest1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSURLRequest1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSURLRequest1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSURLRequest1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSURLRequest1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLRequest1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSURLRequestCachePolicy { + static const int NSURLRequestUseProtocolCachePolicy = 0; + static const int NSURLRequestReloadIgnoringLocalCacheData = 1; + static const int NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4; + static const int NSURLRequestReloadIgnoringCacheData = 1; + static const int NSURLRequestReturnCacheDataElseLoad = 2; + static const int NSURLRequestReturnCacheDataDontLoad = 3; + static const int NSURLRequestReloadRevalidatingCacheData = 5; +} + +abstract class NSURLRequestNetworkServiceType { + static const int NSURLNetworkServiceTypeDefault = 0; + static const int NSURLNetworkServiceTypeVoIP = 1; + static const int NSURLNetworkServiceTypeVideo = 2; + static const int NSURLNetworkServiceTypeBackground = 3; + static const int NSURLNetworkServiceTypeVoice = 4; + static const int NSURLNetworkServiceTypeResponsiveData = 6; + static const int NSURLNetworkServiceTypeAVStreaming = 8; + static const int NSURLNetworkServiceTypeResponsiveAV = 9; + static const int NSURLNetworkServiceTypeCallSignaling = 11; +} + +abstract class NSURLRequestAttribution { + static const int NSURLRequestAttributionDeveloper = 0; + static const int NSURLRequestAttributionUser = 1; +} + +class NSInputStream extends NSStream { + NSInputStream._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSInputStream] that points to the same underlying object as [other]. + static NSInputStream castFrom(T other) { + return NSInputStream._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSInputStream] that wraps the given raw object pointer. + static NSInputStream castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSInputStream._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSInputStream]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSInputStream1); + } + + int read_maxLength_(ffi.Pointer buffer, int len) { + return _lib._objc_msgSend_786(_id, _lib._sel_read_maxLength_1, buffer, len); + } + + bool getBuffer_length_(ffi.Pointer> buffer, + ffi.Pointer len) { + return _lib._objc_msgSend_793( + _id, _lib._sel_getBuffer_length_1, buffer, len); + } + + bool get hasBytesAvailable { + return _lib._objc_msgSend_12(_id, _lib._sel_hasBytesAvailable1); + } + + NSInputStream initWithData_(NSData? data) { + final _ret = _lib._objc_msgSend_257( + _id, _lib._sel_initWithData_1, data?._id ?? ffi.nullptr); + return NSInputStream._(_ret, _lib, retain: true, release: true); + } + + NSInputStream initWithURL_(NSURL? url) { + final _ret = _lib._objc_msgSend_241( + _id, _lib._sel_initWithURL_1, url?._id ?? ffi.nullptr); + return NSInputStream._(_ret, _lib, retain: true, release: true); + } + + NSInputStream initWithFileAtPath_(NSString? path) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithFileAtPath_1, path?._id ?? ffi.nullptr); + return NSInputStream._(_ret, _lib, retain: true, release: true); + } + + static NSInputStream inputStreamWithData_(SentryCocoa _lib, NSData? data) { + final _ret = _lib._objc_msgSend_257(_lib._class_NSInputStream1, + _lib._sel_inputStreamWithData_1, data?._id ?? ffi.nullptr); + return NSInputStream._(_ret, _lib, retain: true, release: true); + } + + static NSInputStream inputStreamWithFileAtPath_( + SentryCocoa _lib, NSString? path) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSInputStream1, + _lib._sel_inputStreamWithFileAtPath_1, path?._id ?? ffi.nullptr); + return NSInputStream._(_ret, _lib, retain: true, release: true); + } + + static NSInputStream inputStreamWithURL_(SentryCocoa _lib, NSURL? url) { + final _ret = _lib._objc_msgSend_241(_lib._class_NSInputStream1, + _lib._sel_inputStreamWithURL_1, url?._id ?? ffi.nullptr); + return NSInputStream._(_ret, _lib, retain: true, release: true); + } + + static void getStreamsToHostWithName_port_inputStream_outputStream_( + SentryCocoa _lib, + NSString? hostname, + int port, + ffi.Pointer> inputStream, + ffi.Pointer> outputStream) { + _lib._objc_msgSend_788( + _lib._class_NSInputStream1, + _lib._sel_getStreamsToHostWithName_port_inputStream_outputStream_1, + hostname?._id ?? ffi.nullptr, + port, + inputStream, + outputStream); + } + + static void getStreamsToHost_port_inputStream_outputStream_( + SentryCocoa _lib, + NSHost? host, + int port, + ffi.Pointer> inputStream, + ffi.Pointer> outputStream) { + _lib._objc_msgSend_791( + _lib._class_NSInputStream1, + _lib._sel_getStreamsToHost_port_inputStream_outputStream_1, + host?._id ?? ffi.nullptr, + port, + inputStream, + outputStream); + } + + static void getBoundStreamsWithBufferSize_inputStream_outputStream_( + SentryCocoa _lib, + int bufferSize, + ffi.Pointer> inputStream, + ffi.Pointer> outputStream) { + _lib._objc_msgSend_792( + _lib._class_NSInputStream1, + _lib._sel_getBoundStreamsWithBufferSize_inputStream_outputStream_1, + bufferSize, + inputStream, + outputStream); + } + + @override + NSInputStream init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSInputStream._(_ret, _lib, retain: true, release: true); + } + + static NSInputStream new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSInputStream1, _lib._sel_new1); + return NSInputStream._(_ret, _lib, retain: false, release: true); + } + + static NSInputStream allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSInputStream1, _lib._sel_allocWithZone_1, zone); + return NSInputStream._(_ret, _lib, retain: false, release: true); + } + + static NSInputStream alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSInputStream1, _lib._sel_alloc1); + return NSInputStream._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSInputStream1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSInputStream1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSInputStream1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSInputStream1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSInputStream1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSInputStream1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSInputStream1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSInputStream1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSInputStream1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSStream extends NSObject { + NSStream._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSStream] that points to the same underlying object as [other]. + static NSStream castFrom(T other) { + return NSStream._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSStream] that wraps the given raw object pointer. + static NSStream castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSStream._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSStream]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSStream1); + } + + void open() { + _lib._objc_msgSend_1(_id, _lib._sel_open1); + } + + void close() { + _lib._objc_msgSend_1(_id, _lib._sel_close1); + } + + NSObject? get delegate { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1); + return _ret.address == 0 + ? null + : NSObject._(_ret, _lib, retain: true, release: true); + } + + set delegate(NSObject? value) { + return _lib._objc_msgSend_387( + _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr); + } + + NSObject propertyForKey_(NSString key) { + final _ret = + _lib._objc_msgSend_30(_id, _lib._sel_propertyForKey_1, key._id); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + bool setProperty_forKey_(NSObject property, NSString key) { + return _lib._objc_msgSend_240( + _id, _lib._sel_setProperty_forKey_1, property._id, key._id); + } + + void scheduleInRunLoop_forMode_(NSRunLoop? aRunLoop, NSString mode) { + _lib._objc_msgSend_533(_id, _lib._sel_scheduleInRunLoop_forMode_1, + aRunLoop?._id ?? ffi.nullptr, mode._id); + } + + void removeFromRunLoop_forMode_(NSRunLoop? aRunLoop, NSString mode) { + _lib._objc_msgSend_533(_id, _lib._sel_removeFromRunLoop_forMode_1, + aRunLoop?._id ?? ffi.nullptr, mode._id); + } + + int get streamStatus { + return _lib._objc_msgSend_785(_id, _lib._sel_streamStatus1); + } + + NSError? get streamError { + final _ret = _lib._objc_msgSend_298(_id, _lib._sel_streamError1); + return _ret.address == 0 + ? null + : NSError._(_ret, _lib, retain: true, release: true); + } + + static void getStreamsToHostWithName_port_inputStream_outputStream_( + SentryCocoa _lib, + NSString? hostname, + int port, + ffi.Pointer> inputStream, + ffi.Pointer> outputStream) { + _lib._objc_msgSend_788( + _lib._class_NSStream1, + _lib._sel_getStreamsToHostWithName_port_inputStream_outputStream_1, + hostname?._id ?? ffi.nullptr, + port, + inputStream, + outputStream); + } + + static void getStreamsToHost_port_inputStream_outputStream_( + SentryCocoa _lib, + NSHost? host, + int port, + ffi.Pointer> inputStream, + ffi.Pointer> outputStream) { + _lib._objc_msgSend_791( + _lib._class_NSStream1, + _lib._sel_getStreamsToHost_port_inputStream_outputStream_1, + host?._id ?? ffi.nullptr, + port, + inputStream, + outputStream); + } + + static void getBoundStreamsWithBufferSize_inputStream_outputStream_( + SentryCocoa _lib, + int bufferSize, + ffi.Pointer> inputStream, + ffi.Pointer> outputStream) { + _lib._objc_msgSend_792( + _lib._class_NSStream1, + _lib._sel_getBoundStreamsWithBufferSize_inputStream_outputStream_1, + bufferSize, + inputStream, + outputStream); + } + + @override + NSStream init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSStream._(_ret, _lib, retain: true, release: true); + } + + static NSStream new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSStream1, _lib._sel_new1); + return NSStream._(_ret, _lib, retain: false, release: true); + } + + static NSStream allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSStream1, _lib._sel_allocWithZone_1, zone); + return NSStream._(_ret, _lib, retain: false, release: true); + } + + static NSStream alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSStream1, _lib._sel_alloc1); + return NSStream._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSStream1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSStream1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSStream1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSStream1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSStream1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSStream1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSStream1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSStream1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSStream1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSStreamStatus { + static const int NSStreamStatusNotOpen = 0; + static const int NSStreamStatusOpening = 1; + static const int NSStreamStatusOpen = 2; + static const int NSStreamStatusReading = 3; + static const int NSStreamStatusWriting = 4; + static const int NSStreamStatusAtEnd = 5; + static const int NSStreamStatusClosed = 6; + static const int NSStreamStatusError = 7; +} + +class NSOutputStream extends NSStream { + NSOutputStream._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSOutputStream] that points to the same underlying object as [other]. + static NSOutputStream castFrom(T other) { + return NSOutputStream._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSOutputStream] that wraps the given raw object pointer. + static NSOutputStream castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSOutputStream._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSOutputStream]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSOutputStream1); + } + + int write_maxLength_(ffi.Pointer buffer, int len) { + return _lib._objc_msgSend_786( + _id, _lib._sel_write_maxLength_1, buffer, len); + } + + bool get hasSpaceAvailable { + return _lib._objc_msgSend_12(_id, _lib._sel_hasSpaceAvailable1); + } + + NSOutputStream initToMemory() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_initToMemory1); + return NSOutputStream._(_ret, _lib, retain: true, release: true); + } + + NSOutputStream initToBuffer_capacity_( + ffi.Pointer buffer, int capacity) { + final _ret = _lib._objc_msgSend_787( + _id, _lib._sel_initToBuffer_capacity_1, buffer, capacity); + return NSOutputStream._(_ret, _lib, retain: true, release: true); + } + + NSOutputStream initWithURL_append_(NSURL? url, bool shouldAppend) { + final _ret = _lib._objc_msgSend_246(_id, _lib._sel_initWithURL_append_1, + url?._id ?? ffi.nullptr, shouldAppend); + return NSOutputStream._(_ret, _lib, retain: true, release: true); + } + + NSOutputStream initToFileAtPath_append_(NSString? path, bool shouldAppend) { + final _ret = _lib._objc_msgSend_29(_id, _lib._sel_initToFileAtPath_append_1, + path?._id ?? ffi.nullptr, shouldAppend); + return NSOutputStream._(_ret, _lib, retain: true, release: true); + } + + static NSOutputStream outputStreamToMemory(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSOutputStream1, _lib._sel_outputStreamToMemory1); + return NSOutputStream._(_ret, _lib, retain: true, release: true); + } + + static NSOutputStream outputStreamToBuffer_capacity_( + SentryCocoa _lib, ffi.Pointer buffer, int capacity) { + final _ret = _lib._objc_msgSend_787(_lib._class_NSOutputStream1, + _lib._sel_outputStreamToBuffer_capacity_1, buffer, capacity); + return NSOutputStream._(_ret, _lib, retain: true, release: true); + } + + static NSOutputStream outputStreamToFileAtPath_append_( + SentryCocoa _lib, NSString? path, bool shouldAppend) { + final _ret = _lib._objc_msgSend_29( + _lib._class_NSOutputStream1, + _lib._sel_outputStreamToFileAtPath_append_1, + path?._id ?? ffi.nullptr, + shouldAppend); + return NSOutputStream._(_ret, _lib, retain: true, release: true); + } + + static NSOutputStream outputStreamWithURL_append_( + SentryCocoa _lib, NSURL? url, bool shouldAppend) { + final _ret = _lib._objc_msgSend_246( + _lib._class_NSOutputStream1, + _lib._sel_outputStreamWithURL_append_1, + url?._id ?? ffi.nullptr, + shouldAppend); + return NSOutputStream._(_ret, _lib, retain: true, release: true); + } + + static void getStreamsToHostWithName_port_inputStream_outputStream_( + SentryCocoa _lib, + NSString? hostname, + int port, + ffi.Pointer> inputStream, + ffi.Pointer> outputStream) { + _lib._objc_msgSend_788( + _lib._class_NSOutputStream1, + _lib._sel_getStreamsToHostWithName_port_inputStream_outputStream_1, + hostname?._id ?? ffi.nullptr, + port, + inputStream, + outputStream); + } + + static void getStreamsToHost_port_inputStream_outputStream_( + SentryCocoa _lib, + NSHost? host, + int port, + ffi.Pointer> inputStream, + ffi.Pointer> outputStream) { + _lib._objc_msgSend_791( + _lib._class_NSOutputStream1, + _lib._sel_getStreamsToHost_port_inputStream_outputStream_1, + host?._id ?? ffi.nullptr, + port, + inputStream, + outputStream); + } + + static void getBoundStreamsWithBufferSize_inputStream_outputStream_( + SentryCocoa _lib, + int bufferSize, + ffi.Pointer> inputStream, + ffi.Pointer> outputStream) { + _lib._objc_msgSend_792( + _lib._class_NSOutputStream1, + _lib._sel_getBoundStreamsWithBufferSize_inputStream_outputStream_1, + bufferSize, + inputStream, + outputStream); + } + + @override + NSOutputStream init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSOutputStream._(_ret, _lib, retain: true, release: true); + } + + static NSOutputStream new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSOutputStream1, _lib._sel_new1); + return NSOutputStream._(_ret, _lib, retain: false, release: true); + } + + static NSOutputStream allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSOutputStream1, _lib._sel_allocWithZone_1, zone); + return NSOutputStream._(_ret, _lib, retain: false, release: true); + } + + static NSOutputStream alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSOutputStream1, _lib._sel_alloc1); + return NSOutputStream._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSOutputStream1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSOutputStream1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSOutputStream1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSOutputStream1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSOutputStream1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSOutputStream1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSOutputStream1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSOutputStream1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSOutputStream1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSHost extends NSObject { + NSHost._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSHost] that points to the same underlying object as [other]. + static NSHost castFrom(T other) { + return NSHost._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSHost] that wraps the given raw object pointer. + static NSHost castFromPointer(SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSHost._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSHost]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSHost1); + } + + static NSHost currentHost(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSHost1, _lib._sel_currentHost1); + return NSHost._(_ret, _lib, retain: true, release: true); + } + + static NSHost hostWithName_(SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSHost1, + _lib._sel_hostWithName_1, name?._id ?? ffi.nullptr); + return NSHost._(_ret, _lib, retain: true, release: true); + } + + static NSHost hostWithAddress_(SentryCocoa _lib, NSString? address) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSHost1, + _lib._sel_hostWithAddress_1, address?._id ?? ffi.nullptr); + return NSHost._(_ret, _lib, retain: true, release: true); + } + + bool isEqualToHost_(NSHost? aHost) { + return _lib._objc_msgSend_789( + _id, _lib._sel_isEqualToHost_1, aHost?._id ?? ffi.nullptr); + } + + NSString? get name { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSArray? get names { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_names1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSString? get address { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_address1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSArray? get addresses { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_addresses1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSString? get localizedName { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_localizedName1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + static void setHostCacheEnabled_(SentryCocoa _lib, bool flag) { + _lib._objc_msgSend_790( + _lib._class_NSHost1, _lib._sel_setHostCacheEnabled_1, flag); + } + + static bool isHostCacheEnabled(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSHost1, _lib._sel_isHostCacheEnabled1); + } + + static void flushHostCache(SentryCocoa _lib) { + _lib._objc_msgSend_1(_lib._class_NSHost1, _lib._sel_flushHostCache1); + } + + @override + NSHost init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSHost._(_ret, _lib, retain: true, release: true); + } + + static NSHost new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSHost1, _lib._sel_new1); + return NSHost._(_ret, _lib, retain: false, release: true); + } + + static NSHost allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSHost1, _lib._sel_allocWithZone_1, zone); + return NSHost._(_ret, _lib, retain: false, release: true); + } + + static NSHost alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSHost1, _lib._sel_alloc1); + return NSHost._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSHost1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSHost1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSHost1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSHost1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSHost1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSHost1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSHost1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSHost1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSHost1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSURLResponse extends NSObject { + NSURLResponse._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSURLResponse] that points to the same underlying object as [other]. + static NSURLResponse castFrom(T other) { + return NSURLResponse._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSURLResponse] that wraps the given raw object pointer. + static NSURLResponse castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSURLResponse._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSURLResponse]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSURLResponse1); + } + + NSURLResponse initWithURL_MIMEType_expectedContentLength_textEncodingName_( + NSURL? URL, NSString? MIMEType, int length, NSString? name) { + final _ret = _lib._objc_msgSend_796( + _id, + _lib._sel_initWithURL_MIMEType_expectedContentLength_textEncodingName_1, + URL?._id ?? ffi.nullptr, + MIMEType?._id ?? ffi.nullptr, + length, + name?._id ?? ffi.nullptr); + return NSURLResponse._(_ret, _lib, retain: true, release: true); + } + + NSURL? get URL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_URL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + NSString? get MIMEType { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_MIMEType1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + int get expectedContentLength { + return _lib._objc_msgSend_220(_id, _lib._sel_expectedContentLength1); + } + + NSString? get textEncodingName { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_textEncodingName1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get suggestedFilename { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_suggestedFilename1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + @override + NSURLResponse init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSURLResponse._(_ret, _lib, retain: true, release: true); + } + + static NSURLResponse new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSURLResponse1, _lib._sel_new1); + return NSURLResponse._(_ret, _lib, retain: false, release: true); + } + + static NSURLResponse allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSURLResponse1, _lib._sel_allocWithZone_1, zone); + return NSURLResponse._(_ret, _lib, retain: false, release: true); + } + + static NSURLResponse alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSURLResponse1, _lib._sel_alloc1); + return NSURLResponse._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSURLResponse1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSURLResponse1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLResponse1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLResponse1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSURLResponse1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSURLResponse1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSURLResponse1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSURLResponse1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLResponse1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSURLSessionTaskState { + static const int NSURLSessionTaskStateRunning = 0; + static const int NSURLSessionTaskStateSuspended = 1; + static const int NSURLSessionTaskStateCanceling = 2; + static const int NSURLSessionTaskStateCompleted = 3; +} + +void _ObjCBlock_ffiVoid_NSArray_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return block.ref.target + .cast< + ffi.NativeFunction arg0)>>() + .asFunction arg0)>()(arg0); +} + +final _ObjCBlock_ffiVoid_NSArray_closureRegistry = {}; +int _ObjCBlock_ffiVoid_NSArray_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_NSArray_registerClosure(Function fn) { + final id = ++_ObjCBlock_ffiVoid_NSArray_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSArray_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSArray_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return (_ObjCBlock_ffiVoid_NSArray_closureRegistry[block.ref.target.address] + as void Function(ffi.Pointer))(arg0); +} + +class ObjCBlock_ffiVoid_NSArray extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSArray._(ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSArray.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi + .NativeFunction arg0)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_NSArray_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSArray.fromFunction( + SentryCocoa lib, void Function(ffi.Pointer arg0) fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_NSArray_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSArray_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>>() + .asFunction< + void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>()(_id, arg0); + } +} + +class NSIndexPath extends NSObject { + NSIndexPath._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSIndexPath] that points to the same underlying object as [other]. + static NSIndexPath castFrom(T other) { + return NSIndexPath._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSIndexPath] that wraps the given raw object pointer. + static NSIndexPath castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSIndexPath._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSIndexPath]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSIndexPath1); + } + + static NSIndexPath indexPathWithIndex_(SentryCocoa _lib, int index) { + final _ret = _lib._objc_msgSend_60( + _lib._class_NSIndexPath1, _lib._sel_indexPathWithIndex_1, index); + return NSIndexPath._(_ret, _lib, retain: true, release: true); + } + + static NSIndexPath indexPathWithIndexes_length_( + SentryCocoa _lib, ffi.Pointer indexes, int length) { + final _ret = _lib._objc_msgSend_802(_lib._class_NSIndexPath1, + _lib._sel_indexPathWithIndexes_length_1, indexes, length); + return NSIndexPath._(_ret, _lib, retain: true, release: true); + } + + NSIndexPath initWithIndexes_length_( + ffi.Pointer indexes, int length) { + final _ret = _lib._objc_msgSend_802( + _id, _lib._sel_initWithIndexes_length_1, indexes, length); + return NSIndexPath._(_ret, _lib, retain: true, release: true); + } + + NSIndexPath initWithIndex_(int index) { + final _ret = _lib._objc_msgSend_60(_id, _lib._sel_initWithIndex_1, index); + return NSIndexPath._(_ret, _lib, retain: true, release: true); + } + + NSIndexPath indexPathByAddingIndex_(int index) { + final _ret = + _lib._objc_msgSend_803(_id, _lib._sel_indexPathByAddingIndex_1, index); + return NSIndexPath._(_ret, _lib, retain: true, release: true); + } + + NSIndexPath indexPathByRemovingLastIndex() { + final _ret = + _lib._objc_msgSend_804(_id, _lib._sel_indexPathByRemovingLastIndex1); + return NSIndexPath._(_ret, _lib, retain: true, release: true); + } + + int indexAtPosition_(int position) { + return _lib._objc_msgSend_88(_id, _lib._sel_indexAtPosition_1, position); + } + + int get length { + return _lib._objc_msgSend_10(_id, _lib._sel_length1); + } + + void getIndexes_range_( + ffi.Pointer indexes, _NSRange positionRange) { + _lib._objc_msgSend_805( + _id, _lib._sel_getIndexes_range_1, indexes, positionRange); + } + + int compare_(NSIndexPath? otherObject) { + return _lib._objc_msgSend_806( + _id, _lib._sel_compare_1, otherObject?._id ?? ffi.nullptr); + } + + void getIndexes_(ffi.Pointer indexes) { + _lib._objc_msgSend_807(_id, _lib._sel_getIndexes_1, indexes); + } + + @override + NSIndexPath init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSIndexPath._(_ret, _lib, retain: true, release: true); + } + + static NSIndexPath new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSIndexPath1, _lib._sel_new1); + return NSIndexPath._(_ret, _lib, retain: false, release: true); + } + + static NSIndexPath allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSIndexPath1, _lib._sel_allocWithZone_1, zone); + return NSIndexPath._(_ret, _lib, retain: false, release: true); + } + + static NSIndexPath alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSIndexPath1, _lib._sel_alloc1); + return NSIndexPath._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSIndexPath1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSIndexPath1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSIndexPath1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSIndexPath1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSIndexPath1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSIndexPath1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSIndexPath1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSIndexPath1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSIndexPath1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSInflectionRule extends NSObject { + NSInflectionRule._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSInflectionRule] that points to the same underlying object as [other]. + static NSInflectionRule castFrom(T other) { + return NSInflectionRule._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSInflectionRule] that wraps the given raw object pointer. + static NSInflectionRule castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSInflectionRule._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSInflectionRule]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSInflectionRule1); + } + + @override + NSObject init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSInflectionRule? getAutomaticRule(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_808( + _lib._class_NSInflectionRule1, _lib._sel_automaticRule1); + return _ret.address == 0 + ? null + : NSInflectionRule._(_ret, _lib, retain: true, release: true); + } + + static bool canInflectLanguage_(SentryCocoa _lib, NSString? language) { + return _lib._objc_msgSend_59(_lib._class_NSInflectionRule1, + _lib._sel_canInflectLanguage_1, language?._id ?? ffi.nullptr); + } + + static bool getCanInflectPreferredLocalization(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSInflectionRule1, + _lib._sel_canInflectPreferredLocalization1); + } + + static NSInflectionRule new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSInflectionRule1, _lib._sel_new1); + return NSInflectionRule._(_ret, _lib, retain: false, release: true); + } + + static NSInflectionRule allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSInflectionRule1, _lib._sel_allocWithZone_1, zone); + return NSInflectionRule._(_ret, _lib, retain: false, release: true); + } + + static NSInflectionRule alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSInflectionRule1, _lib._sel_alloc1); + return NSInflectionRule._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSInflectionRule1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSInflectionRule1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSInflectionRule1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSInflectionRule1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSInflectionRule1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSInflectionRule1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSInflectionRule1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSInflectionRule1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSInflectionRule1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSMorphology extends NSObject { + NSMorphology._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSMorphology] that points to the same underlying object as [other]. + static NSMorphology castFrom(T other) { + return NSMorphology._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSMorphology] that wraps the given raw object pointer. + static NSMorphology castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSMorphology._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSMorphology]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSMorphology1); + } + + int get grammaticalGender { + return _lib._objc_msgSend_809(_id, _lib._sel_grammaticalGender1); + } + + set grammaticalGender(int value) { + return _lib._objc_msgSend_810(_id, _lib._sel_setGrammaticalGender_1, value); + } + + int get partOfSpeech { + return _lib._objc_msgSend_811(_id, _lib._sel_partOfSpeech1); + } + + set partOfSpeech(int value) { + return _lib._objc_msgSend_812(_id, _lib._sel_setPartOfSpeech_1, value); + } + + int get number { + return _lib._objc_msgSend_813(_id, _lib._sel_number1); + } + + set number(int value) { + return _lib._objc_msgSend_814(_id, _lib._sel_setNumber_1, value); + } + + NSMorphologyCustomPronoun customPronounForLanguage_(NSString? language) { + final _ret = _lib._objc_msgSend_815(_id, + _lib._sel_customPronounForLanguage_1, language?._id ?? ffi.nullptr); + return NSMorphologyCustomPronoun._(_ret, _lib, retain: true, release: true); + } + + bool setCustomPronoun_forLanguage_error_(NSMorphologyCustomPronoun? features, + NSString? language, ffi.Pointer> error) { + return _lib._objc_msgSend_816( + _id, + _lib._sel_setCustomPronoun_forLanguage_error_1, + features?._id ?? ffi.nullptr, + language?._id ?? ffi.nullptr, + error); + } + + bool get unspecified { + return _lib._objc_msgSend_12(_id, _lib._sel_isUnspecified1); + } + + static NSMorphology? getUserMorphology(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_817( + _lib._class_NSMorphology1, _lib._sel_userMorphology1); + return _ret.address == 0 + ? null + : NSMorphology._(_ret, _lib, retain: true, release: true); + } + + @override + NSMorphology init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSMorphology._(_ret, _lib, retain: true, release: true); + } + + static NSMorphology new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSMorphology1, _lib._sel_new1); + return NSMorphology._(_ret, _lib, retain: false, release: true); + } + + static NSMorphology allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSMorphology1, _lib._sel_allocWithZone_1, zone); + return NSMorphology._(_ret, _lib, retain: false, release: true); + } + + static NSMorphology alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSMorphology1, _lib._sel_alloc1); + return NSMorphology._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSMorphology1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSMorphology1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSMorphology1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSMorphology1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSMorphology1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSMorphology1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSMorphology1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSMorphology1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSMorphology1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSGrammaticalGender { + static const int NSGrammaticalGenderNotSet = 0; + static const int NSGrammaticalGenderFeminine = 1; + static const int NSGrammaticalGenderMasculine = 2; + static const int NSGrammaticalGenderNeuter = 3; +} + +abstract class NSGrammaticalPartOfSpeech { + static const int NSGrammaticalPartOfSpeechNotSet = 0; + static const int NSGrammaticalPartOfSpeechDeterminer = 1; + static const int NSGrammaticalPartOfSpeechPronoun = 2; + static const int NSGrammaticalPartOfSpeechLetter = 3; + static const int NSGrammaticalPartOfSpeechAdverb = 4; + static const int NSGrammaticalPartOfSpeechParticle = 5; + static const int NSGrammaticalPartOfSpeechAdjective = 6; + static const int NSGrammaticalPartOfSpeechAdposition = 7; + static const int NSGrammaticalPartOfSpeechVerb = 8; + static const int NSGrammaticalPartOfSpeechNoun = 9; + static const int NSGrammaticalPartOfSpeechConjunction = 10; + static const int NSGrammaticalPartOfSpeechNumeral = 11; + static const int NSGrammaticalPartOfSpeechInterjection = 12; + static const int NSGrammaticalPartOfSpeechPreposition = 13; + static const int NSGrammaticalPartOfSpeechAbbreviation = 14; +} + +abstract class NSGrammaticalNumber { + static const int NSGrammaticalNumberNotSet = 0; + static const int NSGrammaticalNumberSingular = 1; + static const int NSGrammaticalNumberZero = 2; + static const int NSGrammaticalNumberPlural = 3; + static const int NSGrammaticalNumberPluralTwo = 4; + static const int NSGrammaticalNumberPluralFew = 5; + static const int NSGrammaticalNumberPluralMany = 6; +} + +class NSMorphologyCustomPronoun extends NSObject { + NSMorphologyCustomPronoun._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSMorphologyCustomPronoun] that points to the same underlying object as [other]. + static NSMorphologyCustomPronoun castFrom(T other) { + return NSMorphologyCustomPronoun._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSMorphologyCustomPronoun] that wraps the given raw object pointer. + static NSMorphologyCustomPronoun castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSMorphologyCustomPronoun._(other, lib, + retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSMorphologyCustomPronoun]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSMorphologyCustomPronoun1); + } + + static bool isSupportedForLanguage_(SentryCocoa _lib, NSString? language) { + return _lib._objc_msgSend_59(_lib._class_NSMorphologyCustomPronoun1, + _lib._sel_isSupportedForLanguage_1, language?._id ?? ffi.nullptr); + } + + static NSArray requiredKeysForLanguage_( + SentryCocoa _lib, NSString? language) { + final _ret = _lib._objc_msgSend_123(_lib._class_NSMorphologyCustomPronoun1, + _lib._sel_requiredKeysForLanguage_1, language?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSString? get subjectForm { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_subjectForm1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set subjectForm(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setSubjectForm_1, value?._id ?? ffi.nullptr); + } + + NSString? get objectForm { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_objectForm1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set objectForm(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setObjectForm_1, value?._id ?? ffi.nullptr); + } + + NSString? get possessiveForm { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_possessiveForm1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set possessiveForm(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setPossessiveForm_1, value?._id ?? ffi.nullptr); + } + + NSString? get possessiveAdjectiveForm { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_possessiveAdjectiveForm1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set possessiveAdjectiveForm(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setPossessiveAdjectiveForm_1, value?._id ?? ffi.nullptr); + } + + NSString? get reflexiveForm { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_reflexiveForm1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set reflexiveForm(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setReflexiveForm_1, value?._id ?? ffi.nullptr); + } + + @override + NSMorphologyCustomPronoun init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSMorphologyCustomPronoun._(_ret, _lib, retain: true, release: true); + } + + static NSMorphologyCustomPronoun new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSMorphologyCustomPronoun1, _lib._sel_new1); + return NSMorphologyCustomPronoun._(_ret, _lib, + retain: false, release: true); + } + + static NSMorphologyCustomPronoun allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3(_lib._class_NSMorphologyCustomPronoun1, + _lib._sel_allocWithZone_1, zone); + return NSMorphologyCustomPronoun._(_ret, _lib, + retain: false, release: true); + } + + static NSMorphologyCustomPronoun alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSMorphologyCustomPronoun1, _lib._sel_alloc1); + return NSMorphologyCustomPronoun._(_ret, _lib, + retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSMorphologyCustomPronoun1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSMorphologyCustomPronoun1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSMorphologyCustomPronoun1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSMorphologyCustomPronoun1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSMorphologyCustomPronoun1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSMorphologyCustomPronoun1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSMorphologyCustomPronoun1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSMorphologyCustomPronoun1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSMorphologyCustomPronoun1, + _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSOperationQueue extends NSObject { + NSOperationQueue._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSOperationQueue] that points to the same underlying object as [other]. + static NSOperationQueue castFrom(T other) { + return NSOperationQueue._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSOperationQueue] that wraps the given raw object pointer. + static NSOperationQueue castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSOperationQueue._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSOperationQueue]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSOperationQueue1); + } + + NSProgress? get progress { + final _ret = _lib._objc_msgSend_609(_id, _lib._sel_progress1); + return _ret.address == 0 + ? null + : NSProgress._(_ret, _lib, retain: true, release: true); + } + + void addOperation_(NSOperation? op) { + _lib._objc_msgSend_818( + _id, _lib._sel_addOperation_1, op?._id ?? ffi.nullptr); + } + + void addOperations_waitUntilFinished_(NSArray? ops, bool wait) { + _lib._objc_msgSend_821(_id, _lib._sel_addOperations_waitUntilFinished_1, + ops?._id ?? ffi.nullptr, wait); + } + + void addOperationWithBlock_(ObjCBlock_ffiVoid block) { + _lib._objc_msgSend_497(_id, _lib._sel_addOperationWithBlock_1, block._id); + } + + void addBarrierBlock_(ObjCBlock_ffiVoid barrier) { + _lib._objc_msgSend_497(_id, _lib._sel_addBarrierBlock_1, barrier._id); + } + + int get maxConcurrentOperationCount { + return _lib._objc_msgSend_78(_id, _lib._sel_maxConcurrentOperationCount1); + } + + set maxConcurrentOperationCount(int value) { + return _lib._objc_msgSend_590( + _id, _lib._sel_setMaxConcurrentOperationCount_1, value); + } + + bool get suspended { + return _lib._objc_msgSend_12(_id, _lib._sel_isSuspended1); + } + + set suspended(bool value) { + return _lib._objc_msgSend_492(_id, _lib._sel_setSuspended_1, value); + } + + NSString? get name { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set name(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setName_1, value?._id ?? ffi.nullptr); + } + + int get qualityOfService { + return _lib._objc_msgSend_507(_id, _lib._sel_qualityOfService1); + } + + set qualityOfService(int value) { + return _lib._objc_msgSend_508(_id, _lib._sel_setQualityOfService_1, value); + } + + NSObject get underlyingQueue { + final _ret = _lib._objc_msgSend_822(_id, _lib._sel_underlyingQueue1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + set underlyingQueue(NSObject value) { + return _lib._objc_msgSend_823( + _id, _lib._sel_setUnderlyingQueue_1, value._id); + } + + void cancelAllOperations() { + _lib._objc_msgSend_1(_id, _lib._sel_cancelAllOperations1); + } + + void waitUntilAllOperationsAreFinished() { + _lib._objc_msgSend_1(_id, _lib._sel_waitUntilAllOperationsAreFinished1); + } + + static NSOperationQueue? getCurrentQueue(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_824( + _lib._class_NSOperationQueue1, _lib._sel_currentQueue1); + return _ret.address == 0 + ? null + : NSOperationQueue._(_ret, _lib, retain: true, release: true); + } + + static NSOperationQueue? getMainQueue(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_824( + _lib._class_NSOperationQueue1, _lib._sel_mainQueue1); + return _ret.address == 0 + ? null + : NSOperationQueue._(_ret, _lib, retain: true, release: true); + } + + NSArray? get operations { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_operations1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + int get operationCount { + return _lib._objc_msgSend_10(_id, _lib._sel_operationCount1); + } + + @override + NSOperationQueue init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSOperationQueue._(_ret, _lib, retain: true, release: true); + } + + static NSOperationQueue new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSOperationQueue1, _lib._sel_new1); + return NSOperationQueue._(_ret, _lib, retain: false, release: true); + } + + static NSOperationQueue allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSOperationQueue1, _lib._sel_allocWithZone_1, zone); + return NSOperationQueue._(_ret, _lib, retain: false, release: true); + } + + static NSOperationQueue alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSOperationQueue1, _lib._sel_alloc1); + return NSOperationQueue._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSOperationQueue1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSOperationQueue1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSOperationQueue1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSOperationQueue1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSOperationQueue1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSOperationQueue1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSOperationQueue1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSOperationQueue1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSOperationQueue1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSOperation extends NSObject { + NSOperation._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSOperation] that points to the same underlying object as [other]. + static NSOperation castFrom(T other) { + return NSOperation._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSOperation] that wraps the given raw object pointer. + static NSOperation castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSOperation._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSOperation]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSOperation1); + } + + void start() { + _lib._objc_msgSend_1(_id, _lib._sel_start1); + } + + void main() { + _lib._objc_msgSend_1(_id, _lib._sel_main1); + } + + bool get cancelled { + return _lib._objc_msgSend_12(_id, _lib._sel_isCancelled1); + } + + void cancel() { + _lib._objc_msgSend_1(_id, _lib._sel_cancel1); + } + + bool get executing { + return _lib._objc_msgSend_12(_id, _lib._sel_isExecuting1); + } + + bool get finished { + return _lib._objc_msgSend_12(_id, _lib._sel_isFinished1); + } + + bool get concurrent { + return _lib._objc_msgSend_12(_id, _lib._sel_isConcurrent1); + } + + bool get asynchronous { + return _lib._objc_msgSend_12(_id, _lib._sel_isAsynchronous1); + } + + bool get ready { + return _lib._objc_msgSend_12(_id, _lib._sel_isReady1); + } + + void addDependency_(NSOperation? op) { + _lib._objc_msgSend_818( + _id, _lib._sel_addDependency_1, op?._id ?? ffi.nullptr); + } + + void removeDependency_(NSOperation? op) { + _lib._objc_msgSend_818( + _id, _lib._sel_removeDependency_1, op?._id ?? ffi.nullptr); + } + + NSArray? get dependencies { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_dependencies1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + int get queuePriority { + return _lib._objc_msgSend_819(_id, _lib._sel_queuePriority1); + } + + set queuePriority(int value) { + return _lib._objc_msgSend_820(_id, _lib._sel_setQueuePriority_1, value); + } + + ObjCBlock_ffiVoid get completionBlock { + final _ret = _lib._objc_msgSend_618(_id, _lib._sel_completionBlock1); + return ObjCBlock_ffiVoid._(_ret, _lib); + } + + set completionBlock(ObjCBlock_ffiVoid value) { + return _lib._objc_msgSend_619( + _id, _lib._sel_setCompletionBlock_1, value._id); + } + + void waitUntilFinished() { + _lib._objc_msgSend_1(_id, _lib._sel_waitUntilFinished1); + } + + double get threadPriority { + return _lib._objc_msgSend_155(_id, _lib._sel_threadPriority1); + } + + set threadPriority(double value) { + return _lib._objc_msgSend_506(_id, _lib._sel_setThreadPriority_1, value); + } + + int get qualityOfService { + return _lib._objc_msgSend_507(_id, _lib._sel_qualityOfService1); + } + + set qualityOfService(int value) { + return _lib._objc_msgSend_508(_id, _lib._sel_setQualityOfService_1, value); + } + + NSString? get name { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set name(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setName_1, value?._id ?? ffi.nullptr); + } + + @override + NSOperation init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSOperation._(_ret, _lib, retain: true, release: true); + } + + static NSOperation new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSOperation1, _lib._sel_new1); + return NSOperation._(_ret, _lib, retain: false, release: true); + } + + static NSOperation allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSOperation1, _lib._sel_allocWithZone_1, zone); + return NSOperation._(_ret, _lib, retain: false, release: true); + } + + static NSOperation alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSOperation1, _lib._sel_alloc1); + return NSOperation._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSOperation1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSOperation1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSOperation1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSOperation1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSOperation1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSOperation1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSOperation1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSOperation1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSOperation1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSOperationQueuePriority { + static const int NSOperationQueuePriorityVeryLow = -8; + static const int NSOperationQueuePriorityLow = -4; + static const int NSOperationQueuePriorityNormal = 0; + static const int NSOperationQueuePriorityHigh = 4; + static const int NSOperationQueuePriorityVeryHigh = 8; +} + +class NSPointerArray extends NSObject { + NSPointerArray._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSPointerArray] that points to the same underlying object as [other]. + static NSPointerArray castFrom(T other) { + return NSPointerArray._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSPointerArray] that wraps the given raw object pointer. + static NSPointerArray castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSPointerArray._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSPointerArray]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSPointerArray1); + } + + NSPointerArray initWithOptions_(int options) { + final _ret = + _lib._objc_msgSend_825(_id, _lib._sel_initWithOptions_1, options); + return NSPointerArray._(_ret, _lib, retain: true, release: true); + } + + NSPointerArray initWithPointerFunctions_(NSPointerFunctions? functions) { + final _ret = _lib._objc_msgSend_839(_id, + _lib._sel_initWithPointerFunctions_1, functions?._id ?? ffi.nullptr); + return NSPointerArray._(_ret, _lib, retain: true, release: true); + } + + static NSPointerArray pointerArrayWithOptions_( + SentryCocoa _lib, int options) { + final _ret = _lib._objc_msgSend_840(_lib._class_NSPointerArray1, + _lib._sel_pointerArrayWithOptions_1, options); + return NSPointerArray._(_ret, _lib, retain: true, release: true); + } + + static NSPointerArray pointerArrayWithPointerFunctions_( + SentryCocoa _lib, NSPointerFunctions? functions) { + final _ret = _lib._objc_msgSend_841( + _lib._class_NSPointerArray1, + _lib._sel_pointerArrayWithPointerFunctions_1, + functions?._id ?? ffi.nullptr); + return NSPointerArray._(_ret, _lib, retain: true, release: true); + } + + NSPointerFunctions? get pointerFunctions { + final _ret = _lib._objc_msgSend_842(_id, _lib._sel_pointerFunctions1); + return _ret.address == 0 + ? null + : NSPointerFunctions._(_ret, _lib, retain: true, release: true); + } + + ffi.Pointer pointerAtIndex_(int index) { + return _lib._objc_msgSend_843(_id, _lib._sel_pointerAtIndex_1, index); + } + + void addPointer_(ffi.Pointer pointer) { + _lib._objc_msgSend_47(_id, _lib._sel_addPointer_1, pointer); + } + + void removePointerAtIndex_(int index) { + _lib._objc_msgSend_439(_id, _lib._sel_removePointerAtIndex_1, index); + } + + void insertPointer_atIndex_(ffi.Pointer item, int index) { + _lib._objc_msgSend_21(_id, _lib._sel_insertPointer_atIndex_1, item, index); + } + + void replacePointerAtIndex_withPointer_( + int index, ffi.Pointer item) { + _lib._objc_msgSend_844( + _id, _lib._sel_replacePointerAtIndex_withPointer_1, index, item); + } + + void compact() { + _lib._objc_msgSend_1(_id, _lib._sel_compact1); + } + + int get count { + return _lib._objc_msgSend_10(_id, _lib._sel_count1); + } + + set count(int value) { + return _lib._objc_msgSend_483(_id, _lib._sel_setCount_1, value); + } + + static NSObject pointerArrayWithStrongObjects(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSPointerArray1, _lib._sel_pointerArrayWithStrongObjects1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject pointerArrayWithWeakObjects(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSPointerArray1, _lib._sel_pointerArrayWithWeakObjects1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSPointerArray strongObjectsPointerArray(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_845( + _lib._class_NSPointerArray1, _lib._sel_strongObjectsPointerArray1); + return NSPointerArray._(_ret, _lib, retain: true, release: true); + } + + static NSPointerArray weakObjectsPointerArray(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_845( + _lib._class_NSPointerArray1, _lib._sel_weakObjectsPointerArray1); + return NSPointerArray._(_ret, _lib, retain: true, release: true); + } + + NSArray? get allObjects { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_allObjects1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + @override + NSPointerArray init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSPointerArray._(_ret, _lib, retain: true, release: true); + } + + static NSPointerArray new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSPointerArray1, _lib._sel_new1); + return NSPointerArray._(_ret, _lib, retain: false, release: true); + } + + static NSPointerArray allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSPointerArray1, _lib._sel_allocWithZone_1, zone); + return NSPointerArray._(_ret, _lib, retain: false, release: true); + } + + static NSPointerArray alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSPointerArray1, _lib._sel_alloc1); + return NSPointerArray._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSPointerArray1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSPointerArray1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSPointerArray1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSPointerArray1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSPointerArray1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSPointerArray1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSPointerArray1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSPointerArray1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSPointerArray1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSPointerFunctionsOptions { + static const int NSPointerFunctionsStrongMemory = 0; + static const int NSPointerFunctionsZeroingWeakMemory = 1; + static const int NSPointerFunctionsOpaqueMemory = 2; + static const int NSPointerFunctionsMallocMemory = 3; + static const int NSPointerFunctionsMachVirtualMemory = 4; + static const int NSPointerFunctionsWeakMemory = 5; + static const int NSPointerFunctionsObjectPersonality = 0; + static const int NSPointerFunctionsOpaquePersonality = 256; + static const int NSPointerFunctionsObjectPointerPersonality = 512; + static const int NSPointerFunctionsCStringPersonality = 768; + static const int NSPointerFunctionsStructPersonality = 1024; + static const int NSPointerFunctionsIntegerPersonality = 1280; + static const int NSPointerFunctionsCopyIn = 65536; +} + +class NSPointerFunctions extends NSObject { + NSPointerFunctions._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSPointerFunctions] that points to the same underlying object as [other]. + static NSPointerFunctions castFrom(T other) { + return NSPointerFunctions._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSPointerFunctions] that wraps the given raw object pointer. + static NSPointerFunctions castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSPointerFunctions._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSPointerFunctions]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSPointerFunctions1); + } + + NSPointerFunctions initWithOptions_(int options) { + final _ret = + _lib._objc_msgSend_825(_id, _lib._sel_initWithOptions_1, options); + return NSPointerFunctions._(_ret, _lib, retain: true, release: true); + } + + static NSPointerFunctions pointerFunctionsWithOptions_( + SentryCocoa _lib, int options) { + final _ret = _lib._objc_msgSend_826(_lib._class_NSPointerFunctions1, + _lib._sel_pointerFunctionsWithOptions_1, options); + return NSPointerFunctions._(_ret, _lib, retain: true, release: true); + } + + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function(ffi.Pointer)>>)>> + get hashFunction { + return _lib._objc_msgSend_827(_id, _lib._sel_hashFunction1); + } + + set hashFunction( + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>)>> + value) { + return _lib._objc_msgSend_828(_id, _lib._sel_setHashFunction_1, value); + } + + ffi.Pointer< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function(ffi.Pointer)>>)>> + get isEqualFunction { + return _lib._objc_msgSend_829(_id, _lib._sel_isEqualFunction1); + } + + set isEqualFunction( + ffi.Pointer< + ffi.NativeFunction< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>)>> + value) { + return _lib._objc_msgSend_830(_id, _lib._sel_setIsEqualFunction_1, value); + } + + ffi.Pointer< + ffi.NativeFunction)>> + get sizeFunction { + return _lib._objc_msgSend_831(_id, _lib._sel_sizeFunction1); + } + + set sizeFunction( + ffi.Pointer< + ffi + .NativeFunction)>> + value) { + return _lib._objc_msgSend_832(_id, _lib._sel_setSizeFunction_1, value); + } + + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer)>> + get descriptionFunction { + return _lib._objc_msgSend_833(_id, _lib._sel_descriptionFunction1); + } + + set descriptionFunction( + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function(ffi.Pointer)>> + value) { + return _lib._objc_msgSend_834( + _id, _lib._sel_setDescriptionFunction_1, value); + } + + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function(ffi.Pointer)>>)>> + get relinquishFunction { + return _lib._objc_msgSend_835(_id, _lib._sel_relinquishFunction1); + } + + set relinquishFunction( + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>)>> + value) { + return _lib._objc_msgSend_836( + _id, _lib._sel_setRelinquishFunction_1, value); + } + + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function(ffi.Pointer)>>, + ffi.Bool)>> get acquireFunction { + return _lib._objc_msgSend_837(_id, _lib._sel_acquireFunction1); + } + + set acquireFunction( + ffi.Pointer< + ffi.NativeFunction< + ffi.Pointer Function( + ffi.Pointer, + ffi.Pointer< + ffi.NativeFunction< + ffi.UnsignedLong Function( + ffi.Pointer)>>, + ffi.Bool)>> + value) { + return _lib._objc_msgSend_838(_id, _lib._sel_setAcquireFunction_1, value); + } + + bool get usesStrongWriteBarrier { + return _lib._objc_msgSend_12(_id, _lib._sel_usesStrongWriteBarrier1); + } + + set usesStrongWriteBarrier(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setUsesStrongWriteBarrier_1, value); + } + + bool get usesWeakReadAndWriteBarriers { + return _lib._objc_msgSend_12(_id, _lib._sel_usesWeakReadAndWriteBarriers1); + } + + set usesWeakReadAndWriteBarriers(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setUsesWeakReadAndWriteBarriers_1, value); + } + + @override + NSPointerFunctions init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSPointerFunctions._(_ret, _lib, retain: true, release: true); + } + + static NSPointerFunctions new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSPointerFunctions1, _lib._sel_new1); + return NSPointerFunctions._(_ret, _lib, retain: false, release: true); + } + + static NSPointerFunctions allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSPointerFunctions1, _lib._sel_allocWithZone_1, zone); + return NSPointerFunctions._(_ret, _lib, retain: false, release: true); + } + + static NSPointerFunctions alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSPointerFunctions1, _lib._sel_alloc1); + return NSPointerFunctions._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSPointerFunctions1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSPointerFunctions1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSPointerFunctions1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSPointerFunctions1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSPointerFunctions1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSPointerFunctions1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSPointerFunctions1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSPointerFunctions1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSPointerFunctions1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSProcessInfo extends NSObject { + NSProcessInfo._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSProcessInfo] that points to the same underlying object as [other]. + static NSProcessInfo castFrom(T other) { + return NSProcessInfo._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSProcessInfo] that wraps the given raw object pointer. + static NSProcessInfo castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSProcessInfo._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSProcessInfo]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSProcessInfo1); + } + + static NSProcessInfo? getProcessInfo(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_846( + _lib._class_NSProcessInfo1, _lib._sel_processInfo1); + return _ret.address == 0 + ? null + : NSProcessInfo._(_ret, _lib, retain: true, release: true); + } + + NSDictionary? get environment { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_environment1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSArray? get arguments { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_arguments1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSString? get hostName { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_hostName1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get processName { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_processName1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set processName(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setProcessName_1, value?._id ?? ffi.nullptr); + } + + int get processIdentifier { + return _lib._objc_msgSend_219(_id, _lib._sel_processIdentifier1); + } + + NSString? get globallyUniqueString { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_globallyUniqueString1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + int operatingSystem() { + return _lib._objc_msgSend_10(_id, _lib._sel_operatingSystem1); + } + + NSString operatingSystemName() { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_operatingSystemName1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get operatingSystemVersionString { + final _ret = + _lib._objc_msgSend_20(_id, _lib._sel_operatingSystemVersionString1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + void getOperatingSystemVersion(ffi.Pointer stret) { + _lib._objc_msgSend_847(stret, _id, _lib._sel_operatingSystemVersion1); + } + + int get processorCount { + return _lib._objc_msgSend_10(_id, _lib._sel_processorCount1); + } + + int get activeProcessorCount { + return _lib._objc_msgSend_10(_id, _lib._sel_activeProcessorCount1); + } + + int get physicalMemory { + return _lib._objc_msgSend_154(_id, _lib._sel_physicalMemory1); + } + + bool isOperatingSystemAtLeastVersion_(NSOperatingSystemVersion version) { + return _lib._objc_msgSend_848( + _id, _lib._sel_isOperatingSystemAtLeastVersion_1, version); + } + + double get systemUptime { + return _lib._objc_msgSend_155(_id, _lib._sel_systemUptime1); + } + + void disableSuddenTermination() { + _lib._objc_msgSend_1(_id, _lib._sel_disableSuddenTermination1); + } + + void enableSuddenTermination() { + _lib._objc_msgSend_1(_id, _lib._sel_enableSuddenTermination1); + } + + void disableAutomaticTermination_(NSString? reason) { + _lib._objc_msgSend_192(_id, _lib._sel_disableAutomaticTermination_1, + reason?._id ?? ffi.nullptr); + } + + void enableAutomaticTermination_(NSString? reason) { + _lib._objc_msgSend_192(_id, _lib._sel_enableAutomaticTermination_1, + reason?._id ?? ffi.nullptr); + } + + bool get automaticTerminationSupportEnabled { + return _lib._objc_msgSend_12( + _id, _lib._sel_automaticTerminationSupportEnabled1); + } + + set automaticTerminationSupportEnabled(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setAutomaticTerminationSupportEnabled_1, value); + } + + NSObject beginActivityWithOptions_reason_(int options, NSString? reason) { + final _ret = _lib._objc_msgSend_849( + _id, + _lib._sel_beginActivityWithOptions_reason_1, + options, + reason?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + void endActivity_(NSObject? activity) { + _lib._objc_msgSend_15( + _id, _lib._sel_endActivity_1, activity?._id ?? ffi.nullptr); + } + + void performActivityWithOptions_reason_usingBlock_( + int options, NSString? reason, ObjCBlock_ffiVoid block) { + _lib._objc_msgSend_850( + _id, + _lib._sel_performActivityWithOptions_reason_usingBlock_1, + options, + reason?._id ?? ffi.nullptr, + block._id); + } + + void performExpiringActivityWithReason_usingBlock_( + NSString? reason, ObjCBlock_ffiVoid_bool block) { + _lib._objc_msgSend_851( + _id, + _lib._sel_performExpiringActivityWithReason_usingBlock_1, + reason?._id ?? ffi.nullptr, + block._id); + } + + NSString? get userName { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_userName1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get fullUserName { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_fullUserName1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + int get thermalState { + return _lib._objc_msgSend_852(_id, _lib._sel_thermalState1); + } + + bool get lowPowerModeEnabled { + return _lib._objc_msgSend_12(_id, _lib._sel_isLowPowerModeEnabled1); + } + + bool get macCatalystApp { + return _lib._objc_msgSend_12(_id, _lib._sel_isMacCatalystApp1); + } + + bool get iOSAppOnMac { + return _lib._objc_msgSend_12(_id, _lib._sel_isiOSAppOnMac1); + } + + @override + NSProcessInfo init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSProcessInfo._(_ret, _lib, retain: true, release: true); + } + + static NSProcessInfo new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSProcessInfo1, _lib._sel_new1); + return NSProcessInfo._(_ret, _lib, retain: false, release: true); + } + + static NSProcessInfo allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSProcessInfo1, _lib._sel_allocWithZone_1, zone); + return NSProcessInfo._(_ret, _lib, retain: false, release: true); + } + + static NSProcessInfo alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSProcessInfo1, _lib._sel_alloc1); + return NSProcessInfo._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSProcessInfo1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSProcessInfo1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSProcessInfo1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSProcessInfo1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSProcessInfo1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSProcessInfo1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSProcessInfo1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSProcessInfo1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSProcessInfo1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSOperatingSystemVersion extends ffi.Struct { + @ffi.Long() + external int majorVersion; + + @ffi.Long() + external int minorVersion; + + @ffi.Long() + external int patchVersion; +} + +abstract class NSActivityOptions { + static const int NSActivityIdleDisplaySleepDisabled = 1099511627776; + static const int NSActivityIdleSystemSleepDisabled = 1048576; + static const int NSActivitySuddenTerminationDisabled = 16384; + static const int NSActivityAutomaticTerminationDisabled = 32768; + static const int NSActivityAnimationTrackingEnabled = 35184372088832; + static const int NSActivityTrackingEnabled = 70368744177664; + static const int NSActivityUserInitiated = 16777215; + static const int NSActivityUserInitiatedAllowingIdleSystemSleep = 15728639; + static const int NSActivityBackground = 255; + static const int NSActivityLatencyCritical = 1095216660480; + static const int NSActivityUserInteractive = 1095233437695; +} + +void _ObjCBlock_ffiVoid_bool_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, bool arg0) { + return block.ref.target + .cast>() + .asFunction()(arg0); +} + +final _ObjCBlock_ffiVoid_bool_closureRegistry = {}; +int _ObjCBlock_ffiVoid_bool_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_bool_registerClosure(Function fn) { + final id = ++_ObjCBlock_ffiVoid_bool_closureRegistryIndex; + _ObjCBlock_ffiVoid_bool_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_bool_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, bool arg0) { + return (_ObjCBlock_ffiVoid_bool_closureRegistry[block.ref.target.address] + as void Function(bool))(arg0); +} + +class ObjCBlock_ffiVoid_bool extends _ObjCBlockBase { + ObjCBlock_ffiVoid_bool._(ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_bool.fromFunctionPointer(SentryCocoa lib, + ffi.Pointer> ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, ffi.Bool arg0)>( + _ObjCBlock_ffiVoid_bool_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_bool.fromFunction( + SentryCocoa lib, void Function(bool arg0) fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, ffi.Bool arg0)>( + _ObjCBlock_ffiVoid_bool_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_bool_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(bool arg0) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, ffi.Bool arg0)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, bool arg0)>()(_id, arg0); + } +} + +abstract class NSProcessInfoThermalState { + static const int NSProcessInfoThermalStateNominal = 0; + static const int NSProcessInfoThermalStateFair = 1; + static const int NSProcessInfoThermalStateSerious = 2; + static const int NSProcessInfoThermalStateCritical = 3; +} + +class NSTextCheckingResult extends NSObject { + NSTextCheckingResult._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSTextCheckingResult] that points to the same underlying object as [other]. + static NSTextCheckingResult castFrom(T other) { + return NSTextCheckingResult._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSTextCheckingResult] that wraps the given raw object pointer. + static NSTextCheckingResult castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSTextCheckingResult._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSTextCheckingResult]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSTextCheckingResult1); + } + + int get resultType { + return _lib._objc_msgSend_853(_id, _lib._sel_resultType1); + } + + void getRange(ffi.Pointer<_NSRange> stret) { + _lib._objc_msgSend_49(stret, _id, _lib._sel_range1); + } + + NSOrthography? get orthography { + final _ret = _lib._objc_msgSend_854(_id, _lib._sel_orthography1); + return _ret.address == 0 + ? null + : NSOrthography._(_ret, _lib, retain: true, release: true); + } + + NSArray? get grammarDetails { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_grammarDetails1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSDate? get date { + final _ret = _lib._objc_msgSend_162(_id, _lib._sel_date1); + return _ret.address == 0 + ? null + : NSDate._(_ret, _lib, retain: true, release: true); + } + + NSTimeZone? get timeZone { + final _ret = _lib._objc_msgSend_168(_id, _lib._sel_timeZone1); + return _ret.address == 0 + ? null + : NSTimeZone._(_ret, _lib, retain: true, release: true); + } + + double get duration { + return _lib._objc_msgSend_155(_id, _lib._sel_duration1); + } + + NSDictionary? get components { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_components1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSURL? get URL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_URL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + NSString? get replacementString { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_replacementString1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSArray? get alternativeStrings { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_alternativeStrings1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSRegularExpression? get regularExpression { + final _ret = _lib._objc_msgSend_866(_id, _lib._sel_regularExpression1); + return _ret.address == 0 + ? null + : NSRegularExpression._(_ret, _lib, retain: true, release: true); + } + + NSString? get phoneNumber { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_phoneNumber1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + int get numberOfRanges { + return _lib._objc_msgSend_10(_id, _lib._sel_numberOfRanges1); + } + + void rangeAtIndex_(ffi.Pointer<_NSRange> stret, int idx) { + _lib._objc_msgSend_323(stret, _id, _lib._sel_rangeAtIndex_1, idx); + } + + void rangeWithName_(ffi.Pointer<_NSRange> stret, NSString? name) { + _lib._objc_msgSend_316( + stret, _id, _lib._sel_rangeWithName_1, name?._id ?? ffi.nullptr); + } + + NSTextCheckingResult resultByAdjustingRangesWithOffset_(int offset) { + final _ret = _lib._objc_msgSend_867( + _id, _lib._sel_resultByAdjustingRangesWithOffset_1, offset); + return NSTextCheckingResult._(_ret, _lib, retain: true, release: true); + } + + NSDictionary? get addressComponents { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_addressComponents1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSTextCheckingResult orthographyCheckingResultWithRange_orthography_( + SentryCocoa _lib, _NSRange range, NSOrthography? orthography) { + final _ret = _lib._objc_msgSend_868( + _lib._class_NSTextCheckingResult1, + _lib._sel_orthographyCheckingResultWithRange_orthography_1, + range, + orthography?._id ?? ffi.nullptr); + return NSTextCheckingResult._(_ret, _lib, retain: true, release: true); + } + + static NSTextCheckingResult spellCheckingResultWithRange_( + SentryCocoa _lib, _NSRange range) { + final _ret = _lib._objc_msgSend_869(_lib._class_NSTextCheckingResult1, + _lib._sel_spellCheckingResultWithRange_1, range); + return NSTextCheckingResult._(_ret, _lib, retain: true, release: true); + } + + static NSTextCheckingResult grammarCheckingResultWithRange_details_( + SentryCocoa _lib, _NSRange range, NSArray? details) { + final _ret = _lib._objc_msgSend_870( + _lib._class_NSTextCheckingResult1, + _lib._sel_grammarCheckingResultWithRange_details_1, + range, + details?._id ?? ffi.nullptr); + return NSTextCheckingResult._(_ret, _lib, retain: true, release: true); + } + + static NSTextCheckingResult dateCheckingResultWithRange_date_( + SentryCocoa _lib, _NSRange range, NSDate? date) { + final _ret = _lib._objc_msgSend_871( + _lib._class_NSTextCheckingResult1, + _lib._sel_dateCheckingResultWithRange_date_1, + range, + date?._id ?? ffi.nullptr); + return NSTextCheckingResult._(_ret, _lib, retain: true, release: true); + } + + static NSTextCheckingResult + dateCheckingResultWithRange_date_timeZone_duration_(SentryCocoa _lib, + _NSRange range, NSDate? date, NSTimeZone? timeZone, double duration) { + final _ret = _lib._objc_msgSend_872( + _lib._class_NSTextCheckingResult1, + _lib._sel_dateCheckingResultWithRange_date_timeZone_duration_1, + range, + date?._id ?? ffi.nullptr, + timeZone?._id ?? ffi.nullptr, + duration); + return NSTextCheckingResult._(_ret, _lib, retain: true, release: true); + } + + static NSTextCheckingResult addressCheckingResultWithRange_components_( + SentryCocoa _lib, _NSRange range, NSDictionary? components) { + final _ret = _lib._objc_msgSend_873( + _lib._class_NSTextCheckingResult1, + _lib._sel_addressCheckingResultWithRange_components_1, + range, + components?._id ?? ffi.nullptr); + return NSTextCheckingResult._(_ret, _lib, retain: true, release: true); + } + + static NSTextCheckingResult linkCheckingResultWithRange_URL_( + SentryCocoa _lib, _NSRange range, NSURL? url) { + final _ret = _lib._objc_msgSend_874( + _lib._class_NSTextCheckingResult1, + _lib._sel_linkCheckingResultWithRange_URL_1, + range, + url?._id ?? ffi.nullptr); + return NSTextCheckingResult._(_ret, _lib, retain: true, release: true); + } + + static NSTextCheckingResult quoteCheckingResultWithRange_replacementString_( + SentryCocoa _lib, _NSRange range, NSString? replacementString) { + final _ret = _lib._objc_msgSend_875( + _lib._class_NSTextCheckingResult1, + _lib._sel_quoteCheckingResultWithRange_replacementString_1, + range, + replacementString?._id ?? ffi.nullptr); + return NSTextCheckingResult._(_ret, _lib, retain: true, release: true); + } + + static NSTextCheckingResult dashCheckingResultWithRange_replacementString_( + SentryCocoa _lib, _NSRange range, NSString? replacementString) { + final _ret = _lib._objc_msgSend_875( + _lib._class_NSTextCheckingResult1, + _lib._sel_dashCheckingResultWithRange_replacementString_1, + range, + replacementString?._id ?? ffi.nullptr); + return NSTextCheckingResult._(_ret, _lib, retain: true, release: true); + } + + static NSTextCheckingResult + replacementCheckingResultWithRange_replacementString_( + SentryCocoa _lib, _NSRange range, NSString? replacementString) { + final _ret = _lib._objc_msgSend_875( + _lib._class_NSTextCheckingResult1, + _lib._sel_replacementCheckingResultWithRange_replacementString_1, + range, + replacementString?._id ?? ffi.nullptr); + return NSTextCheckingResult._(_ret, _lib, retain: true, release: true); + } + + static NSTextCheckingResult + correctionCheckingResultWithRange_replacementString_( + SentryCocoa _lib, _NSRange range, NSString? replacementString) { + final _ret = _lib._objc_msgSend_875( + _lib._class_NSTextCheckingResult1, + _lib._sel_correctionCheckingResultWithRange_replacementString_1, + range, + replacementString?._id ?? ffi.nullptr); + return NSTextCheckingResult._(_ret, _lib, retain: true, release: true); + } + + static NSTextCheckingResult + correctionCheckingResultWithRange_replacementString_alternativeStrings_( + SentryCocoa _lib, + _NSRange range, + NSString? replacementString, + NSArray? alternativeStrings) { + final _ret = _lib._objc_msgSend_876( + _lib._class_NSTextCheckingResult1, + _lib._sel_correctionCheckingResultWithRange_replacementString_alternativeStrings_1, + range, + replacementString?._id ?? ffi.nullptr, + alternativeStrings?._id ?? ffi.nullptr); + return NSTextCheckingResult._(_ret, _lib, retain: true, release: true); + } + + static NSTextCheckingResult + regularExpressionCheckingResultWithRanges_count_regularExpression_( + SentryCocoa _lib, + ffi.Pointer<_NSRange> ranges, + int count, + NSRegularExpression? regularExpression) { + final _ret = _lib._objc_msgSend_877( + _lib._class_NSTextCheckingResult1, + _lib._sel_regularExpressionCheckingResultWithRanges_count_regularExpression_1, + ranges, + count, + regularExpression?._id ?? ffi.nullptr); + return NSTextCheckingResult._(_ret, _lib, retain: true, release: true); + } + + static NSTextCheckingResult phoneNumberCheckingResultWithRange_phoneNumber_( + SentryCocoa _lib, _NSRange range, NSString? phoneNumber) { + final _ret = _lib._objc_msgSend_875( + _lib._class_NSTextCheckingResult1, + _lib._sel_phoneNumberCheckingResultWithRange_phoneNumber_1, + range, + phoneNumber?._id ?? ffi.nullptr); + return NSTextCheckingResult._(_ret, _lib, retain: true, release: true); + } + + static NSTextCheckingResult + transitInformationCheckingResultWithRange_components_( + SentryCocoa _lib, _NSRange range, NSDictionary? components) { + final _ret = _lib._objc_msgSend_873( + _lib._class_NSTextCheckingResult1, + _lib._sel_transitInformationCheckingResultWithRange_components_1, + range, + components?._id ?? ffi.nullptr); + return NSTextCheckingResult._(_ret, _lib, retain: true, release: true); + } + + @override + NSTextCheckingResult init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSTextCheckingResult._(_ret, _lib, retain: true, release: true); + } + + static NSTextCheckingResult new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSTextCheckingResult1, _lib._sel_new1); + return NSTextCheckingResult._(_ret, _lib, retain: false, release: true); + } + + static NSTextCheckingResult allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSTextCheckingResult1, _lib._sel_allocWithZone_1, zone); + return NSTextCheckingResult._(_ret, _lib, retain: false, release: true); + } + + static NSTextCheckingResult alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSTextCheckingResult1, _lib._sel_alloc1); + return NSTextCheckingResult._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSTextCheckingResult1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSTextCheckingResult1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSTextCheckingResult1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSTextCheckingResult1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSTextCheckingResult1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSTextCheckingResult1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSTextCheckingResult1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSTextCheckingResult1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSTextCheckingResult1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSTextCheckingType { + static const int NSTextCheckingTypeOrthography = 1; + static const int NSTextCheckingTypeSpelling = 2; + static const int NSTextCheckingTypeGrammar = 4; + static const int NSTextCheckingTypeDate = 8; + static const int NSTextCheckingTypeAddress = 16; + static const int NSTextCheckingTypeLink = 32; + static const int NSTextCheckingTypeQuote = 64; + static const int NSTextCheckingTypeDash = 128; + static const int NSTextCheckingTypeReplacement = 256; + static const int NSTextCheckingTypeCorrection = 512; + static const int NSTextCheckingTypeRegularExpression = 1024; + static const int NSTextCheckingTypePhoneNumber = 2048; + static const int NSTextCheckingTypeTransitInformation = 4096; +} + +class NSRegularExpression extends NSObject { + NSRegularExpression._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSRegularExpression] that points to the same underlying object as [other]. + static NSRegularExpression castFrom(T other) { + return NSRegularExpression._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSRegularExpression] that wraps the given raw object pointer. + static NSRegularExpression castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSRegularExpression._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSRegularExpression]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSRegularExpression1); + } + + static NSRegularExpression regularExpressionWithPattern_options_error_( + SentryCocoa _lib, + NSString? pattern, + int options, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_855( + _lib._class_NSRegularExpression1, + _lib._sel_regularExpressionWithPattern_options_error_1, + pattern?._id ?? ffi.nullptr, + options, + error); + return NSRegularExpression._(_ret, _lib, retain: true, release: true); + } + + NSRegularExpression initWithPattern_options_error_(NSString? pattern, + int options, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_856( + _id, + _lib._sel_initWithPattern_options_error_1, + pattern?._id ?? ffi.nullptr, + options, + error); + return NSRegularExpression._(_ret, _lib, retain: true, release: true); + } + + NSString? get pattern { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_pattern1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + int get options { + return _lib._objc_msgSend_857(_id, _lib._sel_options1); + } + + int get numberOfCaptureGroups { + return _lib._objc_msgSend_10(_id, _lib._sel_numberOfCaptureGroups1); + } + + static NSString escapedPatternForString_(SentryCocoa _lib, NSString? string) { + final _ret = _lib._objc_msgSend_64(_lib._class_NSRegularExpression1, + _lib._sel_escapedPatternForString_1, string?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + void enumerateMatchesInString_options_range_usingBlock_( + NSString? string, + int options, + _NSRange range, + ObjCBlock_ffiVoid_NSTextCheckingResult_NSMatchingFlags_bool block) { + _lib._objc_msgSend_858( + _id, + _lib._sel_enumerateMatchesInString_options_range_usingBlock_1, + string?._id ?? ffi.nullptr, + options, + range, + block._id); + } + + NSArray matchesInString_options_range_( + NSString? string, int options, _NSRange range) { + final _ret = _lib._objc_msgSend_859( + _id, + _lib._sel_matchesInString_options_range_1, + string?._id ?? ffi.nullptr, + options, + range); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + int numberOfMatchesInString_options_range_( + NSString? string, int options, _NSRange range) { + return _lib._objc_msgSend_860( + _id, + _lib._sel_numberOfMatchesInString_options_range_1, + string?._id ?? ffi.nullptr, + options, + range); + } + + NSTextCheckingResult firstMatchInString_options_range_( + NSString? string, int options, _NSRange range) { + final _ret = _lib._objc_msgSend_861( + _id, + _lib._sel_firstMatchInString_options_range_1, + string?._id ?? ffi.nullptr, + options, + range); + return NSTextCheckingResult._(_ret, _lib, retain: true, release: true); + } + + void rangeOfFirstMatchInString_options_range_(ffi.Pointer<_NSRange> stret, + NSString? string, int options, _NSRange range) { + _lib._objc_msgSend_862( + stret, + _id, + _lib._sel_rangeOfFirstMatchInString_options_range_1, + string?._id ?? ffi.nullptr, + options, + range); + } + + NSString stringByReplacingMatchesInString_options_range_withTemplate_( + NSString? string, int options, _NSRange range, NSString? templ) { + final _ret = _lib._objc_msgSend_863( + _id, + _lib._sel_stringByReplacingMatchesInString_options_range_withTemplate_1, + string?._id ?? ffi.nullptr, + options, + range, + templ?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + int replaceMatchesInString_options_range_withTemplate_( + NSMutableString? string, int options, _NSRange range, NSString? templ) { + return _lib._objc_msgSend_864( + _id, + _lib._sel_replaceMatchesInString_options_range_withTemplate_1, + string?._id ?? ffi.nullptr, + options, + range, + templ?._id ?? ffi.nullptr); + } + + NSString replacementStringForResult_inString_offset_template_( + NSTextCheckingResult? result, + NSString? string, + int offset, + NSString? templ) { + final _ret = _lib._objc_msgSend_865( + _id, + _lib._sel_replacementStringForResult_inString_offset_template_1, + result?._id ?? ffi.nullptr, + string?._id ?? ffi.nullptr, + offset, + templ?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString escapedTemplateForString_( + SentryCocoa _lib, NSString? string) { + final _ret = _lib._objc_msgSend_64(_lib._class_NSRegularExpression1, + _lib._sel_escapedTemplateForString_1, string?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + @override + NSRegularExpression init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSRegularExpression._(_ret, _lib, retain: true, release: true); + } + + static NSRegularExpression new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSRegularExpression1, _lib._sel_new1); + return NSRegularExpression._(_ret, _lib, retain: false, release: true); + } + + static NSRegularExpression allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSRegularExpression1, _lib._sel_allocWithZone_1, zone); + return NSRegularExpression._(_ret, _lib, retain: false, release: true); + } + + static NSRegularExpression alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSRegularExpression1, _lib._sel_alloc1); + return NSRegularExpression._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSRegularExpression1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSRegularExpression1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSRegularExpression1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSRegularExpression1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSRegularExpression1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSRegularExpression1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSRegularExpression1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSRegularExpression1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSRegularExpression1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSRegularExpressionOptions { + static const int NSRegularExpressionCaseInsensitive = 1; + static const int NSRegularExpressionAllowCommentsAndWhitespace = 2; + static const int NSRegularExpressionIgnoreMetacharacters = 4; + static const int NSRegularExpressionDotMatchesLineSeparators = 8; + static const int NSRegularExpressionAnchorsMatchLines = 16; + static const int NSRegularExpressionUseUnixLineSeparators = 32; + static const int NSRegularExpressionUseUnicodeWordBoundaries = 64; +} + +abstract class NSMatchingOptions { + static const int NSMatchingReportProgress = 1; + static const int NSMatchingReportCompletion = 2; + static const int NSMatchingAnchored = 4; + static const int NSMatchingWithTransparentBounds = 8; + static const int NSMatchingWithoutAnchoringBounds = 16; +} + +void + _ObjCBlock_ffiVoid_NSTextCheckingResult_NSMatchingFlags_bool_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + int arg1, + ffi.Pointer arg2) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, ffi.Int32 arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function(ffi.Pointer arg0, int arg1, + ffi.Pointer arg2)>()(arg0, arg1, arg2); +} + +final _ObjCBlock_ffiVoid_NSTextCheckingResult_NSMatchingFlags_bool_closureRegistry = + {}; +int _ObjCBlock_ffiVoid_NSTextCheckingResult_NSMatchingFlags_bool_closureRegistryIndex = + 0; +ffi.Pointer + _ObjCBlock_ffiVoid_NSTextCheckingResult_NSMatchingFlags_bool_registerClosure( + Function fn) { + final id = + ++_ObjCBlock_ffiVoid_NSTextCheckingResult_NSMatchingFlags_bool_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSTextCheckingResult_NSMatchingFlags_bool_closureRegistry[ + id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void + _ObjCBlock_ffiVoid_NSTextCheckingResult_NSMatchingFlags_bool_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + int arg1, + ffi.Pointer arg2) { + return (_ObjCBlock_ffiVoid_NSTextCheckingResult_NSMatchingFlags_bool_closureRegistry[ + block.ref.target.address] + as void Function(ffi.Pointer, int, + ffi.Pointer))(arg0, arg1, arg2); +} + +class ObjCBlock_ffiVoid_NSTextCheckingResult_NSMatchingFlags_bool + extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSTextCheckingResult_NSMatchingFlags_bool._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSTextCheckingResult_NSMatchingFlags_bool.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, + ffi.Int32 arg1, ffi.Pointer arg2)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Int32 arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_NSTextCheckingResult_NSMatchingFlags_bool_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSTextCheckingResult_NSMatchingFlags_bool.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, int arg1, + ffi.Pointer arg2) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Int32 arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_NSTextCheckingResult_NSMatchingFlags_bool_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSTextCheckingResult_NSMatchingFlags_bool_registerClosure( + fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call( + ffi.Pointer arg0, int arg1, ffi.Pointer arg2) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Int32 arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + int arg1, + ffi.Pointer arg2)>()(_id, arg0, arg1, arg2); + } +} + +abstract class NSMatchingFlags { + static const int NSMatchingProgress = 1; + static const int NSMatchingCompleted = 2; + static const int NSMatchingHitEnd = 4; + static const int NSMatchingRequiredEnd = 8; + static const int NSMatchingInternalError = 16; +} + +class NSURLCache extends NSObject { + NSURLCache._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSURLCache] that points to the same underlying object as [other]. + static NSURLCache castFrom(T other) { + return NSURLCache._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSURLCache] that wraps the given raw object pointer. + static NSURLCache castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSURLCache._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSURLCache]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSURLCache1); + } + + static NSURLCache? getSharedURLCache(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_878( + _lib._class_NSURLCache1, _lib._sel_sharedURLCache1); + return _ret.address == 0 + ? null + : NSURLCache._(_ret, _lib, retain: true, release: true); + } + + static void setSharedURLCache(SentryCocoa _lib, NSURLCache? value) { + return _lib._objc_msgSend_879(_lib._class_NSURLCache1, + _lib._sel_setSharedURLCache_1, value?._id ?? ffi.nullptr); + } + + NSURLCache initWithMemoryCapacity_diskCapacity_diskPath_( + int memoryCapacity, int diskCapacity, NSString? path) { + final _ret = _lib._objc_msgSend_880( + _id, + _lib._sel_initWithMemoryCapacity_diskCapacity_diskPath_1, + memoryCapacity, + diskCapacity, + path?._id ?? ffi.nullptr); + return NSURLCache._(_ret, _lib, retain: true, release: true); + } + + NSURLCache initWithMemoryCapacity_diskCapacity_directoryURL_( + int memoryCapacity, int diskCapacity, NSURL? directoryURL) { + final _ret = _lib._objc_msgSend_881( + _id, + _lib._sel_initWithMemoryCapacity_diskCapacity_directoryURL_1, + memoryCapacity, + diskCapacity, + directoryURL?._id ?? ffi.nullptr); + return NSURLCache._(_ret, _lib, retain: true, release: true); + } + + NSCachedURLResponse cachedResponseForRequest_(NSURLRequest? request) { + final _ret = _lib._objc_msgSend_885( + _id, _lib._sel_cachedResponseForRequest_1, request?._id ?? ffi.nullptr); + return NSCachedURLResponse._(_ret, _lib, retain: true, release: true); + } + + void storeCachedResponse_forRequest_( + NSCachedURLResponse? cachedResponse, NSURLRequest? request) { + _lib._objc_msgSend_886(_id, _lib._sel_storeCachedResponse_forRequest_1, + cachedResponse?._id ?? ffi.nullptr, request?._id ?? ffi.nullptr); + } + + void removeCachedResponseForRequest_(NSURLRequest? request) { + _lib._objc_msgSend_887(_id, _lib._sel_removeCachedResponseForRequest_1, + request?._id ?? ffi.nullptr); + } + + void removeAllCachedResponses() { + _lib._objc_msgSend_1(_id, _lib._sel_removeAllCachedResponses1); + } + + void removeCachedResponsesSinceDate_(NSDate? date) { + _lib._objc_msgSend_504(_id, _lib._sel_removeCachedResponsesSinceDate_1, + date?._id ?? ffi.nullptr); + } + + int get memoryCapacity { + return _lib._objc_msgSend_10(_id, _lib._sel_memoryCapacity1); + } + + set memoryCapacity(int value) { + return _lib._objc_msgSend_483(_id, _lib._sel_setMemoryCapacity_1, value); + } + + int get diskCapacity { + return _lib._objc_msgSend_10(_id, _lib._sel_diskCapacity1); + } + + set diskCapacity(int value) { + return _lib._objc_msgSend_483(_id, _lib._sel_setDiskCapacity_1, value); + } + + int get currentMemoryUsage { + return _lib._objc_msgSend_10(_id, _lib._sel_currentMemoryUsage1); + } + + int get currentDiskUsage { + return _lib._objc_msgSend_10(_id, _lib._sel_currentDiskUsage1); + } + + void storeCachedResponse_forDataTask_( + NSCachedURLResponse? cachedResponse, NSURLSessionDataTask? dataTask) { + _lib._objc_msgSend_888(_id, _lib._sel_storeCachedResponse_forDataTask_1, + cachedResponse?._id ?? ffi.nullptr, dataTask?._id ?? ffi.nullptr); + } + + void getCachedResponseForDataTask_completionHandler_( + NSURLSessionDataTask? dataTask, + ObjCBlock_ffiVoid_NSCachedURLResponse completionHandler) { + _lib._objc_msgSend_889( + _id, + _lib._sel_getCachedResponseForDataTask_completionHandler_1, + dataTask?._id ?? ffi.nullptr, + completionHandler._id); + } + + void removeCachedResponseForDataTask_(NSURLSessionDataTask? dataTask) { + _lib._objc_msgSend_890(_id, _lib._sel_removeCachedResponseForDataTask_1, + dataTask?._id ?? ffi.nullptr); + } + + @override + NSURLCache init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSURLCache._(_ret, _lib, retain: true, release: true); + } + + static NSURLCache new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSURLCache1, _lib._sel_new1); + return NSURLCache._(_ret, _lib, retain: false, release: true); + } + + static NSURLCache allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSURLCache1, _lib._sel_allocWithZone_1, zone); + return NSURLCache._(_ret, _lib, retain: false, release: true); + } + + static NSURLCache alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSURLCache1, _lib._sel_alloc1); + return NSURLCache._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSURLCache1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSURLCache1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLCache1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLCache1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSURLCache1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSURLCache1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSURLCache1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSURLCache1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLCache1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSCachedURLResponse extends NSObject { + NSCachedURLResponse._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSCachedURLResponse] that points to the same underlying object as [other]. + static NSCachedURLResponse castFrom(T other) { + return NSCachedURLResponse._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSCachedURLResponse] that wraps the given raw object pointer. + static NSCachedURLResponse castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSCachedURLResponse._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSCachedURLResponse]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSCachedURLResponse1); + } + + NSCachedURLResponse initWithResponse_data_( + NSURLResponse? response, NSData? data) { + final _ret = _lib._objc_msgSend_882(_id, _lib._sel_initWithResponse_data_1, + response?._id ?? ffi.nullptr, data?._id ?? ffi.nullptr); + return NSCachedURLResponse._(_ret, _lib, retain: true, release: true); + } + + NSCachedURLResponse initWithResponse_data_userInfo_storagePolicy_( + NSURLResponse? response, + NSData? data, + NSDictionary? userInfo, + int storagePolicy) { + final _ret = _lib._objc_msgSend_883( + _id, + _lib._sel_initWithResponse_data_userInfo_storagePolicy_1, + response?._id ?? ffi.nullptr, + data?._id ?? ffi.nullptr, + userInfo?._id ?? ffi.nullptr, + storagePolicy); + return NSCachedURLResponse._(_ret, _lib, retain: true, release: true); + } + + NSURLResponse? get response { + final _ret = _lib._objc_msgSend_797(_id, _lib._sel_response1); + return _ret.address == 0 + ? null + : NSURLResponse._(_ret, _lib, retain: true, release: true); + } + + NSData? get data { + final _ret = _lib._objc_msgSend_39(_id, _lib._sel_data1); + return _ret.address == 0 + ? null + : NSData._(_ret, _lib, retain: true, release: true); + } + + NSDictionary? get userInfo { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_userInfo1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + int get storagePolicy { + return _lib._objc_msgSend_884(_id, _lib._sel_storagePolicy1); + } + + @override + NSCachedURLResponse init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSCachedURLResponse._(_ret, _lib, retain: true, release: true); + } + + static NSCachedURLResponse new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSCachedURLResponse1, _lib._sel_new1); + return NSCachedURLResponse._(_ret, _lib, retain: false, release: true); + } + + static NSCachedURLResponse allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSCachedURLResponse1, _lib._sel_allocWithZone_1, zone); + return NSCachedURLResponse._(_ret, _lib, retain: false, release: true); + } + + static NSCachedURLResponse alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSCachedURLResponse1, _lib._sel_alloc1); + return NSCachedURLResponse._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSCachedURLResponse1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSCachedURLResponse1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSCachedURLResponse1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSCachedURLResponse1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSCachedURLResponse1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSCachedURLResponse1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSCachedURLResponse1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSCachedURLResponse1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSCachedURLResponse1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSURLCacheStoragePolicy { + static const int NSURLCacheStorageAllowed = 0; + static const int NSURLCacheStorageAllowedInMemoryOnly = 1; + static const int NSURLCacheStorageNotAllowed = 2; +} + +class NSURLSessionDataTask extends NSURLSessionTask { + NSURLSessionDataTask._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSURLSessionDataTask] that points to the same underlying object as [other]. + static NSURLSessionDataTask castFrom(T other) { + return NSURLSessionDataTask._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSURLSessionDataTask] that wraps the given raw object pointer. + static NSURLSessionDataTask castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSURLSessionDataTask._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSURLSessionDataTask]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSURLSessionDataTask1); + } + + @override + NSURLSessionDataTask init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSURLSessionDataTask._(_ret, _lib, retain: true, release: true); + } + + static NSURLSessionDataTask new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSURLSessionDataTask1, _lib._sel_new1); + return NSURLSessionDataTask._(_ret, _lib, retain: false, release: true); + } + + static NSURLSessionDataTask allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSURLSessionDataTask1, _lib._sel_allocWithZone_1, zone); + return NSURLSessionDataTask._(_ret, _lib, retain: false, release: true); + } + + static NSURLSessionDataTask alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLSessionDataTask1, _lib._sel_alloc1); + return NSURLSessionDataTask._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSURLSessionDataTask1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSURLSessionDataTask1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSURLSessionDataTask1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLSessionDataTask1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSURLSessionDataTask1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSURLSessionDataTask1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSURLSessionDataTask1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSURLSessionDataTask1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLSessionDataTask1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +void _ObjCBlock_ffiVoid_NSCachedURLResponse_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return block.ref.target + .cast< + ffi.NativeFunction arg0)>>() + .asFunction arg0)>()(arg0); +} + +final _ObjCBlock_ffiVoid_NSCachedURLResponse_closureRegistry = + {}; +int _ObjCBlock_ffiVoid_NSCachedURLResponse_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_NSCachedURLResponse_registerClosure( + Function fn) { + final id = ++_ObjCBlock_ffiVoid_NSCachedURLResponse_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSCachedURLResponse_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSCachedURLResponse_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return (_ObjCBlock_ffiVoid_NSCachedURLResponse_closureRegistry[block + .ref.target.address] as void Function(ffi.Pointer))(arg0); +} + +class ObjCBlock_ffiVoid_NSCachedURLResponse extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSCachedURLResponse._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSCachedURLResponse.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi + .NativeFunction arg0)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_NSCachedURLResponse_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSCachedURLResponse.fromFunction( + SentryCocoa lib, void Function(ffi.Pointer arg0) fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_NSCachedURLResponse_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSCachedURLResponse_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>>() + .asFunction< + void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>()(_id, arg0); + } +} + +class NSURLConnection extends NSObject { + NSURLConnection._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSURLConnection] that points to the same underlying object as [other]. + static NSURLConnection castFrom(T other) { + return NSURLConnection._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSURLConnection] that wraps the given raw object pointer. + static NSURLConnection castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSURLConnection._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSURLConnection]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSURLConnection1); + } + + NSURLConnection initWithRequest_delegate_startImmediately_( + NSURLRequest? request, NSObject delegate, bool startImmediately) { + final _ret = _lib._objc_msgSend_891( + _id, + _lib._sel_initWithRequest_delegate_startImmediately_1, + request?._id ?? ffi.nullptr, + delegate._id, + startImmediately); + return NSURLConnection._(_ret, _lib, retain: true, release: true); + } + + NSURLConnection initWithRequest_delegate_( + NSURLRequest? request, NSObject delegate) { + final _ret = _lib._objc_msgSend_892( + _id, + _lib._sel_initWithRequest_delegate_1, + request?._id ?? ffi.nullptr, + delegate._id); + return NSURLConnection._(_ret, _lib, retain: true, release: true); + } + + static NSURLConnection connectionWithRequest_delegate_( + SentryCocoa _lib, NSURLRequest? request, NSObject delegate) { + final _ret = _lib._objc_msgSend_893( + _lib._class_NSURLConnection1, + _lib._sel_connectionWithRequest_delegate_1, + request?._id ?? ffi.nullptr, + delegate._id); + return NSURLConnection._(_ret, _lib, retain: true, release: true); + } + + NSURLRequest? get originalRequest { + final _ret = _lib._objc_msgSend_795(_id, _lib._sel_originalRequest1); + return _ret.address == 0 + ? null + : NSURLRequest._(_ret, _lib, retain: true, release: true); + } + + NSURLRequest? get currentRequest { + final _ret = _lib._objc_msgSend_795(_id, _lib._sel_currentRequest1); + return _ret.address == 0 + ? null + : NSURLRequest._(_ret, _lib, retain: true, release: true); + } + + void start() { + _lib._objc_msgSend_1(_id, _lib._sel_start1); + } + + void cancel() { + _lib._objc_msgSend_1(_id, _lib._sel_cancel1); + } + + void scheduleInRunLoop_forMode_(NSRunLoop? aRunLoop, NSString mode) { + _lib._objc_msgSend_533(_id, _lib._sel_scheduleInRunLoop_forMode_1, + aRunLoop?._id ?? ffi.nullptr, mode._id); + } + + void unscheduleFromRunLoop_forMode_(NSRunLoop? aRunLoop, NSString mode) { + _lib._objc_msgSend_533(_id, _lib._sel_unscheduleFromRunLoop_forMode_1, + aRunLoop?._id ?? ffi.nullptr, mode._id); + } + + void setDelegateQueue_(NSOperationQueue? queue) { + _lib._objc_msgSend_894( + _id, _lib._sel_setDelegateQueue_1, queue?._id ?? ffi.nullptr); + } + + static bool canHandleRequest_(SentryCocoa _lib, NSURLRequest? request) { + return _lib._objc_msgSend_895(_lib._class_NSURLConnection1, + _lib._sel_canHandleRequest_1, request?._id ?? ffi.nullptr); + } + + static NSData sendSynchronousRequest_returningResponse_error_( + SentryCocoa _lib, + NSURLRequest? request, + ffi.Pointer> response, + ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_896( + _lib._class_NSURLConnection1, + _lib._sel_sendSynchronousRequest_returningResponse_error_1, + request?._id ?? ffi.nullptr, + response, + error); + return NSData._(_ret, _lib, retain: true, release: true); + } + + static void sendAsynchronousRequest_queue_completionHandler_( + SentryCocoa _lib, + NSURLRequest? request, + NSOperationQueue? queue, + ObjCBlock_ffiVoid_NSURLResponse_NSData_NSError handler) { + _lib._objc_msgSend_897( + _lib._class_NSURLConnection1, + _lib._sel_sendAsynchronousRequest_queue_completionHandler_1, + request?._id ?? ffi.nullptr, + queue?._id ?? ffi.nullptr, + handler._id); + } + + @override + NSURLConnection init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSURLConnection._(_ret, _lib, retain: true, release: true); + } + + static NSURLConnection new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSURLConnection1, _lib._sel_new1); + return NSURLConnection._(_ret, _lib, retain: false, release: true); + } + + static NSURLConnection allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSURLConnection1, _lib._sel_allocWithZone_1, zone); + return NSURLConnection._(_ret, _lib, retain: false, release: true); + } + + static NSURLConnection alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSURLConnection1, _lib._sel_alloc1); + return NSURLConnection._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSURLConnection1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSURLConnection1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSURLConnection1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLConnection1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSURLConnection1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSURLConnection1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSURLConnection1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSURLConnection1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLConnection1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +void _ObjCBlock_ffiVoid_NSURLResponse_NSData_NSError_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function( + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>()(arg0, arg1, arg2); +} + +final _ObjCBlock_ffiVoid_NSURLResponse_NSData_NSError_closureRegistry = + {}; +int _ObjCBlock_ffiVoid_NSURLResponse_NSData_NSError_closureRegistryIndex = 0; +ffi.Pointer + _ObjCBlock_ffiVoid_NSURLResponse_NSData_NSError_registerClosure( + Function fn) { + final id = + ++_ObjCBlock_ffiVoid_NSURLResponse_NSData_NSError_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSURLResponse_NSData_NSError_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSURLResponse_NSData_NSError_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2) { + return (_ObjCBlock_ffiVoid_NSURLResponse_NSData_NSError_closureRegistry[ + block.ref.target.address] + as void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer))(arg0, arg1, arg2); +} + +class ObjCBlock_ffiVoid_NSURLResponse_NSData_NSError extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSURLResponse_NSData_NSError._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSURLResponse_NSData_NSError.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_NSURLResponse_NSData_NSError_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSURLResponse_NSData_NSError.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, ffi.Pointer arg1, + ffi.Pointer arg2) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_NSURLResponse_NSData_NSError_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSURLResponse_NSData_NSError_registerClosure( + fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0, ffi.Pointer arg1, + ffi.Pointer arg2) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>()(_id, arg0, arg1, arg2); + } +} + +class NSURLCredential extends NSObject { + NSURLCredential._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSURLCredential] that points to the same underlying object as [other]. + static NSURLCredential castFrom(T other) { + return NSURLCredential._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSURLCredential] that wraps the given raw object pointer. + static NSURLCredential castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSURLCredential._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSURLCredential]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSURLCredential1); + } + + int get persistence { + return _lib._objc_msgSend_898(_id, _lib._sel_persistence1); + } + + NSURLCredential initWithUser_password_persistence_( + NSString? user, NSString? password, int persistence) { + final _ret = _lib._objc_msgSend_899( + _id, + _lib._sel_initWithUser_password_persistence_1, + user?._id ?? ffi.nullptr, + password?._id ?? ffi.nullptr, + persistence); + return NSURLCredential._(_ret, _lib, retain: true, release: true); + } + + static NSURLCredential credentialWithUser_password_persistence_( + SentryCocoa _lib, NSString? user, NSString? password, int persistence) { + final _ret = _lib._objc_msgSend_900( + _lib._class_NSURLCredential1, + _lib._sel_credentialWithUser_password_persistence_1, + user?._id ?? ffi.nullptr, + password?._id ?? ffi.nullptr, + persistence); + return NSURLCredential._(_ret, _lib, retain: true, release: true); + } + + NSString? get user { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_user1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get password { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_password1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + bool get hasPassword { + return _lib._objc_msgSend_12(_id, _lib._sel_hasPassword1); + } + + NSURLCredential initWithIdentity_certificates_persistence_( + ffi.Pointer<__SecIdentity> identity, + NSArray? certArray, + int persistence) { + final _ret = _lib._objc_msgSend_901( + _id, + _lib._sel_initWithIdentity_certificates_persistence_1, + identity, + certArray?._id ?? ffi.nullptr, + persistence); + return NSURLCredential._(_ret, _lib, retain: true, release: true); + } + + static NSURLCredential credentialWithIdentity_certificates_persistence_( + SentryCocoa _lib, + ffi.Pointer<__SecIdentity> identity, + NSArray? certArray, + int persistence) { + final _ret = _lib._objc_msgSend_902( + _lib._class_NSURLCredential1, + _lib._sel_credentialWithIdentity_certificates_persistence_1, + identity, + certArray?._id ?? ffi.nullptr, + persistence); + return NSURLCredential._(_ret, _lib, retain: true, release: true); + } + + ffi.Pointer<__SecIdentity> get identity { + return _lib._objc_msgSend_903(_id, _lib._sel_identity1); + } + + NSArray? get certificates { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_certificates1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSURLCredential initWithTrust_(ffi.Pointer<__SecTrust> trust) { + final _ret = _lib._objc_msgSend_904(_id, _lib._sel_initWithTrust_1, trust); + return NSURLCredential._(_ret, _lib, retain: true, release: true); + } + + static NSURLCredential credentialForTrust_( + SentryCocoa _lib, ffi.Pointer<__SecTrust> trust) { + final _ret = _lib._objc_msgSend_905( + _lib._class_NSURLCredential1, _lib._sel_credentialForTrust_1, trust); + return NSURLCredential._(_ret, _lib, retain: true, release: true); + } + + @override + NSURLCredential init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSURLCredential._(_ret, _lib, retain: true, release: true); + } + + static NSURLCredential new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSURLCredential1, _lib._sel_new1); + return NSURLCredential._(_ret, _lib, retain: false, release: true); + } + + static NSURLCredential allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSURLCredential1, _lib._sel_allocWithZone_1, zone); + return NSURLCredential._(_ret, _lib, retain: false, release: true); + } + + static NSURLCredential alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSURLCredential1, _lib._sel_alloc1); + return NSURLCredential._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSURLCredential1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSURLCredential1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSURLCredential1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLCredential1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSURLCredential1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSURLCredential1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSURLCredential1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSURLCredential1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLCredential1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSURLCredentialPersistence { + static const int NSURLCredentialPersistenceNone = 0; + static const int NSURLCredentialPersistenceForSession = 1; + static const int NSURLCredentialPersistencePermanent = 2; + static const int NSURLCredentialPersistenceSynchronizable = 3; +} + +class __SecIdentity extends ffi.Opaque {} + +class __SecTrust extends ffi.Opaque {} + +class NSURLProtectionSpace extends NSObject { + NSURLProtectionSpace._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSURLProtectionSpace] that points to the same underlying object as [other]. + static NSURLProtectionSpace castFrom(T other) { + return NSURLProtectionSpace._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSURLProtectionSpace] that wraps the given raw object pointer. + static NSURLProtectionSpace castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSURLProtectionSpace._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSURLProtectionSpace]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSURLProtectionSpace1); + } + + NSURLProtectionSpace initWithHost_port_protocol_realm_authenticationMethod_( + NSString? host, + int port, + NSString? protocol, + NSString? realm, + NSString? authenticationMethod) { + final _ret = _lib._objc_msgSend_906( + _id, + _lib._sel_initWithHost_port_protocol_realm_authenticationMethod_1, + host?._id ?? ffi.nullptr, + port, + protocol?._id ?? ffi.nullptr, + realm?._id ?? ffi.nullptr, + authenticationMethod?._id ?? ffi.nullptr); + return NSURLProtectionSpace._(_ret, _lib, retain: true, release: true); + } + + NSURLProtectionSpace initWithProxyHost_port_type_realm_authenticationMethod_( + NSString? host, + int port, + NSString? type, + NSString? realm, + NSString? authenticationMethod) { + final _ret = _lib._objc_msgSend_906( + _id, + _lib._sel_initWithProxyHost_port_type_realm_authenticationMethod_1, + host?._id ?? ffi.nullptr, + port, + type?._id ?? ffi.nullptr, + realm?._id ?? ffi.nullptr, + authenticationMethod?._id ?? ffi.nullptr); + return NSURLProtectionSpace._(_ret, _lib, retain: true, release: true); + } + + NSString? get realm { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_realm1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + bool get receivesCredentialSecurely { + return _lib._objc_msgSend_12(_id, _lib._sel_receivesCredentialSecurely1); + } + + bool get isProxy { + return _lib._objc_msgSend_12(_id, _lib._sel_isProxy1); + } + + NSString? get host { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_host1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + int get port { + return _lib._objc_msgSend_78(_id, _lib._sel_port1); + } + + NSString? get proxyType { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_proxyType1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get protocol { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_protocol1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get authenticationMethod { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_authenticationMethod1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSArray? get distinguishedNames { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_distinguishedNames1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + ffi.Pointer<__SecTrust> get serverTrust { + return _lib._objc_msgSend_907(_id, _lib._sel_serverTrust1); + } + + @override + NSURLProtectionSpace init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSURLProtectionSpace._(_ret, _lib, retain: true, release: true); + } + + static NSURLProtectionSpace new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSURLProtectionSpace1, _lib._sel_new1); + return NSURLProtectionSpace._(_ret, _lib, retain: false, release: true); + } + + static NSURLProtectionSpace allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSURLProtectionSpace1, _lib._sel_allocWithZone_1, zone); + return NSURLProtectionSpace._(_ret, _lib, retain: false, release: true); + } + + static NSURLProtectionSpace alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLProtectionSpace1, _lib._sel_alloc1); + return NSURLProtectionSpace._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSURLProtectionSpace1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSURLProtectionSpace1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSURLProtectionSpace1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLProtectionSpace1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSURLProtectionSpace1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSURLProtectionSpace1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSURLProtectionSpace1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSURLProtectionSpace1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLProtectionSpace1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSURLCredentialStorage extends NSObject { + NSURLCredentialStorage._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSURLCredentialStorage] that points to the same underlying object as [other]. + static NSURLCredentialStorage castFrom(T other) { + return NSURLCredentialStorage._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSURLCredentialStorage] that wraps the given raw object pointer. + static NSURLCredentialStorage castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSURLCredentialStorage._(other, lib, + retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSURLCredentialStorage]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSURLCredentialStorage1); + } + + static NSURLCredentialStorage? getSharedCredentialStorage(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_908(_lib._class_NSURLCredentialStorage1, + _lib._sel_sharedCredentialStorage1); + return _ret.address == 0 + ? null + : NSURLCredentialStorage._(_ret, _lib, retain: true, release: true); + } + + NSDictionary credentialsForProtectionSpace_(NSURLProtectionSpace? space) { + final _ret = _lib._objc_msgSend_909(_id, + _lib._sel_credentialsForProtectionSpace_1, space?._id ?? ffi.nullptr); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSDictionary? get allCredentials { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_allCredentials1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + void setCredential_forProtectionSpace_( + NSURLCredential? credential, NSURLProtectionSpace? space) { + _lib._objc_msgSend_910(_id, _lib._sel_setCredential_forProtectionSpace_1, + credential?._id ?? ffi.nullptr, space?._id ?? ffi.nullptr); + } + + void removeCredential_forProtectionSpace_( + NSURLCredential? credential, NSURLProtectionSpace? space) { + _lib._objc_msgSend_910(_id, _lib._sel_removeCredential_forProtectionSpace_1, + credential?._id ?? ffi.nullptr, space?._id ?? ffi.nullptr); + } + + void removeCredential_forProtectionSpace_options_(NSURLCredential? credential, + NSURLProtectionSpace? space, NSDictionary? options) { + _lib._objc_msgSend_911( + _id, + _lib._sel_removeCredential_forProtectionSpace_options_1, + credential?._id ?? ffi.nullptr, + space?._id ?? ffi.nullptr, + options?._id ?? ffi.nullptr); + } + + NSURLCredential defaultCredentialForProtectionSpace_( + NSURLProtectionSpace? space) { + final _ret = _lib._objc_msgSend_912( + _id, + _lib._sel_defaultCredentialForProtectionSpace_1, + space?._id ?? ffi.nullptr); + return NSURLCredential._(_ret, _lib, retain: true, release: true); + } + + void setDefaultCredential_forProtectionSpace_( + NSURLCredential? credential, NSURLProtectionSpace? space) { + _lib._objc_msgSend_910( + _id, + _lib._sel_setDefaultCredential_forProtectionSpace_1, + credential?._id ?? ffi.nullptr, + space?._id ?? ffi.nullptr); + } + + void getCredentialsForProtectionSpace_task_completionHandler_( + NSURLProtectionSpace? protectionSpace, + NSURLSessionTask? task, + ObjCBlock_ffiVoid_NSDictionary completionHandler) { + _lib._objc_msgSend_913( + _id, + _lib._sel_getCredentialsForProtectionSpace_task_completionHandler_1, + protectionSpace?._id ?? ffi.nullptr, + task?._id ?? ffi.nullptr, + completionHandler._id); + } + + void setCredential_forProtectionSpace_task_(NSURLCredential? credential, + NSURLProtectionSpace? protectionSpace, NSURLSessionTask? task) { + _lib._objc_msgSend_914( + _id, + _lib._sel_setCredential_forProtectionSpace_task_1, + credential?._id ?? ffi.nullptr, + protectionSpace?._id ?? ffi.nullptr, + task?._id ?? ffi.nullptr); + } + + void removeCredential_forProtectionSpace_options_task_( + NSURLCredential? credential, + NSURLProtectionSpace? protectionSpace, + NSDictionary? options, + NSURLSessionTask? task) { + _lib._objc_msgSend_915( + _id, + _lib._sel_removeCredential_forProtectionSpace_options_task_1, + credential?._id ?? ffi.nullptr, + protectionSpace?._id ?? ffi.nullptr, + options?._id ?? ffi.nullptr, + task?._id ?? ffi.nullptr); + } + + void getDefaultCredentialForProtectionSpace_task_completionHandler_( + NSURLProtectionSpace? space, + NSURLSessionTask? task, + ObjCBlock_ffiVoid_NSURLCredential completionHandler) { + _lib._objc_msgSend_916( + _id, + _lib._sel_getDefaultCredentialForProtectionSpace_task_completionHandler_1, + space?._id ?? ffi.nullptr, + task?._id ?? ffi.nullptr, + completionHandler._id); + } + + void setDefaultCredential_forProtectionSpace_task_( + NSURLCredential? credential, + NSURLProtectionSpace? protectionSpace, + NSURLSessionTask? task) { + _lib._objc_msgSend_914( + _id, + _lib._sel_setDefaultCredential_forProtectionSpace_task_1, + credential?._id ?? ffi.nullptr, + protectionSpace?._id ?? ffi.nullptr, + task?._id ?? ffi.nullptr); + } + + @override + NSURLCredentialStorage init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSURLCredentialStorage._(_ret, _lib, retain: true, release: true); + } + + static NSURLCredentialStorage new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLCredentialStorage1, _lib._sel_new1); + return NSURLCredentialStorage._(_ret, _lib, retain: false, release: true); + } + + static NSURLCredentialStorage allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSURLCredentialStorage1, _lib._sel_allocWithZone_1, zone); + return NSURLCredentialStorage._(_ret, _lib, retain: false, release: true); + } + + static NSURLCredentialStorage alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLCredentialStorage1, _lib._sel_alloc1); + return NSURLCredentialStorage._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSURLCredentialStorage1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSURLCredentialStorage1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSURLCredentialStorage1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLCredentialStorage1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSURLCredentialStorage1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSURLCredentialStorage1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSURLCredentialStorage1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSURLCredentialStorage1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSURLCredentialStorage1, + _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +void _ObjCBlock_ffiVoid_NSDictionary_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return block.ref.target + .cast< + ffi.NativeFunction arg0)>>() + .asFunction arg0)>()(arg0); +} + +final _ObjCBlock_ffiVoid_NSDictionary_closureRegistry = {}; +int _ObjCBlock_ffiVoid_NSDictionary_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_NSDictionary_registerClosure( + Function fn) { + final id = ++_ObjCBlock_ffiVoid_NSDictionary_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSDictionary_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSDictionary_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return (_ObjCBlock_ffiVoid_NSDictionary_closureRegistry[block + .ref.target.address] as void Function(ffi.Pointer))(arg0); +} + +class ObjCBlock_ffiVoid_NSDictionary extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSDictionary._(ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSDictionary.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi + .NativeFunction arg0)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_NSDictionary_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSDictionary.fromFunction( + SentryCocoa lib, void Function(ffi.Pointer arg0) fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_NSDictionary_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSDictionary_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>>() + .asFunction< + void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>()(_id, arg0); + } +} + +void _ObjCBlock_ffiVoid_NSURLCredential_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return block.ref.target + .cast< + ffi.NativeFunction arg0)>>() + .asFunction arg0)>()(arg0); +} + +final _ObjCBlock_ffiVoid_NSURLCredential_closureRegistry = {}; +int _ObjCBlock_ffiVoid_NSURLCredential_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_NSURLCredential_registerClosure( + Function fn) { + final id = ++_ObjCBlock_ffiVoid_NSURLCredential_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSURLCredential_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSURLCredential_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return (_ObjCBlock_ffiVoid_NSURLCredential_closureRegistry[block + .ref.target.address] as void Function(ffi.Pointer))(arg0); +} + +class ObjCBlock_ffiVoid_NSURLCredential extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSURLCredential._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSURLCredential.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi + .NativeFunction arg0)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_NSURLCredential_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSURLCredential.fromFunction( + SentryCocoa lib, void Function(ffi.Pointer arg0) fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_NSURLCredential_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSURLCredential_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>>() + .asFunction< + void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>()(_id, arg0); + } +} + +class NSURLProtocol extends NSObject { + NSURLProtocol._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSURLProtocol] that points to the same underlying object as [other]. + static NSURLProtocol castFrom(T other) { + return NSURLProtocol._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSURLProtocol] that wraps the given raw object pointer. + static NSURLProtocol castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSURLProtocol._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSURLProtocol]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSURLProtocol1); + } + + NSURLProtocol initWithRequest_cachedResponse_client_(NSURLRequest? request, + NSCachedURLResponse? cachedResponse, NSObject? client) { + final _ret = _lib._objc_msgSend_917( + _id, + _lib._sel_initWithRequest_cachedResponse_client_1, + request?._id ?? ffi.nullptr, + cachedResponse?._id ?? ffi.nullptr, + client?._id ?? ffi.nullptr); + return NSURLProtocol._(_ret, _lib, retain: true, release: true); + } + + NSObject? get client { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_client1); + return _ret.address == 0 + ? null + : NSObject._(_ret, _lib, retain: true, release: true); + } + + NSURLRequest? get request { + final _ret = _lib._objc_msgSend_795(_id, _lib._sel_request1); + return _ret.address == 0 + ? null + : NSURLRequest._(_ret, _lib, retain: true, release: true); + } + + NSCachedURLResponse? get cachedResponse { + final _ret = _lib._objc_msgSend_918(_id, _lib._sel_cachedResponse1); + return _ret.address == 0 + ? null + : NSCachedURLResponse._(_ret, _lib, retain: true, release: true); + } + + static bool canInitWithRequest_(SentryCocoa _lib, NSURLRequest? request) { + return _lib._objc_msgSend_895(_lib._class_NSURLProtocol1, + _lib._sel_canInitWithRequest_1, request?._id ?? ffi.nullptr); + } + + static NSURLRequest canonicalRequestForRequest_( + SentryCocoa _lib, NSURLRequest? request) { + final _ret = _lib._objc_msgSend_919(_lib._class_NSURLProtocol1, + _lib._sel_canonicalRequestForRequest_1, request?._id ?? ffi.nullptr); + return NSURLRequest._(_ret, _lib, retain: true, release: true); + } + + static bool requestIsCacheEquivalent_toRequest_( + SentryCocoa _lib, NSURLRequest? a, NSURLRequest? b) { + return _lib._objc_msgSend_920( + _lib._class_NSURLProtocol1, + _lib._sel_requestIsCacheEquivalent_toRequest_1, + a?._id ?? ffi.nullptr, + b?._id ?? ffi.nullptr); + } + + void startLoading() { + _lib._objc_msgSend_1(_id, _lib._sel_startLoading1); + } + + void stopLoading() { + _lib._objc_msgSend_1(_id, _lib._sel_stopLoading1); + } + + static NSObject propertyForKey_inRequest_( + SentryCocoa _lib, NSString? key, NSURLRequest? request) { + final _ret = _lib._objc_msgSend_921( + _lib._class_NSURLProtocol1, + _lib._sel_propertyForKey_inRequest_1, + key?._id ?? ffi.nullptr, + request?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static void setProperty_forKey_inRequest_(SentryCocoa _lib, NSObject value, + NSString? key, NSMutableURLRequest? request) { + _lib._objc_msgSend_927( + _lib._class_NSURLProtocol1, + _lib._sel_setProperty_forKey_inRequest_1, + value._id, + key?._id ?? ffi.nullptr, + request?._id ?? ffi.nullptr); + } + + static void removePropertyForKey_inRequest_( + SentryCocoa _lib, NSString? key, NSMutableURLRequest? request) { + _lib._objc_msgSend_928( + _lib._class_NSURLProtocol1, + _lib._sel_removePropertyForKey_inRequest_1, + key?._id ?? ffi.nullptr, + request?._id ?? ffi.nullptr); + } + + static bool registerClass_(SentryCocoa _lib, NSObject protocolClass) { + return _lib._objc_msgSend_0(_lib._class_NSURLProtocol1, + _lib._sel_registerClass_1, protocolClass._id); + } + + static void unregisterClass_(SentryCocoa _lib, NSObject protocolClass) { + _lib._objc_msgSend_15(_lib._class_NSURLProtocol1, + _lib._sel_unregisterClass_1, protocolClass._id); + } + + static bool canInitWithTask_(SentryCocoa _lib, NSURLSessionTask? task) { + return _lib._objc_msgSend_929(_lib._class_NSURLProtocol1, + _lib._sel_canInitWithTask_1, task?._id ?? ffi.nullptr); + } + + NSURLProtocol initWithTask_cachedResponse_client_(NSURLSessionTask? task, + NSCachedURLResponse? cachedResponse, NSObject? client) { + final _ret = _lib._objc_msgSend_930( + _id, + _lib._sel_initWithTask_cachedResponse_client_1, + task?._id ?? ffi.nullptr, + cachedResponse?._id ?? ffi.nullptr, + client?._id ?? ffi.nullptr); + return NSURLProtocol._(_ret, _lib, retain: true, release: true); + } + + NSURLSessionTask? get task { + final _ret = _lib._objc_msgSend_931(_id, _lib._sel_task1); + return _ret.address == 0 + ? null + : NSURLSessionTask._(_ret, _lib, retain: true, release: true); + } + + @override + NSURLProtocol init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSURLProtocol._(_ret, _lib, retain: true, release: true); + } + + static NSURLProtocol new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSURLProtocol1, _lib._sel_new1); + return NSURLProtocol._(_ret, _lib, retain: false, release: true); + } + + static NSURLProtocol allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSURLProtocol1, _lib._sel_allocWithZone_1, zone); + return NSURLProtocol._(_ret, _lib, retain: false, release: true); + } + + static NSURLProtocol alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSURLProtocol1, _lib._sel_alloc1); + return NSURLProtocol._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSURLProtocol1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSURLProtocol1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLProtocol1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLProtocol1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSURLProtocol1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSURLProtocol1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSURLProtocol1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSURLProtocol1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLProtocol1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSMutableURLRequest extends NSURLRequest { + NSMutableURLRequest._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSMutableURLRequest] that points to the same underlying object as [other]. + static NSMutableURLRequest castFrom(T other) { + return NSMutableURLRequest._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSMutableURLRequest] that wraps the given raw object pointer. + static NSMutableURLRequest castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSMutableURLRequest._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSMutableURLRequest]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSMutableURLRequest1); + } + + @override + NSURL? get URL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_URL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + set URL(NSURL? value) { + return _lib._objc_msgSend_621( + _id, _lib._sel_setURL_1, value?._id ?? ffi.nullptr); + } + + @override + int get cachePolicy { + return _lib._objc_msgSend_782(_id, _lib._sel_cachePolicy1); + } + + set cachePolicy(int value) { + return _lib._objc_msgSend_922(_id, _lib._sel_setCachePolicy_1, value); + } + + @override + double get timeoutInterval { + return _lib._objc_msgSend_155(_id, _lib._sel_timeoutInterval1); + } + + set timeoutInterval(double value) { + return _lib._objc_msgSend_506(_id, _lib._sel_setTimeoutInterval_1, value); + } + + @override + NSURL? get mainDocumentURL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_mainDocumentURL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + set mainDocumentURL(NSURL? value) { + return _lib._objc_msgSend_621( + _id, _lib._sel_setMainDocumentURL_1, value?._id ?? ffi.nullptr); + } + + @override + int get networkServiceType { + return _lib._objc_msgSend_783(_id, _lib._sel_networkServiceType1); + } + + set networkServiceType(int value) { + return _lib._objc_msgSend_923( + _id, _lib._sel_setNetworkServiceType_1, value); + } + + @override + bool get allowsCellularAccess { + return _lib._objc_msgSend_12(_id, _lib._sel_allowsCellularAccess1); + } + + set allowsCellularAccess(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setAllowsCellularAccess_1, value); + } + + @override + bool get allowsExpensiveNetworkAccess { + return _lib._objc_msgSend_12(_id, _lib._sel_allowsExpensiveNetworkAccess1); + } + + set allowsExpensiveNetworkAccess(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setAllowsExpensiveNetworkAccess_1, value); + } + + @override + bool get allowsConstrainedNetworkAccess { + return _lib._objc_msgSend_12( + _id, _lib._sel_allowsConstrainedNetworkAccess1); + } + + set allowsConstrainedNetworkAccess(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setAllowsConstrainedNetworkAccess_1, value); + } + + @override + bool get assumesHTTP3Capable { + return _lib._objc_msgSend_12(_id, _lib._sel_assumesHTTP3Capable1); + } + + set assumesHTTP3Capable(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setAssumesHTTP3Capable_1, value); + } + + @override + int get attribution { + return _lib._objc_msgSend_784(_id, _lib._sel_attribution1); + } + + set attribution(int value) { + return _lib._objc_msgSend_924(_id, _lib._sel_setAttribution_1, value); + } + + @override + bool get requiresDNSSECValidation { + return _lib._objc_msgSend_12(_id, _lib._sel_requiresDNSSECValidation1); + } + + set requiresDNSSECValidation(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setRequiresDNSSECValidation_1, value); + } + + @override + NSString? get HTTPMethod { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_HTTPMethod1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set HTTPMethod(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setHTTPMethod_1, value?._id ?? ffi.nullptr); + } + + @override + NSDictionary? get allHTTPHeaderFields { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_allHTTPHeaderFields1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + set allHTTPHeaderFields(NSDictionary? value) { + return _lib._objc_msgSend_171( + _id, _lib._sel_setAllHTTPHeaderFields_1, value?._id ?? ffi.nullptr); + } + + void setValue_forHTTPHeaderField_(NSString? value, NSString? field) { + _lib._objc_msgSend_515(_id, _lib._sel_setValue_forHTTPHeaderField_1, + value?._id ?? ffi.nullptr, field?._id ?? ffi.nullptr); + } + + void addValue_forHTTPHeaderField_(NSString? value, NSString? field) { + _lib._objc_msgSend_515(_id, _lib._sel_addValue_forHTTPHeaderField_1, + value?._id ?? ffi.nullptr, field?._id ?? ffi.nullptr); + } + + @override + NSData? get HTTPBody { + final _ret = _lib._objc_msgSend_39(_id, _lib._sel_HTTPBody1); + return _ret.address == 0 + ? null + : NSData._(_ret, _lib, retain: true, release: true); + } + + set HTTPBody(NSData? value) { + return _lib._objc_msgSend_925( + _id, _lib._sel_setHTTPBody_1, value?._id ?? ffi.nullptr); + } + + @override + NSInputStream? get HTTPBodyStream { + final _ret = _lib._objc_msgSend_794(_id, _lib._sel_HTTPBodyStream1); + return _ret.address == 0 + ? null + : NSInputStream._(_ret, _lib, retain: true, release: true); + } + + set HTTPBodyStream(NSInputStream? value) { + return _lib._objc_msgSend_926( + _id, _lib._sel_setHTTPBodyStream_1, value?._id ?? ffi.nullptr); + } + + @override + bool get HTTPShouldHandleCookies { + return _lib._objc_msgSend_12(_id, _lib._sel_HTTPShouldHandleCookies1); + } + + set HTTPShouldHandleCookies(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setHTTPShouldHandleCookies_1, value); + } + + @override + bool get HTTPShouldUsePipelining { + return _lib._objc_msgSend_12(_id, _lib._sel_HTTPShouldUsePipelining1); + } + + set HTTPShouldUsePipelining(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setHTTPShouldUsePipelining_1, value); + } + + static NSMutableURLRequest requestWithURL_(SentryCocoa _lib, NSURL? URL) { + final _ret = _lib._objc_msgSend_241(_lib._class_NSMutableURLRequest1, + _lib._sel_requestWithURL_1, URL?._id ?? ffi.nullptr); + return NSMutableURLRequest._(_ret, _lib, retain: true, release: true); + } + + static bool getSupportsSecureCoding(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSMutableURLRequest1, _lib._sel_supportsSecureCoding1); + } + + static NSMutableURLRequest requestWithURL_cachePolicy_timeoutInterval_( + SentryCocoa _lib, NSURL? URL, int cachePolicy, double timeoutInterval) { + final _ret = _lib._objc_msgSend_781( + _lib._class_NSMutableURLRequest1, + _lib._sel_requestWithURL_cachePolicy_timeoutInterval_1, + URL?._id ?? ffi.nullptr, + cachePolicy, + timeoutInterval); + return NSMutableURLRequest._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableURLRequest initWithURL_(NSURL? URL) { + final _ret = _lib._objc_msgSend_241( + _id, _lib._sel_initWithURL_1, URL?._id ?? ffi.nullptr); + return NSMutableURLRequest._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableURLRequest initWithURL_cachePolicy_timeoutInterval_( + NSURL? URL, int cachePolicy, double timeoutInterval) { + final _ret = _lib._objc_msgSend_781( + _id, + _lib._sel_initWithURL_cachePolicy_timeoutInterval_1, + URL?._id ?? ffi.nullptr, + cachePolicy, + timeoutInterval); + return NSMutableURLRequest._(_ret, _lib, retain: true, release: true); + } + + @override + NSMutableURLRequest init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSMutableURLRequest._(_ret, _lib, retain: true, release: true); + } + + static NSMutableURLRequest new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSMutableURLRequest1, _lib._sel_new1); + return NSMutableURLRequest._(_ret, _lib, retain: false, release: true); + } + + static NSMutableURLRequest allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSMutableURLRequest1, _lib._sel_allocWithZone_1, zone); + return NSMutableURLRequest._(_ret, _lib, retain: false, release: true); + } + + static NSMutableURLRequest alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSMutableURLRequest1, _lib._sel_alloc1); + return NSMutableURLRequest._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSMutableURLRequest1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSMutableURLRequest1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSMutableURLRequest1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSMutableURLRequest1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSMutableURLRequest1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSMutableURLRequest1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSMutableURLRequest1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSMutableURLRequest1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSMutableURLRequest1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSXMLParser extends NSObject { + NSXMLParser._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSXMLParser] that points to the same underlying object as [other]. + static NSXMLParser castFrom(T other) { + return NSXMLParser._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSXMLParser] that wraps the given raw object pointer. + static NSXMLParser castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSXMLParser._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSXMLParser]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSXMLParser1); + } + + NSXMLParser initWithContentsOfURL_(NSURL? url) { + final _ret = _lib._objc_msgSend_241( + _id, _lib._sel_initWithContentsOfURL_1, url?._id ?? ffi.nullptr); + return NSXMLParser._(_ret, _lib, retain: true, release: true); + } + + NSXMLParser initWithData_(NSData? data) { + final _ret = _lib._objc_msgSend_257( + _id, _lib._sel_initWithData_1, data?._id ?? ffi.nullptr); + return NSXMLParser._(_ret, _lib, retain: true, release: true); + } + + NSXMLParser initWithStream_(NSInputStream? stream) { + final _ret = _lib._objc_msgSend_932( + _id, _lib._sel_initWithStream_1, stream?._id ?? ffi.nullptr); + return NSXMLParser._(_ret, _lib, retain: true, release: true); + } + + NSObject? get delegate { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1); + return _ret.address == 0 + ? null + : NSObject._(_ret, _lib, retain: true, release: true); + } + + set delegate(NSObject? value) { + return _lib._objc_msgSend_387( + _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr); + } + + bool get shouldProcessNamespaces { + return _lib._objc_msgSend_12(_id, _lib._sel_shouldProcessNamespaces1); + } + + set shouldProcessNamespaces(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setShouldProcessNamespaces_1, value); + } + + bool get shouldReportNamespacePrefixes { + return _lib._objc_msgSend_12(_id, _lib._sel_shouldReportNamespacePrefixes1); + } + + set shouldReportNamespacePrefixes(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setShouldReportNamespacePrefixes_1, value); + } + + int get externalEntityResolvingPolicy { + return _lib._objc_msgSend_933( + _id, _lib._sel_externalEntityResolvingPolicy1); + } + + set externalEntityResolvingPolicy(int value) { + return _lib._objc_msgSend_934( + _id, _lib._sel_setExternalEntityResolvingPolicy_1, value); + } + + NSSet? get allowedExternalEntityURLs { + final _ret = + _lib._objc_msgSend_295(_id, _lib._sel_allowedExternalEntityURLs1); + return _ret.address == 0 + ? null + : NSSet._(_ret, _lib, retain: true, release: true); + } + + set allowedExternalEntityURLs(NSSet? value) { + return _lib._objc_msgSend_935(_id, _lib._sel_setAllowedExternalEntityURLs_1, + value?._id ?? ffi.nullptr); + } + + bool parse() { + return _lib._objc_msgSend_12(_id, _lib._sel_parse1); + } + + void abortParsing() { + _lib._objc_msgSend_1(_id, _lib._sel_abortParsing1); + } + + NSError? get parserError { + final _ret = _lib._objc_msgSend_298(_id, _lib._sel_parserError1); + return _ret.address == 0 + ? null + : NSError._(_ret, _lib, retain: true, release: true); + } + + bool get shouldResolveExternalEntities { + return _lib._objc_msgSend_12(_id, _lib._sel_shouldResolveExternalEntities1); + } + + set shouldResolveExternalEntities(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setShouldResolveExternalEntities_1, value); + } + + NSString? get publicID { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_publicID1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get systemID { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_systemID1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + int get lineNumber { + return _lib._objc_msgSend_78(_id, _lib._sel_lineNumber1); + } + + int get columnNumber { + return _lib._objc_msgSend_78(_id, _lib._sel_columnNumber1); + } + + @override + NSXMLParser init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSXMLParser._(_ret, _lib, retain: true, release: true); + } + + static NSXMLParser new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSXMLParser1, _lib._sel_new1); + return NSXMLParser._(_ret, _lib, retain: false, release: true); + } + + static NSXMLParser allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSXMLParser1, _lib._sel_allocWithZone_1, zone); + return NSXMLParser._(_ret, _lib, retain: false, release: true); + } + + static NSXMLParser alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSXMLParser1, _lib._sel_alloc1); + return NSXMLParser._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSXMLParser1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSXMLParser1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSXMLParser1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSXMLParser1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSXMLParser1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSXMLParser1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSXMLParser1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSXMLParser1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSXMLParser1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSXMLParserExternalEntityResolvingPolicy { + static const int NSXMLParserResolveExternalEntitiesNever = 0; + static const int NSXMLParserResolveExternalEntitiesNoNetwork = 1; + static const int NSXMLParserResolveExternalEntitiesSameOriginOnly = 2; + static const int NSXMLParserResolveExternalEntitiesAlways = 3; +} + +class NSFileWrapper extends NSObject { + NSFileWrapper._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSFileWrapper] that points to the same underlying object as [other]. + static NSFileWrapper castFrom(T other) { + return NSFileWrapper._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSFileWrapper] that wraps the given raw object pointer. + static NSFileWrapper castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSFileWrapper._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSFileWrapper]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSFileWrapper1); + } + + NSFileWrapper initWithURL_options_error_( + NSURL? url, int options, ffi.Pointer> outError) { + final _ret = _lib._objc_msgSend_936( + _id, + _lib._sel_initWithURL_options_error_1, + url?._id ?? ffi.nullptr, + options, + outError); + return NSFileWrapper._(_ret, _lib, retain: true, release: true); + } + + NSFileWrapper initDirectoryWithFileWrappers_( + NSDictionary? childrenByPreferredName) { + final _ret = _lib._objc_msgSend_149( + _id, + _lib._sel_initDirectoryWithFileWrappers_1, + childrenByPreferredName?._id ?? ffi.nullptr); + return NSFileWrapper._(_ret, _lib, retain: true, release: true); + } + + NSFileWrapper initRegularFileWithContents_(NSData? contents) { + final _ret = _lib._objc_msgSend_257(_id, + _lib._sel_initRegularFileWithContents_1, contents?._id ?? ffi.nullptr); + return NSFileWrapper._(_ret, _lib, retain: true, release: true); + } + + NSFileWrapper initSymbolicLinkWithDestinationURL_(NSURL? url) { + final _ret = _lib._objc_msgSend_241( + _id, + _lib._sel_initSymbolicLinkWithDestinationURL_1, + url?._id ?? ffi.nullptr); + return NSFileWrapper._(_ret, _lib, retain: true, release: true); + } + + NSFileWrapper initWithSerializedRepresentation_( + NSData? serializeRepresentation) { + final _ret = _lib._objc_msgSend_257( + _id, + _lib._sel_initWithSerializedRepresentation_1, + serializeRepresentation?._id ?? ffi.nullptr); + return NSFileWrapper._(_ret, _lib, retain: true, release: true); + } + + NSFileWrapper initWithCoder_(NSCoder? inCoder) { + final _ret = _lib._objc_msgSend_42( + _id, _lib._sel_initWithCoder_1, inCoder?._id ?? ffi.nullptr); + return NSFileWrapper._(_ret, _lib, retain: true, release: true); + } + + bool get directory { + return _lib._objc_msgSend_12(_id, _lib._sel_isDirectory1); + } + + bool get regularFile { + return _lib._objc_msgSend_12(_id, _lib._sel_isRegularFile1); + } + + bool get symbolicLink { + return _lib._objc_msgSend_12(_id, _lib._sel_isSymbolicLink1); + } + + NSString? get preferredFilename { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_preferredFilename1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set preferredFilename(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setPreferredFilename_1, value?._id ?? ffi.nullptr); + } + + NSString? get filename { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_filename1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set filename(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setFilename_1, value?._id ?? ffi.nullptr); + } + + NSDictionary? get fileAttributes { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_fileAttributes1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + set fileAttributes(NSDictionary? value) { + return _lib._objc_msgSend_171( + _id, _lib._sel_setFileAttributes_1, value?._id ?? ffi.nullptr); + } + + bool matchesContentsOfURL_(NSURL? url) { + return _lib._objc_msgSend_244( + _id, _lib._sel_matchesContentsOfURL_1, url?._id ?? ffi.nullptr); + } + + bool readFromURL_options_error_( + NSURL? url, int options, ffi.Pointer> outError) { + return _lib._objc_msgSend_937(_id, _lib._sel_readFromURL_options_error_1, + url?._id ?? ffi.nullptr, options, outError); + } + + bool writeToURL_options_originalContentsURL_error_( + NSURL? url, + int options, + NSURL? originalContentsURL, + ffi.Pointer> outError) { + return _lib._objc_msgSend_938( + _id, + _lib._sel_writeToURL_options_originalContentsURL_error_1, + url?._id ?? ffi.nullptr, + options, + originalContentsURL?._id ?? ffi.nullptr, + outError); + } + + NSData? get serializedRepresentation { + final _ret = + _lib._objc_msgSend_39(_id, _lib._sel_serializedRepresentation1); + return _ret.address == 0 + ? null + : NSData._(_ret, _lib, retain: true, release: true); + } + + NSString addFileWrapper_(NSFileWrapper? child) { + final _ret = _lib._objc_msgSend_939( + _id, _lib._sel_addFileWrapper_1, child?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString addRegularFileWithContents_preferredFilename_( + NSData? data, NSString? fileName) { + final _ret = _lib._objc_msgSend_940( + _id, + _lib._sel_addRegularFileWithContents_preferredFilename_1, + data?._id ?? ffi.nullptr, + fileName?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + void removeFileWrapper_(NSFileWrapper? child) { + _lib._objc_msgSend_941( + _id, _lib._sel_removeFileWrapper_1, child?._id ?? ffi.nullptr); + } + + NSDictionary? get fileWrappers { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_fileWrappers1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + NSString keyForFileWrapper_(NSFileWrapper? child) { + final _ret = _lib._objc_msgSend_939( + _id, _lib._sel_keyForFileWrapper_1, child?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSData? get regularFileContents { + final _ret = _lib._objc_msgSend_39(_id, _lib._sel_regularFileContents1); + return _ret.address == 0 + ? null + : NSData._(_ret, _lib, retain: true, release: true); + } + + NSURL? get symbolicLinkDestinationURL { + final _ret = + _lib._objc_msgSend_40(_id, _lib._sel_symbolicLinkDestinationURL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + NSObject initWithPath_(NSString? path) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithPath_1, path?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject initSymbolicLinkWithDestination_(NSString? path) { + final _ret = _lib._objc_msgSend_30(_id, + _lib._sel_initSymbolicLinkWithDestination_1, path?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + bool needsToBeUpdatedFromPath_(NSString? path) { + return _lib._objc_msgSend_59( + _id, _lib._sel_needsToBeUpdatedFromPath_1, path?._id ?? ffi.nullptr); + } + + bool updateFromPath_(NSString? path) { + return _lib._objc_msgSend_59( + _id, _lib._sel_updateFromPath_1, path?._id ?? ffi.nullptr); + } + + bool writeToFile_atomically_updateFilenames_( + NSString? path, bool atomicFlag, bool updateFilenamesFlag) { + return _lib._objc_msgSend_942( + _id, + _lib._sel_writeToFile_atomically_updateFilenames_1, + path?._id ?? ffi.nullptr, + atomicFlag, + updateFilenamesFlag); + } + + NSString addFileWithPath_(NSString? path) { + final _ret = _lib._objc_msgSend_64( + _id, _lib._sel_addFileWithPath_1, path?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString addSymbolicLinkWithDestination_preferredFilename_( + NSString? path, NSString? filename) { + final _ret = _lib._objc_msgSend_339( + _id, + _lib._sel_addSymbolicLinkWithDestination_preferredFilename_1, + path?._id ?? ffi.nullptr, + filename?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString symbolicLinkDestination() { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_symbolicLinkDestination1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + @override + NSFileWrapper init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSFileWrapper._(_ret, _lib, retain: true, release: true); + } + + static NSFileWrapper new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSFileWrapper1, _lib._sel_new1); + return NSFileWrapper._(_ret, _lib, retain: false, release: true); + } + + static NSFileWrapper allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSFileWrapper1, _lib._sel_allocWithZone_1, zone); + return NSFileWrapper._(_ret, _lib, retain: false, release: true); + } + + static NSFileWrapper alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSFileWrapper1, _lib._sel_alloc1); + return NSFileWrapper._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSFileWrapper1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSFileWrapper1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSFileWrapper1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSFileWrapper1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSFileWrapper1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSFileWrapper1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSFileWrapper1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSFileWrapper1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSFileWrapper1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSFileWrapperReadingOptions { + static const int NSFileWrapperReadingImmediate = 1; + static const int NSFileWrapperReadingWithoutMapping = 2; +} + +abstract class NSFileWrapperWritingOptions { + static const int NSFileWrapperWritingAtomic = 1; + static const int NSFileWrapperWritingWithNameUpdating = 2; +} + +class NSURLSession extends NSObject { + NSURLSession._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSURLSession] that points to the same underlying object as [other]. + static NSURLSession castFrom(T other) { + return NSURLSession._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSURLSession] that wraps the given raw object pointer. + static NSURLSession castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSURLSession._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSURLSession]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSURLSession1); + } + + static NSURLSession? getSharedSession(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_943( + _lib._class_NSURLSession1, _lib._sel_sharedSession1); + return _ret.address == 0 + ? null + : NSURLSession._(_ret, _lib, retain: true, release: true); + } + + static NSURLSession sessionWithConfiguration_( + SentryCocoa _lib, NSURLSessionConfiguration? configuration) { + final _ret = _lib._objc_msgSend_954( + _lib._class_NSURLSession1, + _lib._sel_sessionWithConfiguration_1, + configuration?._id ?? ffi.nullptr); + return NSURLSession._(_ret, _lib, retain: true, release: true); + } + + static NSURLSession sessionWithConfiguration_delegate_delegateQueue_( + SentryCocoa _lib, + NSURLSessionConfiguration? configuration, + NSObject? delegate, + NSOperationQueue? queue) { + final _ret = _lib._objc_msgSend_955( + _lib._class_NSURLSession1, + _lib._sel_sessionWithConfiguration_delegate_delegateQueue_1, + configuration?._id ?? ffi.nullptr, + delegate?._id ?? ffi.nullptr, + queue?._id ?? ffi.nullptr); + return NSURLSession._(_ret, _lib, retain: true, release: true); + } + + NSOperationQueue? get delegateQueue { + final _ret = _lib._objc_msgSend_824(_id, _lib._sel_delegateQueue1); + return _ret.address == 0 + ? null + : NSOperationQueue._(_ret, _lib, retain: true, release: true); + } + + NSObject? get delegate { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1); + return _ret.address == 0 + ? null + : NSObject._(_ret, _lib, retain: true, release: true); + } + + NSURLSessionConfiguration? get configuration { + final _ret = _lib._objc_msgSend_944(_id, _lib._sel_configuration1); + return _ret.address == 0 + ? null + : NSURLSessionConfiguration._(_ret, _lib, retain: true, release: true); + } + + NSString? get sessionDescription { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_sessionDescription1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set sessionDescription(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setSessionDescription_1, value?._id ?? ffi.nullptr); + } + + void finishTasksAndInvalidate() { + _lib._objc_msgSend_1(_id, _lib._sel_finishTasksAndInvalidate1); + } + + void invalidateAndCancel() { + _lib._objc_msgSend_1(_id, _lib._sel_invalidateAndCancel1); + } + + void resetWithCompletionHandler_(ObjCBlock_ffiVoid completionHandler) { + _lib._objc_msgSend_497( + _id, _lib._sel_resetWithCompletionHandler_1, completionHandler._id); + } + + void flushWithCompletionHandler_(ObjCBlock_ffiVoid completionHandler) { + _lib._objc_msgSend_497( + _id, _lib._sel_flushWithCompletionHandler_1, completionHandler._id); + } + + void getTasksWithCompletionHandler_( + ObjCBlock_ffiVoid_NSArray_NSArray_NSArray completionHandler) { + _lib._objc_msgSend_956( + _id, _lib._sel_getTasksWithCompletionHandler_1, completionHandler._id); + } + + void getAllTasksWithCompletionHandler_( + ObjCBlock_ffiVoid_NSArray completionHandler) { + _lib._objc_msgSend_957(_id, _lib._sel_getAllTasksWithCompletionHandler_1, + completionHandler._id); + } + + NSURLSessionDataTask dataTaskWithRequest_(NSURLRequest? request) { + final _ret = _lib._objc_msgSend_958( + _id, _lib._sel_dataTaskWithRequest_1, request?._id ?? ffi.nullptr); + return NSURLSessionDataTask._(_ret, _lib, retain: true, release: true); + } + + NSURLSessionDataTask dataTaskWithURL_(NSURL? url) { + final _ret = _lib._objc_msgSend_959( + _id, _lib._sel_dataTaskWithURL_1, url?._id ?? ffi.nullptr); + return NSURLSessionDataTask._(_ret, _lib, retain: true, release: true); + } + + NSURLSessionUploadTask uploadTaskWithRequest_fromFile_( + NSURLRequest? request, NSURL? fileURL) { + final _ret = _lib._objc_msgSend_960( + _id, + _lib._sel_uploadTaskWithRequest_fromFile_1, + request?._id ?? ffi.nullptr, + fileURL?._id ?? ffi.nullptr); + return NSURLSessionUploadTask._(_ret, _lib, retain: true, release: true); + } + + NSURLSessionUploadTask uploadTaskWithRequest_fromData_( + NSURLRequest? request, NSData? bodyData) { + final _ret = _lib._objc_msgSend_961( + _id, + _lib._sel_uploadTaskWithRequest_fromData_1, + request?._id ?? ffi.nullptr, + bodyData?._id ?? ffi.nullptr); + return NSURLSessionUploadTask._(_ret, _lib, retain: true, release: true); + } + + NSURLSessionUploadTask uploadTaskWithStreamedRequest_(NSURLRequest? request) { + final _ret = _lib._objc_msgSend_962(_id, + _lib._sel_uploadTaskWithStreamedRequest_1, request?._id ?? ffi.nullptr); + return NSURLSessionUploadTask._(_ret, _lib, retain: true, release: true); + } + + NSURLSessionDownloadTask downloadTaskWithRequest_(NSURLRequest? request) { + final _ret = _lib._objc_msgSend_964( + _id, _lib._sel_downloadTaskWithRequest_1, request?._id ?? ffi.nullptr); + return NSURLSessionDownloadTask._(_ret, _lib, retain: true, release: true); + } + + NSURLSessionDownloadTask downloadTaskWithURL_(NSURL? url) { + final _ret = _lib._objc_msgSend_965( + _id, _lib._sel_downloadTaskWithURL_1, url?._id ?? ffi.nullptr); + return NSURLSessionDownloadTask._(_ret, _lib, retain: true, release: true); + } + + NSURLSessionDownloadTask downloadTaskWithResumeData_(NSData? resumeData) { + final _ret = _lib._objc_msgSend_966(_id, + _lib._sel_downloadTaskWithResumeData_1, resumeData?._id ?? ffi.nullptr); + return NSURLSessionDownloadTask._(_ret, _lib, retain: true, release: true); + } + + NSURLSessionStreamTask streamTaskWithHostName_port_( + NSString? hostname, int port) { + final _ret = _lib._objc_msgSend_969( + _id, + _lib._sel_streamTaskWithHostName_port_1, + hostname?._id ?? ffi.nullptr, + port); + return NSURLSessionStreamTask._(_ret, _lib, retain: true, release: true); + } + + NSURLSessionStreamTask streamTaskWithNetService_(NSNetService? service) { + final _ret = _lib._objc_msgSend_975( + _id, _lib._sel_streamTaskWithNetService_1, service?._id ?? ffi.nullptr); + return NSURLSessionStreamTask._(_ret, _lib, retain: true, release: true); + } + + NSURLSessionWebSocketTask webSocketTaskWithURL_(NSURL? url) { + final _ret = _lib._objc_msgSend_982( + _id, _lib._sel_webSocketTaskWithURL_1, url?._id ?? ffi.nullptr); + return NSURLSessionWebSocketTask._(_ret, _lib, retain: true, release: true); + } + + NSURLSessionWebSocketTask webSocketTaskWithURL_protocols_( + NSURL? url, NSArray? protocols) { + final _ret = _lib._objc_msgSend_983( + _id, + _lib._sel_webSocketTaskWithURL_protocols_1, + url?._id ?? ffi.nullptr, + protocols?._id ?? ffi.nullptr); + return NSURLSessionWebSocketTask._(_ret, _lib, retain: true, release: true); + } + + NSURLSessionWebSocketTask webSocketTaskWithRequest_(NSURLRequest? request) { + final _ret = _lib._objc_msgSend_984( + _id, _lib._sel_webSocketTaskWithRequest_1, request?._id ?? ffi.nullptr); + return NSURLSessionWebSocketTask._(_ret, _lib, retain: true, release: true); + } + + @override + NSURLSession init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSURLSession._(_ret, _lib, retain: true, release: true); + } + + static NSURLSession new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSURLSession1, _lib._sel_new1); + return NSURLSession._(_ret, _lib, retain: false, release: true); + } + + NSURLSessionDataTask dataTaskWithRequest_completionHandler_( + NSURLRequest? request, + ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError completionHandler) { + final _ret = _lib._objc_msgSend_985( + _id, + _lib._sel_dataTaskWithRequest_completionHandler_1, + request?._id ?? ffi.nullptr, + completionHandler._id); + return NSURLSessionDataTask._(_ret, _lib, retain: true, release: true); + } + + NSURLSessionDataTask dataTaskWithURL_completionHandler_(NSURL? url, + ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError completionHandler) { + final _ret = _lib._objc_msgSend_986( + _id, + _lib._sel_dataTaskWithURL_completionHandler_1, + url?._id ?? ffi.nullptr, + completionHandler._id); + return NSURLSessionDataTask._(_ret, _lib, retain: true, release: true); + } + + NSURLSessionUploadTask uploadTaskWithRequest_fromFile_completionHandler_( + NSURLRequest? request, + NSURL? fileURL, + ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError completionHandler) { + final _ret = _lib._objc_msgSend_987( + _id, + _lib._sel_uploadTaskWithRequest_fromFile_completionHandler_1, + request?._id ?? ffi.nullptr, + fileURL?._id ?? ffi.nullptr, + completionHandler._id); + return NSURLSessionUploadTask._(_ret, _lib, retain: true, release: true); + } + + NSURLSessionUploadTask uploadTaskWithRequest_fromData_completionHandler_( + NSURLRequest? request, + NSData? bodyData, + ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError completionHandler) { + final _ret = _lib._objc_msgSend_988( + _id, + _lib._sel_uploadTaskWithRequest_fromData_completionHandler_1, + request?._id ?? ffi.nullptr, + bodyData?._id ?? ffi.nullptr, + completionHandler._id); + return NSURLSessionUploadTask._(_ret, _lib, retain: true, release: true); + } + + NSURLSessionDownloadTask downloadTaskWithRequest_completionHandler_( + NSURLRequest? request, + ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError completionHandler) { + final _ret = _lib._objc_msgSend_989( + _id, + _lib._sel_downloadTaskWithRequest_completionHandler_1, + request?._id ?? ffi.nullptr, + completionHandler._id); + return NSURLSessionDownloadTask._(_ret, _lib, retain: true, release: true); + } + + NSURLSessionDownloadTask downloadTaskWithURL_completionHandler_(NSURL? url, + ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError completionHandler) { + final _ret = _lib._objc_msgSend_990( + _id, + _lib._sel_downloadTaskWithURL_completionHandler_1, + url?._id ?? ffi.nullptr, + completionHandler._id); + return NSURLSessionDownloadTask._(_ret, _lib, retain: true, release: true); + } + + NSURLSessionDownloadTask downloadTaskWithResumeData_completionHandler_( + NSData? resumeData, + ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError completionHandler) { + final _ret = _lib._objc_msgSend_991( + _id, + _lib._sel_downloadTaskWithResumeData_completionHandler_1, + resumeData?._id ?? ffi.nullptr, + completionHandler._id); + return NSURLSessionDownloadTask._(_ret, _lib, retain: true, release: true); + } + + static NSURLSession allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSURLSession1, _lib._sel_allocWithZone_1, zone); + return NSURLSession._(_ret, _lib, retain: false, release: true); + } + + static NSURLSession alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSURLSession1, _lib._sel_alloc1); + return NSURLSession._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSURLSession1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSURLSession1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLSession1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLSession1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSURLSession1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSURLSession1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSURLSession1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSURLSession1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLSession1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSURLSessionConfiguration extends NSObject { + NSURLSessionConfiguration._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSURLSessionConfiguration] that points to the same underlying object as [other]. + static NSURLSessionConfiguration castFrom(T other) { + return NSURLSessionConfiguration._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSURLSessionConfiguration] that wraps the given raw object pointer. + static NSURLSessionConfiguration castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSURLSessionConfiguration._(other, lib, + retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSURLSessionConfiguration]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSURLSessionConfiguration1); + } + + static NSURLSessionConfiguration? getDefaultSessionConfiguration( + SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_944(_lib._class_NSURLSessionConfiguration1, + _lib._sel_defaultSessionConfiguration1); + return _ret.address == 0 + ? null + : NSURLSessionConfiguration._(_ret, _lib, retain: true, release: true); + } + + static NSURLSessionConfiguration? getEphemeralSessionConfiguration( + SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_944(_lib._class_NSURLSessionConfiguration1, + _lib._sel_ephemeralSessionConfiguration1); + return _ret.address == 0 + ? null + : NSURLSessionConfiguration._(_ret, _lib, retain: true, release: true); + } + + static NSURLSessionConfiguration + backgroundSessionConfigurationWithIdentifier_( + SentryCocoa _lib, NSString? identifier) { + final _ret = _lib._objc_msgSend_945( + _lib._class_NSURLSessionConfiguration1, + _lib._sel_backgroundSessionConfigurationWithIdentifier_1, + identifier?._id ?? ffi.nullptr); + return NSURLSessionConfiguration._(_ret, _lib, retain: true, release: true); + } + + NSString? get identifier { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_identifier1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + int get requestCachePolicy { + return _lib._objc_msgSend_782(_id, _lib._sel_requestCachePolicy1); + } + + set requestCachePolicy(int value) { + return _lib._objc_msgSend_922( + _id, _lib._sel_setRequestCachePolicy_1, value); + } + + double get timeoutIntervalForRequest { + return _lib._objc_msgSend_155(_id, _lib._sel_timeoutIntervalForRequest1); + } + + set timeoutIntervalForRequest(double value) { + return _lib._objc_msgSend_506( + _id, _lib._sel_setTimeoutIntervalForRequest_1, value); + } + + double get timeoutIntervalForResource { + return _lib._objc_msgSend_155(_id, _lib._sel_timeoutIntervalForResource1); + } + + set timeoutIntervalForResource(double value) { + return _lib._objc_msgSend_506( + _id, _lib._sel_setTimeoutIntervalForResource_1, value); + } + + int get networkServiceType { + return _lib._objc_msgSend_783(_id, _lib._sel_networkServiceType1); + } + + set networkServiceType(int value) { + return _lib._objc_msgSend_923( + _id, _lib._sel_setNetworkServiceType_1, value); + } + + bool get allowsCellularAccess { + return _lib._objc_msgSend_12(_id, _lib._sel_allowsCellularAccess1); + } + + set allowsCellularAccess(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setAllowsCellularAccess_1, value); + } + + bool get allowsExpensiveNetworkAccess { + return _lib._objc_msgSend_12(_id, _lib._sel_allowsExpensiveNetworkAccess1); + } + + set allowsExpensiveNetworkAccess(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setAllowsExpensiveNetworkAccess_1, value); + } + + bool get allowsConstrainedNetworkAccess { + return _lib._objc_msgSend_12( + _id, _lib._sel_allowsConstrainedNetworkAccess1); + } + + set allowsConstrainedNetworkAccess(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setAllowsConstrainedNetworkAccess_1, value); + } + + bool get requiresDNSSECValidation { + return _lib._objc_msgSend_12(_id, _lib._sel_requiresDNSSECValidation1); + } + + set requiresDNSSECValidation(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setRequiresDNSSECValidation_1, value); + } + + bool get waitsForConnectivity { + return _lib._objc_msgSend_12(_id, _lib._sel_waitsForConnectivity1); + } + + set waitsForConnectivity(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setWaitsForConnectivity_1, value); + } + + bool get discretionary { + return _lib._objc_msgSend_12(_id, _lib._sel_isDiscretionary1); + } + + set discretionary(bool value) { + return _lib._objc_msgSend_492(_id, _lib._sel_setDiscretionary_1, value); + } + + NSString? get sharedContainerIdentifier { + final _ret = + _lib._objc_msgSend_20(_id, _lib._sel_sharedContainerIdentifier1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set sharedContainerIdentifier(NSString? value) { + return _lib._objc_msgSend_509(_id, _lib._sel_setSharedContainerIdentifier_1, + value?._id ?? ffi.nullptr); + } + + bool get sessionSendsLaunchEvents { + return _lib._objc_msgSend_12(_id, _lib._sel_sessionSendsLaunchEvents1); + } + + set sessionSendsLaunchEvents(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setSessionSendsLaunchEvents_1, value); + } + + NSDictionary? get connectionProxyDictionary { + final _ret = + _lib._objc_msgSend_170(_id, _lib._sel_connectionProxyDictionary1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + set connectionProxyDictionary(NSDictionary? value) { + return _lib._objc_msgSend_171(_id, _lib._sel_setConnectionProxyDictionary_1, + value?._id ?? ffi.nullptr); + } + + int get TLSMinimumSupportedProtocol { + return _lib._objc_msgSend_946(_id, _lib._sel_TLSMinimumSupportedProtocol1); + } + + set TLSMinimumSupportedProtocol(int value) { + return _lib._objc_msgSend_947( + _id, _lib._sel_setTLSMinimumSupportedProtocol_1, value); + } + + int get TLSMaximumSupportedProtocol { + return _lib._objc_msgSend_946(_id, _lib._sel_TLSMaximumSupportedProtocol1); + } + + set TLSMaximumSupportedProtocol(int value) { + return _lib._objc_msgSend_947( + _id, _lib._sel_setTLSMaximumSupportedProtocol_1, value); + } + + int get TLSMinimumSupportedProtocolVersion { + return _lib._objc_msgSend_948( + _id, _lib._sel_TLSMinimumSupportedProtocolVersion1); + } + + set TLSMinimumSupportedProtocolVersion(int value) { + return _lib._objc_msgSend_949( + _id, _lib._sel_setTLSMinimumSupportedProtocolVersion_1, value); + } + + int get TLSMaximumSupportedProtocolVersion { + return _lib._objc_msgSend_948( + _id, _lib._sel_TLSMaximumSupportedProtocolVersion1); + } + + set TLSMaximumSupportedProtocolVersion(int value) { + return _lib._objc_msgSend_949( + _id, _lib._sel_setTLSMaximumSupportedProtocolVersion_1, value); + } + + bool get HTTPShouldUsePipelining { + return _lib._objc_msgSend_12(_id, _lib._sel_HTTPShouldUsePipelining1); + } + + set HTTPShouldUsePipelining(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setHTTPShouldUsePipelining_1, value); + } + + bool get HTTPShouldSetCookies { + return _lib._objc_msgSend_12(_id, _lib._sel_HTTPShouldSetCookies1); + } + + set HTTPShouldSetCookies(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setHTTPShouldSetCookies_1, value); + } + + int get HTTPCookieAcceptPolicy { + return _lib._objc_msgSend_779(_id, _lib._sel_HTTPCookieAcceptPolicy1); + } + + set HTTPCookieAcceptPolicy(int value) { + return _lib._objc_msgSend_780( + _id, _lib._sel_setHTTPCookieAcceptPolicy_1, value); + } + + NSDictionary? get HTTPAdditionalHeaders { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_HTTPAdditionalHeaders1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + set HTTPAdditionalHeaders(NSDictionary? value) { + return _lib._objc_msgSend_171( + _id, _lib._sel_setHTTPAdditionalHeaders_1, value?._id ?? ffi.nullptr); + } + + int get HTTPMaximumConnectionsPerHost { + return _lib._objc_msgSend_78(_id, _lib._sel_HTTPMaximumConnectionsPerHost1); + } + + set HTTPMaximumConnectionsPerHost(int value) { + return _lib._objc_msgSend_590( + _id, _lib._sel_setHTTPMaximumConnectionsPerHost_1, value); + } + + NSHTTPCookieStorage? get HTTPCookieStorage { + final _ret = _lib._objc_msgSend_773(_id, _lib._sel_HTTPCookieStorage1); + return _ret.address == 0 + ? null + : NSHTTPCookieStorage._(_ret, _lib, retain: true, release: true); + } + + set HTTPCookieStorage(NSHTTPCookieStorage? value) { + return _lib._objc_msgSend_950( + _id, _lib._sel_setHTTPCookieStorage_1, value?._id ?? ffi.nullptr); + } + + NSURLCredentialStorage? get URLCredentialStorage { + final _ret = _lib._objc_msgSend_908(_id, _lib._sel_URLCredentialStorage1); + return _ret.address == 0 + ? null + : NSURLCredentialStorage._(_ret, _lib, retain: true, release: true); + } + + set URLCredentialStorage(NSURLCredentialStorage? value) { + return _lib._objc_msgSend_951( + _id, _lib._sel_setURLCredentialStorage_1, value?._id ?? ffi.nullptr); + } + + NSURLCache? get URLCache { + final _ret = _lib._objc_msgSend_878(_id, _lib._sel_URLCache1); + return _ret.address == 0 + ? null + : NSURLCache._(_ret, _lib, retain: true, release: true); + } + + set URLCache(NSURLCache? value) { + return _lib._objc_msgSend_879( + _id, _lib._sel_setURLCache_1, value?._id ?? ffi.nullptr); + } + + bool get shouldUseExtendedBackgroundIdleMode { + return _lib._objc_msgSend_12( + _id, _lib._sel_shouldUseExtendedBackgroundIdleMode1); + } + + set shouldUseExtendedBackgroundIdleMode(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setShouldUseExtendedBackgroundIdleMode_1, value); + } + + NSArray? get protocolClasses { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_protocolClasses1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set protocolClasses(NSArray? value) { + return _lib._objc_msgSend_731( + _id, _lib._sel_setProtocolClasses_1, value?._id ?? ffi.nullptr); + } + + int get multipathServiceType { + return _lib._objc_msgSend_952(_id, _lib._sel_multipathServiceType1); + } + + set multipathServiceType(int value) { + return _lib._objc_msgSend_953( + _id, _lib._sel_setMultipathServiceType_1, value); + } + + @override + NSURLSessionConfiguration init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSURLSessionConfiguration._(_ret, _lib, retain: true, release: true); + } + + static NSURLSessionConfiguration new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLSessionConfiguration1, _lib._sel_new1); + return NSURLSessionConfiguration._(_ret, _lib, + retain: false, release: true); + } + + static NSURLSessionConfiguration backgroundSessionConfiguration_( + SentryCocoa _lib, NSString? identifier) { + final _ret = _lib._objc_msgSend_945( + _lib._class_NSURLSessionConfiguration1, + _lib._sel_backgroundSessionConfiguration_1, + identifier?._id ?? ffi.nullptr); + return NSURLSessionConfiguration._(_ret, _lib, retain: true, release: true); + } + + static NSURLSessionConfiguration allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3(_lib._class_NSURLSessionConfiguration1, + _lib._sel_allocWithZone_1, zone); + return NSURLSessionConfiguration._(_ret, _lib, + retain: false, release: true); + } + + static NSURLSessionConfiguration alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLSessionConfiguration1, _lib._sel_alloc1); + return NSURLSessionConfiguration._(_ret, _lib, + retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSURLSessionConfiguration1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSURLSessionConfiguration1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSURLSessionConfiguration1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLSessionConfiguration1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSURLSessionConfiguration1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSURLSessionConfiguration1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSURLSessionConfiguration1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSURLSessionConfiguration1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSURLSessionConfiguration1, + _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class SSLProtocol { + static const int kSSLProtocolUnknown = 0; + static const int kTLSProtocol1 = 4; + static const int kTLSProtocol11 = 7; + static const int kTLSProtocol12 = 8; + static const int kDTLSProtocol1 = 9; + static const int kTLSProtocol13 = 10; + static const int kDTLSProtocol12 = 11; + static const int kTLSProtocolMaxSupported = 999; + static const int kSSLProtocol2 = 1; + static const int kSSLProtocol3 = 2; + static const int kSSLProtocol3Only = 3; + static const int kTLSProtocol1Only = 5; + static const int kSSLProtocolAll = 6; +} + +abstract class tls_protocol_version_t { + static const int tls_protocol_version_TLSv10 = 769; + static const int tls_protocol_version_TLSv11 = 770; + static const int tls_protocol_version_TLSv12 = 771; + static const int tls_protocol_version_TLSv13 = 772; + static const int tls_protocol_version_DTLSv10 = -257; + static const int tls_protocol_version_DTLSv12 = -259; +} + +abstract class NSURLSessionMultipathServiceType { + static const int NSURLSessionMultipathServiceTypeNone = 0; + static const int NSURLSessionMultipathServiceTypeHandover = 1; + static const int NSURLSessionMultipathServiceTypeInteractive = 2; + static const int NSURLSessionMultipathServiceTypeAggregate = 3; +} + +void _ObjCBlock_ffiVoid_NSArray_NSArray_NSArray_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function( + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>()(arg0, arg1, arg2); +} + +final _ObjCBlock_ffiVoid_NSArray_NSArray_NSArray_closureRegistry = + {}; +int _ObjCBlock_ffiVoid_NSArray_NSArray_NSArray_closureRegistryIndex = 0; +ffi.Pointer + _ObjCBlock_ffiVoid_NSArray_NSArray_NSArray_registerClosure(Function fn) { + final id = ++_ObjCBlock_ffiVoid_NSArray_NSArray_NSArray_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSArray_NSArray_NSArray_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSArray_NSArray_NSArray_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2) { + return (_ObjCBlock_ffiVoid_NSArray_NSArray_NSArray_closureRegistry[ + block.ref.target.address] + as void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer))(arg0, arg1, arg2); +} + +class ObjCBlock_ffiVoid_NSArray_NSArray_NSArray extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSArray_NSArray_NSArray._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSArray_NSArray_NSArray.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_NSArray_NSArray_NSArray_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSArray_NSArray_NSArray.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, ffi.Pointer arg1, + ffi.Pointer arg2) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_NSArray_NSArray_NSArray_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSArray_NSArray_NSArray_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0, ffi.Pointer arg1, + ffi.Pointer arg2) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>()(_id, arg0, arg1, arg2); + } +} + +class NSURLSessionUploadTask extends NSURLSessionDataTask { + NSURLSessionUploadTask._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSURLSessionUploadTask] that points to the same underlying object as [other]. + static NSURLSessionUploadTask castFrom(T other) { + return NSURLSessionUploadTask._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSURLSessionUploadTask] that wraps the given raw object pointer. + static NSURLSessionUploadTask castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSURLSessionUploadTask._(other, lib, + retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSURLSessionUploadTask]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSURLSessionUploadTask1); + } + + @override + NSURLSessionUploadTask init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSURLSessionUploadTask._(_ret, _lib, retain: true, release: true); + } + + static NSURLSessionUploadTask new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLSessionUploadTask1, _lib._sel_new1); + return NSURLSessionUploadTask._(_ret, _lib, retain: false, release: true); + } + + static NSURLSessionUploadTask allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSURLSessionUploadTask1, _lib._sel_allocWithZone_1, zone); + return NSURLSessionUploadTask._(_ret, _lib, retain: false, release: true); + } + + static NSURLSessionUploadTask alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLSessionUploadTask1, _lib._sel_alloc1); + return NSURLSessionUploadTask._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSURLSessionUploadTask1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSURLSessionUploadTask1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSURLSessionUploadTask1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLSessionUploadTask1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSURLSessionUploadTask1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSURLSessionUploadTask1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSURLSessionUploadTask1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSURLSessionUploadTask1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSURLSessionUploadTask1, + _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSURLSessionDownloadTask extends NSURLSessionTask { + NSURLSessionDownloadTask._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSURLSessionDownloadTask] that points to the same underlying object as [other]. + static NSURLSessionDownloadTask castFrom(T other) { + return NSURLSessionDownloadTask._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSURLSessionDownloadTask] that wraps the given raw object pointer. + static NSURLSessionDownloadTask castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSURLSessionDownloadTask._(other, lib, + retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSURLSessionDownloadTask]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSURLSessionDownloadTask1); + } + + void cancelByProducingResumeData_( + ObjCBlock_ffiVoid_NSData completionHandler) { + _lib._objc_msgSend_963( + _id, _lib._sel_cancelByProducingResumeData_1, completionHandler._id); + } + + @override + NSURLSessionDownloadTask init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSURLSessionDownloadTask._(_ret, _lib, retain: true, release: true); + } + + static NSURLSessionDownloadTask new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLSessionDownloadTask1, _lib._sel_new1); + return NSURLSessionDownloadTask._(_ret, _lib, retain: false, release: true); + } + + static NSURLSessionDownloadTask allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSURLSessionDownloadTask1, _lib._sel_allocWithZone_1, zone); + return NSURLSessionDownloadTask._(_ret, _lib, retain: false, release: true); + } + + static NSURLSessionDownloadTask alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLSessionDownloadTask1, _lib._sel_alloc1); + return NSURLSessionDownloadTask._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSURLSessionDownloadTask1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSURLSessionDownloadTask1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSURLSessionDownloadTask1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLSessionDownloadTask1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSURLSessionDownloadTask1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSURLSessionDownloadTask1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSURLSessionDownloadTask1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSURLSessionDownloadTask1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSURLSessionDownloadTask1, + _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +void _ObjCBlock_ffiVoid_NSData_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return block.ref.target + .cast< + ffi.NativeFunction arg0)>>() + .asFunction arg0)>()(arg0); +} + +final _ObjCBlock_ffiVoid_NSData_closureRegistry = {}; +int _ObjCBlock_ffiVoid_NSData_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_NSData_registerClosure(Function fn) { + final id = ++_ObjCBlock_ffiVoid_NSData_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSData_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSData_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return (_ObjCBlock_ffiVoid_NSData_closureRegistry[block.ref.target.address] + as void Function(ffi.Pointer))(arg0); +} + +class ObjCBlock_ffiVoid_NSData extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSData._(ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSData.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi + .NativeFunction arg0)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_NSData_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSData.fromFunction( + SentryCocoa lib, void Function(ffi.Pointer arg0) fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_NSData_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSData_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>>() + .asFunction< + void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>()(_id, arg0); + } +} + +class NSURLSessionStreamTask extends NSURLSessionTask { + NSURLSessionStreamTask._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSURLSessionStreamTask] that points to the same underlying object as [other]. + static NSURLSessionStreamTask castFrom(T other) { + return NSURLSessionStreamTask._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSURLSessionStreamTask] that wraps the given raw object pointer. + static NSURLSessionStreamTask castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSURLSessionStreamTask._(other, lib, + retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSURLSessionStreamTask]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSURLSessionStreamTask1); + } + + void readDataOfMinLength_maxLength_timeout_completionHandler_( + int minBytes, + int maxBytes, + double timeout, + ObjCBlock_ffiVoid_NSData_bool_NSError completionHandler) { + _lib._objc_msgSend_967( + _id, + _lib._sel_readDataOfMinLength_maxLength_timeout_completionHandler_1, + minBytes, + maxBytes, + timeout, + completionHandler._id); + } + + void writeData_timeout_completionHandler_(NSData? data, double timeout, + ObjCBlock_ffiVoid_NSError completionHandler) { + _lib._objc_msgSend_968(_id, _lib._sel_writeData_timeout_completionHandler_1, + data?._id ?? ffi.nullptr, timeout, completionHandler._id); + } + + void captureStreams() { + _lib._objc_msgSend_1(_id, _lib._sel_captureStreams1); + } + + void closeWrite() { + _lib._objc_msgSend_1(_id, _lib._sel_closeWrite1); + } + + void closeRead() { + _lib._objc_msgSend_1(_id, _lib._sel_closeRead1); + } + + void startSecureConnection() { + _lib._objc_msgSend_1(_id, _lib._sel_startSecureConnection1); + } + + void stopSecureConnection() { + _lib._objc_msgSend_1(_id, _lib._sel_stopSecureConnection1); + } + + @override + NSURLSessionStreamTask init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSURLSessionStreamTask._(_ret, _lib, retain: true, release: true); + } + + static NSURLSessionStreamTask new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLSessionStreamTask1, _lib._sel_new1); + return NSURLSessionStreamTask._(_ret, _lib, retain: false, release: true); + } + + static NSURLSessionStreamTask allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSURLSessionStreamTask1, _lib._sel_allocWithZone_1, zone); + return NSURLSessionStreamTask._(_ret, _lib, retain: false, release: true); + } + + static NSURLSessionStreamTask alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLSessionStreamTask1, _lib._sel_alloc1); + return NSURLSessionStreamTask._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSURLSessionStreamTask1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSURLSessionStreamTask1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSURLSessionStreamTask1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLSessionStreamTask1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSURLSessionStreamTask1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSURLSessionStreamTask1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSURLSessionStreamTask1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSURLSessionStreamTask1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSURLSessionStreamTask1, + _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +void _ObjCBlock_ffiVoid_NSData_bool_NSError_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + bool arg1, + ffi.Pointer arg2) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, ffi.Bool arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function(ffi.Pointer arg0, bool arg1, + ffi.Pointer arg2)>()(arg0, arg1, arg2); +} + +final _ObjCBlock_ffiVoid_NSData_bool_NSError_closureRegistry = + {}; +int _ObjCBlock_ffiVoid_NSData_bool_NSError_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_NSData_bool_NSError_registerClosure( + Function fn) { + final id = ++_ObjCBlock_ffiVoid_NSData_bool_NSError_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSData_bool_NSError_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSData_bool_NSError_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + bool arg1, + ffi.Pointer arg2) { + return (_ObjCBlock_ffiVoid_NSData_bool_NSError_closureRegistry[ + block.ref.target.address] + as void Function(ffi.Pointer, bool, + ffi.Pointer))(arg0, arg1, arg2); +} + +class ObjCBlock_ffiVoid_NSData_bool_NSError extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSData_bool_NSError._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSData_bool_NSError.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, ffi.Bool arg1, + ffi.Pointer arg2)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Bool arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_NSData_bool_NSError_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSData_bool_NSError.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, bool arg1, + ffi.Pointer arg2) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Bool arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_NSData_bool_NSError_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSData_bool_NSError_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call( + ffi.Pointer arg0, bool arg1, ffi.Pointer arg2) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Bool arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + bool arg1, + ffi.Pointer arg2)>()(_id, arg0, arg1, arg2); + } +} + +class NSNetService extends NSObject { + NSNetService._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSNetService] that points to the same underlying object as [other]. + static NSNetService castFrom(T other) { + return NSNetService._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSNetService] that wraps the given raw object pointer. + static NSNetService castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSNetService._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSNetService]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSNetService1); + } + + NSNetService initWithDomain_type_name_port_( + NSString? domain, NSString? type, NSString? name, int port) { + final _ret = _lib._objc_msgSend_970( + _id, + _lib._sel_initWithDomain_type_name_port_1, + domain?._id ?? ffi.nullptr, + type?._id ?? ffi.nullptr, + name?._id ?? ffi.nullptr, + port); + return NSNetService._(_ret, _lib, retain: true, release: true); + } + + NSNetService initWithDomain_type_name_( + NSString? domain, NSString? type, NSString? name) { + final _ret = _lib._objc_msgSend_26( + _id, + _lib._sel_initWithDomain_type_name_1, + domain?._id ?? ffi.nullptr, + type?._id ?? ffi.nullptr, + name?._id ?? ffi.nullptr); + return NSNetService._(_ret, _lib, retain: true, release: true); + } + + void scheduleInRunLoop_forMode_(NSRunLoop? aRunLoop, NSString mode) { + _lib._objc_msgSend_533(_id, _lib._sel_scheduleInRunLoop_forMode_1, + aRunLoop?._id ?? ffi.nullptr, mode._id); + } + + void removeFromRunLoop_forMode_(NSRunLoop? aRunLoop, NSString mode) { + _lib._objc_msgSend_533(_id, _lib._sel_removeFromRunLoop_forMode_1, + aRunLoop?._id ?? ffi.nullptr, mode._id); + } + + NSObject? get delegate { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_delegate1); + return _ret.address == 0 + ? null + : NSObject._(_ret, _lib, retain: true, release: true); + } + + set delegate(NSObject? value) { + return _lib._objc_msgSend_387( + _id, _lib._sel_setDelegate_1, value?._id ?? ffi.nullptr); + } + + bool get includesPeerToPeer { + return _lib._objc_msgSend_12(_id, _lib._sel_includesPeerToPeer1); + } + + set includesPeerToPeer(bool value) { + return _lib._objc_msgSend_492( + _id, _lib._sel_setIncludesPeerToPeer_1, value); + } + + NSString? get name { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get type { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_type1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get domain { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_domain1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get hostName { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_hostName1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSArray? get addresses { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_addresses1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + int get port { + return _lib._objc_msgSend_78(_id, _lib._sel_port1); + } + + void publish() { + _lib._objc_msgSend_1(_id, _lib._sel_publish1); + } + + void publishWithOptions_(int options) { + _lib._objc_msgSend_971(_id, _lib._sel_publishWithOptions_1, options); + } + + void resolve() { + _lib._objc_msgSend_1(_id, _lib._sel_resolve1); + } + + void stop() { + _lib._objc_msgSend_1(_id, _lib._sel_stop1); + } + + static NSDictionary dictionaryFromTXTRecordData_( + SentryCocoa _lib, NSData? txtData) { + final _ret = _lib._objc_msgSend_972(_lib._class_NSNetService1, + _lib._sel_dictionaryFromTXTRecordData_1, txtData?._id ?? ffi.nullptr); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + static NSData dataFromTXTRecordDictionary_( + SentryCocoa _lib, NSDictionary? txtDictionary) { + final _ret = _lib._objc_msgSend_973( + _lib._class_NSNetService1, + _lib._sel_dataFromTXTRecordDictionary_1, + txtDictionary?._id ?? ffi.nullptr); + return NSData._(_ret, _lib, retain: true, release: true); + } + + void resolveWithTimeout_(double timeout) { + _lib._objc_msgSend_505(_id, _lib._sel_resolveWithTimeout_1, timeout); + } + + bool getInputStream_outputStream_( + ffi.Pointer> inputStream, + ffi.Pointer> outputStream) { + return _lib._objc_msgSend_974(_id, _lib._sel_getInputStream_outputStream_1, + inputStream, outputStream); + } + + bool setTXTRecordData_(NSData? recordData) { + return _lib._objc_msgSend_23( + _id, _lib._sel_setTXTRecordData_1, recordData?._id ?? ffi.nullptr); + } + + NSData TXTRecordData() { + final _ret = _lib._objc_msgSend_39(_id, _lib._sel_TXTRecordData1); + return NSData._(_ret, _lib, retain: true, release: true); + } + + void startMonitoring() { + _lib._objc_msgSend_1(_id, _lib._sel_startMonitoring1); + } + + void stopMonitoring() { + _lib._objc_msgSend_1(_id, _lib._sel_stopMonitoring1); + } + + @override + NSNetService init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSNetService._(_ret, _lib, retain: true, release: true); + } + + static NSNetService new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSNetService1, _lib._sel_new1); + return NSNetService._(_ret, _lib, retain: false, release: true); + } + + static NSNetService allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSNetService1, _lib._sel_allocWithZone_1, zone); + return NSNetService._(_ret, _lib, retain: false, release: true); + } + + static NSNetService alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSNetService1, _lib._sel_alloc1); + return NSNetService._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSNetService1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSNetService1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSNetService1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSNetService1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSNetService1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSNetService1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSNetService1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSNetService1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSNetService1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSNetServiceOptions { + static const int NSNetServiceNoAutoRename = 1; + static const int NSNetServiceListenForConnections = 2; +} + +class NSURLSessionWebSocketTask extends NSURLSessionTask { + NSURLSessionWebSocketTask._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSURLSessionWebSocketTask] that points to the same underlying object as [other]. + static NSURLSessionWebSocketTask castFrom(T other) { + return NSURLSessionWebSocketTask._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSURLSessionWebSocketTask] that wraps the given raw object pointer. + static NSURLSessionWebSocketTask castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSURLSessionWebSocketTask._(other, lib, + retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSURLSessionWebSocketTask]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSURLSessionWebSocketTask1); + } + + void sendMessage_completionHandler_(NSURLSessionWebSocketMessage? message, + ObjCBlock_ffiVoid_NSError completionHandler) { + _lib._objc_msgSend_977(_id, _lib._sel_sendMessage_completionHandler_1, + message?._id ?? ffi.nullptr, completionHandler._id); + } + + void receiveMessageWithCompletionHandler_( + ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError + completionHandler) { + _lib._objc_msgSend_978(_id, _lib._sel_receiveMessageWithCompletionHandler_1, + completionHandler._id); + } + + void sendPingWithPongReceiveHandler_( + ObjCBlock_ffiVoid_NSError pongReceiveHandler) { + _lib._objc_msgSend_979(_id, _lib._sel_sendPingWithPongReceiveHandler_1, + pongReceiveHandler._id); + } + + void cancelWithCloseCode_reason_(int closeCode, NSData? reason) { + _lib._objc_msgSend_980(_id, _lib._sel_cancelWithCloseCode_reason_1, + closeCode, reason?._id ?? ffi.nullptr); + } + + int get maximumMessageSize { + return _lib._objc_msgSend_78(_id, _lib._sel_maximumMessageSize1); + } + + set maximumMessageSize(int value) { + return _lib._objc_msgSend_590( + _id, _lib._sel_setMaximumMessageSize_1, value); + } + + int get closeCode { + return _lib._objc_msgSend_981(_id, _lib._sel_closeCode1); + } + + NSData? get closeReason { + final _ret = _lib._objc_msgSend_39(_id, _lib._sel_closeReason1); + return _ret.address == 0 + ? null + : NSData._(_ret, _lib, retain: true, release: true); + } + + @override + NSURLSessionWebSocketTask init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSURLSessionWebSocketTask._(_ret, _lib, retain: true, release: true); + } + + static NSURLSessionWebSocketTask new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLSessionWebSocketTask1, _lib._sel_new1); + return NSURLSessionWebSocketTask._(_ret, _lib, + retain: false, release: true); + } + + static NSURLSessionWebSocketTask allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3(_lib._class_NSURLSessionWebSocketTask1, + _lib._sel_allocWithZone_1, zone); + return NSURLSessionWebSocketTask._(_ret, _lib, + retain: false, release: true); + } + + static NSURLSessionWebSocketTask alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLSessionWebSocketTask1, _lib._sel_alloc1); + return NSURLSessionWebSocketTask._(_ret, _lib, + retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSURLSessionWebSocketTask1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSURLSessionWebSocketTask1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSURLSessionWebSocketTask1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSURLSessionWebSocketTask1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSURLSessionWebSocketTask1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSURLSessionWebSocketTask1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSURLSessionWebSocketTask1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_NSURLSessionWebSocketTask1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSURLSessionWebSocketTask1, + _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSURLSessionWebSocketMessage extends NSObject { + NSURLSessionWebSocketMessage._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSURLSessionWebSocketMessage] that points to the same underlying object as [other]. + static NSURLSessionWebSocketMessage castFrom( + T other) { + return NSURLSessionWebSocketMessage._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSURLSessionWebSocketMessage] that wraps the given raw object pointer. + static NSURLSessionWebSocketMessage castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSURLSessionWebSocketMessage._(other, lib, + retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSURLSessionWebSocketMessage]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSURLSessionWebSocketMessage1); + } + + NSURLSessionWebSocketMessage initWithData_(NSData? data) { + final _ret = _lib._objc_msgSend_257( + _id, _lib._sel_initWithData_1, data?._id ?? ffi.nullptr); + return NSURLSessionWebSocketMessage._(_ret, _lib, + retain: true, release: true); + } + + NSURLSessionWebSocketMessage initWithString_(NSString? string) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithString_1, string?._id ?? ffi.nullptr); + return NSURLSessionWebSocketMessage._(_ret, _lib, + retain: true, release: true); + } + + int get type { + return _lib._objc_msgSend_976(_id, _lib._sel_type1); + } + + NSData? get data { + final _ret = _lib._objc_msgSend_39(_id, _lib._sel_data1); + return _ret.address == 0 + ? null + : NSData._(_ret, _lib, retain: true, release: true); + } + + NSString? get string { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_string1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + @override + NSURLSessionWebSocketMessage init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSURLSessionWebSocketMessage._(_ret, _lib, + retain: true, release: true); + } + + static NSURLSessionWebSocketMessage new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLSessionWebSocketMessage1, _lib._sel_new1); + return NSURLSessionWebSocketMessage._(_ret, _lib, + retain: false, release: true); + } + + static NSURLSessionWebSocketMessage allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3(_lib._class_NSURLSessionWebSocketMessage1, + _lib._sel_allocWithZone_1, zone); + return NSURLSessionWebSocketMessage._(_ret, _lib, + retain: false, release: true); + } + + static NSURLSessionWebSocketMessage alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSURLSessionWebSocketMessage1, _lib._sel_alloc1); + return NSURLSessionWebSocketMessage._(_ret, _lib, + retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSURLSessionWebSocketMessage1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSURLSessionWebSocketMessage1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSURLSessionWebSocketMessage1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_NSURLSessionWebSocketMessage1, + _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSURLSessionWebSocketMessage1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSURLSessionWebSocketMessage1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSURLSessionWebSocketMessage1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSURLSessionWebSocketMessage1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSURLSessionWebSocketMessage1, + _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSURLSessionWebSocketMessageType { + static const int NSURLSessionWebSocketMessageTypeData = 0; + static const int NSURLSessionWebSocketMessageTypeString = 1; +} + +void _ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + void Function(ffi.Pointer arg0, + ffi.Pointer arg1)>()(arg0, arg1); +} + +final _ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError_closureRegistry = + {}; +int _ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError_closureRegistryIndex = + 0; +ffi.Pointer + _ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError_registerClosure( + Function fn) { + final id = + ++_ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError_closureRegistry[id] = + fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1) { + return (_ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError_closureRegistry[ + block.ref.target.address] + as void Function( + ffi.Pointer, ffi.Pointer))(arg0, arg1); +} + +class ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError + extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer arg0, + ffi.Pointer arg1)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, ffi.Pointer arg1) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>( + _ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSURLSessionWebSocketMessage_NSError_registerClosure( + fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0, ffi.Pointer arg1) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1)>()(_id, arg0, arg1); + } +} + +abstract class NSURLSessionWebSocketCloseCode { + static const int NSURLSessionWebSocketCloseCodeInvalid = 0; + static const int NSURLSessionWebSocketCloseCodeNormalClosure = 1000; + static const int NSURLSessionWebSocketCloseCodeGoingAway = 1001; + static const int NSURLSessionWebSocketCloseCodeProtocolError = 1002; + static const int NSURLSessionWebSocketCloseCodeUnsupportedData = 1003; + static const int NSURLSessionWebSocketCloseCodeNoStatusReceived = 1005; + static const int NSURLSessionWebSocketCloseCodeAbnormalClosure = 1006; + static const int NSURLSessionWebSocketCloseCodeInvalidFramePayloadData = 1007; + static const int NSURLSessionWebSocketCloseCodePolicyViolation = 1008; + static const int NSURLSessionWebSocketCloseCodeMessageTooBig = 1009; + static const int NSURLSessionWebSocketCloseCodeMandatoryExtensionMissing = + 1010; + static const int NSURLSessionWebSocketCloseCodeInternalServerError = 1011; + static const int NSURLSessionWebSocketCloseCodeTLSHandshakeFailure = 1015; +} + +void _ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function( + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>()(arg0, arg1, arg2); +} + +final _ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError_closureRegistry = + {}; +int _ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError_closureRegistryIndex = 0; +ffi.Pointer + _ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError_registerClosure( + Function fn) { + final id = + ++_ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2) { + return (_ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError_closureRegistry[ + block.ref.target.address] + as void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer))(arg0, arg1, arg2); +} + +class ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, ffi.Pointer arg1, + ffi.Pointer arg2) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSData_NSURLResponse_NSError_registerClosure( + fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0, ffi.Pointer arg1, + ffi.Pointer arg2) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>()(_id, arg0, arg1, arg2); + } +} + +void _ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2) { + return block.ref.target + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function( + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>()(arg0, arg1, arg2); +} + +final _ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError_closureRegistry = + {}; +int _ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError_closureRegistryIndex = 0; +ffi.Pointer + _ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError_registerClosure( + Function fn) { + final id = + ++_ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2) { + return (_ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError_closureRegistry[ + block.ref.target.address] + as void Function(ffi.Pointer, ffi.Pointer, + ffi.Pointer))(arg0, arg1, arg2); +} + +class ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError.fromFunction( + SentryCocoa lib, + void Function(ffi.Pointer arg0, ffi.Pointer arg1, + ffi.Pointer arg2) + fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>( + _ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSURL_NSURLResponse_NSError_registerClosure( + fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0, ffi.Pointer arg1, + ffi.Pointer arg2) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>>() + .asFunction< + void Function( + ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0, + ffi.Pointer arg1, + ffi.Pointer arg2)>()(_id, arg0, arg1, arg2); + } +} + +class NSProtocolChecker extends NSProxy { + NSProtocolChecker._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSProtocolChecker] that points to the same underlying object as [other]. + static NSProtocolChecker castFrom(T other) { + return NSProtocolChecker._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [NSProtocolChecker] that wraps the given raw object pointer. + static NSProtocolChecker castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSProtocolChecker._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSProtocolChecker]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_NSProtocolChecker1); + } + + Protocol? get protocol { + final _ret = _lib._objc_msgSend_992(_id, _lib._sel_protocol1); + return _ret.address == 0 + ? null + : Protocol._(_ret, _lib, retain: true, release: true); + } + + NSObject? get target { + final _ret = _lib._objc_msgSend_822(_id, _lib._sel_target1); + return _ret.address == 0 + ? null + : NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSProtocolChecker protocolCheckerWithTarget_protocol_( + SentryCocoa _lib, NSObject? anObject, Protocol? aProtocol) { + final _ret = _lib._objc_msgSend_993( + _lib._class_NSProtocolChecker1, + _lib._sel_protocolCheckerWithTarget_protocol_1, + anObject?._id ?? ffi.nullptr, + aProtocol?._id ?? ffi.nullptr); + return NSProtocolChecker._(_ret, _lib, retain: true, release: true); + } + + NSProtocolChecker initWithTarget_protocol_( + NSObject? anObject, Protocol? aProtocol) { + final _ret = _lib._objc_msgSend_993( + _id, + _lib._sel_initWithTarget_protocol_1, + anObject?._id ?? ffi.nullptr, + aProtocol?._id ?? ffi.nullptr); + return NSProtocolChecker._(_ret, _lib, retain: true, release: true); + } + + static NSObject alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSProtocolChecker1, _lib._sel_alloc1); + return NSObject._(_ret, _lib, retain: false, release: true); + } + + static bool respondsToSelector_( + SentryCocoa _lib, ffi.Pointer aSelector) { + return _lib._objc_msgSend_4(_lib._class_NSProtocolChecker1, + _lib._sel_respondsToSelector_1, aSelector); + } +} + +class NSTask extends NSObject { + NSTask._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSTask] that points to the same underlying object as [other]. + static NSTask castFrom(T other) { + return NSTask._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSTask] that wraps the given raw object pointer. + static NSTask castFromPointer(SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSTask._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSTask]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSTask1); + } + + @override + NSTask init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSTask._(_ret, _lib, retain: true, release: true); + } + + NSURL? get executableURL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_executableURL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + set executableURL(NSURL? value) { + return _lib._objc_msgSend_621( + _id, _lib._sel_setExecutableURL_1, value?._id ?? ffi.nullptr); + } + + NSArray? get arguments { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_arguments1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set arguments(NSArray? value) { + return _lib._objc_msgSend_731( + _id, _lib._sel_setArguments_1, value?._id ?? ffi.nullptr); + } + + NSDictionary? get environment { + final _ret = _lib._objc_msgSend_170(_id, _lib._sel_environment1); + return _ret.address == 0 + ? null + : NSDictionary._(_ret, _lib, retain: true, release: true); + } + + set environment(NSDictionary? value) { + return _lib._objc_msgSend_171( + _id, _lib._sel_setEnvironment_1, value?._id ?? ffi.nullptr); + } + + NSURL? get currentDirectoryURL { + final _ret = _lib._objc_msgSend_40(_id, _lib._sel_currentDirectoryURL1); + return _ret.address == 0 + ? null + : NSURL._(_ret, _lib, retain: true, release: true); + } + + set currentDirectoryURL(NSURL? value) { + return _lib._objc_msgSend_621( + _id, _lib._sel_setCurrentDirectoryURL_1, value?._id ?? ffi.nullptr); + } + + NSObject get standardInput { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_standardInput1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + set standardInput(NSObject value) { + return _lib._objc_msgSend_387(_id, _lib._sel_setStandardInput_1, value._id); + } + + NSObject get standardOutput { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_standardOutput1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + set standardOutput(NSObject value) { + return _lib._objc_msgSend_387( + _id, _lib._sel_setStandardOutput_1, value._id); + } + + NSObject get standardError { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_standardError1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + set standardError(NSObject value) { + return _lib._objc_msgSend_387(_id, _lib._sel_setStandardError_1, value._id); + } + + bool launchAndReturnError_(ffi.Pointer> error) { + return _lib._objc_msgSend_225(_id, _lib._sel_launchAndReturnError_1, error); + } + + void interrupt() { + _lib._objc_msgSend_1(_id, _lib._sel_interrupt1); + } + + void terminate() { + _lib._objc_msgSend_1(_id, _lib._sel_terminate1); + } + + bool suspend() { + return _lib._objc_msgSend_12(_id, _lib._sel_suspend1); + } + + bool resume() { + return _lib._objc_msgSend_12(_id, _lib._sel_resume1); + } + + int get processIdentifier { + return _lib._objc_msgSend_219(_id, _lib._sel_processIdentifier1); + } + + bool get running { + return _lib._objc_msgSend_12(_id, _lib._sel_isRunning1); + } + + int get terminationStatus { + return _lib._objc_msgSend_219(_id, _lib._sel_terminationStatus1); + } + + int get terminationReason { + return _lib._objc_msgSend_994(_id, _lib._sel_terminationReason1); + } + + ObjCBlock_ffiVoid_NSTask get terminationHandler { + final _ret = _lib._objc_msgSend_995(_id, _lib._sel_terminationHandler1); + return ObjCBlock_ffiVoid_NSTask._(_ret, _lib); + } + + set terminationHandler(ObjCBlock_ffiVoid_NSTask value) { + return _lib._objc_msgSend_996( + _id, _lib._sel_setTerminationHandler_1, value._id); + } + + int get qualityOfService { + return _lib._objc_msgSend_507(_id, _lib._sel_qualityOfService1); + } + + set qualityOfService(int value) { + return _lib._objc_msgSend_508(_id, _lib._sel_setQualityOfService_1, value); + } + + static NSTask + launchedTaskWithExecutableURL_arguments_error_terminationHandler_( + SentryCocoa _lib, + NSURL? url, + NSArray? arguments, + ffi.Pointer> error, + ObjCBlock_ffiVoid_NSTask terminationHandler) { + final _ret = _lib._objc_msgSend_997( + _lib._class_NSTask1, + _lib._sel_launchedTaskWithExecutableURL_arguments_error_terminationHandler_1, + url?._id ?? ffi.nullptr, + arguments?._id ?? ffi.nullptr, + error, + terminationHandler._id); + return NSTask._(_ret, _lib, retain: true, release: true); + } + + void waitUntilExit() { + _lib._objc_msgSend_1(_id, _lib._sel_waitUntilExit1); + } + + NSString? get launchPath { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_launchPath1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set launchPath(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setLaunchPath_1, value?._id ?? ffi.nullptr); + } + + NSString? get currentDirectoryPath { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_currentDirectoryPath1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set currentDirectoryPath(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setCurrentDirectoryPath_1, value?._id ?? ffi.nullptr); + } + + void launch() { + _lib._objc_msgSend_1(_id, _lib._sel_launch1); + } + + static NSTask launchedTaskWithLaunchPath_arguments_( + SentryCocoa _lib, NSString? path, NSArray? arguments) { + final _ret = _lib._objc_msgSend_998( + _lib._class_NSTask1, + _lib._sel_launchedTaskWithLaunchPath_arguments_1, + path?._id ?? ffi.nullptr, + arguments?._id ?? ffi.nullptr); + return NSTask._(_ret, _lib, retain: true, release: true); + } + + static NSTask new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSTask1, _lib._sel_new1); + return NSTask._(_ret, _lib, retain: false, release: true); + } + + static NSTask allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSTask1, _lib._sel_allocWithZone_1, zone); + return NSTask._(_ret, _lib, retain: false, release: true); + } + + static NSTask alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSTask1, _lib._sel_alloc1); + return NSTask._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSTask1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSTask1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSTask1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSTask1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSTask1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSTask1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSTask1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSTask1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSTask1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSTaskTerminationReason { + static const int NSTaskTerminationReasonExit = 1; + static const int NSTaskTerminationReasonUncaughtSignal = 2; +} + +void _ObjCBlock_ffiVoid_NSTask_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return block.ref.target + .cast< + ffi.NativeFunction arg0)>>() + .asFunction arg0)>()(arg0); +} + +final _ObjCBlock_ffiVoid_NSTask_closureRegistry = {}; +int _ObjCBlock_ffiVoid_NSTask_closureRegistryIndex = 0; +ffi.Pointer _ObjCBlock_ffiVoid_NSTask_registerClosure(Function fn) { + final id = ++_ObjCBlock_ffiVoid_NSTask_closureRegistryIndex; + _ObjCBlock_ffiVoid_NSTask_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_NSTask_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return (_ObjCBlock_ffiVoid_NSTask_closureRegistry[block.ref.target.address] + as void Function(ffi.Pointer))(arg0); +} + +class ObjCBlock_ffiVoid_NSTask extends _ObjCBlockBase { + ObjCBlock_ffiVoid_NSTask._(ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_NSTask.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi + .NativeFunction arg0)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_NSTask_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_NSTask.fromFunction( + SentryCocoa lib, void Function(ffi.Pointer arg0) fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_NSTask_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_NSTask_registerClosure(fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>>() + .asFunction< + void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>()(_id, arg0); + } +} + +class NSXMLElement extends NSXMLNode { + NSXMLElement._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSXMLElement] that points to the same underlying object as [other]. + static NSXMLElement castFrom(T other) { + return NSXMLElement._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSXMLElement] that wraps the given raw object pointer. + static NSXMLElement castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSXMLElement._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSXMLElement]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSXMLElement1); + } + + NSXMLElement initWithName_(NSString? name) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithName_1, name?._id ?? ffi.nullptr); + return NSXMLElement._(_ret, _lib, retain: true, release: true); + } + + NSXMLElement initWithName_URI_(NSString? name, NSString? URI) { + final _ret = _lib._objc_msgSend_165(_id, _lib._sel_initWithName_URI_1, + name?._id ?? ffi.nullptr, URI?._id ?? ffi.nullptr); + return NSXMLElement._(_ret, _lib, retain: true, release: true); + } + + NSXMLElement initWithName_stringValue_(NSString? name, NSString? string) { + final _ret = _lib._objc_msgSend_165( + _id, + _lib._sel_initWithName_stringValue_1, + name?._id ?? ffi.nullptr, + string?._id ?? ffi.nullptr); + return NSXMLElement._(_ret, _lib, retain: true, release: true); + } + + NSXMLElement initWithXMLString_error_( + NSString? string, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_279(_id, + _lib._sel_initWithXMLString_error_1, string?._id ?? ffi.nullptr, error); + return NSXMLElement._(_ret, _lib, retain: true, release: true); + } + + @override + NSXMLElement initWithKind_options_(int kind, int options) { + final _ret = _lib._objc_msgSend_1000( + _id, _lib._sel_initWithKind_options_1, kind, options); + return NSXMLElement._(_ret, _lib, retain: true, release: true); + } + + NSArray elementsForName_(NSString? name) { + final _ret = _lib._objc_msgSend_123( + _id, _lib._sel_elementsForName_1, name?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray elementsForLocalName_URI_(NSString? localName, NSString? URI) { + final _ret = _lib._objc_msgSend_652( + _id, + _lib._sel_elementsForLocalName_URI_1, + localName?._id ?? ffi.nullptr, + URI?._id ?? ffi.nullptr); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + void addAttribute_(NSXMLNode? attribute) { + _lib._objc_msgSend_1012( + _id, _lib._sel_addAttribute_1, attribute?._id ?? ffi.nullptr); + } + + void removeAttributeForName_(NSString? name) { + _lib._objc_msgSend_192( + _id, _lib._sel_removeAttributeForName_1, name?._id ?? ffi.nullptr); + } + + NSArray? get attributes { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_attributes1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set attributes(NSArray? value) { + return _lib._objc_msgSend_731( + _id, _lib._sel_setAttributes_1, value?._id ?? ffi.nullptr); + } + + void setAttributesWithDictionary_(NSDictionary? attributes) { + _lib._objc_msgSend_476(_id, _lib._sel_setAttributesWithDictionary_1, + attributes?._id ?? ffi.nullptr); + } + + NSXMLNode attributeForName_(NSString? name) { + final _ret = _lib._objc_msgSend_1016( + _id, _lib._sel_attributeForName_1, name?._id ?? ffi.nullptr); + return NSXMLNode._(_ret, _lib, retain: true, release: true); + } + + NSXMLNode attributeForLocalName_URI_(NSString? localName, NSString? URI) { + final _ret = _lib._objc_msgSend_1033( + _id, + _lib._sel_attributeForLocalName_URI_1, + localName?._id ?? ffi.nullptr, + URI?._id ?? ffi.nullptr); + return NSXMLNode._(_ret, _lib, retain: true, release: true); + } + + void addNamespace_(NSXMLNode? aNamespace) { + _lib._objc_msgSend_1012( + _id, _lib._sel_addNamespace_1, aNamespace?._id ?? ffi.nullptr); + } + + void removeNamespaceForPrefix_(NSString? name) { + _lib._objc_msgSend_192( + _id, _lib._sel_removeNamespaceForPrefix_1, name?._id ?? ffi.nullptr); + } + + NSArray? get namespaces { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_namespaces1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + set namespaces(NSArray? value) { + return _lib._objc_msgSend_731( + _id, _lib._sel_setNamespaces_1, value?._id ?? ffi.nullptr); + } + + NSXMLNode namespaceForPrefix_(NSString? name) { + final _ret = _lib._objc_msgSend_1016( + _id, _lib._sel_namespaceForPrefix_1, name?._id ?? ffi.nullptr); + return NSXMLNode._(_ret, _lib, retain: true, release: true); + } + + NSXMLNode resolveNamespaceForName_(NSString? name) { + final _ret = _lib._objc_msgSend_1016( + _id, _lib._sel_resolveNamespaceForName_1, name?._id ?? ffi.nullptr); + return NSXMLNode._(_ret, _lib, retain: true, release: true); + } + + NSString resolvePrefixForNamespaceURI_(NSString? namespaceURI) { + final _ret = _lib._objc_msgSend_64( + _id, + _lib._sel_resolvePrefixForNamespaceURI_1, + namespaceURI?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + void insertChild_atIndex_(NSXMLNode? child, int index) { + _lib._objc_msgSend_1010( + _id, _lib._sel_insertChild_atIndex_1, child?._id ?? ffi.nullptr, index); + } + + void insertChildren_atIndex_(NSArray? children, int index) { + _lib._objc_msgSend_1011(_id, _lib._sel_insertChildren_atIndex_1, + children?._id ?? ffi.nullptr, index); + } + + void removeChildAtIndex_(int index) { + _lib._objc_msgSend_439(_id, _lib._sel_removeChildAtIndex_1, index); + } + + void setChildren_(NSArray? children) { + _lib._objc_msgSend_441( + _id, _lib._sel_setChildren_1, children?._id ?? ffi.nullptr); + } + + void addChild_(NSXMLNode? child) { + _lib._objc_msgSend_1012( + _id, _lib._sel_addChild_1, child?._id ?? ffi.nullptr); + } + + void replaceChildAtIndex_withNode_(int index, NSXMLNode? node) { + _lib._objc_msgSend_1013(_id, _lib._sel_replaceChildAtIndex_withNode_1, + index, node?._id ?? ffi.nullptr); + } + + void normalizeAdjacentTextNodesPreservingCDATA_(bool preserve) { + _lib._objc_msgSend_790( + _id, _lib._sel_normalizeAdjacentTextNodesPreservingCDATA_1, preserve); + } + + void setAttributesAsDictionary_(NSDictionary? attributes) { + _lib._objc_msgSend_476(_id, _lib._sel_setAttributesAsDictionary_1, + attributes?._id ?? ffi.nullptr); + } + + @override + NSXMLElement init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSXMLElement._(_ret, _lib, retain: true, release: true); + } + + @override + NSXMLElement initWithKind_(int kind) { + final _ret = _lib._objc_msgSend_999(_id, _lib._sel_initWithKind_1, kind); + return NSXMLElement._(_ret, _lib, retain: true, release: true); + } + + static NSObject document(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSXMLElement1, _lib._sel_document1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject documentWithRootElement_( + SentryCocoa _lib, NSXMLElement? element) { + final _ret = _lib._objc_msgSend_1001(_lib._class_NSXMLElement1, + _lib._sel_documentWithRootElement_1, element?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject elementWithName_(SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLElement1, + _lib._sel_elementWithName_1, name?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject elementWithName_URI_( + SentryCocoa _lib, NSString? name, NSString? URI) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLElement1, + _lib._sel_elementWithName_URI_1, + name?._id ?? ffi.nullptr, + URI?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject elementWithName_stringValue_( + SentryCocoa _lib, NSString? name, NSString? string) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLElement1, + _lib._sel_elementWithName_stringValue_1, + name?._id ?? ffi.nullptr, + string?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject elementWithName_children_attributes_(SentryCocoa _lib, + NSString? name, NSArray? children, NSArray? attributes) { + final _ret = _lib._objc_msgSend_1002( + _lib._class_NSXMLElement1, + _lib._sel_elementWithName_children_attributes_1, + name?._id ?? ffi.nullptr, + children?._id ?? ffi.nullptr, + attributes?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject attributeWithName_stringValue_( + SentryCocoa _lib, NSString? name, NSString? stringValue) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLElement1, + _lib._sel_attributeWithName_stringValue_1, + name?._id ?? ffi.nullptr, + stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject attributeWithName_URI_stringValue_( + SentryCocoa _lib, NSString? name, NSString? URI, NSString? stringValue) { + final _ret = _lib._objc_msgSend_26( + _lib._class_NSXMLElement1, + _lib._sel_attributeWithName_URI_stringValue_1, + name?._id ?? ffi.nullptr, + URI?._id ?? ffi.nullptr, + stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject namespaceWithName_stringValue_( + SentryCocoa _lib, NSString? name, NSString? stringValue) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLElement1, + _lib._sel_namespaceWithName_stringValue_1, + name?._id ?? ffi.nullptr, + stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject processingInstructionWithName_stringValue_( + SentryCocoa _lib, NSString? name, NSString? stringValue) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLElement1, + _lib._sel_processingInstructionWithName_stringValue_1, + name?._id ?? ffi.nullptr, + stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject commentWithStringValue_( + SentryCocoa _lib, NSString? stringValue) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLElement1, + _lib._sel_commentWithStringValue_1, stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject textWithStringValue_( + SentryCocoa _lib, NSString? stringValue) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLElement1, + _lib._sel_textWithStringValue_1, stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject DTDNodeWithXMLString_(SentryCocoa _lib, NSString? string) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLElement1, + _lib._sel_DTDNodeWithXMLString_1, string?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSString localNameForName_(SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLElement1, + _lib._sel_localNameForName_1, name?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString prefixForName_(SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLElement1, + _lib._sel_prefixForName_1, name?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSXMLNode predefinedNamespaceForPrefix_( + SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_1016(_lib._class_NSXMLElement1, + _lib._sel_predefinedNamespaceForPrefix_1, name?._id ?? ffi.nullptr); + return NSXMLNode._(_ret, _lib, retain: true, release: true); + } + + static NSXMLElement new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSXMLElement1, _lib._sel_new1); + return NSXMLElement._(_ret, _lib, retain: false, release: true); + } + + static NSXMLElement allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSXMLElement1, _lib._sel_allocWithZone_1, zone); + return NSXMLElement._(_ret, _lib, retain: false, release: true); + } + + static NSXMLElement alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSXMLElement1, _lib._sel_alloc1); + return NSXMLElement._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSXMLElement1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSXMLElement1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSXMLElement1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSXMLElement1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSXMLElement1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSXMLElement1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSXMLElement1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSXMLElement1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSXMLElement1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSXMLNode extends NSObject { + NSXMLNode._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSXMLNode] that points to the same underlying object as [other]. + static NSXMLNode castFrom(T other) { + return NSXMLNode._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSXMLNode] that wraps the given raw object pointer. + static NSXMLNode castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSXMLNode._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSXMLNode]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSXMLNode1); + } + + @override + NSXMLNode init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSXMLNode._(_ret, _lib, retain: true, release: true); + } + + NSXMLNode initWithKind_(int kind) { + final _ret = _lib._objc_msgSend_999(_id, _lib._sel_initWithKind_1, kind); + return NSXMLNode._(_ret, _lib, retain: true, release: true); + } + + NSXMLNode initWithKind_options_(int kind, int options) { + final _ret = _lib._objc_msgSend_1000( + _id, _lib._sel_initWithKind_options_1, kind, options); + return NSXMLNode._(_ret, _lib, retain: true, release: true); + } + + static NSObject document(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSXMLNode1, _lib._sel_document1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject documentWithRootElement_( + SentryCocoa _lib, NSXMLElement? element) { + final _ret = _lib._objc_msgSend_1001(_lib._class_NSXMLNode1, + _lib._sel_documentWithRootElement_1, element?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject elementWithName_(SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLNode1, + _lib._sel_elementWithName_1, name?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject elementWithName_URI_( + SentryCocoa _lib, NSString? name, NSString? URI) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLNode1, + _lib._sel_elementWithName_URI_1, + name?._id ?? ffi.nullptr, + URI?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject elementWithName_stringValue_( + SentryCocoa _lib, NSString? name, NSString? string) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLNode1, + _lib._sel_elementWithName_stringValue_1, + name?._id ?? ffi.nullptr, + string?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject elementWithName_children_attributes_(SentryCocoa _lib, + NSString? name, NSArray? children, NSArray? attributes) { + final _ret = _lib._objc_msgSend_1002( + _lib._class_NSXMLNode1, + _lib._sel_elementWithName_children_attributes_1, + name?._id ?? ffi.nullptr, + children?._id ?? ffi.nullptr, + attributes?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject attributeWithName_stringValue_( + SentryCocoa _lib, NSString? name, NSString? stringValue) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLNode1, + _lib._sel_attributeWithName_stringValue_1, + name?._id ?? ffi.nullptr, + stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject attributeWithName_URI_stringValue_( + SentryCocoa _lib, NSString? name, NSString? URI, NSString? stringValue) { + final _ret = _lib._objc_msgSend_26( + _lib._class_NSXMLNode1, + _lib._sel_attributeWithName_URI_stringValue_1, + name?._id ?? ffi.nullptr, + URI?._id ?? ffi.nullptr, + stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject namespaceWithName_stringValue_( + SentryCocoa _lib, NSString? name, NSString? stringValue) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLNode1, + _lib._sel_namespaceWithName_stringValue_1, + name?._id ?? ffi.nullptr, + stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject processingInstructionWithName_stringValue_( + SentryCocoa _lib, NSString? name, NSString? stringValue) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLNode1, + _lib._sel_processingInstructionWithName_stringValue_1, + name?._id ?? ffi.nullptr, + stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject commentWithStringValue_( + SentryCocoa _lib, NSString? stringValue) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLNode1, + _lib._sel_commentWithStringValue_1, stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject textWithStringValue_( + SentryCocoa _lib, NSString? stringValue) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLNode1, + _lib._sel_textWithStringValue_1, stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject DTDNodeWithXMLString_(SentryCocoa _lib, NSString? string) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLNode1, + _lib._sel_DTDNodeWithXMLString_1, string?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + int get kind { + return _lib._objc_msgSend_1003(_id, _lib._sel_kind1); + } + + NSString? get name { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_name1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set name(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setName_1, value?._id ?? ffi.nullptr); + } + + NSObject get objectValue { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_objectValue1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + set objectValue(NSObject value) { + return _lib._objc_msgSend_387(_id, _lib._sel_setObjectValue_1, value._id); + } + + NSString? get stringValue { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_stringValue1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set stringValue(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setStringValue_1, value?._id ?? ffi.nullptr); + } + + void setStringValue_resolvingEntities_(NSString? string, bool resolve) { + _lib._objc_msgSend_1004(_id, _lib._sel_setStringValue_resolvingEntities_1, + string?._id ?? ffi.nullptr, resolve); + } + + int get index { + return _lib._objc_msgSend_10(_id, _lib._sel_index1); + } + + int get level { + return _lib._objc_msgSend_10(_id, _lib._sel_level1); + } + + NSXMLDocument? get rootDocument { + final _ret = _lib._objc_msgSend_1027(_id, _lib._sel_rootDocument1); + return _ret.address == 0 + ? null + : NSXMLDocument._(_ret, _lib, retain: true, release: true); + } + + NSXMLNode? get parent { + final _ret = _lib._objc_msgSend_1028(_id, _lib._sel_parent1); + return _ret.address == 0 + ? null + : NSXMLNode._(_ret, _lib, retain: true, release: true); + } + + int get childCount { + return _lib._objc_msgSend_10(_id, _lib._sel_childCount1); + } + + NSArray? get children { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_children1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + NSXMLNode childAtIndex_(int index) { + final _ret = _lib._objc_msgSend_1029(_id, _lib._sel_childAtIndex_1, index); + return NSXMLNode._(_ret, _lib, retain: true, release: true); + } + + NSXMLNode? get previousSibling { + final _ret = _lib._objc_msgSend_1028(_id, _lib._sel_previousSibling1); + return _ret.address == 0 + ? null + : NSXMLNode._(_ret, _lib, retain: true, release: true); + } + + NSXMLNode? get nextSibling { + final _ret = _lib._objc_msgSend_1028(_id, _lib._sel_nextSibling1); + return _ret.address == 0 + ? null + : NSXMLNode._(_ret, _lib, retain: true, release: true); + } + + NSXMLNode? get previousNode { + final _ret = _lib._objc_msgSend_1028(_id, _lib._sel_previousNode1); + return _ret.address == 0 + ? null + : NSXMLNode._(_ret, _lib, retain: true, release: true); + } + + NSXMLNode? get nextNode { + final _ret = _lib._objc_msgSend_1028(_id, _lib._sel_nextNode1); + return _ret.address == 0 + ? null + : NSXMLNode._(_ret, _lib, retain: true, release: true); + } + + void detach() { + _lib._objc_msgSend_1(_id, _lib._sel_detach1); + } + + NSString? get XPath { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_XPath1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get localName { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_localName1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get prefix { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_prefix1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get URI { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_URI1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set URI(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setURI_1, value?._id ?? ffi.nullptr); + } + + static NSString localNameForName_(SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLNode1, + _lib._sel_localNameForName_1, name?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString prefixForName_(SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLNode1, + _lib._sel_prefixForName_1, name?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSXMLNode predefinedNamespaceForPrefix_( + SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_1016(_lib._class_NSXMLNode1, + _lib._sel_predefinedNamespaceForPrefix_1, name?._id ?? ffi.nullptr); + return NSXMLNode._(_ret, _lib, retain: true, release: true); + } + + NSString? get description { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_description1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString? get XMLString { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_XMLString1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + NSString XMLStringWithOptions_(int options) { + final _ret = + _lib._objc_msgSend_1030(_id, _lib._sel_XMLStringWithOptions_1, options); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSString canonicalXMLStringPreservingComments_(bool comments) { + final _ret = _lib._objc_msgSend_1031( + _id, _lib._sel_canonicalXMLStringPreservingComments_1, comments); + return NSString._(_ret, _lib, retain: true, release: true); + } + + NSArray nodesForXPath_error_( + NSString? xpath, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_414( + _id, _lib._sel_nodesForXPath_error_1, xpath?._id ?? ffi.nullptr, error); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray objectsForXQuery_constants_error_(NSString? xquery, + NSDictionary? constants, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_1032( + _id, + _lib._sel_objectsForXQuery_constants_error_1, + xquery?._id ?? ffi.nullptr, + constants?._id ?? ffi.nullptr, + error); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + NSArray objectsForXQuery_error_( + NSString? xquery, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_414(_id, _lib._sel_objectsForXQuery_error_1, + xquery?._id ?? ffi.nullptr, error); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSXMLNode new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSXMLNode1, _lib._sel_new1); + return NSXMLNode._(_ret, _lib, retain: false, release: true); + } + + static NSXMLNode allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSXMLNode1, _lib._sel_allocWithZone_1, zone); + return NSXMLNode._(_ret, _lib, retain: false, release: true); + } + + static NSXMLNode alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSXMLNode1, _lib._sel_alloc1); + return NSXMLNode._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSXMLNode1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSXMLNode1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSXMLNode1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSXMLNode1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSXMLNode1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSXMLNode1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSXMLNode1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSXMLNode1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSXMLNode1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSXMLNodeKind { + static const int NSXMLInvalidKind = 0; + static const int NSXMLDocumentKind = 1; + static const int NSXMLElementKind = 2; + static const int NSXMLAttributeKind = 3; + static const int NSXMLNamespaceKind = 4; + static const int NSXMLProcessingInstructionKind = 5; + static const int NSXMLCommentKind = 6; + static const int NSXMLTextKind = 7; + static const int NSXMLDTDKind = 8; + static const int NSXMLEntityDeclarationKind = 9; + static const int NSXMLAttributeDeclarationKind = 10; + static const int NSXMLElementDeclarationKind = 11; + static const int NSXMLNotationDeclarationKind = 12; +} + +abstract class NSXMLNodeOptions { + static const int NSXMLNodeOptionsNone = 0; + static const int NSXMLNodeIsCDATA = 1; + static const int NSXMLNodeExpandEmptyElement = 2; + static const int NSXMLNodeCompactEmptyElement = 4; + static const int NSXMLNodeUseSingleQuotes = 8; + static const int NSXMLNodeUseDoubleQuotes = 16; + static const int NSXMLNodeNeverEscapeContents = 32; + static const int NSXMLDocumentTidyHTML = 512; + static const int NSXMLDocumentTidyXML = 1024; + static const int NSXMLDocumentValidate = 8192; + static const int NSXMLNodeLoadExternalEntitiesAlways = 16384; + static const int NSXMLNodeLoadExternalEntitiesSameOriginOnly = 32768; + static const int NSXMLNodeLoadExternalEntitiesNever = 524288; + static const int NSXMLDocumentXInclude = 65536; + static const int NSXMLNodePrettyPrint = 131072; + static const int NSXMLDocumentIncludeContentTypeDeclaration = 262144; + static const int NSXMLNodePreserveNamespaceOrder = 1048576; + static const int NSXMLNodePreserveAttributeOrder = 2097152; + static const int NSXMLNodePreserveEntities = 4194304; + static const int NSXMLNodePreservePrefixes = 8388608; + static const int NSXMLNodePreserveCDATA = 16777216; + static const int NSXMLNodePreserveWhitespace = 33554432; + static const int NSXMLNodePreserveDTD = 67108864; + static const int NSXMLNodePreserveCharacterReferences = 134217728; + static const int NSXMLNodePromoteSignificantWhitespace = 268435456; + static const int NSXMLNodePreserveEmptyElements = 6; + static const int NSXMLNodePreserveQuotes = 24; + static const int NSXMLNodePreserveAll = 4293918750; +} + +class NSXMLDocument extends NSXMLNode { + NSXMLDocument._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSXMLDocument] that points to the same underlying object as [other]. + static NSXMLDocument castFrom(T other) { + return NSXMLDocument._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSXMLDocument] that wraps the given raw object pointer. + static NSXMLDocument castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSXMLDocument._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSXMLDocument]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSXMLDocument1); + } + + @override + NSXMLDocument init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSXMLDocument._(_ret, _lib, retain: true, release: true); + } + + NSXMLDocument initWithXMLString_options_error_( + NSString? string, int mask, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_1005( + _id, + _lib._sel_initWithXMLString_options_error_1, + string?._id ?? ffi.nullptr, + mask, + error); + return NSXMLDocument._(_ret, _lib, retain: true, release: true); + } + + NSXMLDocument initWithContentsOfURL_options_error_( + NSURL? url, int mask, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_1006( + _id, + _lib._sel_initWithContentsOfURL_options_error_1, + url?._id ?? ffi.nullptr, + mask, + error); + return NSXMLDocument._(_ret, _lib, retain: true, release: true); + } + + NSXMLDocument initWithData_options_error_( + NSData? data, int mask, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_1007( + _id, + _lib._sel_initWithData_options_error_1, + data?._id ?? ffi.nullptr, + mask, + error); + return NSXMLDocument._(_ret, _lib, retain: true, release: true); + } + + NSXMLDocument initWithRootElement_(NSXMLElement? element) { + final _ret = _lib._objc_msgSend_1001( + _id, _lib._sel_initWithRootElement_1, element?._id ?? ffi.nullptr); + return NSXMLDocument._(_ret, _lib, retain: true, release: true); + } + + static NSObject replacementClassForClass_(SentryCocoa _lib, NSObject cls) { + final _ret = _lib._objc_msgSend_16(_lib._class_NSXMLDocument1, + _lib._sel_replacementClassForClass_1, cls._id); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSString? get characterEncoding { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_characterEncoding1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set characterEncoding(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setCharacterEncoding_1, value?._id ?? ffi.nullptr); + } + + NSString? get version { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_version1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set version(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setVersion_1, value?._id ?? ffi.nullptr); + } + + bool get standalone { + return _lib._objc_msgSend_12(_id, _lib._sel_isStandalone1); + } + + set standalone(bool value) { + return _lib._objc_msgSend_492(_id, _lib._sel_setStandalone_1, value); + } + + int get documentContentKind { + return _lib._objc_msgSend_1008(_id, _lib._sel_documentContentKind1); + } + + set documentContentKind(int value) { + return _lib._objc_msgSend_1009( + _id, _lib._sel_setDocumentContentKind_1, value); + } + + NSString? get MIMEType { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_MIMEType1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set MIMEType(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setMIMEType_1, value?._id ?? ffi.nullptr); + } + + NSXMLDTD? get DTD { + final _ret = _lib._objc_msgSend_1019(_id, _lib._sel_DTD1); + return _ret.address == 0 + ? null + : NSXMLDTD._(_ret, _lib, retain: true, release: true); + } + + set DTD(NSXMLDTD? value) { + return _lib._objc_msgSend_1020( + _id, _lib._sel_setDTD_1, value?._id ?? ffi.nullptr); + } + + void setRootElement_(NSXMLElement? root) { + _lib._objc_msgSend_1021( + _id, _lib._sel_setRootElement_1, root?._id ?? ffi.nullptr); + } + + NSXMLElement rootElement() { + final _ret = _lib._objc_msgSend_1022(_id, _lib._sel_rootElement1); + return NSXMLElement._(_ret, _lib, retain: true, release: true); + } + + void insertChild_atIndex_(NSXMLNode? child, int index) { + _lib._objc_msgSend_1010( + _id, _lib._sel_insertChild_atIndex_1, child?._id ?? ffi.nullptr, index); + } + + void insertChildren_atIndex_(NSArray? children, int index) { + _lib._objc_msgSend_1011(_id, _lib._sel_insertChildren_atIndex_1, + children?._id ?? ffi.nullptr, index); + } + + void removeChildAtIndex_(int index) { + _lib._objc_msgSend_439(_id, _lib._sel_removeChildAtIndex_1, index); + } + + void setChildren_(NSArray? children) { + _lib._objc_msgSend_441( + _id, _lib._sel_setChildren_1, children?._id ?? ffi.nullptr); + } + + void addChild_(NSXMLNode? child) { + _lib._objc_msgSend_1012( + _id, _lib._sel_addChild_1, child?._id ?? ffi.nullptr); + } + + void replaceChildAtIndex_withNode_(int index, NSXMLNode? node) { + _lib._objc_msgSend_1013(_id, _lib._sel_replaceChildAtIndex_withNode_1, + index, node?._id ?? ffi.nullptr); + } + + NSData? get XMLData { + final _ret = _lib._objc_msgSend_39(_id, _lib._sel_XMLData1); + return _ret.address == 0 + ? null + : NSData._(_ret, _lib, retain: true, release: true); + } + + NSData XMLDataWithOptions_(int options) { + final _ret = + _lib._objc_msgSend_1023(_id, _lib._sel_XMLDataWithOptions_1, options); + return NSData._(_ret, _lib, retain: true, release: true); + } + + NSObject objectByApplyingXSLT_arguments_error_(NSData? xslt, + NSDictionary? arguments, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_1024( + _id, + _lib._sel_objectByApplyingXSLT_arguments_error_1, + xslt?._id ?? ffi.nullptr, + arguments?._id ?? ffi.nullptr, + error); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject objectByApplyingXSLTString_arguments_error_(NSString? xslt, + NSDictionary? arguments, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_1025( + _id, + _lib._sel_objectByApplyingXSLTString_arguments_error_1, + xslt?._id ?? ffi.nullptr, + arguments?._id ?? ffi.nullptr, + error); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + NSObject objectByApplyingXSLTAtURL_arguments_error_(NSURL? xsltURL, + NSDictionary? argument, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_1026( + _id, + _lib._sel_objectByApplyingXSLTAtURL_arguments_error_1, + xsltURL?._id ?? ffi.nullptr, + argument?._id ?? ffi.nullptr, + error); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + bool validateAndReturnError_(ffi.Pointer> error) { + return _lib._objc_msgSend_225( + _id, _lib._sel_validateAndReturnError_1, error); + } + + @override + NSXMLDocument initWithKind_(int kind) { + final _ret = _lib._objc_msgSend_999(_id, _lib._sel_initWithKind_1, kind); + return NSXMLDocument._(_ret, _lib, retain: true, release: true); + } + + @override + NSXMLDocument initWithKind_options_(int kind, int options) { + final _ret = _lib._objc_msgSend_1000( + _id, _lib._sel_initWithKind_options_1, kind, options); + return NSXMLDocument._(_ret, _lib, retain: true, release: true); + } + + static NSObject document(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSXMLDocument1, _lib._sel_document1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject documentWithRootElement_( + SentryCocoa _lib, NSXMLElement? element) { + final _ret = _lib._objc_msgSend_1001(_lib._class_NSXMLDocument1, + _lib._sel_documentWithRootElement_1, element?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject elementWithName_(SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDocument1, + _lib._sel_elementWithName_1, name?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject elementWithName_URI_( + SentryCocoa _lib, NSString? name, NSString? URI) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLDocument1, + _lib._sel_elementWithName_URI_1, + name?._id ?? ffi.nullptr, + URI?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject elementWithName_stringValue_( + SentryCocoa _lib, NSString? name, NSString? string) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLDocument1, + _lib._sel_elementWithName_stringValue_1, + name?._id ?? ffi.nullptr, + string?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject elementWithName_children_attributes_(SentryCocoa _lib, + NSString? name, NSArray? children, NSArray? attributes) { + final _ret = _lib._objc_msgSend_1002( + _lib._class_NSXMLDocument1, + _lib._sel_elementWithName_children_attributes_1, + name?._id ?? ffi.nullptr, + children?._id ?? ffi.nullptr, + attributes?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject attributeWithName_stringValue_( + SentryCocoa _lib, NSString? name, NSString? stringValue) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLDocument1, + _lib._sel_attributeWithName_stringValue_1, + name?._id ?? ffi.nullptr, + stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject attributeWithName_URI_stringValue_( + SentryCocoa _lib, NSString? name, NSString? URI, NSString? stringValue) { + final _ret = _lib._objc_msgSend_26( + _lib._class_NSXMLDocument1, + _lib._sel_attributeWithName_URI_stringValue_1, + name?._id ?? ffi.nullptr, + URI?._id ?? ffi.nullptr, + stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject namespaceWithName_stringValue_( + SentryCocoa _lib, NSString? name, NSString? stringValue) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLDocument1, + _lib._sel_namespaceWithName_stringValue_1, + name?._id ?? ffi.nullptr, + stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject processingInstructionWithName_stringValue_( + SentryCocoa _lib, NSString? name, NSString? stringValue) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLDocument1, + _lib._sel_processingInstructionWithName_stringValue_1, + name?._id ?? ffi.nullptr, + stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject commentWithStringValue_( + SentryCocoa _lib, NSString? stringValue) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDocument1, + _lib._sel_commentWithStringValue_1, stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject textWithStringValue_( + SentryCocoa _lib, NSString? stringValue) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDocument1, + _lib._sel_textWithStringValue_1, stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject DTDNodeWithXMLString_(SentryCocoa _lib, NSString? string) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDocument1, + _lib._sel_DTDNodeWithXMLString_1, string?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSString localNameForName_(SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLDocument1, + _lib._sel_localNameForName_1, name?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString prefixForName_(SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLDocument1, + _lib._sel_prefixForName_1, name?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSXMLNode predefinedNamespaceForPrefix_( + SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_1016(_lib._class_NSXMLDocument1, + _lib._sel_predefinedNamespaceForPrefix_1, name?._id ?? ffi.nullptr); + return NSXMLNode._(_ret, _lib, retain: true, release: true); + } + + static NSXMLDocument new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSXMLDocument1, _lib._sel_new1); + return NSXMLDocument._(_ret, _lib, retain: false, release: true); + } + + static NSXMLDocument allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSXMLDocument1, _lib._sel_allocWithZone_1, zone); + return NSXMLDocument._(_ret, _lib, retain: false, release: true); + } + + static NSXMLDocument alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSXMLDocument1, _lib._sel_alloc1); + return NSXMLDocument._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSXMLDocument1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSXMLDocument1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSXMLDocument1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSXMLDocument1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSXMLDocument1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSXMLDocument1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSXMLDocument1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSXMLDocument1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSXMLDocument1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSXMLDocumentContentKind { + static const int NSXMLDocumentXMLKind = 0; + static const int NSXMLDocumentXHTMLKind = 1; + static const int NSXMLDocumentHTMLKind = 2; + static const int NSXMLDocumentTextKind = 3; +} + +class NSXMLDTD extends NSXMLNode { + NSXMLDTD._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSXMLDTD] that points to the same underlying object as [other]. + static NSXMLDTD castFrom(T other) { + return NSXMLDTD._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSXMLDTD] that wraps the given raw object pointer. + static NSXMLDTD castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSXMLDTD._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSXMLDTD]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSXMLDTD1); + } + + @override + NSXMLDTD init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSXMLDTD._(_ret, _lib, retain: true, release: true); + } + + @override + NSXMLDTD initWithKind_options_(int kind, int options) { + final _ret = _lib._objc_msgSend_1000( + _id, _lib._sel_initWithKind_options_1, kind, options); + return NSXMLDTD._(_ret, _lib, retain: true, release: true); + } + + NSXMLDTD initWithContentsOfURL_options_error_( + NSURL? url, int mask, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_1006( + _id, + _lib._sel_initWithContentsOfURL_options_error_1, + url?._id ?? ffi.nullptr, + mask, + error); + return NSXMLDTD._(_ret, _lib, retain: true, release: true); + } + + NSXMLDTD initWithData_options_error_( + NSData? data, int mask, ffi.Pointer> error) { + final _ret = _lib._objc_msgSend_1007( + _id, + _lib._sel_initWithData_options_error_1, + data?._id ?? ffi.nullptr, + mask, + error); + return NSXMLDTD._(_ret, _lib, retain: true, release: true); + } + + NSString? get publicID { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_publicID1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set publicID(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setPublicID_1, value?._id ?? ffi.nullptr); + } + + NSString? get systemID { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_systemID1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set systemID(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setSystemID_1, value?._id ?? ffi.nullptr); + } + + void insertChild_atIndex_(NSXMLNode? child, int index) { + _lib._objc_msgSend_1010( + _id, _lib._sel_insertChild_atIndex_1, child?._id ?? ffi.nullptr, index); + } + + void insertChildren_atIndex_(NSArray? children, int index) { + _lib._objc_msgSend_1011(_id, _lib._sel_insertChildren_atIndex_1, + children?._id ?? ffi.nullptr, index); + } + + void removeChildAtIndex_(int index) { + _lib._objc_msgSend_439(_id, _lib._sel_removeChildAtIndex_1, index); + } + + void setChildren_(NSArray? children) { + _lib._objc_msgSend_441( + _id, _lib._sel_setChildren_1, children?._id ?? ffi.nullptr); + } + + void addChild_(NSXMLNode? child) { + _lib._objc_msgSend_1012( + _id, _lib._sel_addChild_1, child?._id ?? ffi.nullptr); + } + + void replaceChildAtIndex_withNode_(int index, NSXMLNode? node) { + _lib._objc_msgSend_1013(_id, _lib._sel_replaceChildAtIndex_withNode_1, + index, node?._id ?? ffi.nullptr); + } + + NSXMLDTDNode entityDeclarationForName_(NSString? name) { + final _ret = _lib._objc_msgSend_1017( + _id, _lib._sel_entityDeclarationForName_1, name?._id ?? ffi.nullptr); + return NSXMLDTDNode._(_ret, _lib, retain: true, release: true); + } + + NSXMLDTDNode notationDeclarationForName_(NSString? name) { + final _ret = _lib._objc_msgSend_1017( + _id, _lib._sel_notationDeclarationForName_1, name?._id ?? ffi.nullptr); + return NSXMLDTDNode._(_ret, _lib, retain: true, release: true); + } + + NSXMLDTDNode elementDeclarationForName_(NSString? name) { + final _ret = _lib._objc_msgSend_1017( + _id, _lib._sel_elementDeclarationForName_1, name?._id ?? ffi.nullptr); + return NSXMLDTDNode._(_ret, _lib, retain: true, release: true); + } + + NSXMLDTDNode attributeDeclarationForName_elementName_( + NSString? name, NSString? elementName) { + final _ret = _lib._objc_msgSend_1018( + _id, + _lib._sel_attributeDeclarationForName_elementName_1, + name?._id ?? ffi.nullptr, + elementName?._id ?? ffi.nullptr); + return NSXMLDTDNode._(_ret, _lib, retain: true, release: true); + } + + static NSXMLDTDNode predefinedEntityDeclarationForName_( + SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_1017( + _lib._class_NSXMLDTD1, + _lib._sel_predefinedEntityDeclarationForName_1, + name?._id ?? ffi.nullptr); + return NSXMLDTDNode._(_ret, _lib, retain: true, release: true); + } + + @override + NSXMLDTD initWithKind_(int kind) { + final _ret = _lib._objc_msgSend_999(_id, _lib._sel_initWithKind_1, kind); + return NSXMLDTD._(_ret, _lib, retain: true, release: true); + } + + static NSObject document(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSXMLDTD1, _lib._sel_document1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject documentWithRootElement_( + SentryCocoa _lib, NSXMLElement? element) { + final _ret = _lib._objc_msgSend_1001(_lib._class_NSXMLDTD1, + _lib._sel_documentWithRootElement_1, element?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject elementWithName_(SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTD1, + _lib._sel_elementWithName_1, name?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject elementWithName_URI_( + SentryCocoa _lib, NSString? name, NSString? URI) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLDTD1, + _lib._sel_elementWithName_URI_1, + name?._id ?? ffi.nullptr, + URI?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject elementWithName_stringValue_( + SentryCocoa _lib, NSString? name, NSString? string) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLDTD1, + _lib._sel_elementWithName_stringValue_1, + name?._id ?? ffi.nullptr, + string?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject elementWithName_children_attributes_(SentryCocoa _lib, + NSString? name, NSArray? children, NSArray? attributes) { + final _ret = _lib._objc_msgSend_1002( + _lib._class_NSXMLDTD1, + _lib._sel_elementWithName_children_attributes_1, + name?._id ?? ffi.nullptr, + children?._id ?? ffi.nullptr, + attributes?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject attributeWithName_stringValue_( + SentryCocoa _lib, NSString? name, NSString? stringValue) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLDTD1, + _lib._sel_attributeWithName_stringValue_1, + name?._id ?? ffi.nullptr, + stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject attributeWithName_URI_stringValue_( + SentryCocoa _lib, NSString? name, NSString? URI, NSString? stringValue) { + final _ret = _lib._objc_msgSend_26( + _lib._class_NSXMLDTD1, + _lib._sel_attributeWithName_URI_stringValue_1, + name?._id ?? ffi.nullptr, + URI?._id ?? ffi.nullptr, + stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject namespaceWithName_stringValue_( + SentryCocoa _lib, NSString? name, NSString? stringValue) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLDTD1, + _lib._sel_namespaceWithName_stringValue_1, + name?._id ?? ffi.nullptr, + stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject processingInstructionWithName_stringValue_( + SentryCocoa _lib, NSString? name, NSString? stringValue) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLDTD1, + _lib._sel_processingInstructionWithName_stringValue_1, + name?._id ?? ffi.nullptr, + stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject commentWithStringValue_( + SentryCocoa _lib, NSString? stringValue) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTD1, + _lib._sel_commentWithStringValue_1, stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject textWithStringValue_( + SentryCocoa _lib, NSString? stringValue) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTD1, + _lib._sel_textWithStringValue_1, stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject DTDNodeWithXMLString_(SentryCocoa _lib, NSString? string) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTD1, + _lib._sel_DTDNodeWithXMLString_1, string?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSString localNameForName_(SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLDTD1, + _lib._sel_localNameForName_1, name?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString prefixForName_(SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLDTD1, + _lib._sel_prefixForName_1, name?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSXMLNode predefinedNamespaceForPrefix_( + SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_1016(_lib._class_NSXMLDTD1, + _lib._sel_predefinedNamespaceForPrefix_1, name?._id ?? ffi.nullptr); + return NSXMLNode._(_ret, _lib, retain: true, release: true); + } + + static NSXMLDTD new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSXMLDTD1, _lib._sel_new1); + return NSXMLDTD._(_ret, _lib, retain: false, release: true); + } + + static NSXMLDTD allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSXMLDTD1, _lib._sel_allocWithZone_1, zone); + return NSXMLDTD._(_ret, _lib, retain: false, release: true); + } + + static NSXMLDTD alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSXMLDTD1, _lib._sel_alloc1); + return NSXMLDTD._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSXMLDTD1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSXMLDTD1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSXMLDTD1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSXMLDTD1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSXMLDTD1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSXMLDTD1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSXMLDTD1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSXMLDTD1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSXMLDTD1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSXMLDTDNode extends NSXMLNode { + NSXMLDTDNode._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSXMLDTDNode] that points to the same underlying object as [other]. + static NSXMLDTDNode castFrom(T other) { + return NSXMLDTDNode._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSXMLDTDNode] that wraps the given raw object pointer. + static NSXMLDTDNode castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSXMLDTDNode._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSXMLDTDNode]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSXMLDTDNode1); + } + + NSXMLDTDNode initWithXMLString_(NSString? string) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithXMLString_1, string?._id ?? ffi.nullptr); + return NSXMLDTDNode._(_ret, _lib, retain: true, release: true); + } + + @override + NSXMLDTDNode initWithKind_options_(int kind, int options) { + final _ret = _lib._objc_msgSend_1000( + _id, _lib._sel_initWithKind_options_1, kind, options); + return NSXMLDTDNode._(_ret, _lib, retain: true, release: true); + } + + @override + NSXMLDTDNode init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSXMLDTDNode._(_ret, _lib, retain: true, release: true); + } + + int get DTDKind { + return _lib._objc_msgSend_1014(_id, _lib._sel_DTDKind1); + } + + set DTDKind(int value) { + return _lib._objc_msgSend_1015(_id, _lib._sel_setDTDKind_1, value); + } + + bool get external1 { + return _lib._objc_msgSend_12(_id, _lib._sel_isExternal1); + } + + NSString? get publicID { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_publicID1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set publicID(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setPublicID_1, value?._id ?? ffi.nullptr); + } + + NSString? get systemID { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_systemID1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set systemID(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setSystemID_1, value?._id ?? ffi.nullptr); + } + + NSString? get notationName { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_notationName1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + set notationName(NSString? value) { + return _lib._objc_msgSend_509( + _id, _lib._sel_setNotationName_1, value?._id ?? ffi.nullptr); + } + + @override + NSXMLDTDNode initWithKind_(int kind) { + final _ret = _lib._objc_msgSend_999(_id, _lib._sel_initWithKind_1, kind); + return NSXMLDTDNode._(_ret, _lib, retain: true, release: true); + } + + static NSObject document(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSXMLDTDNode1, _lib._sel_document1); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject documentWithRootElement_( + SentryCocoa _lib, NSXMLElement? element) { + final _ret = _lib._objc_msgSend_1001(_lib._class_NSXMLDTDNode1, + _lib._sel_documentWithRootElement_1, element?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject elementWithName_(SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTDNode1, + _lib._sel_elementWithName_1, name?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject elementWithName_URI_( + SentryCocoa _lib, NSString? name, NSString? URI) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLDTDNode1, + _lib._sel_elementWithName_URI_1, + name?._id ?? ffi.nullptr, + URI?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject elementWithName_stringValue_( + SentryCocoa _lib, NSString? name, NSString? string) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLDTDNode1, + _lib._sel_elementWithName_stringValue_1, + name?._id ?? ffi.nullptr, + string?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject elementWithName_children_attributes_(SentryCocoa _lib, + NSString? name, NSArray? children, NSArray? attributes) { + final _ret = _lib._objc_msgSend_1002( + _lib._class_NSXMLDTDNode1, + _lib._sel_elementWithName_children_attributes_1, + name?._id ?? ffi.nullptr, + children?._id ?? ffi.nullptr, + attributes?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject attributeWithName_stringValue_( + SentryCocoa _lib, NSString? name, NSString? stringValue) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLDTDNode1, + _lib._sel_attributeWithName_stringValue_1, + name?._id ?? ffi.nullptr, + stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject attributeWithName_URI_stringValue_( + SentryCocoa _lib, NSString? name, NSString? URI, NSString? stringValue) { + final _ret = _lib._objc_msgSend_26( + _lib._class_NSXMLDTDNode1, + _lib._sel_attributeWithName_URI_stringValue_1, + name?._id ?? ffi.nullptr, + URI?._id ?? ffi.nullptr, + stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject namespaceWithName_stringValue_( + SentryCocoa _lib, NSString? name, NSString? stringValue) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLDTDNode1, + _lib._sel_namespaceWithName_stringValue_1, + name?._id ?? ffi.nullptr, + stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject processingInstructionWithName_stringValue_( + SentryCocoa _lib, NSString? name, NSString? stringValue) { + final _ret = _lib._objc_msgSend_165( + _lib._class_NSXMLDTDNode1, + _lib._sel_processingInstructionWithName_stringValue_1, + name?._id ?? ffi.nullptr, + stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject commentWithStringValue_( + SentryCocoa _lib, NSString? stringValue) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTDNode1, + _lib._sel_commentWithStringValue_1, stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject textWithStringValue_( + SentryCocoa _lib, NSString? stringValue) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTDNode1, + _lib._sel_textWithStringValue_1, stringValue?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSObject DTDNodeWithXMLString_(SentryCocoa _lib, NSString? string) { + final _ret = _lib._objc_msgSend_30(_lib._class_NSXMLDTDNode1, + _lib._sel_DTDNodeWithXMLString_1, string?._id ?? ffi.nullptr); + return NSObject._(_ret, _lib, retain: true, release: true); + } + + static NSString localNameForName_(SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLDTDNode1, + _lib._sel_localNameForName_1, name?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSString prefixForName_(SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_64(_lib._class_NSXMLDTDNode1, + _lib._sel_prefixForName_1, name?._id ?? ffi.nullptr); + return NSString._(_ret, _lib, retain: true, release: true); + } + + static NSXMLNode predefinedNamespaceForPrefix_( + SentryCocoa _lib, NSString? name) { + final _ret = _lib._objc_msgSend_1016(_lib._class_NSXMLDTDNode1, + _lib._sel_predefinedNamespaceForPrefix_1, name?._id ?? ffi.nullptr); + return NSXMLNode._(_ret, _lib, retain: true, release: true); + } + + static NSXMLDTDNode new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSXMLDTDNode1, _lib._sel_new1); + return NSXMLDTDNode._(_ret, _lib, retain: false, release: true); + } + + static NSXMLDTDNode allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSXMLDTDNode1, _lib._sel_allocWithZone_1, zone); + return NSXMLDTDNode._(_ret, _lib, retain: false, release: true); + } + + static NSXMLDTDNode alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_NSXMLDTDNode1, _lib._sel_alloc1); + return NSXMLDTDNode._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSXMLDTDNode1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSXMLDTDNode1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSXMLDTDNode1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSXMLDTDNode1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSXMLDTDNode1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSXMLDTDNode1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSXMLDTDNode1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSXMLDTDNode1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSXMLDTDNode1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +abstract class NSXMLDTDNodeKind { + static const int NSXMLEntityGeneralKind = 1; + static const int NSXMLEntityParsedKind = 2; + static const int NSXMLEntityUnparsedKind = 3; + static const int NSXMLEntityParameterKind = 4; + static const int NSXMLEntityPredefined = 5; + static const int NSXMLAttributeCDATAKind = 6; + static const int NSXMLAttributeIDKind = 7; + static const int NSXMLAttributeIDRefKind = 8; + static const int NSXMLAttributeIDRefsKind = 9; + static const int NSXMLAttributeEntityKind = 10; + static const int NSXMLAttributeEntitiesKind = 11; + static const int NSXMLAttributeNMTokenKind = 12; + static const int NSXMLAttributeNMTokensKind = 13; + static const int NSXMLAttributeEnumerationKind = 14; + static const int NSXMLAttributeNotationKind = 15; + static const int NSXMLElementDeclarationUndefinedKind = 16; + static const int NSXMLElementDeclarationEmptyKind = 17; + static const int NSXMLElementDeclarationAnyKind = 18; + static const int NSXMLElementDeclarationMixedKind = 19; + static const int NSXMLElementDeclarationElementKind = 20; +} + +/// @warning This class is reserved for hybrid SDKs. Methods may be changed, renamed or removed +/// without notice. If you want to use one of these methods here please open up an issue and let us +/// know. +/// @note The name of this class is supposed to be a bit weird and ugly. The name starts with private +/// on purpose so users don't see it in code completion when typing Sentry. We also add only at the +/// end to make it more obvious you shouldn't use it. +class PrivateSentrySDKOnly extends NSObject { + PrivateSentrySDKOnly._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [PrivateSentrySDKOnly] that points to the same underlying object as [other]. + static PrivateSentrySDKOnly castFrom(T other) { + return PrivateSentrySDKOnly._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [PrivateSentrySDKOnly] that wraps the given raw object pointer. + static PrivateSentrySDKOnly castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return PrivateSentrySDKOnly._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [PrivateSentrySDKOnly]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_PrivateSentrySDKOnly1); + } + + /// For storing an envelope synchronously to disk. + static void storeEnvelope_(SentryCocoa _lib, SentryEnvelope? envelope) { + _lib._objc_msgSend_1055(_lib._class_PrivateSentrySDKOnly1, + _lib._sel_storeEnvelope_1, envelope?._id ?? ffi.nullptr); + } + + static void captureEnvelope_(SentryCocoa _lib, SentryEnvelope? envelope) { + _lib._objc_msgSend_1055(_lib._class_PrivateSentrySDKOnly1, + _lib._sel_captureEnvelope_1, envelope?._id ?? ffi.nullptr); + } + + /// Create an envelope from @c NSData. Needed for example by Flutter. + static SentryEnvelope envelopeWithData_(SentryCocoa _lib, NSData? data) { + final _ret = _lib._objc_msgSend_1056(_lib._class_PrivateSentrySDKOnly1, + _lib._sel_envelopeWithData_1, data?._id ?? ffi.nullptr); + return SentryEnvelope._(_ret, _lib, retain: true, release: true); + } + + /// Returns the current list of debug images. Be aware that the @c SentryDebugMeta is actually + /// describing a debug image. + /// @warning This assumes a crash has occurred and attempts to read the crash information from each + /// image's data segment, which may not be present or be invalid if a crash has not actually + /// occurred. To avoid this, use the new @c +[getDebugImagesCrashed:] instead. + static NSArray getDebugImages(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_PrivateSentrySDKOnly1, _lib._sel_getDebugImages1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + /// Returns the current list of debug images. Be aware that the @c SentryDebugMeta is actually + /// describing a debug image. + /// @param isCrash @c YES if we're collecting binary images for a crash report, @c NO if we're + /// gathering them for other backtrace information, like a performance transaction. If this is for a + /// crash, each image's data section crash info is also included. + static NSArray getDebugImagesCrashed_(SentryCocoa _lib, bool isCrash) { + final _ret = _lib._objc_msgSend_1057(_lib._class_PrivateSentrySDKOnly1, + _lib._sel_getDebugImagesCrashed_1, isCrash); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + /// Override SDK information. + static void setSdkName_andVersionString_( + SentryCocoa _lib, NSString? sdkName, NSString? versionString) { + _lib._objc_msgSend_515( + _lib._class_PrivateSentrySDKOnly1, + _lib._sel_setSdkName_andVersionString_1, + sdkName?._id ?? ffi.nullptr, + versionString?._id ?? ffi.nullptr); + } + + /// Override SDK information. + static void setSdkName_(SentryCocoa _lib, NSString? sdkName) { + _lib._objc_msgSend_192(_lib._class_PrivateSentrySDKOnly1, + _lib._sel_setSdkName_1, sdkName?._id ?? ffi.nullptr); + } + + /// Retrieves the SDK name + static NSString getSdkName(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_20( + _lib._class_PrivateSentrySDKOnly1, _lib._sel_getSdkName1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + /// Retrieves the SDK version string + static NSString getSdkVersionString(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_20( + _lib._class_PrivateSentrySDKOnly1, _lib._sel_getSdkVersionString1); + return NSString._(_ret, _lib, retain: true, release: true); + } + + /// Retrieves extra context + static NSDictionary getExtraContext(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_170( + _lib._class_PrivateSentrySDKOnly1, _lib._sel_getExtraContext1); + return NSDictionary._(_ret, _lib, retain: true, release: true); + } + + /// Start a profiler session associated with the given @c SentryId. + /// @return The system time when the profiler session started. + static int startProfilerForTrace_(SentryCocoa _lib, SentryId? traceId) { + return _lib._objc_msgSend_1058(_lib._class_PrivateSentrySDKOnly1, + _lib._sel_startProfilerForTrace_1, traceId?._id ?? ffi.nullptr); + } + + /// Collect a profiler session data associated with the given @c SentryId. + /// This also discards the profiler. + static NSMutableDictionary collectProfileBetween_and_forTrace_( + SentryCocoa _lib, + int startSystemTime, + int endSystemTime, + SentryId? traceId) { + final _ret = _lib._objc_msgSend_1059( + _lib._class_PrivateSentrySDKOnly1, + _lib._sel_collectProfileBetween_and_forTrace_1, + startSystemTime, + endSystemTime, + traceId?._id ?? ffi.nullptr); + return NSMutableDictionary._(_ret, _lib, retain: true, release: true); + } + + /// Discard profiler session data associated with the given @c SentryId. + /// This only needs to be called in case you haven't collected the profile (and don't intend to). + static void discardProfilerForTrace_(SentryCocoa _lib, SentryId? traceId) { + _lib._objc_msgSend_1060(_lib._class_PrivateSentrySDKOnly1, + _lib._sel_discardProfilerForTrace_1, traceId?._id ?? ffi.nullptr); + } + + static ObjCBlock_ffiVoid_SentryAppStartMeasurement + getOnAppStartMeasurementAvailable(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_1061(_lib._class_PrivateSentrySDKOnly1, + _lib._sel_onAppStartMeasurementAvailable1); + return ObjCBlock_ffiVoid_SentryAppStartMeasurement._(_ret, _lib); + } + + static void setOnAppStartMeasurementAvailable( + SentryCocoa _lib, ObjCBlock_ffiVoid_SentryAppStartMeasurement value) { + return _lib._objc_msgSend_1062(_lib._class_PrivateSentrySDKOnly1, + _lib._sel_setOnAppStartMeasurementAvailable_1, value._id); + } + + static SentryAppStartMeasurement? getAppStartMeasurement(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_1063( + _lib._class_PrivateSentrySDKOnly1, _lib._sel_appStartMeasurement1); + return _ret.address == 0 + ? null + : SentryAppStartMeasurement._(_ret, _lib, retain: true, release: true); + } + + static NSString? getInstallationID(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_20( + _lib._class_PrivateSentrySDKOnly1, _lib._sel_installationID1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + static SentryOptions? getOptions(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_1064( + _lib._class_PrivateSentrySDKOnly1, _lib._sel_options1); + return _ret.address == 0 + ? null + : SentryOptions._(_ret, _lib, retain: true, release: true); + } + + /// If enabled, the SDK won't send the app start measurement with the first transaction. Instead, if + /// @c enableAutoPerformanceTracing is enabled, the SDK measures the app start and then calls + /// @c onAppStartMeasurementAvailable. Furthermore, the SDK doesn't set all values for the app start + /// measurement because the HybridSDKs initialize the Cocoa SDK too late to receive all + /// notifications. Instead, the SDK sets the @c appStartDuration to @c 0 and the + /// @c didFinishLaunchingTimestamp to @c timeIntervalSinceReferenceDate. + /// @note Default is @c NO. + static bool getAppStartMeasurementHybridSDKMode(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_PrivateSentrySDKOnly1, + _lib._sel_appStartMeasurementHybridSDKMode1); + } + + /// If enabled, the SDK won't send the app start measurement with the first transaction. Instead, if + /// @c enableAutoPerformanceTracing is enabled, the SDK measures the app start and then calls + /// @c onAppStartMeasurementAvailable. Furthermore, the SDK doesn't set all values for the app start + /// measurement because the HybridSDKs initialize the Cocoa SDK too late to receive all + /// notifications. Instead, the SDK sets the @c appStartDuration to @c 0 and the + /// @c didFinishLaunchingTimestamp to @c timeIntervalSinceReferenceDate. + /// @note Default is @c NO. + static void setAppStartMeasurementHybridSDKMode( + SentryCocoa _lib, bool value) { + return _lib._objc_msgSend_492(_lib._class_PrivateSentrySDKOnly1, + _lib._sel_setAppStartMeasurementHybridSDKMode_1, value); + } + + static SentryUser userWithDictionary_( + SentryCocoa _lib, NSDictionary? dictionary) { + final _ret = _lib._objc_msgSend_1065(_lib._class_PrivateSentrySDKOnly1, + _lib._sel_userWithDictionary_1, dictionary?._id ?? ffi.nullptr); + return SentryUser._(_ret, _lib, retain: true, release: true); + } + + static SentryBreadcrumb breadcrumbWithDictionary_( + SentryCocoa _lib, NSDictionary? dictionary) { + final _ret = _lib._objc_msgSend_1066(_lib._class_PrivateSentrySDKOnly1, + _lib._sel_breadcrumbWithDictionary_1, dictionary?._id ?? ffi.nullptr); + return SentryBreadcrumb._(_ret, _lib, retain: true, release: true); + } + + @override + PrivateSentrySDKOnly init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return PrivateSentrySDKOnly._(_ret, _lib, retain: true, release: true); + } + + static PrivateSentrySDKOnly new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_PrivateSentrySDKOnly1, _lib._sel_new1); + return PrivateSentrySDKOnly._(_ret, _lib, retain: false, release: true); + } + + static PrivateSentrySDKOnly allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_PrivateSentrySDKOnly1, _lib._sel_allocWithZone_1, zone); + return PrivateSentrySDKOnly._(_ret, _lib, retain: false, release: true); + } + + static PrivateSentrySDKOnly alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_PrivateSentrySDKOnly1, _lib._sel_alloc1); + return PrivateSentrySDKOnly._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_PrivateSentrySDKOnly1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_PrivateSentrySDKOnly1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_PrivateSentrySDKOnly1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_PrivateSentrySDKOnly1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_PrivateSentrySDKOnly1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_PrivateSentrySDKOnly1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_PrivateSentrySDKOnly1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_PrivateSentrySDKOnly1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_PrivateSentrySDKOnly1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class SentryEnvelope extends NSObject { + SentryEnvelope._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [SentryEnvelope] that points to the same underlying object as [other]. + static SentryEnvelope castFrom(T other) { + return SentryEnvelope._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [SentryEnvelope] that wraps the given raw object pointer. + static SentryEnvelope castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return SentryEnvelope._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [SentryEnvelope]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_SentryEnvelope1); + } + + @override + SentryEnvelope init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return SentryEnvelope._(_ret, _lib, retain: true, release: true); + } + + static SentryEnvelope new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_SentryEnvelope1, _lib._sel_new1); + return SentryEnvelope._(_ret, _lib, retain: false, release: true); + } + + SentryEnvelope initWithId_singleItem_( + SentryId? id, SentryEnvelopeItem? item) { + final _ret = _lib._objc_msgSend_1045(_id, _lib._sel_initWithId_singleItem_1, + id?._id ?? ffi.nullptr, item?._id ?? ffi.nullptr); + return SentryEnvelope._(_ret, _lib, retain: true, release: true); + } + + SentryEnvelope initWithHeader_singleItem_( + SentryEnvelopeHeader? header, SentryEnvelopeItem? item) { + final _ret = _lib._objc_msgSend_1051( + _id, + _lib._sel_initWithHeader_singleItem_1, + header?._id ?? ffi.nullptr, + item?._id ?? ffi.nullptr); + return SentryEnvelope._(_ret, _lib, retain: true, release: true); + } + + SentryEnvelope initWithId_items_(SentryId? id, NSArray? items) { + final _ret = _lib._objc_msgSend_1052(_id, _lib._sel_initWithId_items_1, + id?._id ?? ffi.nullptr, items?._id ?? ffi.nullptr); + return SentryEnvelope._(_ret, _lib, retain: true, release: true); + } + + /// Initializes a @c SentryEnvelope with a single session. + /// @param session to init the envelope with. + SentryEnvelope initWithSession_(SentrySession? session) { + final _ret = _lib._objc_msgSend_1040( + _id, _lib._sel_initWithSession_1, session?._id ?? ffi.nullptr); + return SentryEnvelope._(_ret, _lib, retain: true, release: true); + } + + /// Initializes a @c SentryEnvelope with a list of sessions. + /// Can be used when an operation that starts a session closes an ongoing session. + /// @param sessions to init the envelope with. + SentryEnvelope initWithSessions_(NSArray? sessions) { + final _ret = _lib._objc_msgSend_67( + _id, _lib._sel_initWithSessions_1, sessions?._id ?? ffi.nullptr); + return SentryEnvelope._(_ret, _lib, retain: true, release: true); + } + + SentryEnvelope initWithHeader_items_( + SentryEnvelopeHeader? header, NSArray? items) { + final _ret = _lib._objc_msgSend_1053(_id, _lib._sel_initWithHeader_items_1, + header?._id ?? ffi.nullptr, items?._id ?? ffi.nullptr); + return SentryEnvelope._(_ret, _lib, retain: true, release: true); + } + + /// Convenience init for a single event. + SentryEnvelope initWithEvent_(SentryEvent? event) { + final _ret = _lib._objc_msgSend_1039( + _id, _lib._sel_initWithEvent_1, event?._id ?? ffi.nullptr); + return SentryEnvelope._(_ret, _lib, retain: true, release: true); + } + + SentryEnvelope initWithUserFeedback_(SentryUserFeedback? userFeedback) { + final _ret = _lib._objc_msgSend_1041(_id, _lib._sel_initWithUserFeedback_1, + userFeedback?._id ?? ffi.nullptr); + return SentryEnvelope._(_ret, _lib, retain: true, release: true); + } + + /// The envelope header. + SentryEnvelopeHeader? get header { + final _ret = _lib._objc_msgSend_1054(_id, _lib._sel_header1); + return _ret.address == 0 + ? null + : SentryEnvelopeHeader._(_ret, _lib, retain: true, release: true); + } + + /// The envelope items. + NSArray? get items { + final _ret = _lib._objc_msgSend_79(_id, _lib._sel_items1); + return _ret.address == 0 + ? null + : NSArray._(_ret, _lib, retain: true, release: true); + } + + static SentryEnvelope allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_SentryEnvelope1, _lib._sel_allocWithZone_1, zone); + return SentryEnvelope._(_ret, _lib, retain: false, release: true); + } + + static SentryEnvelope alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_SentryEnvelope1, _lib._sel_alloc1); + return SentryEnvelope._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_SentryEnvelope1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_SentryEnvelope1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_SentryEnvelope1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_SentryEnvelope1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_SentryEnvelope1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_SentryEnvelope1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_SentryEnvelope1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_SentryEnvelope1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_SentryEnvelope1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class SentryId extends NSObject { + SentryId._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [SentryId] that points to the same underlying object as [other]. + static SentryId castFrom(T other) { + return SentryId._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [SentryId] that wraps the given raw object pointer. + static SentryId castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return SentryId._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [SentryId]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_SentryId1); + } + + /// Creates a @c SentryId with a random UUID. + @override + SentryId init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return SentryId._(_ret, _lib, retain: true, release: true); + } + + /// Creates a SentryId with the given UUID. + SentryId initWithUUID_(NSUUID? uuid) { + final _ret = _lib._objc_msgSend_1037( + _id, _lib._sel_initWithUUID_1, uuid?._id ?? ffi.nullptr); + return SentryId._(_ret, _lib, retain: true, release: true); + } + + /// Creates a @c SentryId from a 32 character hexadecimal string without dashes such as + /// "12c2d058d58442709aa2eca08bf20986" or a 36 character hexadecimal string such as such as + /// "12c2d058-d584-4270-9aa2-eca08bf20986". + /// @return SentryId.empty for invalid strings. + SentryId initWithUUIDString_(NSString? string) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithUUIDString_1, string?._id ?? ffi.nullptr); + return SentryId._(_ret, _lib, retain: true, release: true); + } + + /// Returns a 32 lowercase character hexadecimal string description of the @c SentryId, such as + /// "12c2d058d58442709aa2eca08bf20986". + NSString? get sentryIdString { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_sentryIdString1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + /// A @c SentryId with an empty UUID "00000000000000000000000000000000". + static SentryId? getEmpty(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_1038(_lib._class_SentryId1, _lib._sel_empty1); + return _ret.address == 0 + ? null + : SentryId._(_ret, _lib, retain: true, release: true); + } + + static SentryId new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_SentryId1, _lib._sel_new1); + return SentryId._(_ret, _lib, retain: false, release: true); + } + + static SentryId allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_SentryId1, _lib._sel_allocWithZone_1, zone); + return SentryId._(_ret, _lib, retain: false, release: true); + } + + static SentryId alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_SentryId1, _lib._sel_alloc1); + return SentryId._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_SentryId1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_SentryId1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_SentryId1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_SentryId1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_SentryId1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_SentryId1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_SentryId1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_SentryId1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_SentryId1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class NSUUID extends NSObject { + NSUUID._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [NSUUID] that points to the same underlying object as [other]. + static NSUUID castFrom(T other) { + return NSUUID._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [NSUUID] that wraps the given raw object pointer. + static NSUUID castFromPointer(SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return NSUUID._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [NSUUID]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_NSUUID1); + } + + static NSUUID UUID(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSUUID1, _lib._sel_UUID1); + return NSUUID._(_ret, _lib, retain: true, release: true); + } + + @override + NSUUID init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return NSUUID._(_ret, _lib, retain: true, release: true); + } + + NSUUID initWithUUIDString_(NSString? string) { + final _ret = _lib._objc_msgSend_30( + _id, _lib._sel_initWithUUIDString_1, string?._id ?? ffi.nullptr); + return NSUUID._(_ret, _lib, retain: true, release: true); + } + + NSUUID initWithUUIDBytes_(ffi.Pointer bytes) { + final _ret = + _lib._objc_msgSend_1034(_id, _lib._sel_initWithUUIDBytes_1, bytes); + return NSUUID._(_ret, _lib, retain: true, release: true); + } + + void getUUIDBytes_(ffi.Pointer uuid) { + _lib._objc_msgSend_1035(_id, _lib._sel_getUUIDBytes_1, uuid); + } + + int compare_(NSUUID? otherUUID) { + return _lib._objc_msgSend_1036( + _id, _lib._sel_compare_1, otherUUID?._id ?? ffi.nullptr); + } + + NSString? get UUIDString { + final _ret = _lib._objc_msgSend_20(_id, _lib._sel_UUIDString1); + return _ret.address == 0 + ? null + : NSString._(_ret, _lib, retain: true, release: true); + } + + static NSUUID new1(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSUUID1, _lib._sel_new1); + return NSUUID._(_ret, _lib, retain: false, release: true); + } + + static NSUUID allocWithZone_(SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_NSUUID1, _lib._sel_allocWithZone_1, zone); + return NSUUID._(_ret, _lib, retain: false, release: true); + } + + static NSUUID alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2(_lib._class_NSUUID1, _lib._sel_alloc1); + return NSUUID._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_NSUUID1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_NSUUID1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSUUID1, _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_NSUUID1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_NSUUID1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_NSUUID1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_NSUUID1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79( + _lib._class_NSUUID1, _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_NSUUID1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class SentryEnvelopeItem extends NSObject { + SentryEnvelopeItem._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [SentryEnvelopeItem] that points to the same underlying object as [other]. + static SentryEnvelopeItem castFrom(T other) { + return SentryEnvelopeItem._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [SentryEnvelopeItem] that wraps the given raw object pointer. + static SentryEnvelopeItem castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return SentryEnvelopeItem._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [SentryEnvelopeItem]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_SentryEnvelopeItem1); + } + + @override + SentryEnvelopeItem init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return SentryEnvelopeItem._(_ret, _lib, retain: true, release: true); + } + + static SentryEnvelopeItem new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_SentryEnvelopeItem1, _lib._sel_new1); + return SentryEnvelopeItem._(_ret, _lib, retain: false, release: true); + } + + SentryEnvelopeItem initWithEvent_(SentryEvent? event) { + final _ret = _lib._objc_msgSend_1039( + _id, _lib._sel_initWithEvent_1, event?._id ?? ffi.nullptr); + return SentryEnvelopeItem._(_ret, _lib, retain: true, release: true); + } + + SentryEnvelopeItem initWithSession_(SentrySession? session) { + final _ret = _lib._objc_msgSend_1040( + _id, _lib._sel_initWithSession_1, session?._id ?? ffi.nullptr); + return SentryEnvelopeItem._(_ret, _lib, retain: true, release: true); + } + + SentryEnvelopeItem initWithUserFeedback_(SentryUserFeedback? userFeedback) { + final _ret = _lib._objc_msgSend_1041(_id, _lib._sel_initWithUserFeedback_1, + userFeedback?._id ?? ffi.nullptr); + return SentryEnvelopeItem._(_ret, _lib, retain: true, release: true); + } + + SentryEnvelopeItem initWithAttachment_maxAttachmentSize_( + SentryAttachment? attachment, int maxAttachmentSize) { + final _ret = _lib._objc_msgSend_1042( + _id, + _lib._sel_initWithAttachment_maxAttachmentSize_1, + attachment?._id ?? ffi.nullptr, + maxAttachmentSize); + return SentryEnvelopeItem._(_ret, _lib, retain: true, release: true); + } + + SentryEnvelopeItem initWithHeader_data_( + SentryEnvelopeItemHeader? header, NSData? data) { + final _ret = _lib._objc_msgSend_1043(_id, _lib._sel_initWithHeader_data_1, + header?._id ?? ffi.nullptr, data?._id ?? ffi.nullptr); + return SentryEnvelopeItem._(_ret, _lib, retain: true, release: true); + } + + /// The envelope item header. + SentryEnvelopeItemHeader? get header { + final _ret = _lib._objc_msgSend_1044(_id, _lib._sel_header1); + return _ret.address == 0 + ? null + : SentryEnvelopeItemHeader._(_ret, _lib, retain: true, release: true); + } + + /// The envelope payload. + NSData? get data { + final _ret = _lib._objc_msgSend_39(_id, _lib._sel_data1); + return _ret.address == 0 + ? null + : NSData._(_ret, _lib, retain: true, release: true); + } + + static SentryEnvelopeItem allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_SentryEnvelopeItem1, _lib._sel_allocWithZone_1, zone); + return SentryEnvelopeItem._(_ret, _lib, retain: false, release: true); + } + + static SentryEnvelopeItem alloc(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_SentryEnvelopeItem1, _lib._sel_alloc1); + return SentryEnvelopeItem._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_SentryEnvelopeItem1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_SentryEnvelopeItem1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_SentryEnvelopeItem1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_SentryEnvelopeItem1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_SentryEnvelopeItem1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_SentryEnvelopeItem1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_SentryEnvelopeItem1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_SentryEnvelopeItem1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_SentryEnvelopeItem1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class SentryEvent extends _ObjCWrapper { + SentryEvent._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [SentryEvent] that points to the same underlying object as [other]. + static SentryEvent castFrom(T other) { + return SentryEvent._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [SentryEvent] that wraps the given raw object pointer. + static SentryEvent castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return SentryEvent._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [SentryEvent]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_SentryEvent1); + } +} + +class SentrySession extends _ObjCWrapper { + SentrySession._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [SentrySession] that points to the same underlying object as [other]. + static SentrySession castFrom(T other) { + return SentrySession._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [SentrySession] that wraps the given raw object pointer. + static SentrySession castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return SentrySession._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [SentrySession]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_SentrySession1); + } +} + +class SentryUserFeedback extends _ObjCWrapper { + SentryUserFeedback._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [SentryUserFeedback] that points to the same underlying object as [other]. + static SentryUserFeedback castFrom(T other) { + return SentryUserFeedback._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [SentryUserFeedback] that wraps the given raw object pointer. + static SentryUserFeedback castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return SentryUserFeedback._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [SentryUserFeedback]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_SentryUserFeedback1); + } +} + +class SentryAttachment extends _ObjCWrapper { + SentryAttachment._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [SentryAttachment] that points to the same underlying object as [other]. + static SentryAttachment castFrom(T other) { + return SentryAttachment._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [SentryAttachment] that wraps the given raw object pointer. + static SentryAttachment castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return SentryAttachment._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [SentryAttachment]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_SentryAttachment1); + } +} + +class SentryEnvelopeItemHeader extends _ObjCWrapper { + SentryEnvelopeItemHeader._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [SentryEnvelopeItemHeader] that points to the same underlying object as [other]. + static SentryEnvelopeItemHeader castFrom(T other) { + return SentryEnvelopeItemHeader._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [SentryEnvelopeItemHeader] that wraps the given raw object pointer. + static SentryEnvelopeItemHeader castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return SentryEnvelopeItemHeader._(other, lib, + retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [SentryEnvelopeItemHeader]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_SentryEnvelopeItemHeader1); + } +} + +class SentryEnvelopeHeader extends NSObject { + SentryEnvelopeHeader._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [SentryEnvelopeHeader] that points to the same underlying object as [other]. + static SentryEnvelopeHeader castFrom(T other) { + return SentryEnvelopeHeader._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [SentryEnvelopeHeader] that wraps the given raw object pointer. + static SentryEnvelopeHeader castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return SentryEnvelopeHeader._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [SentryEnvelopeHeader]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_SentryEnvelopeHeader1); + } + + @override + SentryEnvelopeHeader init() { + final _ret = _lib._objc_msgSend_2(_id, _lib._sel_init1); + return SentryEnvelopeHeader._(_ret, _lib, retain: true, release: true); + } + + static SentryEnvelopeHeader new1(SentryCocoa _lib) { + final _ret = + _lib._objc_msgSend_2(_lib._class_SentryEnvelopeHeader1, _lib._sel_new1); + return SentryEnvelopeHeader._(_ret, _lib, retain: false, release: true); + } + + /// Initializes an @c SentryEnvelopeHeader object with the specified eventId. + /// @note Sets the @c sdkInfo from @c SentryMeta. + /// @param eventId The identifier of the event. Can be nil if no event in the envelope or attachment + /// related to event. + SentryEnvelopeHeader initWithId_(SentryId? eventId) { + final _ret = _lib._objc_msgSend_1046( + _id, _lib._sel_initWithId_1, eventId?._id ?? ffi.nullptr); + return SentryEnvelopeHeader._(_ret, _lib, retain: true, release: true); + } + + /// Initializes a @c SentryEnvelopeHeader object with the specified @c eventId and @c traceContext. + /// @param eventId The identifier of the event. Can be @c nil if no event in the envelope or + /// attachment related to event. + /// @param traceContext Current trace state. + SentryEnvelopeHeader initWithId_traceContext_( + SentryId? eventId, SentryTraceContext? traceContext) { + final _ret = _lib._objc_msgSend_1047( + _id, + _lib._sel_initWithId_traceContext_1, + eventId?._id ?? ffi.nullptr, + traceContext?._id ?? ffi.nullptr); + return SentryEnvelopeHeader._(_ret, _lib, retain: true, release: true); + } + + /// Initializes a @c SentryEnvelopeHeader object with the specified @c eventId, @c skdInfo and + /// @c traceContext. It is recommended to use @c initWithId:traceContext: because it sets the + /// @c sdkInfo for you. + /// @param eventId The identifier of the event. Can be @c nil if no event in the envelope or + /// attachment related to event. + /// @param sdkInfo Describes the Sentry SDK. Can be @c nil for backwards compatibility. New + /// instances should always provide a version. + /// @param traceContext Current trace state. + SentryEnvelopeHeader initWithId_sdkInfo_traceContext_(SentryId? eventId, + SentrySdkInfo? sdkInfo, SentryTraceContext? traceContext) { + final _ret = _lib._objc_msgSend_1048( + _id, + _lib._sel_initWithId_sdkInfo_traceContext_1, + eventId?._id ?? ffi.nullptr, + sdkInfo?._id ?? ffi.nullptr, + traceContext?._id ?? ffi.nullptr); + return SentryEnvelopeHeader._(_ret, _lib, retain: true, release: true); + } + + /// The event identifier, if available. + /// An event id exist if the envelope contains an event of items within it are related. i.e + /// Attachments + SentryId? get eventId { + final _ret = _lib._objc_msgSend_1038(_id, _lib._sel_eventId1); + return _ret.address == 0 + ? null + : SentryId._(_ret, _lib, retain: true, release: true); + } + + SentrySdkInfo? get sdkInfo { + final _ret = _lib._objc_msgSend_1049(_id, _lib._sel_sdkInfo1); + return _ret.address == 0 + ? null + : SentrySdkInfo._(_ret, _lib, retain: true, release: true); + } + + SentryTraceContext? get traceContext { + final _ret = _lib._objc_msgSend_1050(_id, _lib._sel_traceContext1); + return _ret.address == 0 + ? null + : SentryTraceContext._(_ret, _lib, retain: true, release: true); + } + + /// The timestamp when the event was sent from the SDK as string in RFC 3339 format. Used + /// for clock drift correction of the event timestamp. The time zone must be UTC. + /// + /// The timestamp should be generated as close as possible to the transmision of the event, + /// so that the delay between sending the envelope and receiving it on the server-side is + /// minimized. + NSDate? get sentAt { + final _ret = _lib._objc_msgSend_162(_id, _lib._sel_sentAt1); + return _ret.address == 0 + ? null + : NSDate._(_ret, _lib, retain: true, release: true); + } + + /// The timestamp when the event was sent from the SDK as string in RFC 3339 format. Used + /// for clock drift correction of the event timestamp. The time zone must be UTC. + /// + /// The timestamp should be generated as close as possible to the transmision of the event, + /// so that the delay between sending the envelope and receiving it on the server-side is + /// minimized. + set sentAt(NSDate? value) { + return _lib._objc_msgSend_525( + _id, _lib._sel_setSentAt_1, value?._id ?? ffi.nullptr); + } + + static SentryEnvelopeHeader allocWithZone_( + SentryCocoa _lib, ffi.Pointer<_NSZone> zone) { + final _ret = _lib._objc_msgSend_3( + _lib._class_SentryEnvelopeHeader1, _lib._sel_allocWithZone_1, zone); + return SentryEnvelopeHeader._(_ret, _lib, retain: false, release: true); + } + + static SentryEnvelopeHeader alloc(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_SentryEnvelopeHeader1, _lib._sel_alloc1); + return SentryEnvelopeHeader._(_ret, _lib, retain: false, release: true); + } + + static void cancelPreviousPerformRequestsWithTarget_selector_object_( + SentryCocoa _lib, + NSObject aTarget, + ffi.Pointer aSelector, + NSObject anArgument) { + _lib._objc_msgSend_14( + _lib._class_SentryEnvelopeHeader1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_selector_object_1, + aTarget._id, + aSelector, + anArgument._id); + } + + static void cancelPreviousPerformRequestsWithTarget_( + SentryCocoa _lib, NSObject aTarget) { + _lib._objc_msgSend_15(_lib._class_SentryEnvelopeHeader1, + _lib._sel_cancelPreviousPerformRequestsWithTarget_1, aTarget._id); + } + + static bool getAccessInstanceVariablesDirectly(SentryCocoa _lib) { + return _lib._objc_msgSend_12(_lib._class_SentryEnvelopeHeader1, + _lib._sel_accessInstanceVariablesDirectly1); + } + + static bool useStoredAccessor(SentryCocoa _lib) { + return _lib._objc_msgSend_12( + _lib._class_SentryEnvelopeHeader1, _lib._sel_useStoredAccessor1); + } + + static NSSet keyPathsForValuesAffectingValueForKey_( + SentryCocoa _lib, NSString? key) { + final _ret = _lib._objc_msgSend_58( + _lib._class_SentryEnvelopeHeader1, + _lib._sel_keyPathsForValuesAffectingValueForKey_1, + key?._id ?? ffi.nullptr); + return NSSet._(_ret, _lib, retain: true, release: true); + } + + static bool automaticallyNotifiesObserversForKey_( + SentryCocoa _lib, NSString? key) { + return _lib._objc_msgSend_59( + _lib._class_SentryEnvelopeHeader1, + _lib._sel_automaticallyNotifiesObserversForKey_1, + key?._id ?? ffi.nullptr); + } + + static void setKeys_triggerChangeNotificationsForDependentKey_( + SentryCocoa _lib, NSArray? keys, NSString? dependentKey) { + _lib._objc_msgSend_82( + _lib._class_SentryEnvelopeHeader1, + _lib._sel_setKeys_triggerChangeNotificationsForDependentKey_1, + keys?._id ?? ffi.nullptr, + dependentKey?._id ?? ffi.nullptr); + } + + static NSArray classFallbacksForKeyedArchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_79(_lib._class_SentryEnvelopeHeader1, + _lib._sel_classFallbacksForKeyedArchiver1); + return NSArray._(_ret, _lib, retain: true, release: true); + } + + static NSObject classForKeyedUnarchiver(SentryCocoa _lib) { + final _ret = _lib._objc_msgSend_2( + _lib._class_SentryEnvelopeHeader1, _lib._sel_classForKeyedUnarchiver1); + return NSObject._(_ret, _lib, retain: true, release: true); + } +} + +class SentryTraceContext extends _ObjCWrapper { + SentryTraceContext._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [SentryTraceContext] that points to the same underlying object as [other]. + static SentryTraceContext castFrom(T other) { + return SentryTraceContext._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [SentryTraceContext] that wraps the given raw object pointer. + static SentryTraceContext castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return SentryTraceContext._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [SentryTraceContext]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_SentryTraceContext1); + } +} + +class SentrySdkInfo extends _ObjCWrapper { + SentrySdkInfo._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [SentrySdkInfo] that points to the same underlying object as [other]. + static SentrySdkInfo castFrom(T other) { + return SentrySdkInfo._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [SentrySdkInfo] that wraps the given raw object pointer. + static SentrySdkInfo castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return SentrySdkInfo._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [SentrySdkInfo]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_SentrySdkInfo1); + } +} + +void _ObjCBlock_ffiVoid_SentryAppStartMeasurement_fnPtrTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return block.ref.target + .cast< + ffi.NativeFunction arg0)>>() + .asFunction arg0)>()(arg0); +} + +final _ObjCBlock_ffiVoid_SentryAppStartMeasurement_closureRegistry = + {}; +int _ObjCBlock_ffiVoid_SentryAppStartMeasurement_closureRegistryIndex = 0; +ffi.Pointer + _ObjCBlock_ffiVoid_SentryAppStartMeasurement_registerClosure(Function fn) { + final id = + ++_ObjCBlock_ffiVoid_SentryAppStartMeasurement_closureRegistryIndex; + _ObjCBlock_ffiVoid_SentryAppStartMeasurement_closureRegistry[id] = fn; + return ffi.Pointer.fromAddress(id); +} + +void _ObjCBlock_ffiVoid_SentryAppStartMeasurement_closureTrampoline( + ffi.Pointer<_ObjCBlock> block, ffi.Pointer arg0) { + return (_ObjCBlock_ffiVoid_SentryAppStartMeasurement_closureRegistry[block + .ref.target.address] as void Function(ffi.Pointer))(arg0); +} + +class ObjCBlock_ffiVoid_SentryAppStartMeasurement extends _ObjCBlockBase { + ObjCBlock_ffiVoid_SentryAppStartMeasurement._( + ffi.Pointer<_ObjCBlock> id, SentryCocoa lib) + : super._(id, lib, retain: false, release: true); + + /// Creates a block from a C function pointer. + ObjCBlock_ffiVoid_SentryAppStartMeasurement.fromFunctionPointer( + SentryCocoa lib, + ffi.Pointer< + ffi + .NativeFunction arg0)>> + ptr) + : this._( + lib._newBlock1( + _cFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_SentryAppStartMeasurement_fnPtrTrampoline) + .cast(), + ptr.cast()), + lib); + static ffi.Pointer? _cFuncTrampoline; + + /// Creates a block from a Dart function. + ObjCBlock_ffiVoid_SentryAppStartMeasurement.fromFunction( + SentryCocoa lib, void Function(ffi.Pointer arg0) fn) + : this._( + lib._newBlock1( + _dartFuncTrampoline ??= ffi.Pointer.fromFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>( + _ObjCBlock_ffiVoid_SentryAppStartMeasurement_closureTrampoline) + .cast(), + _ObjCBlock_ffiVoid_SentryAppStartMeasurement_registerClosure( + fn)), + lib); + static ffi.Pointer? _dartFuncTrampoline; + void call(ffi.Pointer arg0) { + return _id.ref.invoke + .cast< + ffi.NativeFunction< + ffi.Void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>>() + .asFunction< + void Function(ffi.Pointer<_ObjCBlock> block, + ffi.Pointer arg0)>()(_id, arg0); + } +} + +class SentryAppStartMeasurement extends _ObjCWrapper { + SentryAppStartMeasurement._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [SentryAppStartMeasurement] that points to the same underlying object as [other]. + static SentryAppStartMeasurement castFrom(T other) { + return SentryAppStartMeasurement._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [SentryAppStartMeasurement] that wraps the given raw object pointer. + static SentryAppStartMeasurement castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return SentryAppStartMeasurement._(other, lib, + retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [SentryAppStartMeasurement]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_SentryAppStartMeasurement1); + } +} + +class SentryOptions extends _ObjCWrapper { + SentryOptions._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [SentryOptions] that points to the same underlying object as [other]. + static SentryOptions castFrom(T other) { + return SentryOptions._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [SentryOptions] that wraps the given raw object pointer. + static SentryOptions castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return SentryOptions._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [SentryOptions]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_SentryOptions1); + } +} + +class SentryUser extends _ObjCWrapper { + SentryUser._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [SentryUser] that points to the same underlying object as [other]. + static SentryUser castFrom(T other) { + return SentryUser._(other._id, other._lib, retain: true, release: true); + } + + /// Returns a [SentryUser] that wraps the given raw object pointer. + static SentryUser castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return SentryUser._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [SentryUser]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0( + obj._id, obj._lib._sel_isKindOfClass_1, obj._lib._class_SentryUser1); + } +} + +class SentryBreadcrumb extends _ObjCWrapper { + SentryBreadcrumb._(ffi.Pointer id, SentryCocoa lib, + {bool retain = false, bool release = false}) + : super._(id, lib, retain: retain, release: release); + + /// Returns a [SentryBreadcrumb] that points to the same underlying object as [other]. + static SentryBreadcrumb castFrom(T other) { + return SentryBreadcrumb._(other._id, other._lib, + retain: true, release: true); + } + + /// Returns a [SentryBreadcrumb] that wraps the given raw object pointer. + static SentryBreadcrumb castFromPointer( + SentryCocoa lib, ffi.Pointer other, + {bool retain = false, bool release = false}) { + return SentryBreadcrumb._(other, lib, retain: retain, release: release); + } + + /// Returns whether [obj] is an instance of [SentryBreadcrumb]. + static bool isInstance(_ObjCWrapper obj) { + return obj._lib._objc_msgSend_0(obj._id, obj._lib._sel_isKindOfClass_1, + obj._lib._class_SentryBreadcrumb1); + } +} diff --git a/flutter/lib/src/native/cocoa/sentry_native_cocoa.dart b/flutter/lib/src/native/cocoa/sentry_native_cocoa.dart new file mode 100644 index 0000000000..0e6817cb48 --- /dev/null +++ b/flutter/lib/src/native/cocoa/sentry_native_cocoa.dart @@ -0,0 +1,23 @@ +import 'dart:ffi'; + +import 'package:meta/meta.dart'; + +import '../../../sentry_flutter.dart'; +import '../sentry_native_channel.dart'; +import 'binding.dart' as cocoa; + +@internal +class SentryNativeCocoa extends SentryNativeChannel { + late final _lib = cocoa.SentryCocoa(DynamicLibrary.process()); + + SentryNativeCocoa(super.channel); + + @override + int? startProfiler(SentryId traceId) { + final cSentryId = cocoa.SentryId.alloc(_lib) + ..initWithUUIDString_(cocoa.NSString(_lib, traceId.toString())); + final startTime = + cocoa.PrivateSentrySDKOnly.startProfilerForTrace_(_lib, cSentryId); + return startTime; + } +} diff --git a/flutter/lib/src/native/factory.dart b/flutter/lib/src/native/factory.dart new file mode 100644 index 0000000000..981e1d6ead --- /dev/null +++ b/flutter/lib/src/native/factory.dart @@ -0,0 +1 @@ +export 'factory_real.dart' if (dart.library.html) 'factory_web.dart'; diff --git a/flutter/lib/src/native/factory_real.dart b/flutter/lib/src/native/factory_real.dart new file mode 100644 index 0000000000..3c918b7be7 --- /dev/null +++ b/flutter/lib/src/native/factory_real.dart @@ -0,0 +1,14 @@ +import 'package:flutter/services.dart'; + +import '../../sentry_flutter.dart'; +import 'cocoa/sentry_native_cocoa.dart'; +import 'sentry_native_binding.dart'; +import 'sentry_native_channel.dart'; + +SentryNativeBinding createBinding(PlatformChecker pc, MethodChannel channel) { + if (pc.platform.isIOS || pc.platform.isMacOS) { + return SentryNativeCocoa(channel); + } else { + return SentryNativeChannel(channel); + } +} diff --git a/flutter/lib/src/native/factory_web.dart b/flutter/lib/src/native/factory_web.dart new file mode 100644 index 0000000000..8038ea9780 --- /dev/null +++ b/flutter/lib/src/native/factory_web.dart @@ -0,0 +1,9 @@ +import 'package:flutter/services.dart'; + +import '../../sentry_flutter.dart'; +import 'sentry_native_binding.dart'; + +// This isn't actually called, see SentryFlutter.init() +SentryNativeBinding createBinding(PlatformChecker pc, MethodChannel channel) { + throw UnsupportedError("Native binding is not supported on this platform."); +} diff --git a/flutter/lib/src/native/method_channel_helper.dart b/flutter/lib/src/native/method_channel_helper.dart new file mode 100644 index 0000000000..bd3c8864b8 --- /dev/null +++ b/flutter/lib/src/native/method_channel_helper.dart @@ -0,0 +1,38 @@ +import 'package:meta/meta.dart'; + +/// Makes sure no invalid data is sent over method channels. +@internal +class MethodChannelHelper { + static dynamic normalize(dynamic data) { + if (data == null) { + return null; + } + if (_isPrimitive(data)) { + return data; + } else if (data is List) { + return _normalizeList(data); + } else if (data is Map) { + return normalizeMap(data); + } else { + return data.toString(); + } + } + + static Map? normalizeMap(Map? data) { + if (data == null) { + return null; + } + return data.map((key, value) => MapEntry(key, normalize(value))); + } + + static List? _normalizeList(List? data) { + if (data == null) { + return null; + } + return data.map((e) => normalize(e)).toList(); + } + + static bool _isPrimitive(dynamic value) { + return value == null || value is String || value is num || value is bool; + } +} diff --git a/flutter/lib/src/native_scope_observer.dart b/flutter/lib/src/native/native_scope_observer.dart similarity index 100% rename from flutter/lib/src/native_scope_observer.dart rename to flutter/lib/src/native/native_scope_observer.dart diff --git a/flutter/lib/src/native/sentry_native.dart b/flutter/lib/src/native/sentry_native.dart new file mode 100644 index 0000000000..b8d2206a8d --- /dev/null +++ b/flutter/lib/src/native/sentry_native.dart @@ -0,0 +1,156 @@ +import 'dart:async'; + +import 'package:meta/meta.dart'; + +import '../../sentry_flutter.dart'; +import 'sentry_native_binding.dart'; + +/// [SentryNative] holds state that it fetches from to the native SDKs. +/// It forwards to platform-specific implementations of [SentryNativeBinding]. +/// Any errors are logged and ignored. +@internal +class SentryNative { + final SentryOptions _options; + final SentryNativeBinding _binding; + + SentryNative(this._options, this._binding); + + // AppStart + + /// This timestamp marks the end of app startup. Either set automatically when + /// [SentryFlutterOptions.autoAppStart] is true, or by calling + /// [SentryFlutter.setAppStartEnd] + DateTime? appStartEnd; + + bool _didFetchAppStart = false; + + /// Flag indicating if app start was already fetched. + bool get didFetchAppStart => _didFetchAppStart; + + /// Fetch [NativeAppStart] from native channels. Can only be called once. + Future fetchNativeAppStart() async { + _didFetchAppStart = true; + return _invoke("fetchNativeAppStart", _binding.fetchNativeAppStart); + } + + // NativeFrames + + Future beginNativeFramesCollection() => + _invoke("beginNativeFrames", _binding.beginNativeFrames); + + Future endNativeFramesCollection(SentryId traceId) => + _invoke("endNativeFrames", () => _binding.endNativeFrames(traceId)); + + // Scope + + Future setContexts(String key, dynamic value) => + _invoke("setContexts", () => _binding.setContexts(key, value)); + + Future removeContexts(String key) => + _invoke("removeContexts", () => _binding.removeContexts(key)); + + Future setUser(SentryUser? sentryUser) => + _invoke("setUser", () => _binding.setUser(sentryUser)); + + Future addBreadcrumb(Breadcrumb breadcrumb) => + _invoke("addBreadcrumb", () => _binding.addBreadcrumb(breadcrumb)); + + Future clearBreadcrumbs() => + _invoke("clearBreadcrumbs", _binding.clearBreadcrumbs); + + Future setExtra(String key, dynamic value) => + _invoke("setExtra", () => _binding.setExtra(key, value)); + + Future removeExtra(String key) => + _invoke("removeExtra", () => _binding.removeExtra(key)); + + Future setTag(String key, String value) => + _invoke("setTag", () => _binding.setTag(key, value)); + + Future removeTag(String key) => + _invoke("removeTag", () => _binding.removeTag(key)); + + int? startProfiler(SentryId traceId) => + _invokeSync("startProfiler", () => _binding.startProfiler(traceId)); + + Future discardProfiler(SentryId traceId) => + _invoke("discardProfiler", () => _binding.discardProfiler(traceId)); + + Future?> collectProfile( + SentryId traceId, int startTimeNs, int endTimeNs) => + _invoke("collectProfile", + () => _binding.collectProfile(traceId, startTimeNs, endTimeNs)); + + /// Reset state + void reset() { + appStartEnd = null; + _didFetchAppStart = false; + } + + // Helpers + Future _invoke( + String nativeMethodName, Future Function() fn) async { + try { + return await fn(); + } catch (error, stackTrace) { + _logError(nativeMethodName, error, stackTrace); + // ignore: invalid_use_of_internal_member + if (_options.automatedTestMode) { + rethrow; + } + return null; + } + } + + T? _invokeSync(String nativeMethodName, T? Function() fn) { + try { + return fn(); + } catch (error, stackTrace) { + _logError(nativeMethodName, error, stackTrace); + // ignore: invalid_use_of_internal_member + if (_options.automatedTestMode) { + rethrow; + } + return null; + } + } + + void _logError(String nativeMethodName, Object error, StackTrace stackTrace) { + _options.logger( + SentryLevel.error, + 'Native call `$nativeMethodName` failed', + exception: error, + stackTrace: stackTrace, + ); + } +} + +class NativeAppStart { + NativeAppStart(this.appStartTime, this.isColdStart); + + double appStartTime; + bool isColdStart; + + factory NativeAppStart.fromJson(Map json) { + return NativeAppStart( + json['appStartTime'] as double, + json['isColdStart'] as bool, + ); + } +} + +class NativeFrames { + NativeFrames(this.totalFrames, this.slowFrames, this.frozenFrames); + + int totalFrames; + int slowFrames; + int frozenFrames; + + factory NativeFrames.fromJson(Map json) { + return NativeFrames( + json['totalFrames'] as int, + json['slowFrames'] as int, + json['frozenFrames'] as int, + ); + } +} diff --git a/flutter/lib/src/native/sentry_native_binding.dart b/flutter/lib/src/native/sentry_native_binding.dart new file mode 100644 index 0000000000..54d335d529 --- /dev/null +++ b/flutter/lib/src/native/sentry_native_binding.dart @@ -0,0 +1,43 @@ +import 'dart:async'; + +import 'package:meta/meta.dart'; + +import '../../sentry_flutter.dart'; +import 'sentry_native.dart'; + +/// Provide typed methods to access native layer. +@internal +abstract class SentryNativeBinding { + // TODO Move other native calls here. + + Future fetchNativeAppStart(); + + Future beginNativeFrames(); + + Future endNativeFrames(SentryId id); + + Future setUser(SentryUser? user); + + Future addBreadcrumb(Breadcrumb breadcrumb); + + Future clearBreadcrumbs(); + + Future setContexts(String key, dynamic value); + + Future removeContexts(String key); + + Future setExtra(String key, dynamic value); + + Future removeExtra(String key); + + Future setTag(String key, String value); + + Future removeTag(String key); + + int? startProfiler(SentryId traceId); + + Future discardProfiler(SentryId traceId); + + Future?> collectProfile( + SentryId traceId, int startTimeNs, int endTimeNs); +} diff --git a/flutter/lib/src/native/sentry_native_channel.dart b/flutter/lib/src/native/sentry_native_channel.dart new file mode 100644 index 0000000000..4bf9745cb3 --- /dev/null +++ b/flutter/lib/src/native/sentry_native_channel.dart @@ -0,0 +1,107 @@ +import 'dart:async'; + +import 'package:flutter/services.dart'; +import 'package:meta/meta.dart'; + +import '../../sentry_flutter.dart'; +import 'sentry_native.dart'; +import 'method_channel_helper.dart'; +import 'sentry_native_binding.dart'; + +/// Provide typed methods to access native layer via MethodChannel. +@internal +class SentryNativeChannel implements SentryNativeBinding { + SentryNativeChannel(this._channel); + + final MethodChannel _channel; + + // TODO Move other native calls here. + + @override + Future fetchNativeAppStart() async { + final json = + await _channel.invokeMapMethod('fetchNativeAppStart'); + return (json != null) ? NativeAppStart.fromJson(json) : null; + } + + @override + Future beginNativeFrames() => + _channel.invokeMethod('beginNativeFrames'); + + @override + Future endNativeFrames(SentryId id) async { + final json = await _channel.invokeMapMethod( + 'endNativeFrames', {'id': id.toString()}); + return (json != null) ? NativeFrames.fromJson(json) : null; + } + + @override + Future setUser(SentryUser? user) async { + final normalizedUser = user?.copyWith( + data: MethodChannelHelper.normalizeMap(user.data), + ); + await _channel.invokeMethod( + 'setUser', + {'user': normalizedUser?.toJson()}, + ); + } + + @override + Future addBreadcrumb(Breadcrumb breadcrumb) async { + final normalizedBreadcrumb = breadcrumb.copyWith( + data: MethodChannelHelper.normalizeMap(breadcrumb.data), + ); + await _channel.invokeMethod( + 'addBreadcrumb', + {'breadcrumb': normalizedBreadcrumb.toJson()}, + ); + } + + @override + Future clearBreadcrumbs() => _channel.invokeMethod('clearBreadcrumbs'); + + @override + Future setContexts(String key, dynamic value) => _channel.invokeMethod( + 'setContexts', + {'key': key, 'value': MethodChannelHelper.normalize(value)}, + ); + + @override + Future removeContexts(String key) => + _channel.invokeMethod('removeContexts', {'key': key}); + + @override + Future setExtra(String key, dynamic value) => _channel.invokeMethod( + 'setExtra', + {'key': key, 'value': MethodChannelHelper.normalize(value)}, + ); + + @override + Future removeExtra(String key) => + _channel.invokeMethod('removeExtra', {'key': key}); + + @override + Future setTag(String key, String value) => + _channel.invokeMethod('setTag', {'key': key, 'value': value}); + + @override + Future removeTag(String key) => + _channel.invokeMethod('removeTag', {'key': key}); + + @override + int? startProfiler(SentryId traceId) => + throw UnsupportedError("Not supported on this platform"); + + @override + Future discardProfiler(SentryId traceId) => + _channel.invokeMethod('discardProfiler', traceId.toString()); + + @override + Future?> collectProfile( + SentryId traceId, int startTimeNs, int endTimeNs) => + _channel.invokeMapMethod('collectProfile', { + 'traceId': traceId.toString(), + 'startTime': startTimeNs, + 'endTime': endTimeNs, + }); +} diff --git a/flutter/lib/src/navigation/sentry_navigator_observer.dart b/flutter/lib/src/navigation/sentry_navigator_observer.dart index 135d131ec2..6893d47aca 100644 --- a/flutter/lib/src/navigation/sentry_navigator_observer.dart +++ b/flutter/lib/src/navigation/sentry_navigator_observer.dart @@ -1,8 +1,9 @@ import 'package:flutter/widgets.dart'; +import 'package:meta/meta.dart'; import '../../sentry_flutter.dart'; -import '../sentry_native.dart'; -import '../sentry_native_channel.dart'; +import '../event_processor/flutter_enricher_event_processor.dart'; +import '../native/sentry_native.dart'; /// This key must be used so that the web interface displays the events nicely /// See https://develop.sentry.dev/sdk/event-payloads/breadcrumbs/ @@ -23,6 +24,9 @@ typedef AdditionalInfoExtractor = Map? Function( /// The [RouteSettings] is null if a developer has not specified any /// RouteSettings. /// +/// The current route name will also be set to [SentryEvent] +/// `contexts.app.view_names` by [FlutterEnricherEventProcessor]. +/// /// [SentryNavigatorObserver] must be added to the [navigation observer](https://api.flutter.dev/flutter/material/MaterialApp/navigatorObservers.html) of /// your used app. This is an example for [MaterialApp](https://api.flutter.dev/flutter/material/MaterialApp/navigatorObservers.html), /// but the integration for [CupertinoApp](https://api.flutter.dev/flutter/cupertino/CupertinoApp/navigatorObservers.html) @@ -68,7 +72,7 @@ class SentryNavigatorObserver extends RouteObserver> { _setRouteNameAsTransaction = setRouteNameAsTransaction, _routeNameExtractor = routeNameExtractor, _additionalInfoProvider = additionalInfoProvider, - _native = SentryNative() { + _native = SentryFlutter.native { if (enableAutoTransactions) { // ignore: invalid_use_of_internal_member _hub.options.sdk.addIntegration('UINavigationTracing'); @@ -81,15 +85,21 @@ class SentryNavigatorObserver extends RouteObserver> { final bool _setRouteNameAsTransaction; final RouteNameExtractor? _routeNameExtractor; final AdditionalInfoExtractor? _additionalInfoProvider; - final SentryNative _native; + final SentryNative? _native; ISentrySpan? _transaction; + static String? _currentRouteName; + + @internal + static String? get currentRouteName => _currentRouteName; + @override void didPush(Route route, Route? previousRoute) { super.didPush(route, previousRoute); - _setCurrentRoute(route); + _setCurrentRouteName(route); + _setCurrentRouteNameAsTransaction(route); _addBreadcrumb( type: 'didPush', @@ -105,7 +115,9 @@ class SentryNavigatorObserver extends RouteObserver> { void didReplace({Route? newRoute, Route? oldRoute}) { super.didReplace(newRoute: newRoute, oldRoute: oldRoute); - _setCurrentRoute(newRoute); + _setCurrentRouteName(newRoute); + _setCurrentRouteNameAsTransaction(newRoute); + _addBreadcrumb( type: 'didReplace', from: oldRoute?.settings, @@ -117,7 +129,9 @@ class SentryNavigatorObserver extends RouteObserver> { void didPop(Route route, Route? previousRoute) { super.didPop(route, previousRoute); - _setCurrentRoute(previousRoute); + _setCurrentRouteName(previousRoute); + _setCurrentRouteNameAsTransaction(previousRoute); + _addBreadcrumb( type: 'didPop', from: route.settings, @@ -148,7 +162,11 @@ class SentryNavigatorObserver extends RouteObserver> { ?.name; } - Future _setCurrentRoute(Route? route) async { + Future _setCurrentRouteName(Route? route) async { + _currentRouteName = _getRouteName(route); + } + + Future _setCurrentRouteNameAsTransaction(Route? route) async { final name = _getRouteName(route); if (name == null) { return; @@ -190,7 +208,7 @@ class SentryNavigatorObserver extends RouteObserver> { trimEnd: true, onFinish: (transaction) async { final nativeFrames = await _native - .endNativeFramesCollection(transaction.context.traceId); + ?.endNativeFramesCollection(transaction.context.traceId); if (nativeFrames != null) { final measurements = nativeFrames.toMeasurements(); for (final item in measurements.entries) { @@ -219,7 +237,7 @@ class SentryNavigatorObserver extends RouteObserver> { scope.span ??= _transaction; }); - await _native.beginNativeFramesCollection(); + await _native?.beginNativeFramesCollection(); } Future _finishTransaction() async { @@ -265,14 +283,12 @@ class RouteObserverBreadcrumb extends Breadcrumb { dynamic fromArgs, String? to, dynamic toArgs, - SentryLevel? level, - DateTime? timestamp, + super.level, + super.timestamp, Map? data, }) : super( category: _navigationKey, type: _navigationKey, - level: level, - timestamp: timestamp, data: { 'state': navigationType, if (from != null) 'from': from, diff --git a/flutter/lib/src/profiling.dart b/flutter/lib/src/profiling.dart new file mode 100644 index 0000000000..a4332d77e7 --- /dev/null +++ b/flutter/lib/src/profiling.dart @@ -0,0 +1,117 @@ +import 'dart:async'; + +// ignore: implementation_imports +import 'package:sentry/src/profiling.dart'; +// ignore: implementation_imports +import 'package:sentry/src/sentry_envelope_item_header.dart'; +// ignore: implementation_imports +import 'package:sentry/src/sentry_item_type.dart'; + +import '../sentry_flutter.dart'; +import 'native/sentry_native.dart'; + +// ignore: invalid_use_of_internal_member +class SentryNativeProfilerFactory implements SentryProfilerFactory { + final SentryNative _native; + final ClockProvider _clock; + + SentryNativeProfilerFactory(this._native, this._clock); + + static void attachTo(Hub hub, SentryNative native) { + // ignore: invalid_use_of_internal_member + final options = hub.options; + + // ignore: invalid_use_of_internal_member + if ((options.profilesSampleRate ?? 0.0) <= 0.0) { + return; + } + + if (options.platformChecker.isWeb) { + return; + } + + if (options.platformChecker.platform.isMacOS || + options.platformChecker.platform.isIOS) { + // ignore: invalid_use_of_internal_member + hub.profilerFactory = SentryNativeProfilerFactory(native, options.clock); + } + } + + @override + SentryNativeProfiler? startProfiler(SentryTransactionContext context) { + if (context.traceId == SentryId.empty()) { + return null; + } + + final startTime = _native.startProfiler(context.traceId); + if (startTime == null) { + return null; + } + return SentryNativeProfiler(_native, startTime, context.traceId, _clock); + } +} + +// ignore: invalid_use_of_internal_member +class SentryNativeProfiler implements SentryProfiler { + final SentryNative _native; + final int _starTimeNs; + final SentryId _traceId; + bool _finished = false; + final ClockProvider _clock; + + SentryNativeProfiler( + this._native, this._starTimeNs, this._traceId, this._clock); + + @override + void dispose() { + if (!_finished) { + _finished = true; + _native.discardProfiler(_traceId); + } + } + + @override + Future finishFor( + SentryTransaction transaction) async { + if (_finished) { + return null; + } + _finished = true; + + // ignore: invalid_use_of_internal_member + final transactionEndTime = transaction.timestamp ?? _clock(); + final duration = transactionEndTime.difference(transaction.startTimestamp); + final endTimeNs = _starTimeNs + (duration.inMicroseconds * 1000); + + final payload = + await _native.collectProfile(_traceId, _starTimeNs, endTimeNs); + if (payload == null) { + return null; + } + + payload["transaction"]["id"] = transaction.eventId.toString(); + payload["transaction"]["trace_id"] = _traceId.toString(); + payload["transaction"]["name"] = transaction.transaction; + payload["timestamp"] = transaction.startTimestamp.toIso8601String(); + return SentryNativeProfileInfo(payload); + } +} + +// ignore: invalid_use_of_internal_member +class SentryNativeProfileInfo implements SentryProfileInfo { + final Map _payload; + // ignore: invalid_use_of_internal_member + late final List _data = utf8JsonEncoder.convert(_payload); + + SentryNativeProfileInfo(this._payload); + + @override + SentryEnvelopeItem asEnvelopeItem() { + final header = SentryEnvelopeItemHeader( + SentryItemType.profile, + () => Future.value(_data.length), + contentType: 'application/json', + ); + return SentryEnvelopeItem(header, () => Future.value(_data)); + } +} diff --git a/flutter/lib/src/renderer/html_renderer.dart b/flutter/lib/src/renderer/html_renderer.dart index b768a14c09..de41f5e77a 100644 --- a/flutter/lib/src/renderer/html_renderer.dart +++ b/flutter/lib/src/renderer/html_renderer.dart @@ -2,7 +2,7 @@ import 'dart:js' as js; import 'renderer.dart'; -FlutterRenderer getRenderer() { +FlutterRenderer? getRenderer() { return isCanvasKitRenderer ? FlutterRenderer.canvasKit : FlutterRenderer.html; } diff --git a/flutter/lib/src/renderer/io_renderer.dart b/flutter/lib/src/renderer/io_renderer.dart index 961feb7a1f..77322a4e08 100644 --- a/flutter/lib/src/renderer/io_renderer.dart +++ b/flutter/lib/src/renderer/io_renderer.dart @@ -1,5 +1,3 @@ import 'renderer.dart'; -FlutterRenderer getRenderer() { - return FlutterRenderer.skia; -} +FlutterRenderer? getRenderer() => null; diff --git a/flutter/lib/src/renderer/renderer.dart b/flutter/lib/src/renderer/renderer.dart index b1b9c2dd69..3e41eced70 100644 --- a/flutter/lib/src/renderer/renderer.dart +++ b/flutter/lib/src/renderer/renderer.dart @@ -6,14 +6,22 @@ import 'unknown_renderer.dart' @internal class RendererWrapper { - FlutterRenderer getRenderer() { + FlutterRenderer? getRenderer() { return implementation.getRenderer(); } } enum FlutterRenderer { + /// https://skia.org/ skia, + + /// https://docs.flutter.dev/perf/impeller + impeller, + + /// https://docs.flutter.dev/platform-integration/web/renderers canvasKit, + + /// https://docs.flutter.dev/platform-integration/web/renderers html, unknown, } diff --git a/flutter/lib/src/screenshot/sentry_screenshot_widget.dart b/flutter/lib/src/screenshot/sentry_screenshot_widget.dart index b11b511bb3..e83d46d0c5 100644 --- a/flutter/lib/src/screenshot/sentry_screenshot_widget.dart +++ b/flutter/lib/src/screenshot/sentry_screenshot_widget.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:meta/meta.dart'; +import '../../sentry_flutter.dart'; + /// Key which is used to identify the [RepaintBoundary] @internal final sentryScreenshotWidgetGlobalKey = @@ -22,21 +24,37 @@ final sentryScreenshotWidgetGlobalKey = /// - You can only have one [SentryScreenshotWidget] widget in your widget tree at all /// times. class SentryScreenshotWidget extends StatefulWidget { - const SentryScreenshotWidget({Key? key, required this.child}) - : super(key: key); - final Widget child; + late final Hub _hub; + + SentryFlutterOptions? get _options => + // ignore: invalid_use_of_internal_member + _hub.options is SentryFlutterOptions + // ignore: invalid_use_of_internal_member + ? _hub.options as SentryFlutterOptions + : null; + + SentryScreenshotWidget({ + super.key, + required this.child, + @internal Hub? hub, + }) : _hub = hub ?? HubAdapter(); @override _SentryScreenshotWidgetState createState() => _SentryScreenshotWidgetState(); } class _SentryScreenshotWidgetState extends State { + SentryFlutterOptions? get _options => widget._options; + @override Widget build(BuildContext context) { - return RepaintBoundary( - key: sentryScreenshotWidgetGlobalKey, - child: widget.child, - ); + if (_options?.attachScreenshot ?? false) { + return RepaintBoundary( + key: sentryScreenshotWidgetGlobalKey, + child: widget.child, + ); + } + return widget.child; } } diff --git a/flutter/lib/src/sentry_flutter.dart b/flutter/lib/src/sentry_flutter.dart index 860990b213..44bec28657 100644 --- a/flutter/lib/src/sentry_flutter.dart +++ b/flutter/lib/src/sentry_flutter.dart @@ -9,11 +9,13 @@ import '../sentry_flutter.dart'; import 'event_processor/android_platform_exception_event_processor.dart'; import 'event_processor/flutter_exception_event_processor.dart'; import 'event_processor/platform_exception_event_processor.dart'; +import 'integrations/connectivity/connectivity_integration.dart'; import 'integrations/screenshot_integration.dart'; -import 'native_scope_observer.dart'; +import 'native/factory.dart'; +import 'native/native_scope_observer.dart'; +import 'profiling.dart'; import 'renderer/renderer.dart'; -import 'sentry_native.dart'; -import 'sentry_native_channel.dart'; +import 'native/sentry_native.dart'; import 'integrations/integrations.dart'; import 'event_processor/flutter_enricher_event_processor.dart'; @@ -47,10 +49,9 @@ mixin SentryFlutter { flutterOptions.rendererWrapper = rendererWrapper; } - final nativeChannel = SentryNativeChannel(channel, flutterOptions); if (flutterOptions.platformChecker.hasNativeIntegration) { - final native = SentryNative(); - native.nativeChannel = nativeChannel; + final binding = createBinding(flutterOptions.platformChecker, channel); + _native = SentryNative(flutterOptions, binding); } final platformDispatcher = PlatformDispatcher.instance; @@ -81,9 +82,7 @@ mixin SentryFlutter { await _initDefaultValues(flutterOptions, channel); await Sentry.init( - (options) async { - await optionsConfiguration(options as SentryFlutterOptions); - }, + (options) => optionsConfiguration(options as SentryFlutterOptions), appRunner: appRunner, // ignore: invalid_use_of_internal_member options: flutterOptions, @@ -92,6 +91,11 @@ mixin SentryFlutter { // ignore: invalid_use_of_internal_member runZonedGuardedOnError: runZonedGuardedOnError, ); + + if (_native != null) { + // ignore: invalid_use_of_internal_member + SentryNativeProfilerFactory.attachTo(Sentry.currentHub, _native!); + } } static Future _initDefaultValues( @@ -101,9 +105,9 @@ mixin SentryFlutter { options.addEventProcessor(FlutterExceptionEventProcessor()); // Not all platforms have a native integration. - if (options.platformChecker.hasNativeIntegration) { + if (_native != null) { options.transport = FileSystemTransport(channel, options); - options.addScopeObserver(NativeScopeObserver(SentryNative())); + options.addScopeObserver(NativeScopeObserver(_native!)); } var flutterEventProcessor = FlutterEnricherEventProcessor(options); @@ -164,11 +168,14 @@ mixin SentryFlutter { integrations.add(LoadImageListIntegration(channel)); } final renderer = options.rendererWrapper.getRenderer(); - if (renderer == FlutterRenderer.skia || - renderer == FlutterRenderer.canvasKit) { + if (!platformChecker.isWeb || renderer == FlutterRenderer.canvasKit) { integrations.add(ScreenshotIntegration()); } + if (platformChecker.isWeb) { + integrations.add(ConnectivityIntegration()); + } + // works with Skia, CanvasKit and HTML renderer integrations.add(SentryViewHierarchyIntegration()); @@ -179,9 +186,9 @@ mixin SentryFlutter { // in errors. integrations.add(LoadReleaseIntegration()); - if (platformChecker.hasNativeIntegration) { + if (_native != null) { integrations.add(NativeAppStartIntegration( - SentryNative(), + _native!, () { try { /// Flutter >= 2.12 throws if SchedulerBinding.instance isn't initialized. @@ -207,7 +214,7 @@ mixin SentryFlutter { /// Manually set when your app finished startup. Make sure to set /// [SentryFlutterOptions.autoAppStart] to false on init. static void setAppStartEnd(DateTime appStartEnd) { - SentryNative().appStartEnd = appStartEnd; + _native?.appStartEnd = appStartEnd; } static void _setSdk(SentryFlutterOptions options) { @@ -221,4 +228,10 @@ mixin SentryFlutter { sdk.addPackage('pub:sentry_flutter', sdkVersion); options.sdk = sdk; } + + @internal + static SentryNative? get native => _native; + @internal + static set native(SentryNative? value) => _native = value; + static SentryNative? _native; } diff --git a/flutter/lib/src/sentry_flutter_options.dart b/flutter/lib/src/sentry_flutter_options.dart index a1d7755c3c..ee722f8e9e 100644 --- a/flutter/lib/src/sentry_flutter_options.dart +++ b/flutter/lib/src/sentry_flutter_options.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:meta/meta.dart'; import 'package:sentry/sentry.dart'; import 'package:flutter/widgets.dart'; @@ -5,13 +7,13 @@ import 'package:flutter/widgets.dart'; import 'binding_wrapper.dart'; import 'renderer/renderer.dart'; import 'screenshot/sentry_screenshot_quality.dart'; +import 'event_processor/screenshot_event_processor.dart'; -/// This class adds options which are only availble in a Flutter environment. +/// This class adds options which are only available in a Flutter environment. /// Note that some of these options require native Sentry integration, which is /// not available on all platforms. class SentryFlutterOptions extends SentryOptions { - SentryFlutterOptions({String? dsn, PlatformChecker? checker}) - : super(dsn: dsn, checker: checker) { + SentryFlutterOptions({super.dsn, super.checker}) { enableBreadcrumbTrackingForCurrentPlatform(); } @@ -167,6 +169,14 @@ class SentryFlutterOptions extends SentryOptions { /// The quality of the attached screenshot SentryScreenshotQuality screenshotQuality = SentryScreenshotQuality.high; + /// Only attach a screenshot when the app is resumed. + bool attachScreenshotOnlyWhenResumed = false; + + /// Sets a callback which is executed before capturing screenshots. Only + /// relevant if `attachScreenshot` is set to true. When false is returned + /// from the function, no screenshot will be attached. + BeforeScreenshotCallback? beforeScreenshot; + /// Enable or disable automatic breadcrumbs for User interactions Using [Listener] /// /// Requires adding the [SentryUserInteractionWidget] to the widget tree. @@ -263,4 +273,34 @@ class SentryFlutterOptions extends SentryOptions { /// Setting this to a custom [BindingWrapper] allows you to use a custom [WidgetsBinding]. @experimental BindingWrapper bindingUtils = BindingWrapper(); + + /// The sample rate for profiling traces in the range of 0.0 to 1.0. + /// This is relative to tracesSampleRate - it is a ratio of profiled traces out of all sampled traces. + /// At the moment, only apps targeting iOS and macOS are supported. + @override + @experimental + double? get profilesSampleRate { + // ignore: invalid_use_of_internal_member + return super.profilesSampleRate; + } + + /// The sample rate for profiling traces in the range of 0.0 to 1.0. + /// This is relative to tracesSampleRate - it is a ratio of profiled traces out of all sampled traces. + /// At the moment, only apps targeting iOS and macOS are supported. + @override + @experimental + set profilesSampleRate(double? value) { + // ignore: invalid_use_of_internal_member + super.profilesSampleRate = value; + } + + /// The [navigatorKey] is used to add information of the currently used locale to the contexts. + GlobalKey? navigatorKey; } + +/// Callback being executed in [ScreenshotEventProcessor], deciding if a +/// screenshot should be recorded and attached. +typedef BeforeScreenshotCallback = FutureOr Function( + SentryEvent event, { + Hint? hint, +}); diff --git a/flutter/lib/src/sentry_native.dart b/flutter/lib/src/sentry_native.dart deleted file mode 100644 index 3727294f74..0000000000 --- a/flutter/lib/src/sentry_native.dart +++ /dev/null @@ -1,100 +0,0 @@ -import 'dart:async'; - -import 'package:meta/meta.dart'; - -import '../sentry_flutter.dart'; -import 'sentry_native_channel.dart'; - -/// [SentryNative] holds state that it fetches from to the native SDKs. Always -/// use the shared instance with [SentryNative()]. -@internal -class SentryNative { - SentryNative._(); - - static final SentryNative _instance = SentryNative._(); - - SentryNativeChannel? _nativeChannel; - - factory SentryNative() { - return _instance; - } - - SentryNativeChannel? get nativeChannel => _instance._nativeChannel; - - /// Provide [nativeChannel] for native communication. - set nativeChannel(SentryNativeChannel? nativeChannel) { - _instance._nativeChannel = nativeChannel; - } - - // AppStart - - /// This timestamp marks the end of app startup. Either set automatically when - /// [SentryFlutterOptions.autoAppStart] is true, or by calling - /// [SentryFlutter.setAppStartEnd] - DateTime? appStartEnd; - - bool _didFetchAppStart = false; - - /// Flag indicating if app start was already fetched. - bool get didFetchAppStart => _didFetchAppStart; - - /// Fetch [NativeAppStart] from native channels. Can only be called once. - Future fetchNativeAppStart() async { - _didFetchAppStart = true; - return await _nativeChannel?.fetchNativeAppStart(); - } - - // NativeFrames - - Future beginNativeFramesCollection() async { - await _nativeChannel?.beginNativeFrames(); - } - - Future endNativeFramesCollection(SentryId traceId) async { - return await _nativeChannel?.endNativeFrames(traceId); - } - - // Scope - - Future setContexts(String key, dynamic value) async { - return await _nativeChannel?.setContexts(key, value); - } - - Future removeContexts(String key) async { - return await _nativeChannel?.removeContexts(key); - } - - Future setUser(SentryUser? sentryUser) async { - return await _nativeChannel?.setUser(sentryUser); - } - - Future addBreadcrumb(Breadcrumb breadcrumb) async { - return await _nativeChannel?.addBreadcrumb(breadcrumb); - } - - Future clearBreadcrumbs() async { - return await _nativeChannel?.clearBreadcrumbs(); - } - - Future setExtra(String key, dynamic value) async { - return await _nativeChannel?.setExtra(key, value); - } - - Future removeExtra(String key) async { - return await _nativeChannel?.removeExtra(key); - } - - Future setTag(String key, String value) async { - return await _nativeChannel?.setTag(key, value); - } - - Future removeTag(String key) async { - return await _nativeChannel?.removeTag(key); - } - - /// Reset state - void reset() { - appStartEnd = null; - _didFetchAppStart = false; - } -} diff --git a/flutter/lib/src/sentry_native_channel.dart b/flutter/lib/src/sentry_native_channel.dart deleted file mode 100644 index 575e43b618..0000000000 --- a/flutter/lib/src/sentry_native_channel.dart +++ /dev/null @@ -1,161 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/services.dart'; -import 'package:meta/meta.dart'; - -import '../sentry_flutter.dart'; - -/// Provide typed methods to access native layer. -@internal -class SentryNativeChannel { - SentryNativeChannel(this._channel, this._options); - - final MethodChannel _channel; - final SentryFlutterOptions _options; - - // TODO Move other native calls here. - - Future fetchNativeAppStart() async { - try { - final json = await _channel - .invokeMapMethod('fetchNativeAppStart'); - return (json != null) ? NativeAppStart.fromJson(json) : null; - } catch (error, stackTrace) { - _logError('fetchNativeAppStart', error, stackTrace); - return null; - } - } - - Future beginNativeFrames() async { - try { - await _channel.invokeMethod('beginNativeFrames'); - } catch (error, stackTrace) { - _logError('beginNativeFrames', error, stackTrace); - } - } - - Future endNativeFrames(SentryId id) async { - try { - final json = await _channel.invokeMapMethod( - 'endNativeFrames', {'id': id.toString()}); - return (json != null) ? NativeFrames.fromJson(json) : null; - } catch (error, stackTrace) { - _logError('endNativeFrames', error, stackTrace); - return null; - } - } - - Future setUser(SentryUser? user) async { - try { - await _channel.invokeMethod('setUser', {'user': user?.toJson()}); - } catch (error, stackTrace) { - _logError('setUser', error, stackTrace); - } - } - - Future addBreadcrumb(Breadcrumb breadcrumb) async { - try { - await _channel - .invokeMethod('addBreadcrumb', {'breadcrumb': breadcrumb.toJson()}); - } catch (error, stackTrace) { - _logError('addBreadcrumb', error, stackTrace); - } - } - - Future clearBreadcrumbs() async { - try { - await _channel.invokeMethod('clearBreadcrumbs'); - } catch (error, stackTrace) { - _logError('clearBreadcrumbs', error, stackTrace); - } - } - - Future setContexts(String key, dynamic value) async { - try { - await _channel.invokeMethod('setContexts', {'key': key, 'value': value}); - } catch (error, stackTrace) { - _logError('setContexts', error, stackTrace); - } - } - - Future removeContexts(String key) async { - try { - await _channel.invokeMethod('removeContexts', {'key': key}); - } catch (error, stackTrace) { - _logError('removeContexts', error, stackTrace); - } - } - - Future setExtra(String key, dynamic value) async { - try { - await _channel.invokeMethod('setExtra', {'key': key, 'value': value}); - } catch (error, stackTrace) { - _logError('setExtra', error, stackTrace); - } - } - - Future removeExtra(String key) async { - try { - await _channel.invokeMethod('removeExtra', {'key': key}); - } catch (error, stackTrace) { - _logError('removeExtra', error, stackTrace); - } - } - - Future setTag(String key, dynamic value) async { - try { - await _channel.invokeMethod('setTag', {'key': key, 'value': value}); - } catch (error, stackTrace) { - _logError('setTag', error, stackTrace); - } - } - - Future removeTag(String key) async { - try { - await _channel.invokeMethod('removeTag', {'key': key}); - } catch (error, stackTrace) { - _logError('removeTag', error, stackTrace); - } - } - - // Helper - - void _logError(String nativeMethodName, Object error, StackTrace stackTrace) { - _options.logger( - SentryLevel.error, - 'Native call `$nativeMethodName` failed', - exception: error, - stackTrace: stackTrace, - ); - } -} - -class NativeAppStart { - NativeAppStart(this.appStartTime, this.isColdStart); - - double appStartTime; - bool isColdStart; - - factory NativeAppStart.fromJson(Map json) { - return NativeAppStart( - json['appStartTime'] as double, - json['isColdStart'] as bool, - ); - } -} - -class NativeFrames { - NativeFrames(this.totalFrames, this.slowFrames, this.frozenFrames); - - int totalFrames; - int slowFrames; - int frozenFrames; - - factory NativeFrames.fromJson(Map json) { - return NativeFrames( - json['totalFrames'] as int, - json['slowFrames'] as int, - json['frozenFrames'] as int, - ); - } -} diff --git a/flutter/lib/src/sentry_widget.dart b/flutter/lib/src/sentry_widget.dart new file mode 100644 index 0000000000..ed390d1ab4 --- /dev/null +++ b/flutter/lib/src/sentry_widget.dart @@ -0,0 +1,23 @@ +import 'package:flutter/cupertino.dart'; +import '../sentry_flutter.dart'; + +/// This widget serves as a wrapper to include Sentry widgets such +/// as [SentryScreenshotWidget] and [SentryUserInteractionWidget]. +class SentryWidget extends StatefulWidget { + final Widget child; + + const SentryWidget({super.key, required this.child}); + + @override + _SentryWidgetState createState() => _SentryWidgetState(); +} + +class _SentryWidgetState extends State { + @override + Widget build(BuildContext context) { + Widget content = widget.child; + content = SentryScreenshotWidget(child: content); + content = SentryUserInteractionWidget(child: content); + return content; + } +} diff --git a/flutter/lib/src/user_interaction/sentry_user_interaction_widget.dart b/flutter/lib/src/user_interaction/sentry_user_interaction_widget.dart index 46b25e5cb3..018f750a2e 100644 --- a/flutter/lib/src/user_interaction/sentry_user_interaction_widget.dart +++ b/flutter/lib/src/user_interaction/sentry_user_interaction_widget.dart @@ -234,10 +234,10 @@ Element? _clickTrackerElement; /// [SentryUserInteractionWidget] as a child of [SentryScreenshotWidget]. class SentryUserInteractionWidget extends StatefulWidget { SentryUserInteractionWidget({ - Key? key, + super.key, required this.child, @internal Hub? hub, - }) : super(key: key) { + }) { _hub = hub ?? HubAdapter(); if (_options?.enableUserInteractionTracing ?? false) { @@ -281,12 +281,16 @@ class _SentryUserInteractionWidgetState @override Widget build(BuildContext context) { - return Listener( - behavior: HitTestBehavior.translucent, - onPointerDown: _onPointerDown, - onPointerUp: _onPointerUp, - child: widget.child, - ); + if ((_options?.enableUserInteractionTracing ?? true) || + (_options?.enableUserInteractionBreadcrumbs ?? true)) { + return Listener( + behavior: HitTestBehavior.translucent, + onPointerDown: _onPointerDown, + onPointerUp: _onPointerUp, + child: widget.child, + ); + } + return widget.child; } void _onPointerDown(PointerDownEvent event) { diff --git a/flutter/lib/src/version.dart b/flutter/lib/src/version.dart index 0da840e5b1..078ad6a08f 100644 --- a/flutter/lib/src/version.dart +++ b/flutter/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '7.9.0'; +const String sdkVersion = '7.16.0'; /// The default SDK name reported to Sentry.io in the submitted events. const String sdkName = 'sentry.dart.flutter'; diff --git a/flutter/macos/Classes/SentryFlutter.swift b/flutter/macos/Classes/SentryFlutter.swift new file mode 120000 index 0000000000..ea42d8c01c --- /dev/null +++ b/flutter/macos/Classes/SentryFlutter.swift @@ -0,0 +1 @@ +../../ios/Classes/SentryFlutter.swift \ No newline at end of file diff --git a/flutter/pubspec.yaml b/flutter/pubspec.yaml index f49fb9ca53..9757dbd698 100644 --- a/flutter/pubspec.yaml +++ b/flutter/pubspec.yaml @@ -1,5 +1,5 @@ name: sentry_flutter -version: 7.9.0 +version: 7.16.0 description: Sentry SDK for Flutter. This package aims to support different Flutter targets by relying on the many platforms supported by Sentry with native SDKs. homepage: https://docs.sentry.io/platforms/flutter/ repository: https://github.com/getsentry/sentry-dart @@ -15,9 +15,10 @@ dependencies: sdk: flutter flutter_web_plugins: sdk: flutter - sentry: 7.9.0 - package_info_plus: '>=1.0.0 <5.0.0' + sentry: 7.16.0 + package_info_plus: '>=1.0.0 <=5.0.1' meta: ^1.3.0 + ffi: ^2.0.0 dev_dependencies: build_runner: ^2.4.2 @@ -25,7 +26,11 @@ dev_dependencies: sdk: flutter mockito: ^5.1.0 yaml: ^3.1.0 # needed for version match (code and pubspec) - flutter_lints: ^2.0.0 + flutter_lints: ^3.0.0 + collection: ^1.16.0 + remove_from_coverage: ^2.0.0 + flutter_localizations: + sdk: flutter flutter: plugin: diff --git a/flutter/scripts/generate-cocoa-bindings.sh b/flutter/scripts/generate-cocoa-bindings.sh new file mode 100755 index 0000000000..3381089df5 --- /dev/null +++ b/flutter/scripts/generate-cocoa-bindings.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +set -euo pipefail + +if [[ -n ${CI:+x} ]]; then + echo "Running in CI so we need to set up Flutter SDK first" + curl -Lv https://storage.googleapis.com/flutter_infra_release/releases/stable/macos/flutter_macos_3.13.3-stable.zip --output /tmp/flutter.zip + unzip -q /tmp/flutter.zip -d /tmp + export PATH=":/tmp/flutter/bin:$PATH" + which flutter + flutter --version +fi + +cocoa_version="${1:-$(./scripts/update-cocoa.sh get-version)}" + +cd "$(dirname "$0")/../" + +# Remove dependency on script exit (even in case of an error). +trap "dart pub remove ffigen" EXIT + +# Currently we add the dependency only when the code needs to be generated because it depends +# on Dart SDK 3.2.0 which isn't available on with Flutter stable yet. +# Leaving the dependency in pubspec would block all contributors. +# As for why this is coming from a fork - because we need a specific version of ffigen including PR 607 but not PR 601 +# which starts generating code not compatible with Dart SDK 2.17. The problem is they were merged in the wrong order... +dart pub add 'dev:ffigen:{"git":{"url":"https://github.com/getsentry/ffigen","ref":"6aa2c2642f507eab3df83373189170797a9fa5e7"}}' + +# Download Cocoa SDK (we need the headers) +temp="cocoa_bindings_temp" +rm -rf $temp +mkdir -p $temp +curl -Lv https://github.com/getsentry/sentry-cocoa/releases/download/$cocoa_version/Sentry.xcframework.zip -o $temp/Sentry.xcframework.zip +subdir="Carthage/Build/Sentry.xcframework/macos-arm64_x86_64/Sentry.framework" +unzip -q $temp/Sentry.xcframework.zip "$subdir/*" -d $temp +mv "$temp/$subdir" $temp/Sentry.framework + +dart run ffigen --config ffi-cocoa.yaml +sed -i.bak 's|final class|class|g' lib/src/native/cocoa/binding.dart +rm lib/src/native/cocoa/binding.dart.bak diff --git a/flutter/scripts/update-cocoa.sh b/flutter/scripts/update-cocoa.sh index ebe557c405..d54a754399 100755 --- a/flutter/scripts/update-cocoa.sh +++ b/flutter/scripts/update-cocoa.sh @@ -20,6 +20,7 @@ get-repo) set-version) newValue="${BASH_REMATCH[1]}'$2'" echo "${content/${BASH_REMATCH[0]}/$newValue}" >$file + ../scripts/generate-cocoa-bindings.sh "$2" ;; *) echo "Unknown argument $1" diff --git a/flutter/test/android_platform_exception_event_processor_test.dart b/flutter/test/android_platform_exception_event_processor_test.dart index 0ac142922a..5e916f06a3 100644 --- a/flutter/test/android_platform_exception_event_processor_test.dart +++ b/flutter/test/android_platform_exception_event_processor_test.dart @@ -30,7 +30,7 @@ void main() { .apply(fixture.eventWithPlatformStackTrace, Hint()); final exceptions = platformExceptionEvent!.exceptions!; - expect(exceptions.length, 2); + expect(exceptions.length, 3); final platformException = exceptions[1]; @@ -40,6 +40,15 @@ void main() { "Unsupported value: '[Ljava.lang.StackTraceElement;@ba6feed' of type 'class [Ljava.lang.StackTraceElement;'", ); expect(platformException.stackTrace!.frames.length, 18); + + final platformException_2 = exceptions[2]; + + expect(platformException_2.type, 'IllegalArgumentException'); + expect( + platformException_2.value, + "Unsupported value: '[Ljava.lang.StackTraceElement;@ba6feed' of type 'class [Ljava.lang.StackTraceElement;'", + ); + expect(platformException_2.stackTrace!.frames.length, 18); }); test( @@ -49,7 +58,7 @@ void main() { .apply(fixture.eventWithPlatformStackTrace, Hint()); final exceptions = platformExceptionEvent!.exceptions!; - expect(exceptions.length, 2); + expect(exceptions.length, 3); expect(platformExceptionEvent.threads?.first.current, true); expect(platformExceptionEvent.threads?.first.crashed, false); @@ -60,7 +69,7 @@ void main() { .apply(fixture.eventWithPlatformStackTrace, Hint()); final exceptions = platformExceptionEvent!.exceptions!; - expect(exceptions.length, 2); + expect(exceptions.length, 3); final platformException = exceptions[1]; final platformThread = platformExceptionEvent.threads?[1]; @@ -80,7 +89,7 @@ void main() { .apply(fixture.eventWithPlatformStackTrace, Hint()); final exceptions = platformExceptionEvent!.exceptions!; - expect(exceptions.length, 2); + expect(exceptions.length, 3); expect(platformExceptionEvent.threads?.length, threadCount); }); @@ -145,12 +154,23 @@ class Fixture { } final testPlatformException = PlatformException( + code: 'error', + details: + "Unsupported value: '[Ljava.lang.StackTraceElement;@fa902f1' of type 'class [Ljava.lang.StackTraceElement;'", + message: _jvmStackTrace, + stacktrace: _jvmStackTrace, +); + +final emptyPlatformException = PlatformException( code: 'error', details: "Unsupported value: '[Ljava.lang.StackTraceElement;@fa902f1' of type 'class [Ljava.lang.StackTraceElement;'", message: null, - stacktrace: - """java.lang.IllegalArgumentException: Unsupported value: '[Ljava.lang.StackTraceElement;@ba6feed' of type 'class [Ljava.lang.StackTraceElement;' + stacktrace: null, +); + +const _jvmStackTrace = + """java.lang.IllegalArgumentException: Unsupported value: '[Ljava.lang.StackTraceElement;@ba6feed' of type 'class [Ljava.lang.StackTraceElement;' at io.flutter.plugin.common.StandardMessageCodec.writeValue(StandardMessageCodec.java:292) at io.flutter.plugin.common.StandardMethodCodec.encodeSuccessEnvelope(StandardMethodCodec.java:59) at io.flutter.plugin.common.MethodChannel\$IncomingMethodCallHandler\$1.success(MethodChannel.java:267) @@ -168,13 +188,4 @@ final testPlatformException = PlatformException( at android.app.ActivityThread.main(ActivityThread.java:8138) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit\$MethodAndArgsCaller.run(RuntimeInit.java:556) - at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1037)""", -); - -final emptyPlatformException = PlatformException( - code: 'error', - details: - "Unsupported value: '[Ljava.lang.StackTraceElement;@fa902f1' of type 'class [Ljava.lang.StackTraceElement;'", - message: null, - stacktrace: null, -); + at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1037)"""; diff --git a/flutter/test/event_processor/flutter_enricher_event_processor_test.dart b/flutter/test/event_processor/flutter_enricher_event_processor_test.dart index 72ff0fc1cb..892e7ff517 100644 --- a/flutter/test/event_processor/flutter_enricher_event_processor_test.dart +++ b/flutter/test/event_processor/flutter_enricher_event_processor_test.dart @@ -1,9 +1,11 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; + // backcompatibility for Flutter < 3.3 // ignore: unnecessary_import import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; @@ -22,7 +24,38 @@ void main() { fixture = Fixture(); }); - testWidgets('flutter context', (WidgetTester tester) async { + testWidgets('flutter context on dart:io', (WidgetTester tester) async { + if (kIsWeb) { + // widget tests don't support onPlatform config + // https://pub.dev/packages/test#platform-specific-configuration + return; + } + // These two values need to be changed inside the test, + // otherwise the Flutter test framework complains that these + // values are changed outside of a test. + debugBrightnessOverride = Brightness.dark; + debugDefaultTargetPlatformOverride = TargetPlatform.android; + final enricher = fixture.getSut( + binding: () => tester.binding, + ); + + final event = await enricher.apply(SentryEvent(), Hint()); + + debugBrightnessOverride = null; + debugDefaultTargetPlatformOverride = null; + + final flutterContext = event?.contexts['flutter_context']; + expect(flutterContext, isNotNull); + expect(flutterContext, isA>()); + }, skip: !kIsWeb); + + testWidgets('flutter context on web', (WidgetTester tester) async { + if (!kIsWeb) { + // widget tests don't support onPlatform config + // https://pub.dev/packages/test#platform-specific-configuration + return; + } + // These two values need to be changed inside the test, // otherwise the Flutter test framework complains that these // values are changed outside of a test. @@ -73,6 +106,38 @@ void main() { expect(culture?.timezone, isNotNull); }); + testWidgets( + 'GIVEN MaterialApp WHEN setting locale and sentryNavigatorKey THEN enrich event culture with selected locale', + (WidgetTester tester) async { + GlobalKey navigatorKey = GlobalKey(); + + await tester.pumpWidget(MaterialApp( + navigatorKey: navigatorKey, + home: Material(), + localizationsDelegates: const [ + GlobalMaterialLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ], + supportedLocales: const [ + Locale('en', 'US'), + Locale('de', 'DE'), + ], + locale: const Locale('de', 'DE'), + )); + + final enricher = fixture.getSut( + binding: () => tester.binding, + optionsBuilder: (options) { + options.navigatorKey = navigatorKey; + return options; + }, + ); + + final event = await enricher.apply(SentryEvent(), Hint()); + + expect(event?.contexts.culture?.locale, 'de-DE'); + }); + testWidgets('app context in foreground', (WidgetTester tester) async { final enricher = fixture.getSut( binding: () => tester.binding, @@ -322,6 +387,24 @@ void main() { .length; expect(ioEnricherCount, 1); }); + + testWidgets('adds SentryNavigatorObserver.currentRouteName as app.screen', + (tester) async { + final observer = SentryNavigatorObserver(); + final route = + fixture.route(RouteSettings(name: 'fixture-currentRouteName')); + observer.didPush(route, null); + + final eventWithContextsApp = + SentryEvent(contexts: Contexts(app: SentryApp())); + + final enricher = fixture.getSut( + binding: () => tester.binding, + ); + final event = await enricher.apply(eventWithContextsApp, Hint()); + + expect(event?.contexts.app?.viewNames, ['fixture-currentRouteName']); + }); }); } @@ -331,17 +414,25 @@ class Fixture { PlatformChecker? checker, bool hasNativeIntegration = false, bool reportPackages = true, + SentryFlutterOptions Function(SentryFlutterOptions)? optionsBuilder, }) { final platformChecker = checker ?? MockPlatformChecker( hasNativeIntegration: hasNativeIntegration, ); + final options = SentryFlutterOptions( dsn: fakeDsn, checker: platformChecker, )..reportPackages = reportPackages; - return FlutterEnricherEventProcessor(options); + final customizedOptions = optionsBuilder?.call(options) ?? options; + return FlutterEnricherEventProcessor(customizedOptions); } + + PageRoute route(RouteSettings? settings) => PageRouteBuilder( + pageBuilder: (_, __, ___) => Container(), + settings: settings, + ); } void loadTestPackage() { diff --git a/flutter/test/event_processor/screenshot_event_processor_test.dart b/flutter/test/event_processor/screenshot_event_processor_test.dart index 6101217a04..2c1d0a4adc 100644 --- a/flutter/test/event_processor/screenshot_event_processor_test.dart +++ b/flutter/test/event_processor/screenshot_event_processor_test.dart @@ -14,24 +14,32 @@ void main() { TestWidgetsFlutterBinding.ensureInitialized(); late Fixture fixture; + late SentryEvent event; + late Hint hint; + setUp(() { fixture = Fixture(); }); Future _addScreenshotAttachment( - WidgetTester tester, FlutterRenderer renderer, bool added, - {int? expectedMaxWidthOrHeight}) async { + WidgetTester tester, + FlutterRenderer? renderer, { + required bool isWeb, + required bool added, + int? expectedMaxWidthOrHeight, + }) async { // Run with real async https://stackoverflow.com/a/54021863 await tester.runAsync(() async { - final sut = fixture.getSut(renderer); + final sut = fixture.getSut(renderer, isWeb); await tester.pumpWidget(SentryScreenshotWidget( + hub: fixture.hub, child: Text('Catching Pokémon is a snap!', textDirection: TextDirection.ltr))); final throwable = Exception(); - final event = SentryEvent(throwable: throwable); - final hint = Hint(); + event = SentryEvent(throwable: throwable); + hint = Hint(); await sut.apply(event, hint); expect(hint.screenshot != null, added); @@ -48,55 +56,141 @@ void main() { }); } - testWidgets('adds screenshot attachment with skia renderer', (tester) async { - await _addScreenshotAttachment(tester, FlutterRenderer.skia, true); + testWidgets('adds screenshot attachment dart:io', (tester) async { + await _addScreenshotAttachment(tester, null, added: true, isWeb: false); }); testWidgets('adds screenshot attachment with canvasKit renderer', (tester) async { - await _addScreenshotAttachment(tester, FlutterRenderer.canvasKit, true); + await _addScreenshotAttachment(tester, FlutterRenderer.canvasKit, + added: true, isWeb: true); }); testWidgets('does not add screenshot attachment with html renderer', (tester) async { - await _addScreenshotAttachment(tester, FlutterRenderer.html, false); - }); - - testWidgets('does not add screenshot attachment with unknown renderer', - (tester) async { - await _addScreenshotAttachment(tester, FlutterRenderer.unknown, false); + await _addScreenshotAttachment(tester, FlutterRenderer.html, + added: false, isWeb: true); }); testWidgets('does add screenshot in correct resolution for low', (tester) async { final height = SentryScreenshotQuality.low.targetResolution()!; fixture.options.screenshotQuality = SentryScreenshotQuality.low; - await _addScreenshotAttachment(tester, FlutterRenderer.skia, true, - expectedMaxWidthOrHeight: height); + await _addScreenshotAttachment(tester, null, + added: true, isWeb: false, expectedMaxWidthOrHeight: height); }); testWidgets('does add screenshot in correct resolution for medium', (tester) async { final height = SentryScreenshotQuality.medium.targetResolution()!; fixture.options.screenshotQuality = SentryScreenshotQuality.medium; - await _addScreenshotAttachment(tester, FlutterRenderer.skia, true, - expectedMaxWidthOrHeight: height); + await _addScreenshotAttachment(tester, null, + added: true, isWeb: false, expectedMaxWidthOrHeight: height); }); testWidgets('does add screenshot in correct resolution for high', (tester) async { final widthOrHeight = SentryScreenshotQuality.high.targetResolution()!; fixture.options.screenshotQuality = SentryScreenshotQuality.high; - await _addScreenshotAttachment(tester, FlutterRenderer.skia, true, - expectedMaxWidthOrHeight: widthOrHeight); + await _addScreenshotAttachment(tester, null, + added: true, isWeb: false, expectedMaxWidthOrHeight: widthOrHeight); + }); + + group('beforeScreenshot', () { + testWidgets('does add screenshot if beforeScreenshot returns true', + (tester) async { + fixture.options.beforeScreenshot = (SentryEvent event, {Hint? hint}) { + return true; + }; + await _addScreenshotAttachment(tester, FlutterRenderer.canvasKit, + added: true, isWeb: false); + }); + + testWidgets('does add screenshot if async beforeScreenshot returns true', + (tester) async { + fixture.options.beforeScreenshot = + (SentryEvent event, {Hint? hint}) async { + await Future.delayed(Duration(milliseconds: 1)); + return true; + }; + await _addScreenshotAttachment(tester, FlutterRenderer.canvasKit, + added: true, isWeb: false); + }); + + testWidgets('does not add screenshot if beforeScreenshot returns false', + (tester) async { + fixture.options.beforeScreenshot = (SentryEvent event, {Hint? hint}) { + return false; + }; + await _addScreenshotAttachment(tester, FlutterRenderer.canvasKit, + added: false, isWeb: false); + }); + + testWidgets( + 'does not add screenshot if async beforeScreenshot returns false', + (tester) async { + fixture.options.beforeScreenshot = + (SentryEvent event, {Hint? hint}) async { + await Future.delayed(Duration(milliseconds: 1)); + return false; + }; + await _addScreenshotAttachment(tester, FlutterRenderer.canvasKit, + added: false, isWeb: false); + }); + + testWidgets('does add screenshot if beforeScreenshot throws', + (tester) async { + fixture.options.beforeScreenshot = (SentryEvent event, {Hint? hint}) { + throw Error(); + }; + await _addScreenshotAttachment(tester, FlutterRenderer.canvasKit, + added: true, isWeb: false); + }); + + testWidgets('does add screenshot if async beforeScreenshot throws', + (tester) async { + fixture.options.beforeScreenshot = + (SentryEvent event, {Hint? hint}) async { + await Future.delayed(Duration(milliseconds: 1)); + throw Error(); + }; + await _addScreenshotAttachment(tester, FlutterRenderer.canvasKit, + added: true, isWeb: false); + }); + + testWidgets('passes event & hint to beforeScreenshot callback', + (tester) async { + SentryEvent? beforeScreenshotEvent; + Hint? beforeScreenshotHint; + + fixture.options.beforeScreenshot = (SentryEvent event, {Hint? hint}) { + beforeScreenshotEvent = event; + beforeScreenshotHint = hint; + return true; + }; + + await _addScreenshotAttachment(tester, FlutterRenderer.canvasKit, + added: true, isWeb: false); + + expect(beforeScreenshotEvent, event); + expect(beforeScreenshotHint, hint); + }); }); } class Fixture { + late Hub hub; SentryFlutterOptions options = SentryFlutterOptions(dsn: fakeDsn); - ScreenshotEventProcessor getSut(FlutterRenderer flutterRenderer) { + Fixture() { + options.attachScreenshot = true; + hub = Hub(options); + } + + ScreenshotEventProcessor getSut( + FlutterRenderer? flutterRenderer, bool isWeb) { options.rendererWrapper = MockRendererWrapper(flutterRenderer); + options.platformChecker = MockPlatformChecker(isWebValue: isWeb); return ScreenshotEventProcessor(options); } } diff --git a/flutter/test/initialization_test.dart b/flutter/test/initialization_test.dart index cf1374df37..29d5e42c96 100644 --- a/flutter/test/initialization_test.dart +++ b/flutter/test/initialization_test.dart @@ -18,7 +18,7 @@ void main() { (options) { options.dsn = fakeDsn; // ignore: invalid_use_of_internal_member - options.devMode = true; + options.automatedTestMode = true; }, ); @@ -28,7 +28,7 @@ void main() { (options) { options.dsn = fakeDsn; // ignore: invalid_use_of_internal_member - options.devMode = true; + options.automatedTestMode = true; }, ); @@ -42,7 +42,7 @@ void main() { (options) { options.dsn = fakeDsn; // ignore: invalid_use_of_internal_member - options.devMode = true; + options.automatedTestMode = true; }, ); @@ -52,7 +52,7 @@ void main() { (options) { options.dsn = fakeDsn; // ignore: invalid_use_of_internal_member - options.devMode = true; + options.automatedTestMode = true; }, ); diff --git a/flutter/test/integrations/connectivity_integration_test.dart b/flutter/test/integrations/connectivity_integration_test.dart new file mode 100644 index 0000000000..2f0781e9ec --- /dev/null +++ b/flutter/test/integrations/connectivity_integration_test.dart @@ -0,0 +1,56 @@ +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:sentry/sentry.dart'; +import 'package:sentry_flutter/src/integrations/connectivity/connectivity_integration.dart'; +import 'package:sentry_flutter/src/sentry_flutter_options.dart'; + +import '../mocks.dart'; +import '../mocks.mocks.dart'; + +void main() { + WidgetsFlutterBinding.ensureInitialized(); + + late Fixture fixture; + + setUp(() { + fixture = Fixture(); + }); + + verifyBreadcrumb(Breadcrumb crumb, String connectivityData) { + expect(crumb.category, 'device.connectivity'); + expect(crumb.type, 'connectivity'); + expect(crumb.level, SentryLevel.info); + expect(crumb.data?['connectivity'], connectivityData); + } + + test('adds integration', () { + final sut = fixture.getSut(); + sut(fixture.hub, fixture.options); + + expect(fixture.options.sdk.integrations.contains('connectivityIntegration'), + true); + }); + + test('$ConnectivityIntegration: addsBreadcrumb', () { + final integration = fixture.getSut(); + integration.call(fixture.hub, fixture.options); + + integration.addBreadcrumb('wifi'); + + final crumb = verify( + fixture.hub.addBreadcrumb(captureAny), + ).captured.first as Breadcrumb; + + verifyBreadcrumb(crumb, 'wifi'); + }); +} + +class Fixture { + final hub = MockHub(); + final options = SentryFlutterOptions(dsn: fakeDsn); + + ConnectivityIntegration getSut() { + return ConnectivityIntegration(); + } +} diff --git a/flutter/test/integrations/flutter_error_integration_test.dart b/flutter/test/integrations/flutter_error_integration_test.dart index 43df8de278..401b606bc4 100644 --- a/flutter/test/integrations/flutter_error_integration_test.dart +++ b/flutter/test/integrations/flutter_error_integration_test.dart @@ -246,6 +246,20 @@ void main() { await span?.finish(); }); + + test('captures error with level error', () async { + final exception = StateError('error'); + + fixture.options.markAutomaticallyCollectedErrorsAsFatal = false; + + _reportError(exception: exception); + + final event = verify( + await fixture.hub.captureEvent(captureAny, hint: anyNamed('hint')), + ).captured.first as SentryEvent; + + expect(event.level, SentryLevel.error); + }); }); } diff --git a/flutter/test/integrations/load_image_list_test.dart b/flutter/test/integrations/load_image_list_test.dart index 1b82a3332e..b02acc94f3 100644 --- a/flutter/test/integrations/load_image_list_test.dart +++ b/flutter/test/integrations/load_image_list_test.dart @@ -187,12 +187,7 @@ void main() { SentryEvent _getEvent() { final frame = SentryStackFrame(platform: 'native'); final st = SentryStackTrace(frames: [frame]); - final ex = SentryException( - type: 'type', - value: 'value', - stackTrace: st, - ); - return SentryEvent(exceptions: [ex]); + return SentryEvent(threads: [SentryThread(stacktrace: st)]); } class Fixture { diff --git a/flutter/test/integrations/native_app_start_integration_test.dart b/flutter/test/integrations/native_app_start_integration_test.dart index 467ac9bb55..d16815bbe4 100644 --- a/flutter/test/integrations/native_app_start_integration_test.dart +++ b/flutter/test/integrations/native_app_start_integration_test.dart @@ -4,8 +4,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/mockito.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:sentry_flutter/src/integrations/native_app_start_integration.dart'; -import 'package:sentry_flutter/src/sentry_native.dart'; -import 'package:sentry_flutter/src/sentry_native_channel.dart'; +import 'package:sentry_flutter/src/native/sentry_native.dart'; import 'package:sentry/src/sentry_tracer.dart'; import '../mocks.dart'; @@ -24,7 +23,7 @@ void main() { test('native app start measurement added to first transaction', () async { fixture.options.autoAppStart = false; fixture.native.appStartEnd = DateTime.fromMillisecondsSinceEpoch(10); - fixture.wrapper.nativeAppStart = NativeAppStart(0, true); + fixture.binding.nativeAppStart = NativeAppStart(0, true); fixture.getNativeAppStartIntegration().call(fixture.hub, fixture.options); @@ -44,7 +43,7 @@ void main() { () async { fixture.options.autoAppStart = false; fixture.native.appStartEnd = DateTime.fromMillisecondsSinceEpoch(10); - fixture.wrapper.nativeAppStart = NativeAppStart(0, true); + fixture.binding.nativeAppStart = NativeAppStart(0, true); fixture.getNativeAppStartIntegration().call(fixture.hub, fixture.options); @@ -64,7 +63,7 @@ void main() { test('measurements appended', () async { fixture.options.autoAppStart = false; fixture.native.appStartEnd = DateTime.fromMillisecondsSinceEpoch(10); - fixture.wrapper.nativeAppStart = NativeAppStart(0, true); + fixture.binding.nativeAppStart = NativeAppStart(0, true); final measurement = SentryMeasurement.warmAppStart(Duration(seconds: 1)); fixture.getNativeAppStartIntegration().call(fixture.hub, fixture.options); @@ -87,7 +86,7 @@ void main() { test('native app start measurement not added if more than 60s', () async { fixture.options.autoAppStart = false; fixture.native.appStartEnd = DateTime.fromMillisecondsSinceEpoch(60001); - fixture.wrapper.nativeAppStart = NativeAppStart(0, true); + fixture.binding.nativeAppStart = NativeAppStart(0, true); fixture.getNativeAppStartIntegration().call(fixture.hub, fixture.options); @@ -106,11 +105,10 @@ void main() { class Fixture { final hub = MockHub(); final options = SentryFlutterOptions(dsn: fakeDsn); - final wrapper = MockNativeChannel(); - late final native = SentryNative(); + final binding = MockNativeChannel(); + late final native = SentryNative(options, binding); Fixture() { - native.nativeChannel = wrapper; native.reset(); when(hub.options).thenReturn(options); } diff --git a/flutter/test/jvm/jvm_exception_test.dart b/flutter/test/jvm/jvm_exception_test.dart index 3202da097d..de8a3b4e29 100644 --- a/flutter/test/jvm/jvm_exception_test.dart +++ b/flutter/test/jvm/jvm_exception_test.dart @@ -40,7 +40,7 @@ void main() { 'Violation of unique constraint MY_ENTITY_UK_1: duplicate value(s) for column(s) MY_COLUMN in statement [...]'); expect(thirdCause.thread, null); expect(thirdCause.type, 'java.sql.SQLException'); - expect(thirdCause.stackTrace.length, 6); + expect(thirdCause.stackTrace.length, 5); expect(thirdCause.causes, null); expect(thirdCause.suppressed, null); }); @@ -85,6 +85,16 @@ void main() { expect(exception.stackTrace[0].fileName, 'StandardMessageCodec.java'); expect(exception.stackTrace[0].lineNumber, 292); }); + + test('parse drops empty frames', () { + final exception = JvmException.parse(platformExceptionWithEmptyStackFrames); + expect(exception.stackTrace.length, 13); + expect(exception.stackTrace.last.className, + 'com.android.internal.os.ZygoteInit'); + expect(exception.stackTrace.last.fileName, 'ZygoteInit.java'); + expect(exception.stackTrace.last.method, 'main'); + expect(exception.stackTrace.last.lineNumber, 936); + }); } const javaExceptionWithCauses = ''' @@ -194,3 +204,21 @@ java.lang.IllegalArgumentException: Unsupported value: '[Ljava.lang.StackTraceEl at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit\$MethodAndArgsCaller.run(RuntimeInit.java:556) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1037)'''; + +const platformExceptionWithEmptyStackFrames = ''' +java.lang.RuntimeException: Catch this platform exception! + at io.sentry.samples.flutter.MainActivity\$configureFlutterEngine\$1.onMethodCall(MainActivity.kt:40) + at io.flutter.plugin.common.MethodChannel\$IncomingMethodCallHandler.onMessage(MethodChannel.java:258) + at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:295) + at io.flutter.embedding.engine.dart.DartMessenger.lambda\$dispatchMessageToQueue\$0\$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:322) + at io.flutter.embedding.engine.dart.DartMessenger\$\$ExternalSyntheticLambda0.run(Unknown Source:12) + at android.os.Handler.handleCallback(Handler.java:942) + at android.os.Handler.dispatchMessage(Handler.java:99) + at android.os.Looper.loopOnce(Looper.java:201) + at android.os.Looper.loop(Looper.java:288) + at android.app.ActivityThread.main(ActivityThread.java:7872) + at java.lang.reflect.Method.invoke + at com.android.internal.os.RuntimeInit\$MethodAndArgsCaller.run(RuntimeInit.java:548) + at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) + + '''; diff --git a/flutter/test/method_channel_helper_test.dart b/flutter/test/method_channel_helper_test.dart new file mode 100644 index 0000000000..12729e7313 --- /dev/null +++ b/flutter/test/method_channel_helper_test.dart @@ -0,0 +1,159 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:sentry_flutter/src/native/method_channel_helper.dart'; +import 'package:collection/collection.dart'; + +void main() { + group('normalize', () { + test('primitives', () { + var expected = { + 'null': null, + 'int': 1, + 'float': 1.1, + 'bool': true, + 'string': 'Foo', + }; + + var actual = MethodChannelHelper.normalizeMap(expected); + expect( + DeepCollectionEquality().equals(actual, expected), + true, + ); + + expect(MethodChannelHelper.normalize(null), null); + expect(MethodChannelHelper.normalize(1), 1); + expect(MethodChannelHelper.normalize(1.1), 1.1); + expect(MethodChannelHelper.normalize(true), true); + expect(MethodChannelHelper.normalize('Foo'), 'Foo'); + }); + + test('object', () { + expect(MethodChannelHelper.normalize(_CustomObject()), 'CustomObject()'); + }); + + test('object in list', () { + var input = { + 'object': [_CustomObject()] + }; + var expected = { + 'object': ['CustomObject()'] + }; + + var actual = MethodChannelHelper.normalize(input); + expect( + DeepCollectionEquality().equals(actual, expected), + true, + ); + }); + + test('object in map', () { + var input = { + 'object': {'object': _CustomObject()} + }; + var expected = { + 'object': {'object': 'CustomObject()'} + }; + + var actual = MethodChannelHelper.normalize(input); + expect( + DeepCollectionEquality().equals(actual, expected), + true, + ); + }); + }); + + group('normalizeMap', () { + test('primitives', () { + var expected = { + 'null': null, + 'int': 1, + 'float': 1.1, + 'bool': true, + 'string': 'Foo', + }; + + var actual = MethodChannelHelper.normalizeMap(expected); + expect( + DeepCollectionEquality().equals(actual, expected), + true, + ); + }); + + test('list with primitives', () { + var expected = { + 'list': [null, 1, 1.1, true, 'Foo'], + }; + + var actual = MethodChannelHelper.normalizeMap(expected); + expect( + DeepCollectionEquality().equals(actual, expected), + true, + ); + }); + + test('map with primitives', () { + var expected = { + 'map': { + 'null': null, + 'int': 1, + 'float': 1.1, + 'bool': true, + 'string': 'Foo', + }, + }; + + var actual = MethodChannelHelper.normalizeMap(expected); + expect( + DeepCollectionEquality().equals(actual, expected), + true, + ); + }); + + test('object', () { + var input = {'object': _CustomObject()}; + var expected = {'object': 'CustomObject()'}; + + var actual = MethodChannelHelper.normalizeMap(input); + expect( + DeepCollectionEquality().equals(actual, expected), + true, + ); + }); + + test('object in list', () { + var input = { + 'object': [_CustomObject()] + }; + var expected = { + 'object': ['CustomObject()'] + }; + + var actual = MethodChannelHelper.normalizeMap(input); + expect( + DeepCollectionEquality().equals(actual, expected), + true, + ); + }); + + test('object in map', () { + var input = { + 'object': {'object': _CustomObject()} + }; + var expected = { + 'object': {'object': 'CustomObject()'} + }; + + var actual = MethodChannelHelper.normalizeMap(input); + expect( + DeepCollectionEquality().equals(actual, expected), + true, + ); + }); + }); +} + +class _CustomObject { + @override + String toString() { + return 'CustomObject()'; + } +} diff --git a/flutter/test/mocks.dart b/flutter/test/mocks.dart index 28da5e6bff..b2e01788c1 100644 --- a/flutter/test/mocks.dart +++ b/flutter/test/mocks.dart @@ -4,15 +4,14 @@ import 'package:flutter/services.dart'; import 'package:flutter/src/widgets/binding.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/annotations.dart'; -import 'package:sentry/sentry.dart'; import 'package:sentry/src/platform/platform.dart'; import 'package:sentry/src/sentry_tracer.dart'; import 'package:meta/meta.dart'; -import 'package:sentry_flutter/src/binding_wrapper.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:sentry_flutter/src/renderer/renderer.dart'; -import 'package:sentry_flutter/src/sentry_native.dart'; -import 'package:sentry_flutter/src/sentry_native_channel.dart'; +import 'package:sentry_flutter/src/native/sentry_native.dart'; +import 'package:sentry_flutter/src/native/sentry_native_binding.dart'; import 'mocks.mocks.dart'; import 'no_such_method_provider.dart'; @@ -20,6 +19,12 @@ import 'no_such_method_provider.dart'; const fakeDsn = 'https://abc@def.ingest.sentry.io/1234567'; const fakeProguardUuid = '3457d982-65ef-576d-a6ad-65b5f30f49a5'; +// TODO use this everywhere in tests so that we don't get exceptions swallowed. +SentryFlutterOptions defaultTestOptions() { + // ignore: invalid_use_of_internal_member + return SentryFlutterOptions(dsn: fakeDsn)..automatedTestMode = true; +} + // https://github.com/dart-lang/mockito/blob/master/NULL_SAFETY_README.md#fallback-generators ISentrySpan startTransactionShim( String? name, @@ -40,8 +45,8 @@ ISentrySpan startTransactionShim( Transport, // ignore: invalid_use_of_internal_member SentryTracer, + SentryTransaction, MethodChannel, - SentryNative, ], customMocks: [ MockSpec(fallbackGenerators: {#startTransaction: startTransactionShim}) ]) @@ -146,7 +151,7 @@ class MockPlatformChecker with NoSuchMethodProvider implements PlatformChecker { // Does nothing or returns default values. // Useful for when a Hub needs to be passed but is not used. class NoOpHub with NoSuchMethodProvider implements Hub { - final _options = SentryOptions(dsn: 'fixture-dsn'); + final _options = defaultTestOptions(); @override @internal @@ -156,13 +161,11 @@ class NoOpHub with NoSuchMethodProvider implements Hub { bool get isEnabled => false; } +// TODO can this be replaced with https://pub.dev/packages/mockito#verifying-exact-number-of-invocations--at-least-x--never class TestMockSentryNative implements SentryNative { @override DateTime? appStartEnd; - @override - SentryNativeChannel? nativeChannel; - bool _didFetchAppStart = false; @override @@ -189,6 +192,9 @@ class TestMockSentryNative implements SentryNative { var numberOfSetTagCalls = 0; SentryUser? sentryUser; var numberOfSetUserCalls = 0; + var numberOfStartProfilerCalls = 0; + var numberOfDiscardProfilerCalls = 0; + var numberOfCollectProfileCalls = 0; @override Future addBreadcrumb(Breadcrumb breadcrumb) async { @@ -265,9 +271,29 @@ class TestMockSentryNative implements SentryNative { this.sentryUser = sentryUser; numberOfSetUserCalls++; } + + @override + Future?> collectProfile( + SentryId traceId, int startTimeNs, int endTimeNs) { + numberOfCollectProfileCalls++; + return Future.value(null); + } + + @override + int? startProfiler(SentryId traceId) { + numberOfStartProfilerCalls++; + return 42; + } + + @override + Future discardProfiler(SentryId traceId) { + numberOfDiscardProfilerCalls++; + return Future.value(null); + } } -class MockNativeChannel implements SentryNativeChannel { +// TODO can this be replaced with https://pub.dev/packages/mockito#verifying-exact-number-of-invocations--at-least-x--never +class MockNativeChannel implements SentryNativeBinding { NativeAppStart? nativeAppStart; NativeFrames? nativeFrames; SentryId? id; @@ -283,6 +309,9 @@ class MockNativeChannel implements SentryNativeChannel { int numberOfSetContextsCalls = 0; int numberOfSetExtraCalls = 0; int numberOfSetTagCalls = 0; + int numberOfStartProfilerCalls = 0; + int numberOfDiscardProfilerCalls = 0; + int numberOfCollectProfileCalls = 0; @override Future fetchNativeAppStart() async => nativeAppStart; @@ -343,15 +372,34 @@ class MockNativeChannel implements SentryNativeChannel { Future setTag(String key, value) async { numberOfSetTagCalls += 1; } + + @override + Future?> collectProfile( + SentryId traceId, int startTimeNs, int endTimeNs) { + numberOfCollectProfileCalls++; + return Future.value(null); + } + + @override + int? startProfiler(SentryId traceId) { + numberOfStartProfilerCalls++; + return null; + } + + @override + Future discardProfiler(SentryId traceId) { + numberOfDiscardProfilerCalls++; + return Future.value(null); + } } class MockRendererWrapper implements RendererWrapper { MockRendererWrapper(this._renderer); - final FlutterRenderer _renderer; + final FlutterRenderer? _renderer; @override - FlutterRenderer getRenderer() { + FlutterRenderer? getRenderer() { return _renderer; } } diff --git a/flutter/test/mocks.mocks.dart b/flutter/test/mocks.mocks.dart index 70a42aff77..e2807ef405 100644 --- a/flutter/test/mocks.mocks.dart +++ b/flutter/test/mocks.mocks.dart @@ -3,20 +3,19 @@ // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:async' as _i6; +import 'dart:async' as _i7; -import 'package:flutter/src/services/binary_messenger.dart' as _i5; -import 'package:flutter/src/services/message_codec.dart' as _i4; -import 'package:flutter/src/services/platform_channel.dart' as _i9; +import 'package:flutter/src/services/binary_messenger.dart' as _i6; +import 'package:flutter/src/services/message_codec.dart' as _i5; +import 'package:flutter/src/services/platform_channel.dart' as _i10; import 'package:mockito/mockito.dart' as _i1; import 'package:sentry/sentry.dart' as _i2; +import 'package:sentry/src/profiling.dart' as _i9; import 'package:sentry/src/protocol.dart' as _i3; -import 'package:sentry/src/sentry_envelope.dart' as _i7; -import 'package:sentry/src/sentry_tracer.dart' as _i8; -import 'package:sentry_flutter/src/sentry_native.dart' as _i10; -import 'package:sentry_flutter/src/sentry_native_channel.dart' as _i11; +import 'package:sentry/src/sentry_envelope.dart' as _i8; +import 'package:sentry/src/sentry_tracer.dart' as _i4; -import 'mocks.dart' as _i12; +import 'mocks.dart' as _i11; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values @@ -71,8 +70,8 @@ class _FakeSentryTraceHeader_3 extends _i1.SmartFake ); } -class _FakeMethodCodec_4 extends _i1.SmartFake implements _i4.MethodCodec { - _FakeMethodCodec_4( +class _FakeSentryTracer_4 extends _i1.SmartFake implements _i4.SentryTracer { + _FakeSentryTracer_4( Object parent, Invocation parentInvocation, ) : super( @@ -81,9 +80,8 @@ class _FakeMethodCodec_4 extends _i1.SmartFake implements _i4.MethodCodec { ); } -class _FakeBinaryMessenger_5 extends _i1.SmartFake - implements _i5.BinaryMessenger { - _FakeBinaryMessenger_5( +class _FakeSentryId_5 extends _i1.SmartFake implements _i3.SentryId { + _FakeSentryId_5( Object parent, Invocation parentInvocation, ) : super( @@ -92,8 +90,8 @@ class _FakeBinaryMessenger_5 extends _i1.SmartFake ); } -class _FakeSentryOptions_6 extends _i1.SmartFake implements _i2.SentryOptions { - _FakeSentryOptions_6( +class _FakeContexts_6 extends _i1.SmartFake implements _i3.Contexts { + _FakeContexts_6( Object parent, Invocation parentInvocation, ) : super( @@ -102,8 +100,9 @@ class _FakeSentryOptions_6 extends _i1.SmartFake implements _i2.SentryOptions { ); } -class _FakeSentryId_7 extends _i1.SmartFake implements _i3.SentryId { - _FakeSentryId_7( +class _FakeSentryTransaction_7 extends _i1.SmartFake + implements _i3.SentryTransaction { + _FakeSentryTransaction_7( Object parent, Invocation parentInvocation, ) : super( @@ -112,8 +111,49 @@ class _FakeSentryId_7 extends _i1.SmartFake implements _i3.SentryId { ); } -class _FakeHub_8 extends _i1.SmartFake implements _i2.Hub { - _FakeHub_8( +class _FakeMethodCodec_8 extends _i1.SmartFake implements _i5.MethodCodec { + _FakeMethodCodec_8( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeBinaryMessenger_9 extends _i1.SmartFake + implements _i6.BinaryMessenger { + _FakeBinaryMessenger_9( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeSentryOptions_10 extends _i1.SmartFake implements _i2.SentryOptions { + _FakeSentryOptions_10( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeScope_11 extends _i1.SmartFake implements _i2.Scope { + _FakeScope_11( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeHub_12 extends _i1.SmartFake implements _i2.Hub { + _FakeHub_12( Object parent, Invocation parentInvocation, ) : super( @@ -131,21 +171,20 @@ class MockTransport extends _i1.Mock implements _i2.Transport { } @override - _i6.Future<_i3.SentryId?> send(_i7.SentryEnvelope? envelope) => + _i7.Future<_i3.SentryId?> send(_i8.SentryEnvelope? envelope) => (super.noSuchMethod( Invocation.method( #send, [envelope], ), - returnValue: _i6.Future<_i3.SentryId?>.value(), - ) as _i6.Future<_i3.SentryId?>); + returnValue: _i7.Future<_i3.SentryId?>.value(), + ) as _i7.Future<_i3.SentryId?>); } /// A class which mocks [SentryTracer]. /// /// See the documentation for Mockito's code generation for more information. -// ignore: invalid_use_of_internal_member -class MockSentryTracer extends _i1.Mock implements _i8.SentryTracer { +class MockSentryTracer extends _i1.Mock implements _i4.SentryTracer { MockSentryTracer() { _i1.throwOnMissingStub(this); } @@ -155,6 +194,7 @@ class MockSentryTracer extends _i1.Mock implements _i8.SentryTracer { Invocation.getter(#name), returnValue: '', ) as String); + @override set name(String? _name) => super.noSuchMethod( Invocation.setter( @@ -163,12 +203,14 @@ class MockSentryTracer extends _i1.Mock implements _i8.SentryTracer { ), returnValueForMissingStub: null, ); + @override _i3.SentryTransactionNameSource get transactionNameSource => (super.noSuchMethod( Invocation.getter(#transactionNameSource), returnValue: _i3.SentryTransactionNameSource.custom, ) as _i3.SentryTransactionNameSource); + @override set transactionNameSource( _i3.SentryTransactionNameSource? _transactionNameSource) => @@ -179,6 +221,25 @@ class MockSentryTracer extends _i1.Mock implements _i8.SentryTracer { ), returnValueForMissingStub: null, ); + + @override + set profiler(_i9.SentryProfiler? _profiler) => super.noSuchMethod( + Invocation.setter( + #profiler, + _profiler, + ), + returnValueForMissingStub: null, + ); + + @override + set profileInfo(_i9.SentryProfileInfo? _profileInfo) => super.noSuchMethod( + Invocation.setter( + #profileInfo, + _profileInfo, + ), + returnValueForMissingStub: null, + ); + @override _i2.SentrySpanContext get context => (super.noSuchMethod( Invocation.getter(#context), @@ -187,6 +248,7 @@ class MockSentryTracer extends _i1.Mock implements _i8.SentryTracer { Invocation.getter(#context), ), ) as _i2.SentrySpanContext); + @override set origin(String? origin) => super.noSuchMethod( Invocation.setter( @@ -195,6 +257,7 @@ class MockSentryTracer extends _i1.Mock implements _i8.SentryTracer { ), returnValueForMissingStub: null, ); + @override DateTime get startTimestamp => (super.noSuchMethod( Invocation.getter(#startTimestamp), @@ -203,21 +266,25 @@ class MockSentryTracer extends _i1.Mock implements _i8.SentryTracer { Invocation.getter(#startTimestamp), ), ) as DateTime); + @override Map get data => (super.noSuchMethod( Invocation.getter(#data), returnValue: {}, ) as Map); + @override bool get finished => (super.noSuchMethod( Invocation.getter(#finished), returnValue: false, ) as bool); + @override List<_i3.SentrySpan> get children => (super.noSuchMethod( Invocation.getter(#children), returnValue: <_i3.SentrySpan>[], ) as List<_i3.SentrySpan>); + @override set throwable(dynamic throwable) => super.noSuchMethod( Invocation.setter( @@ -226,6 +293,7 @@ class MockSentryTracer extends _i1.Mock implements _i8.SentryTracer { ), returnValueForMissingStub: null, ); + @override set status(_i3.SpanStatus? status) => super.noSuchMethod( Invocation.setter( @@ -234,18 +302,21 @@ class MockSentryTracer extends _i1.Mock implements _i8.SentryTracer { ), returnValueForMissingStub: null, ); + @override Map get tags => (super.noSuchMethod( Invocation.getter(#tags), returnValue: {}, ) as Map); + @override Map get measurements => (super.noSuchMethod( Invocation.getter(#measurements), returnValue: {}, ) as Map); + @override - _i6.Future finish({ + _i7.Future finish({ _i3.SpanStatus? status, DateTime? endTimestamp, }) => @@ -258,9 +329,10 @@ class MockSentryTracer extends _i1.Mock implements _i8.SentryTracer { #endTimestamp: endTimestamp, }, ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override void removeData(String? key) => super.noSuchMethod( Invocation.method( @@ -269,6 +341,7 @@ class MockSentryTracer extends _i1.Mock implements _i8.SentryTracer { ), returnValueForMissingStub: null, ); + @override void removeTag(String? key) => super.noSuchMethod( Invocation.method( @@ -277,6 +350,7 @@ class MockSentryTracer extends _i1.Mock implements _i8.SentryTracer { ), returnValueForMissingStub: null, ); + @override void setData( String? key, @@ -292,6 +366,7 @@ class MockSentryTracer extends _i1.Mock implements _i8.SentryTracer { ), returnValueForMissingStub: null, ); + @override void setTag( String? key, @@ -307,6 +382,7 @@ class MockSentryTracer extends _i1.Mock implements _i8.SentryTracer { ), returnValueForMissingStub: null, ); + @override _i2.ISentrySpan startChild( String? operation, { @@ -334,6 +410,7 @@ class MockSentryTracer extends _i1.Mock implements _i8.SentryTracer { ), ), ) as _i2.ISentrySpan); + @override _i2.ISentrySpan startChildWithParentSpanId( _i3.SpanId? parentSpanId, @@ -368,6 +445,7 @@ class MockSentryTracer extends _i1.Mock implements _i8.SentryTracer { ), ), ) as _i2.ISentrySpan); + @override _i3.SentryTraceHeader toSentryTrace() => (super.noSuchMethod( Invocation.method( @@ -382,6 +460,7 @@ class MockSentryTracer extends _i1.Mock implements _i8.SentryTracer { ), ), ) as _i3.SentryTraceHeader); + @override void setMeasurement( String? name, @@ -399,6 +478,7 @@ class MockSentryTracer extends _i1.Mock implements _i8.SentryTracer { ), returnValueForMissingStub: null, ); + @override void scheduleFinish() => super.noSuchMethod( Invocation.method( @@ -409,257 +489,315 @@ class MockSentryTracer extends _i1.Mock implements _i8.SentryTracer { ); } -/// A class which mocks [MethodChannel]. +/// A class which mocks [SentryTransaction]. /// /// See the documentation for Mockito's code generation for more information. -class MockMethodChannel extends _i1.Mock implements _i9.MethodChannel { - MockMethodChannel() { +// ignore: must_be_immutable +class MockSentryTransaction extends _i1.Mock implements _i3.SentryTransaction { + MockSentryTransaction() { _i1.throwOnMissingStub(this); } @override - String get name => (super.noSuchMethod( - Invocation.getter(#name), - returnValue: '', - ) as String); - @override - _i4.MethodCodec get codec => (super.noSuchMethod( - Invocation.getter(#codec), - returnValue: _FakeMethodCodec_4( - this, - Invocation.getter(#codec), - ), - ) as _i4.MethodCodec); - @override - _i5.BinaryMessenger get binaryMessenger => (super.noSuchMethod( - Invocation.getter(#binaryMessenger), - returnValue: _FakeBinaryMessenger_5( + DateTime get startTimestamp => (super.noSuchMethod( + Invocation.getter(#startTimestamp), + returnValue: _FakeDateTime_1( this, - Invocation.getter(#binaryMessenger), - ), - ) as _i5.BinaryMessenger); - @override - _i6.Future invokeMethod( - String? method, [ - dynamic arguments, - ]) => - (super.noSuchMethod( - Invocation.method( - #invokeMethod, - [ - method, - arguments, - ], + Invocation.getter(#startTimestamp), ), - returnValue: _i6.Future.value(), - ) as _i6.Future); + ) as DateTime); + @override - _i6.Future?> invokeListMethod( - String? method, [ - dynamic arguments, - ]) => - (super.noSuchMethod( - Invocation.method( - #invokeListMethod, - [ - method, - arguments, - ], + set startTimestamp(DateTime? _startTimestamp) => super.noSuchMethod( + Invocation.setter( + #startTimestamp, + _startTimestamp, ), - returnValue: _i6.Future?>.value(), - ) as _i6.Future?>); + returnValueForMissingStub: null, + ); + @override - _i6.Future?> invokeMapMethod( - String? method, [ - dynamic arguments, - ]) => - (super.noSuchMethod( - Invocation.method( - #invokeMapMethod, - [ - method, - arguments, - ], - ), - returnValue: _i6.Future?>.value(), - ) as _i6.Future?>); + List<_i3.SentrySpan> get spans => (super.noSuchMethod( + Invocation.getter(#spans), + returnValue: <_i3.SentrySpan>[], + ) as List<_i3.SentrySpan>); + @override - void setMethodCallHandler( - _i6.Future Function(_i4.MethodCall)? handler) => - super.noSuchMethod( - Invocation.method( - #setMethodCallHandler, - [handler], + set spans(List<_i3.SentrySpan>? _spans) => super.noSuchMethod( + Invocation.setter( + #spans, + _spans, ), returnValueForMissingStub: null, ); -} -/// A class which mocks [SentryNative]. -/// -/// See the documentation for Mockito's code generation for more information. -class MockSentryNative extends _i1.Mock implements _i10.SentryNative { - MockSentryNative() { - _i1.throwOnMissingStub(this); - } + @override + _i4.SentryTracer get tracer => (super.noSuchMethod( + Invocation.getter(#tracer), + returnValue: _FakeSentryTracer_4( + this, + Invocation.getter(#tracer), + ), + ) as _i4.SentryTracer); @override - set appStartEnd(DateTime? _appStartEnd) => super.noSuchMethod( + Map get measurements => (super.noSuchMethod( + Invocation.getter(#measurements), + returnValue: {}, + ) as Map); + + @override + set measurements(Map? _measurements) => + super.noSuchMethod( Invocation.setter( - #appStartEnd, - _appStartEnd, + #measurements, + _measurements, ), returnValueForMissingStub: null, ); + @override - set nativeChannel(_i11.SentryNativeChannel? nativeChannel) => + set transactionInfo(_i3.SentryTransactionInfo? _transactionInfo) => super.noSuchMethod( Invocation.setter( - #nativeChannel, - nativeChannel, + #transactionInfo, + _transactionInfo, ), returnValueForMissingStub: null, ); + @override - bool get didFetchAppStart => (super.noSuchMethod( - Invocation.getter(#didFetchAppStart), + bool get finished => (super.noSuchMethod( + Invocation.getter(#finished), returnValue: false, ) as bool); + @override - _i6.Future<_i11.NativeAppStart?> fetchNativeAppStart() => (super.noSuchMethod( - Invocation.method( - #fetchNativeAppStart, - [], + bool get sampled => (super.noSuchMethod( + Invocation.getter(#sampled), + returnValue: false, + ) as bool); + + @override + _i3.SentryId get eventId => (super.noSuchMethod( + Invocation.getter(#eventId), + returnValue: _FakeSentryId_5( + this, + Invocation.getter(#eventId), ), - returnValue: _i6.Future<_i11.NativeAppStart?>.value(), - ) as _i6.Future<_i11.NativeAppStart?>); + ) as _i3.SentryId); + @override - _i6.Future beginNativeFramesCollection() => (super.noSuchMethod( - Invocation.method( - #beginNativeFramesCollection, - [], + _i3.Contexts get contexts => (super.noSuchMethod( + Invocation.getter(#contexts), + returnValue: _FakeContexts_6( + this, + Invocation.getter(#contexts), ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + ) as _i3.Contexts); + @override - _i6.Future<_i11.NativeFrames?> endNativeFramesCollection( - _i3.SentryId? traceId) => - (super.noSuchMethod( + Map toJson() => (super.noSuchMethod( Invocation.method( - #endNativeFramesCollection, - [traceId], + #toJson, + [], ), - returnValue: _i6.Future<_i11.NativeFrames?>.value(), - ) as _i6.Future<_i11.NativeFrames?>); + returnValue: {}, + ) as Map); + @override - _i6.Future setContexts( - String? key, - dynamic value, - ) => + _i3.SentryTransaction copyWith({ + _i3.SentryId? eventId, + DateTime? timestamp, + String? platform, + String? logger, + String? serverName, + String? release, + String? dist, + String? environment, + Map? modules, + _i3.SentryMessage? message, + String? transaction, + dynamic throwable, + _i3.SentryLevel? level, + String? culprit, + Map? tags, + Map? extra, + List? fingerprint, + _i3.SentryUser? user, + _i3.Contexts? contexts, + List<_i3.Breadcrumb>? breadcrumbs, + _i3.SdkVersion? sdk, + _i3.SentryRequest? request, + _i3.DebugMeta? debugMeta, + List<_i3.SentryException>? exceptions, + List<_i3.SentryThread>? threads, + String? type, + Map? measurements, + _i3.SentryTransactionInfo? transactionInfo, + }) => (super.noSuchMethod( Invocation.method( - #setContexts, - [ - key, - value, - ], + #copyWith, + [], + { + #eventId: eventId, + #timestamp: timestamp, + #platform: platform, + #logger: logger, + #serverName: serverName, + #release: release, + #dist: dist, + #environment: environment, + #modules: modules, + #message: message, + #transaction: transaction, + #throwable: throwable, + #level: level, + #culprit: culprit, + #tags: tags, + #extra: extra, + #fingerprint: fingerprint, + #user: user, + #contexts: contexts, + #breadcrumbs: breadcrumbs, + #sdk: sdk, + #request: request, + #debugMeta: debugMeta, + #exceptions: exceptions, + #threads: threads, + #type: type, + #measurements: measurements, + #transactionInfo: transactionInfo, + }, ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); - @override - _i6.Future removeContexts(String? key) => (super.noSuchMethod( - Invocation.method( - #removeContexts, - [key], + returnValue: _FakeSentryTransaction_7( + this, + Invocation.method( + #copyWith, + [], + { + #eventId: eventId, + #timestamp: timestamp, + #platform: platform, + #logger: logger, + #serverName: serverName, + #release: release, + #dist: dist, + #environment: environment, + #modules: modules, + #message: message, + #transaction: transaction, + #throwable: throwable, + #level: level, + #culprit: culprit, + #tags: tags, + #extra: extra, + #fingerprint: fingerprint, + #user: user, + #contexts: contexts, + #breadcrumbs: breadcrumbs, + #sdk: sdk, + #request: request, + #debugMeta: debugMeta, + #exceptions: exceptions, + #threads: threads, + #type: type, + #measurements: measurements, + #transactionInfo: transactionInfo, + }, + ), ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + ) as _i3.SentryTransaction); +} + +/// A class which mocks [MethodChannel]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockMethodChannel extends _i1.Mock implements _i10.MethodChannel { + MockMethodChannel() { + _i1.throwOnMissingStub(this); + } + @override - _i6.Future setUser(_i3.SentryUser? sentryUser) => (super.noSuchMethod( - Invocation.method( - #setUser, - [sentryUser], - ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + String get name => (super.noSuchMethod( + Invocation.getter(#name), + returnValue: '', + ) as String); + @override - _i6.Future addBreadcrumb(_i3.Breadcrumb? breadcrumb) => - (super.noSuchMethod( - Invocation.method( - #addBreadcrumb, - [breadcrumb], + _i5.MethodCodec get codec => (super.noSuchMethod( + Invocation.getter(#codec), + returnValue: _FakeMethodCodec_8( + this, + Invocation.getter(#codec), ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + ) as _i5.MethodCodec); + @override - _i6.Future clearBreadcrumbs() => (super.noSuchMethod( - Invocation.method( - #clearBreadcrumbs, - [], + _i6.BinaryMessenger get binaryMessenger => (super.noSuchMethod( + Invocation.getter(#binaryMessenger), + returnValue: _FakeBinaryMessenger_9( + this, + Invocation.getter(#binaryMessenger), ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + ) as _i6.BinaryMessenger); + @override - _i6.Future setExtra( - String? key, - dynamic value, - ) => + _i7.Future invokeMethod( + String? method, [ + dynamic arguments, + ]) => (super.noSuchMethod( Invocation.method( - #setExtra, + #invokeMethod, [ - key, - value, + method, + arguments, ], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); - @override - _i6.Future removeExtra(String? key) => (super.noSuchMethod( - Invocation.method( - #removeExtra, - [key], - ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i7.Future.value(), + ) as _i7.Future); + @override - _i6.Future setTag( - String? key, - String? value, - ) => + _i7.Future?> invokeListMethod( + String? method, [ + dynamic arguments, + ]) => (super.noSuchMethod( Invocation.method( - #setTag, + #invokeListMethod, [ - key, - value, + method, + arguments, ], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i7.Future?>.value(), + ) as _i7.Future?>); + @override - _i6.Future removeTag(String? key) => (super.noSuchMethod( + _i7.Future?> invokeMapMethod( + String? method, [ + dynamic arguments, + ]) => + (super.noSuchMethod( Invocation.method( - #removeTag, - [key], + #invokeMapMethod, + [ + method, + arguments, + ], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i7.Future?>.value(), + ) as _i7.Future?>); + @override - void reset() => super.noSuchMethod( + void setMethodCallHandler( + _i7.Future Function(_i5.MethodCall)? handler) => + super.noSuchMethod( Invocation.method( - #reset, - [], + #setMethodCallHandler, + [handler], ), returnValueForMissingStub: null, ); @@ -676,26 +814,47 @@ class MockHub extends _i1.Mock implements _i2.Hub { @override _i2.SentryOptions get options => (super.noSuchMethod( Invocation.getter(#options), - returnValue: _FakeSentryOptions_6( + returnValue: _FakeSentryOptions_10( this, Invocation.getter(#options), ), ) as _i2.SentryOptions); + @override bool get isEnabled => (super.noSuchMethod( Invocation.getter(#isEnabled), returnValue: false, ) as bool); + @override _i3.SentryId get lastEventId => (super.noSuchMethod( Invocation.getter(#lastEventId), - returnValue: _FakeSentryId_7( + returnValue: _FakeSentryId_5( this, Invocation.getter(#lastEventId), ), ) as _i3.SentryId); + + @override + _i2.Scope get scope => (super.noSuchMethod( + Invocation.getter(#scope), + returnValue: _FakeScope_11( + this, + Invocation.getter(#scope), + ), + ) as _i2.Scope); + @override - _i6.Future<_i3.SentryId> captureEvent( + set profilerFactory(_i9.SentryProfilerFactory? value) => super.noSuchMethod( + Invocation.setter( + #profilerFactory, + value, + ), + returnValueForMissingStub: null, + ); + + @override + _i7.Future<_i3.SentryId> captureEvent( _i3.SentryEvent? event, { dynamic stackTrace, _i2.Hint? hint, @@ -711,7 +870,7 @@ class MockHub extends _i1.Mock implements _i2.Hub { #withScope: withScope, }, ), - returnValue: _i6.Future<_i3.SentryId>.value(_FakeSentryId_7( + returnValue: _i7.Future<_i3.SentryId>.value(_FakeSentryId_5( this, Invocation.method( #captureEvent, @@ -723,9 +882,10 @@ class MockHub extends _i1.Mock implements _i2.Hub { }, ), )), - ) as _i6.Future<_i3.SentryId>); + ) as _i7.Future<_i3.SentryId>); + @override - _i6.Future<_i3.SentryId> captureException( + _i7.Future<_i3.SentryId> captureException( dynamic throwable, { dynamic stackTrace, _i2.Hint? hint, @@ -741,7 +901,7 @@ class MockHub extends _i1.Mock implements _i2.Hub { #withScope: withScope, }, ), - returnValue: _i6.Future<_i3.SentryId>.value(_FakeSentryId_7( + returnValue: _i7.Future<_i3.SentryId>.value(_FakeSentryId_5( this, Invocation.method( #captureException, @@ -753,9 +913,10 @@ class MockHub extends _i1.Mock implements _i2.Hub { }, ), )), - ) as _i6.Future<_i3.SentryId>); + ) as _i7.Future<_i3.SentryId>); + @override - _i6.Future<_i3.SentryId> captureMessage( + _i7.Future<_i3.SentryId> captureMessage( String? message, { _i3.SentryLevel? level, String? template, @@ -775,7 +936,7 @@ class MockHub extends _i1.Mock implements _i2.Hub { #withScope: withScope, }, ), - returnValue: _i6.Future<_i3.SentryId>.value(_FakeSentryId_7( + returnValue: _i7.Future<_i3.SentryId>.value(_FakeSentryId_5( this, Invocation.method( #captureMessage, @@ -789,19 +950,21 @@ class MockHub extends _i1.Mock implements _i2.Hub { }, ), )), - ) as _i6.Future<_i3.SentryId>); + ) as _i7.Future<_i3.SentryId>); + @override - _i6.Future captureUserFeedback(_i2.SentryUserFeedback? userFeedback) => + _i7.Future captureUserFeedback(_i2.SentryUserFeedback? userFeedback) => (super.noSuchMethod( Invocation.method( #captureUserFeedback, [userFeedback], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override - _i6.Future addBreadcrumb( + _i7.Future addBreadcrumb( _i3.Breadcrumb? crumb, { _i2.Hint? hint, }) => @@ -811,9 +974,10 @@ class MockHub extends _i1.Mock implements _i2.Hub { [crumb], {#hint: hint}, ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override void bindClient(_i2.SentryClient? client) => super.noSuchMethod( Invocation.method( @@ -822,13 +986,14 @@ class MockHub extends _i1.Mock implements _i2.Hub { ), returnValueForMissingStub: null, ); + @override _i2.Hub clone() => (super.noSuchMethod( Invocation.method( #clone, [], ), - returnValue: _FakeHub_8( + returnValue: _FakeHub_12( this, Invocation.method( #clone, @@ -836,21 +1001,24 @@ class MockHub extends _i1.Mock implements _i2.Hub { ), ), ) as _i2.Hub); + @override - _i6.Future close() => (super.noSuchMethod( + _i7.Future close() => (super.noSuchMethod( Invocation.method( #close, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) as _i7.Future); + @override - _i6.FutureOr configureScope(_i2.ScopeCallback? callback) => + _i7.FutureOr configureScope(_i2.ScopeCallback? callback) => (super.noSuchMethod(Invocation.method( #configureScope, [callback], - )) as _i6.FutureOr); + )) as _i7.FutureOr); + @override _i2.ISentrySpan startTransaction( String? name, @@ -882,7 +1050,7 @@ class MockHub extends _i1.Mock implements _i2.Hub { #customSamplingContext: customSamplingContext, }, ), - returnValue: _i12.startTransactionShim( + returnValue: _i11.startTransactionShim( name, operation, description: description, @@ -895,6 +1063,7 @@ class MockHub extends _i1.Mock implements _i2.Hub { customSamplingContext: customSamplingContext, ), ) as _i2.ISentrySpan); + @override _i2.ISentrySpan startTransactionWithContext( _i2.SentryTransactionContext? transactionContext, { @@ -937,8 +1106,9 @@ class MockHub extends _i1.Mock implements _i2.Hub { ), ), ) as _i2.ISentrySpan); + @override - _i6.Future<_i3.SentryId> captureTransaction( + _i7.Future<_i3.SentryId> captureTransaction( _i3.SentryTransaction? transaction, { _i2.SentryTraceContextHeader? traceContext, }) => @@ -948,7 +1118,7 @@ class MockHub extends _i1.Mock implements _i2.Hub { [transaction], {#traceContext: traceContext}, ), - returnValue: _i6.Future<_i3.SentryId>.value(_FakeSentryId_7( + returnValue: _i7.Future<_i3.SentryId>.value(_FakeSentryId_5( this, Invocation.method( #captureTransaction, @@ -956,7 +1126,8 @@ class MockHub extends _i1.Mock implements _i2.Hub { {#traceContext: traceContext}, ), )), - ) as _i6.Future<_i3.SentryId>); + ) as _i7.Future<_i3.SentryId>); + @override void setSpanContext( dynamic throwable, diff --git a/flutter/test/native_scope_observer_test.dart b/flutter/test/native_scope_observer_test.dart index 0efb22a2c1..916bd4b7be 100644 --- a/flutter/test/native_scope_observer_test.dart +++ b/flutter/test/native_scope_observer_test.dart @@ -2,7 +2,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:sentry/sentry.dart'; -import 'package:sentry_flutter/src/native_scope_observer.dart'; +import 'package:sentry_flutter/src/native/native_scope_observer.dart'; import 'mocks.dart'; diff --git a/flutter/test/profiling_test.dart b/flutter/test/profiling_test.dart new file mode 100644 index 0000000000..eddb391313 --- /dev/null +++ b/flutter/test/profiling_test.dart @@ -0,0 +1,95 @@ +@TestOn('vm') + +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; +import 'package:sentry_flutter/src/profiling.dart'; +import 'mocks.dart'; +import 'mocks.mocks.dart'; +import 'sentry_flutter_test.dart'; + +void main() { + group('$SentryNativeProfilerFactory', () { + Hub hubWithSampleRate(double profilesSampleRate) { + final o = SentryFlutterOptions(dsn: fakeDsn); + o.platformChecker = getPlatformChecker(platform: MockPlatform.iOs()); + o.profilesSampleRate = profilesSampleRate; + + final hub = MockHub(); + when(hub.options).thenAnswer((_) => o); + return hub; + } + + test('attachTo() respects sampling rate', () async { + var hub = hubWithSampleRate(0.0); + SentryNativeProfilerFactory.attachTo(hub, TestMockSentryNative()); + // ignore: invalid_use_of_internal_member + verifyNever(hub.profilerFactory = any); + + hub = hubWithSampleRate(0.1); + SentryNativeProfilerFactory.attachTo(hub, TestMockSentryNative()); + // ignore: invalid_use_of_internal_member + verify(hub.profilerFactory = any); + }); + + test('creates a profiler', () async { + final nativeMock = TestMockSentryNative(); + // ignore: invalid_use_of_internal_member + final sut = SentryNativeProfilerFactory(nativeMock, getUtcDateTime); + final profiler = sut.startProfiler(SentryTransactionContext( + 'name', + 'op', + )); + expect(nativeMock.numberOfStartProfilerCalls, 1); + expect(profiler, isNotNull); + }); + }); + + group('$SentryNativeProfiler', () { + late TestMockSentryNative nativeMock; + late SentryNativeProfiler sut; + + setUp(() { + nativeMock = TestMockSentryNative(); + // ignore: invalid_use_of_internal_member + final factory = SentryNativeProfilerFactory(nativeMock, getUtcDateTime); + final profiler = factory.startProfiler(SentryTransactionContext( + 'name', + 'op', + )); + expect(nativeMock.numberOfStartProfilerCalls, 1); + expect(profiler, isNotNull); + sut = profiler!; + }); + + test('dispose() calls native discard() exactly once', () async { + sut.dispose(); + sut.dispose(); // Additional calls must not have an effect. + + // Yield to let the .then() in .dispose() execute. + await null; + await null; + + expect(nativeMock.numberOfDiscardProfilerCalls, 1); + + // finishFor() mustn't work after disposing + expect(await sut.finishFor(MockSentryTransaction()), isNull); + expect(nativeMock.numberOfCollectProfileCalls, 0); + }); + + test('dispose() does not call discard() after finishing', () async { + final mockTransaction = MockSentryTransaction(); + when(mockTransaction.startTimestamp).thenReturn(DateTime.now()); + when(mockTransaction.timestamp).thenReturn(DateTime.now()); + expect(await sut.finishFor(mockTransaction), isNull); + + sut.dispose(); + + // Yield to let the .then() in .dispose() execute. + await null; + + expect(nativeMock.numberOfDiscardProfilerCalls, 0); + expect(nativeMock.numberOfCollectProfileCalls, 1); + }); + }); +} diff --git a/flutter/test/screenshot/sentry_screenshot_widget_test.dart b/flutter/test/screenshot/sentry_screenshot_widget_test.dart new file mode 100644 index 0000000000..fd4603c794 --- /dev/null +++ b/flutter/test/screenshot/sentry_screenshot_widget_test.dart @@ -0,0 +1,79 @@ +@TestOn('vm') +// ignore_for_file: invalid_use_of_internal_member + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; + +import '../mocks.dart'; + +void main() { + late Fixture fixture; + setUp(() { + fixture = Fixture(); + TestWidgetsFlutterBinding.ensureInitialized(); + }); + + testWidgets( + '$SentryScreenshotWidget does not apply when attachScreenshot is false', + (tester) async { + await tester.pumpWidget( + fixture.getSut( + attachScreenshot: false, + ), + ); + + final widget = find.byType(MyApp); + final repaintBoundaryFinder = find.descendant( + of: widget, + matching: find.byType(RepaintBoundary), + ); + expect(repaintBoundaryFinder, findsNothing); + }, + ); + + testWidgets( + '$SentryScreenshotWidget applies when attachScreenshot is true', + (tester) async { + await tester.pumpWidget( + fixture.getSut( + attachScreenshot: true, + ), + ); + + final widget = find.byType(MyApp); + final repaintBoundaryFinder = find.ancestor( + of: widget, + matching: find.byKey(sentryScreenshotWidgetGlobalKey), + ); + expect(repaintBoundaryFinder, findsOneWidget); + }, + ); +} + +class Fixture { + final _options = SentryFlutterOptions(dsn: fakeDsn); + late Hub hub; + + SentryScreenshotWidget getSut({ + bool attachScreenshot = false, + }) { + _options.attachScreenshot = attachScreenshot; + + hub = Hub(_options); + + return SentryScreenshotWidget( + hub: hub, + child: MaterialApp(home: MyApp()), + ); + } +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return const Text('test'); + } +} diff --git a/flutter/test/sentry_flutter_options_test.dart b/flutter/test/sentry_flutter_options_test.dart index a6d871318b..ed4a3ea7f7 100644 --- a/flutter/test/sentry_flutter_options_test.dart +++ b/flutter/test/sentry_flutter_options_test.dart @@ -32,7 +32,7 @@ void main() { expect(options.enableAutoNativeBreadcrumbs, isFalse); }); - testWidgets('useFlutterBreadcrumbTracking', (WidgetTester tester) async { + testWidgets('useNativeBreadcrumbTracking', (WidgetTester tester) async { final options = SentryFlutterOptions(); options.useNativeBreadcrumbTracking(); diff --git a/flutter/test/sentry_flutter_test.dart b/flutter/test/sentry_flutter_test.dart index 9a7df7d063..e06938da90 100644 --- a/flutter/test/sentry_flutter_test.dart +++ b/flutter/test/sentry_flutter_test.dart @@ -3,10 +3,11 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; +import 'package:sentry_flutter/src/integrations/connectivity/connectivity_integration.dart'; import 'package:sentry_flutter/src/integrations/integrations.dart'; import 'package:sentry_flutter/src/integrations/screenshot_integration.dart'; +import 'package:sentry_flutter/src/profiling.dart'; import 'package:sentry_flutter/src/renderer/renderer.dart'; -import 'package:sentry_flutter/src/sentry_native.dart'; import 'package:sentry_flutter/src/version.dart'; import 'package:sentry_flutter/src/view_hierarchy/view_hierarchy_integration.dart'; import 'mocks.dart'; @@ -23,6 +24,10 @@ final platformAgnosticIntegrations = [ SentryViewHierarchyIntegration, ]; +final webIntegrations = [ + ConnectivityIntegration, +]; + final nonWebIntegrations = [ OnErrorIntegration, ]; @@ -51,9 +56,7 @@ void main() { setUp(() async { loadTestPackage(); await Sentry.close(); - final sentryNative = SentryNative(); - sentryNative.nativeChannel = null; - sentryNative.reset(); + SentryFlutter.native = null; }); test('Android', () async { @@ -65,7 +68,8 @@ void main() { await SentryFlutter.init( (options) async { options.dsn = fakeDsn; - options.devMode = true; + options.automatedTestMode = true; + options.profilesSampleRate = 1.0; integrations = options.integrations; transport = options.transport; sentryFlutterOptions = options; @@ -83,14 +87,18 @@ void main() { options: sentryFlutterOptions!, expectedHasNativeScopeObserver: true); testConfiguration( - integrations: integrations, - shouldHaveIntegrations: [ - ...androidIntegrations, - ...nativeIntegrations, - ...platformAgnosticIntegrations, - ...nonWebIntegrations, - ], - shouldNotHaveIntegrations: iOsAndMacOsIntegrations); + integrations: integrations, + shouldHaveIntegrations: [ + ...androidIntegrations, + ...nativeIntegrations, + ...platformAgnosticIntegrations, + ...nonWebIntegrations, + ], + shouldNotHaveIntegrations: [ + ...iOsAndMacOsIntegrations, + ...nonWebIntegrations, + ], + ); integrations .indexWhere((element) => element is WidgetsFlutterBindingIntegration); @@ -100,7 +108,8 @@ void main() { beforeIntegration: WidgetsFlutterBindingIntegration, afterIntegration: OnErrorIntegration); - expect(SentryNative().nativeChannel, isNotNull); + expect(SentryFlutter.native, isNotNull); + expect(Sentry.currentHub.profilerFactory, isNull); await Sentry.close(); }, testOn: 'vm'); @@ -113,7 +122,8 @@ void main() { await SentryFlutter.init( (options) async { options.dsn = fakeDsn; - options.devMode = true; + options.automatedTestMode = true; + options.profilesSampleRate = 1.0; integrations = options.integrations; transport = options.transport; sentryFlutterOptions = options; @@ -138,7 +148,10 @@ void main() { ...platformAgnosticIntegrations, ...nonWebIntegrations, ], - shouldNotHaveIntegrations: androidIntegrations, + shouldNotHaveIntegrations: [ + ...androidIntegrations, + ...nonWebIntegrations, + ], ); testBefore( @@ -146,7 +159,9 @@ void main() { beforeIntegration: WidgetsFlutterBindingIntegration, afterIntegration: OnErrorIntegration); - expect(SentryNative().nativeChannel, isNotNull); + expect(SentryFlutter.native, isNotNull); + expect(Sentry.currentHub.profilerFactory, + isInstanceOf()); await Sentry.close(); }, testOn: 'vm'); @@ -159,7 +174,8 @@ void main() { await SentryFlutter.init( (options) async { options.dsn = fakeDsn; - options.devMode = true; + options.automatedTestMode = true; + options.profilesSampleRate = 1.0; integrations = options.integrations; transport = options.transport; sentryFlutterOptions = options; @@ -176,23 +192,24 @@ void main() { testScopeObserver( options: sentryFlutterOptions!, expectedHasNativeScopeObserver: true); - testConfiguration( - integrations: integrations, - shouldHaveIntegrations: [ - ...iOsAndMacOsIntegrations, - ...nativeIntegrations, - ...platformAgnosticIntegrations, - ...nonWebIntegrations, - ], - shouldNotHaveIntegrations: androidIntegrations, - ); + testConfiguration(integrations: integrations, shouldHaveIntegrations: [ + ...iOsAndMacOsIntegrations, + ...nativeIntegrations, + ...platformAgnosticIntegrations, + ...nonWebIntegrations, + ], shouldNotHaveIntegrations: [ + ...androidIntegrations, + ...nonWebIntegrations, + ]); testBefore( integrations: integrations, beforeIntegration: WidgetsFlutterBindingIntegration, afterIntegration: OnErrorIntegration); - expect(SentryNative().nativeChannel, isNotNull); + expect(SentryFlutter.native, isNotNull); + expect(Sentry.currentHub.profilerFactory, + isInstanceOf()); await Sentry.close(); }, testOn: 'vm'); @@ -205,7 +222,8 @@ void main() { await SentryFlutter.init( (options) async { options.dsn = fakeDsn; - options.devMode = true; + options.automatedTestMode = true; + options.profilesSampleRate = 1.0; integrations = options.integrations; transport = options.transport; sentryFlutterOptions = options; @@ -233,6 +251,7 @@ void main() { ...androidIntegrations, ...iOsAndMacOsIntegrations, ...nativeIntegrations, + ...webIntegrations, ], ); @@ -241,7 +260,8 @@ void main() { beforeIntegration: WidgetsFlutterBindingIntegration, afterIntegration: OnErrorIntegration); - expect(SentryNative().nativeChannel, isNull); + expect(SentryFlutter.native, isNull); + expect(Sentry.currentHub.profilerFactory, isNull); await Sentry.close(); }, testOn: 'vm'); @@ -254,7 +274,8 @@ void main() { await SentryFlutter.init( (options) async { options.dsn = fakeDsn; - options.devMode = true; + options.automatedTestMode = true; + options.profilesSampleRate = 1.0; integrations = options.integrations; transport = options.transport; sentryFlutterOptions = options; @@ -282,6 +303,7 @@ void main() { ...androidIntegrations, ...iOsAndMacOsIntegrations, ...nativeIntegrations, + ...webIntegrations, ], ); @@ -290,7 +312,8 @@ void main() { beforeIntegration: WidgetsFlutterBindingIntegration, afterIntegration: OnErrorIntegration); - expect(SentryNative().nativeChannel, isNull); + expect(SentryFlutter.native, isNull); + expect(Sentry.currentHub.profilerFactory, isNull); await Sentry.close(); }, testOn: 'vm'); @@ -303,7 +326,8 @@ void main() { await SentryFlutter.init( (options) async { options.dsn = fakeDsn; - options.devMode = true; + options.automatedTestMode = true; + options.profilesSampleRate = 1.0; integrations = options.integrations; transport = options.transport; sentryFlutterOptions = options; @@ -326,7 +350,10 @@ void main() { testConfiguration( integrations: integrations, - shouldHaveIntegrations: platformAgnosticIntegrations, + shouldHaveIntegrations: [ + ...platformAgnosticIntegrations, + ...webIntegrations, + ], shouldNotHaveIntegrations: [ ...androidIntegrations, ...iOsAndMacOsIntegrations, @@ -340,7 +367,8 @@ void main() { beforeIntegration: RunZonedGuardedIntegration, afterIntegration: WidgetsFlutterBindingIntegration); - expect(SentryNative().nativeChannel, isNull); + expect(SentryFlutter.native, isNull); + expect(Sentry.currentHub.profilerFactory, isNull); await Sentry.close(); }); @@ -354,7 +382,7 @@ void main() { await SentryFlutter.init( (options) async { options.dsn = fakeDsn; - options.devMode = true; + options.automatedTestMode = true; integrations = options.integrations; transport = options.transport; }, @@ -372,7 +400,10 @@ void main() { testConfiguration( integrations: integrations, - shouldHaveIntegrations: platformAgnosticIntegrations, + shouldHaveIntegrations: [ + ...platformAgnosticIntegrations, + ...webIntegrations, + ], shouldNotHaveIntegrations: [ ...androidIntegrations, ...iOsAndMacOsIntegrations, @@ -398,7 +429,7 @@ void main() { await SentryFlutter.init( (options) async { options.dsn = fakeDsn; - options.devMode = true; + options.automatedTestMode = true; integrations = options.integrations; transport = options.transport; }, @@ -416,7 +447,10 @@ void main() { testConfiguration( integrations: integrations, - shouldHaveIntegrations: platformAgnosticIntegrations, + shouldHaveIntegrations: [ + ...platformAgnosticIntegrations, + ...webIntegrations, + ], shouldNotHaveIntegrations: [ ...androidIntegrations, ...iOsAndMacOsIntegrations, @@ -430,6 +464,8 @@ void main() { beforeIntegration: RunZonedGuardedIntegration, afterIntegration: WidgetsFlutterBindingIntegration); + expect(Sentry.currentHub.profilerFactory, isNull); + await Sentry.close(); }); @@ -441,7 +477,7 @@ void main() { await SentryFlutter.init( (options) async { options.dsn = fakeDsn; - options.devMode = true; + options.automatedTestMode = true; integrations = options.integrations; transport = options.transport; }, @@ -459,7 +495,10 @@ void main() { testConfiguration( integrations: integrations, - shouldHaveIntegrations: platformAgnosticIntegrations, + shouldHaveIntegrations: [ + ...platformAgnosticIntegrations, + ...webIntegrations, + ], shouldNotHaveIntegrations: [ ...androidIntegrations, ...iOsAndMacOsIntegrations, @@ -482,17 +521,18 @@ void main() { await Sentry.close(); }); - test('installed with skia renderer', () async { + test('installed on io platforms', () async { List integrations = []; await SentryFlutter.init( (options) async { options.dsn = fakeDsn; - options.devMode = true; + options.automatedTestMode = true; integrations = options.integrations; }, appRunner: appRunner, - platformChecker: getPlatformChecker(platform: MockPlatform.iOs()), + platformChecker: + getPlatformChecker(platform: MockPlatform.iOs(), isWeb: false), rendererWrapper: MockRendererWrapper(FlutterRenderer.skia), ); @@ -511,11 +551,12 @@ void main() { await SentryFlutter.init( (options) async { options.dsn = fakeDsn; - options.devMode = true; + options.automatedTestMode = true; integrations = options.integrations; }, appRunner: appRunner, - platformChecker: getPlatformChecker(platform: MockPlatform.iOs()), + platformChecker: + getPlatformChecker(platform: MockPlatform.iOs(), isWeb: true), rendererWrapper: MockRendererWrapper(FlutterRenderer.canvasKit), ); @@ -534,11 +575,12 @@ void main() { await SentryFlutter.init( (options) async { options.dsn = fakeDsn; - options.devMode = true; + options.automatedTestMode = true; integrations = options.integrations; }, appRunner: appRunner, - platformChecker: getPlatformChecker(platform: MockPlatform.iOs()), + platformChecker: + getPlatformChecker(platform: MockPlatform.iOs(), isWeb: true), rendererWrapper: MockRendererWrapper(FlutterRenderer.html), ); @@ -550,29 +592,6 @@ void main() { await Sentry.close(); }, testOn: 'vm'); - - test('not installed with unknown renderer', () async { - List integrations = []; - - await SentryFlutter.init( - (options) async { - options.dsn = fakeDsn; - options.devMode = true; - integrations = options.integrations; - }, - appRunner: appRunner, - platformChecker: getPlatformChecker(platform: MockPlatform.iOs()), - rendererWrapper: MockRendererWrapper(FlutterRenderer.unknown), - ); - - expect( - integrations - .map((e) => e.runtimeType) - .contains(ScreenshotIntegration), - false); - - await Sentry.close(); - }, testOn: 'vm'); }); group('initial values', () { @@ -585,7 +604,7 @@ void main() { await SentryFlutter.init( (options) { options.dsn = fakeDsn; - options.devMode = true; + options.automatedTestMode = true; expect(false, options.debug); expect('debug', options.environment); diff --git a/flutter/test/sentry_flutter_util.dart b/flutter/test/sentry_flutter_util.dart index dcff13c054..7397c4a6a5 100644 --- a/flutter/test/sentry_flutter_util.dart +++ b/flutter/test/sentry_flutter_util.dart @@ -1,7 +1,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:sentry_flutter/src/file_system_transport.dart'; -import 'package:sentry_flutter/src/native_scope_observer.dart'; +import 'package:sentry_flutter/src/native/native_scope_observer.dart'; void testTransport({ required Transport transport, diff --git a/flutter/test/sentry_native_channel_test.dart b/flutter/test/sentry_native_channel_test.dart index 1d99ba2779..04ec723feb 100644 --- a/flutter/test/sentry_native_channel_test.dart +++ b/flutter/test/sentry_native_channel_test.dart @@ -5,8 +5,9 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/mockito.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; -import 'package:sentry_flutter/src/sentry_native.dart'; -import 'package:sentry_flutter/src/sentry_native_channel.dart'; +import 'package:sentry_flutter/src/native/method_channel_helper.dart'; +import 'package:sentry_flutter/src/native/sentry_native.dart'; +import 'package:sentry_flutter/src/native/sentry_native_channel.dart'; import 'mocks.mocks.dart'; void main() { @@ -37,6 +38,8 @@ void main() { test('beginNativeFrames', () async { final sut = fixture.getSut(); + when(fixture.methodChannel.invokeMethod('beginNativeFrames')) + .thenAnswer((realInvocation) async {}); await sut.beginNativeFrames(); verify(fixture.methodChannel.invokeMethod('beginNativeFrames')); @@ -64,26 +67,40 @@ void main() { }); test('setUser', () async { - when(fixture.methodChannel.invokeMethod('setUser', {'user': null})) + final user = SentryUser( + id: "fixture-id", + data: {'object': Object()}, + ); + final normalizedUser = user.copyWith( + data: MethodChannelHelper.normalizeMap(user.data), + ); + when(fixture.methodChannel + .invokeMethod('setUser', {'user': normalizedUser.toJson()})) .thenAnswer((_) => Future.value()); final sut = fixture.getSut(); - await sut.setUser(null); + await sut.setUser(user); - verify(fixture.methodChannel.invokeMethod('setUser', {'user': null})); + verify(fixture.methodChannel + .invokeMethod('setUser', {'user': normalizedUser.toJson()})); }); test('addBreadcrumb', () async { - final breadcrumb = Breadcrumb(); + final breadcrumb = Breadcrumb( + data: {'object': Object()}, + ); + final normalizedBreadcrumb = breadcrumb.copyWith( + data: MethodChannelHelper.normalizeMap(breadcrumb.data)); + when(fixture.methodChannel.invokeMethod( - 'addBreadcrumb', {'breadcrumb': breadcrumb.toJson()})) + 'addBreadcrumb', {'breadcrumb': normalizedBreadcrumb.toJson()})) .thenAnswer((_) => Future.value()); final sut = fixture.getSut(); await sut.addBreadcrumb(breadcrumb); - verify(fixture.methodChannel - .invokeMethod('addBreadcrumb', {'breadcrumb': breadcrumb.toJson()})); + verify(fixture.methodChannel.invokeMethod( + 'addBreadcrumb', {'breadcrumb': normalizedBreadcrumb.toJson()})); }); test('clearBreadcrumbs', () async { @@ -97,15 +114,17 @@ void main() { }); test('setContexts', () async { + final value = {'object': Object()}; + final normalizedValue = MethodChannelHelper.normalize(value); when(fixture.methodChannel.invokeMethod( - 'setContexts', {'key': 'fixture-key', 'value': 'fixture-value'})) + 'setContexts', {'key': 'fixture-key', 'value': normalizedValue})) .thenAnswer((_) => Future.value()); final sut = fixture.getSut(); - await sut.setContexts('fixture-key', 'fixture-value'); + await sut.setContexts('fixture-key', value); verify(fixture.methodChannel.invokeMethod( - 'setContexts', {'key': 'fixture-key', 'value': 'fixture-value'})); + 'setContexts', {'key': 'fixture-key', 'value': normalizedValue})); }); test('removeContexts', () async { @@ -121,15 +140,17 @@ void main() { }); test('setExtra', () async { + final value = {'object': Object()}; + final normalizedValue = MethodChannelHelper.normalize(value); when(fixture.methodChannel.invokeMethod( - 'setExtra', {'key': 'fixture-key', 'value': 'fixture-value'})) + 'setExtra', {'key': 'fixture-key', 'value': normalizedValue})) .thenAnswer((_) => Future.value()); final sut = fixture.getSut(); - await sut.setExtra('fixture-key', 'fixture-value'); + await sut.setExtra('fixture-key', value); verify(fixture.methodChannel.invokeMethod( - 'setExtra', {'key': 'fixture-key', 'value': 'fixture-value'})); + 'setExtra', {'key': 'fixture-key', 'value': normalizedValue})); }); test('removeExtra', () async { @@ -167,14 +188,53 @@ void main() { verify(fixture.methodChannel .invokeMethod('removeTag', {'key': 'fixture-key'})); }); + + test('startProfiler', () { + final sut = fixture.getSut(); + expect(() => sut.startProfiler(SentryId.newId()), throwsUnsupportedError); + verifyZeroInteractions(fixture.methodChannel); + }); + + test('discardProfiler', () async { + final traceId = SentryId.newId(); + when(fixture.methodChannel + .invokeMethod('discardProfiler', traceId.toString())) + .thenAnswer((_) async {}); + + final sut = fixture.getSut(); + await sut.discardProfiler(traceId); + + verify(fixture.methodChannel + .invokeMethod('discardProfiler', traceId.toString())); + }); + + test('collectProfile', () async { + final traceId = SentryId.newId(); + const startTime = 42; + const endTime = 50; + when(fixture.methodChannel + .invokeMapMethod('collectProfile', { + 'traceId': traceId.toString(), + 'startTime': startTime, + 'endTime': endTime, + })).thenAnswer((_) => Future.value()); + + final sut = fixture.getSut(); + await sut.collectProfile(traceId, startTime, endTime); + + verify(fixture.methodChannel.invokeMapMethod('collectProfile', { + 'traceId': traceId.toString(), + 'startTime': startTime, + 'endTime': endTime, + })); + }); }); } class Fixture { final methodChannel = MockMethodChannel(); - final options = SentryFlutterOptions(); SentryNativeChannel getSut() { - return SentryNativeChannel(methodChannel, options); + return SentryNativeChannel(methodChannel); } } diff --git a/flutter/test/sentry_native_test.dart b/flutter/test/sentry_native_test.dart index 4d38a45122..68dc16fdfa 100644 --- a/flutter/test/sentry_native_test.dart +++ b/flutter/test/sentry_native_test.dart @@ -2,27 +2,22 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; -import 'package:sentry_flutter/src/sentry_native.dart'; -import 'package:sentry_flutter/src/sentry_native_channel.dart'; +import 'package:sentry_flutter/src/native/sentry_native.dart'; import 'mocks.dart'; void main() { group('$SentryNative', () { - late Fixture fixture; - - setUp(() { - fixture = Fixture(); - }); + final channel = MockNativeChannel(); + final options = SentryFlutterOptions(dsn: fakeDsn); + late final sut = SentryNative(options, channel); tearDown(() { - fixture.getSut().reset(); + sut.reset(); }); test('fetchNativeAppStart sets didFetchAppStart', () async { final nativeAppStart = NativeAppStart(0.0, true); - fixture.channel.nativeAppStart = nativeAppStart; - - final sut = fixture.getSut(); + channel.nativeAppStart = nativeAppStart; expect(sut.didFetchAppStart, false); @@ -33,110 +28,88 @@ void main() { }); test('beginNativeFramesCollection', () async { - final sut = fixture.getSut(); - await sut.beginNativeFramesCollection(); - - expect(fixture.channel.numberOfBeginNativeFramesCalls, 1); + expect(channel.numberOfBeginNativeFramesCalls, 1); }); test('endNativeFramesCollection', () async { final nativeFrames = NativeFrames(3, 2, 1); final traceId = SentryId.empty(); - fixture.channel.nativeFrames = nativeFrames; - - final sut = fixture.getSut(); + channel.nativeFrames = nativeFrames; final actual = await sut.endNativeFramesCollection(traceId); expect(actual, nativeFrames); - expect(fixture.channel.id, traceId); - expect(fixture.channel.numberOfEndNativeFramesCalls, 1); + expect(channel.id, traceId); + expect(channel.numberOfEndNativeFramesCalls, 1); }); test('setUser', () async { - final sut = fixture.getSut(); await sut.setUser(null); - - expect(fixture.channel.numberOfSetUserCalls, 1); + expect(channel.numberOfSetUserCalls, 1); }); test('addBreadcrumb', () async { - final sut = fixture.getSut(); await sut.addBreadcrumb(Breadcrumb()); - - expect(fixture.channel.numberOfAddBreadcrumbCalls, 1); + expect(channel.numberOfAddBreadcrumbCalls, 1); }); test('clearBreadcrumbs', () async { - final sut = fixture.getSut(); await sut.clearBreadcrumbs(); - - expect(fixture.channel.numberOfClearBreadcrumbCalls, 1); + expect(channel.numberOfClearBreadcrumbCalls, 1); }); test('setContexts', () async { - final sut = fixture.getSut(); await sut.setContexts('fixture-key', 'fixture-value'); - - expect(fixture.channel.numberOfSetContextsCalls, 1); + expect(channel.numberOfSetContextsCalls, 1); }); test('removeContexts', () async { - final sut = fixture.getSut(); await sut.removeContexts('fixture-key'); - - expect(fixture.channel.numberOfRemoveContextsCalls, 1); + expect(channel.numberOfRemoveContextsCalls, 1); }); test('setExtra', () async { - final sut = fixture.getSut(); await sut.setExtra('fixture-key', 'fixture-value'); - - expect(fixture.channel.numberOfSetExtraCalls, 1); + expect(channel.numberOfSetExtraCalls, 1); }); test('removeExtra', () async { - final sut = fixture.getSut(); await sut.removeExtra('fixture-key'); - - expect(fixture.channel.numberOfRemoveExtraCalls, 1); + expect(channel.numberOfRemoveExtraCalls, 1); }); test('setTag', () async { - final sut = fixture.getSut(); await sut.setTag('fixture-key', 'fixture-value'); - - expect(fixture.channel.numberOfSetTagCalls, 1); + expect(channel.numberOfSetTagCalls, 1); }); test('removeTag', () async { - final sut = fixture.getSut(); await sut.removeTag('fixture-key'); + expect(channel.numberOfRemoveTagCalls, 1); + }); - expect(fixture.channel.numberOfRemoveTagCalls, 1); + test('startProfiler', () async { + sut.startProfiler(SentryId.newId()); + expect(channel.numberOfStartProfilerCalls, 1); }); - test('reset', () async { - final sut = fixture.getSut(); + test('discardProfiler', () async { + await sut.discardProfiler(SentryId.newId()); + expect(channel.numberOfDiscardProfilerCalls, 1); + }); + + test('collectProfile', () async { + await sut.collectProfile(SentryId.newId(), 1, 2); + expect(channel.numberOfCollectProfileCalls, 1); + }); + test('reset', () async { sut.appStartEnd = DateTime.now(); await sut.fetchNativeAppStart(); - sut.reset(); - expect(sut.appStartEnd, null); expect(sut.didFetchAppStart, false); }); }); } - -class Fixture { - final channel = MockNativeChannel(); - - SentryNative getSut() { - final sut = SentryNative(); - sut.nativeChannel = channel; - return sut; - } -} diff --git a/flutter/test/sentry_navigator_observer_test.dart b/flutter/test/sentry_navigator_observer_test.dart index d3871b4390..c49588ab85 100644 --- a/flutter/test/sentry_navigator_observer_test.dart +++ b/flutter/test/sentry_navigator_observer_test.dart @@ -5,8 +5,7 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/mockito.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; -import 'package:sentry_flutter/src/sentry_native.dart'; -import 'package:sentry_flutter/src/sentry_native_channel.dart'; +import 'package:sentry_flutter/src/native/sentry_native.dart'; import 'package:sentry/src/sentry_tracer.dart'; import 'mocks.dart'; @@ -34,21 +33,25 @@ void main() { } setUp(() { - SentryNative().reset(); fixture = Fixture(); }); - tearDown(() { - SentryNative().reset(); - }); - group('NativeFrames', () { + late MockNativeChannel mockNativeChannel; + + setUp(() { + mockNativeChannel = MockNativeChannel(); + SentryFlutter.native = + SentryNative(SentryFlutterOptions(dsn: fakeDsn), mockNativeChannel); + }); + + tearDown(() { + SentryFlutter.native = null; + }); + test('transaction start begins frames collection', () async { final currentRoute = route(RouteSettings(name: 'Current Route')); final mockHub = _MockHub(); - final native = SentryNative(); - final mockNativeChannel = MockNativeChannel(); - native.nativeChannel = mockNativeChannel; final tracer = getMockSentryTracer(); _whenAnyStart(mockHub, tracer); @@ -66,17 +69,13 @@ void main() { test('transaction finish adds native frames to tracer', () async { final currentRoute = route(RouteSettings(name: 'Current Route')); - final options = SentryOptions(dsn: fakeDsn); + final options = defaultTestOptions(); options.tracesSampleRate = 1; final hub = Hub(options); final nativeFrames = NativeFrames(3, 2, 1); - final mockNativeChannel = MockNativeChannel(); mockNativeChannel.nativeFrames = nativeFrames; - final mockNative = SentryNative(); - mockNative.nativeChannel = mockNativeChannel; - final sut = fixture.getSut( hub: hub, autoFinishAfter: Duration(milliseconds: 50), @@ -368,6 +367,73 @@ void main() { expect(scope.span, span); }); }); + + test('didPush sets current route name', () { + const name = 'Current Route'; + final currentRoute = route(RouteSettings(name: name)); + + const op = 'navigation'; + final hub = _MockHub(); + final span = getMockSentryTracer(name: name); + when(span.context).thenReturn(SentrySpanContext(operation: op)); + _whenAnyStart(hub, span); + + final sut = fixture.getSut( + hub: hub, + autoFinishAfter: Duration(seconds: 5), + ); + + sut.didPush(currentRoute, null); + + expect(SentryNavigatorObserver.currentRouteName, 'Current Route'); + }); + + test('didReplace sets new route name', () { + const oldRouteName = 'Old Route'; + final oldRoute = route(RouteSettings(name: oldRouteName)); + const newRouteName = 'New Route'; + final newRoute = route(RouteSettings(name: newRouteName)); + + const op = 'navigation'; + final hub = _MockHub(); + final span = getMockSentryTracer(name: oldRouteName); + when(span.context).thenReturn(SentrySpanContext(operation: op)); + _whenAnyStart(hub, span); + + final sut = fixture.getSut( + hub: hub, + autoFinishAfter: Duration(seconds: 5), + ); + + sut.didPush(oldRoute, null); + sut.didReplace(newRoute: newRoute, oldRoute: oldRoute); + + expect(SentryNavigatorObserver.currentRouteName, 'New Route'); + }); + + test('popRoute sets previous route name', () { + const oldRouteName = 'Old Route'; + final oldRoute = route(RouteSettings(name: oldRouteName)); + const newRouteName = 'New Route'; + final newRoute = route(RouteSettings(name: newRouteName)); + + const op = 'navigation'; + final hub = _MockHub(); + final span = getMockSentryTracer(name: oldRouteName); + when(span.context).thenReturn(SentrySpanContext(operation: op)); + when(span.status).thenReturn(null); + _whenAnyStart(hub, span); + + final sut = fixture.getSut( + hub: hub, + autoFinishAfter: Duration(seconds: 5), + ); + + sut.didPush(oldRoute, null); + sut.didPop(newRoute, oldRoute); + + expect(SentryNavigatorObserver.currentRouteName, 'Old Route'); + }); }); group('RouteObserverBreadcrumb', () { @@ -729,6 +795,8 @@ void main() { } class Fixture { + final mockNativeChannel = MockNativeChannel(); + SentryNavigatorObserver getSut({ required Hub hub, bool enableAutoTransactions = true, @@ -754,8 +822,9 @@ class Fixture { class _MockHub extends MockHub { @override - final options = SentryOptions(dsn: fakeDsn); + final options = defaultTestOptions(); + @override late final scope = Scope(options); @override diff --git a/flutter/test/sentry_widget_test.dart b/flutter/test/sentry_widget_test.dart new file mode 100644 index 0000000000..a64fded42f --- /dev/null +++ b/flutter/test/sentry_widget_test.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; + +void main() { + group('SentryWidget', () { + const testChild = Text('Test Child'); + + setUp(() async { + TestWidgetsFlutterBinding.ensureInitialized(); + }); + + testWidgets('SentryWidget wraps child with SentryUserInteractionWidget', + (WidgetTester tester) async { + await tester.pumpWidget( + MaterialApp( + home: SentryWidget(child: testChild), + ), + ); + + expect(find.byType(SentryUserInteractionWidget), findsOneWidget); + expect(find.byWidget(testChild), findsOneWidget); + }); + + testWidgets('SentryWidget wraps child with SentryScreenshotWidget', + (WidgetTester tester) async { + await tester.pumpWidget( + MaterialApp( + home: SentryWidget(child: testChild), + ), + ); + + expect(find.byType(SentryScreenshotWidget), findsOneWidget); + expect(find.byWidget(testChild), findsOneWidget); + }); + }); +} diff --git a/flutter/test/user_interaction/sentry_user_interaction_widget_test.dart b/flutter/test/user_interaction/sentry_user_interaction_widget_test.dart index 02d1022157..0fb73cb930 100644 --- a/flutter/test/user_interaction/sentry_user_interaction_widget_test.dart +++ b/flutter/test/user_interaction/sentry_user_interaction_widget_test.dart @@ -32,6 +32,75 @@ void main() { }, ); + testWidgets( + '$SentryUserInteractionWidget does not apply when enableUserInteractionTracing and enableUserInteractionBreadcrumbs is false', + (tester) async { + await tester.runAsync(() async { + await tester.pumpWidget( + fixture.getSut( + enableUserInteractionTracing: false, + enableUserInteractionBreadcrumbs: false, + ), + ); + final specificChildFinder = find.byType(MyApp); + + expect( + find.ancestor( + of: specificChildFinder, + matching: find.byType(Listener), + ), + findsNothing, + ); + }); + }, + ); + + testWidgets( + '$SentryUserInteractionWidget does apply when enableUserInteractionTracing is true', + (tester) async { + await tester.runAsync(() async { + await tester.pumpWidget( + fixture.getSut( + enableUserInteractionTracing: true, + enableUserInteractionBreadcrumbs: false, + ), + ); + final specificChildFinder = find.byType(MyApp); + + expect( + find.ancestor( + of: specificChildFinder, + matching: find.byType(Listener), + ), + findsOne, + ); + }); + }, + ); + + testWidgets( + '$SentryUserInteractionWidget does apply when enableUserInteractionBreadcrumbs is true', + (tester) async { + await tester.runAsync(() async { + await tester.pumpWidget( + fixture.getSut( + enableUserInteractionTracing: false, + enableUserInteractionBreadcrumbs: true, + ), + ); + final specificChildFinder = find.byType(MyApp); + + expect( + find.ancestor( + of: specificChildFinder, + matching: find.byType(Listener), + ), + findsOne, + ); + }); + }, + ); + group('$SentryUserInteractionWidget crumbs', () { testWidgets('Add crumb for MaterialButton', (tester) async { await tester.runAsync(() async { @@ -327,7 +396,7 @@ class Fixture { } class MyApp extends StatelessWidget { - const MyApp({Key? key}) : super(key: key); + const MyApp({super.key}); @override Widget build(BuildContext context) { @@ -340,7 +409,7 @@ class MyApp extends StatelessWidget { } class Page1 extends StatelessWidget { - const Page1({Key? key}) : super(key: key); + const Page1({super.key}); @override Widget build(BuildContext context) { @@ -416,7 +485,7 @@ class Page1 extends StatelessWidget { } class Page2 extends StatelessWidget { - const Page2({Key? key}) : super(key: key); + const Page2({super.key}); @override Widget build(BuildContext context) { diff --git a/flutter/test/view_hierarchy/sentry_tree_walker_test.dart b/flutter/test/view_hierarchy/sentry_tree_walker_test.dart index c2048c3492..52d775529b 100644 --- a/flutter/test/view_hierarchy/sentry_tree_walker_test.dart +++ b/flutter/test/view_hierarchy/sentry_tree_walker_test.dart @@ -172,7 +172,7 @@ bool _findWidget( } class MyApp extends StatelessWidget { - const MyApp({Key? key}) : super(key: key); + const MyApp({super.key}); @override Widget build(BuildContext context) { diff --git a/flutter/test/view_hierarchy/view_hierarchy_event_processor_test.dart b/flutter/test/view_hierarchy/view_hierarchy_event_processor_test.dart index a409d1a293..7743e8ebc6 100644 --- a/flutter/test/view_hierarchy/view_hierarchy_event_processor_test.dart +++ b/flutter/test/view_hierarchy/view_hierarchy_event_processor_test.dart @@ -107,7 +107,7 @@ class Fixture { } class MyApp extends StatelessWidget { - const MyApp({Key? key}) : super(key: key); + const MyApp({super.key}); @override Widget build(BuildContext context) { diff --git a/hive/.gitignore b/hive/.gitignore new file mode 100644 index 0000000000..ba521d5a39 --- /dev/null +++ b/hive/.gitignore @@ -0,0 +1,14 @@ +# Omit committing pubspec.lock for library packages; see +# https://dart.dev/guides/libraries/private-files#pubspeclock. +pubspec.lock + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ diff --git a/hive/CHANGELOG.md b/hive/CHANGELOG.md new file mode 120000 index 0000000000..04c99a55ca --- /dev/null +++ b/hive/CHANGELOG.md @@ -0,0 +1 @@ +../CHANGELOG.md \ No newline at end of file diff --git a/hive/LICENSE b/hive/LICENSE new file mode 100644 index 0000000000..2a6964d84d --- /dev/null +++ b/hive/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Sentry + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/hive/README.md b/hive/README.md new file mode 100644 index 0000000000..14f26d9ce8 --- /dev/null +++ b/hive/README.md @@ -0,0 +1,86 @@ +

+ + + +
+

+ +Sentry integration for `hive` package +=========== + +| package | build | pub | likes | popularity | pub points | +|-------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------| ------- | +| sentry_hive | [![build](https://github.com/getsentry/sentry-dart/actions/workflows/hive.yml/badge.svg?branch=main)](https://github.com/getsentry/sentry-dart/actions?query=workflow%3Asentry-hive) | [![pub package](https://img.shields.io/pub/v/sentry_hive.svg)](https://pub.dev/packages/sentry_hive) | [![likes](https://img.shields.io/pub/likes/sentry_hive)](https://pub.dev/packages/sentry_hive/score) | [![popularity](https://img.shields.io/pub/popularity/sentry_hive)](https://pub.dev/packages/sentry_hive/score) | [![pub points](https://img.shields.io/pub/points/sentry_hive)](https://pub.dev/packages/sentry_hive/score) + +Integration for the [`hive`](https://pub.dev/packages/hive) package. + +#### Usage + +- Sign up for a Sentry.io account and get a DSN at https://sentry.io. + +- Follow the installing instructions on [pub.dev](https://pub.dev/packages/sentry/install). + +- Initialize the Sentry SDK using the DSN issued by Sentry.io. + +- Call... + +```dart +import 'package:sentry/sentry.dart'; +import 'package:hive/hive.dart'; +import 'package:sentry_hive/sentry_hive.dart'; +import 'package:path_provider/path_provider.dart'; + +Future main() async { + await SentryFlutter.init( + (options) { + options.dsn = 'https://example@sentry.io/add-your-dsn-here'; + options.tracesSampleRate = 1.0; + }, + appRunner: () => runApp(YourApp()), + ); +} + +Future insertUser() async { + // Use [SentryHive] where you would use [Hive] + final appDir = await getApplicationDocumentsDirectory(); + SentryHive + ..init(appDir.path) + ..registerAdapter(PersonAdapter()); + + var box = await SentryHive.openBox('testBox'); + + var person = Person( + name: 'Dave', + age: 22, + ); + + await box.put('dave', person); + + print(box.get('dave')); // Dave: 22 +} + +@HiveType(typeId: 1) +class Person { + Person({required this.name, required this.age}); + + @HiveField(0) + String name; + + @HiveField(1) + int age; + + @override + String toString() { + return '$name: $age'; + } +} +``` + +#### Resources + +* [![Flutter docs](https://img.shields.io/badge/documentation-sentry.io-green.svg?label=flutter%20docs)](https://docs.sentry.io/platforms/flutter/) +* [![Dart docs](https://img.shields.io/badge/documentation-sentry.io-green.svg?label=dart%20docs)](https://docs.sentry.io/platforms/dart/) +* [![Discussions](https://img.shields.io/github/discussions/getsentry/sentry-dart.svg)](https://github.com/getsentry/sentry-dart/discussions) +* [![Discord Chat](https://img.shields.io/discord/621778831602221064?logo=discord&logoColor=ffffff&color=7389D8)](https://discord.gg/PXa5Apfe7K) +* [![Stack Overflow](https://img.shields.io/badge/stack%20overflow-sentry-green.svg)](https://stackoverflow.com/questions/tagged/sentry) +* [![Twitter Follow](https://img.shields.io/twitter/follow/getsentry?label=getsentry&style=social)](https://twitter.com/intent/follow?screen_name=getsentry) \ No newline at end of file diff --git a/hive/analysis_options.yaml b/hive/analysis_options.yaml new file mode 100644 index 0000000000..28ddbe2636 --- /dev/null +++ b/hive/analysis_options.yaml @@ -0,0 +1,34 @@ +include: package:lints/recommended.yaml + +analyzer: + language: + strict-casts: true + strict-inference: true + strict-raw-types: true + errors: + # treat missing required parameters as a warning (not a hint) + missing_required_param: error + # treat missing returns as a warning (not a hint) + missing_return: error + # allow having TODOs in the code + todo: ignore + # allow self-reference to deprecated members (we do this because otherwise we have + # to annotate every member in every test, assert, etc, when we deprecate something) + deprecated_member_use_from_same_package: warning + # ignore sentry/path on pubspec as we change it on deployment + invalid_dependency: ignore + unnecessary_import: ignore + exclude: + - example/** + - test/mocks/mocks.mocks.dart + +linter: + rules: + - prefer_final_locals + - public_member_api_docs + - prefer_single_quotes + - prefer_relative_imports + - unnecessary_brace_in_string_interps + - implementation_imports + - require_trailing_commas + - unawaited_futures diff --git a/hive/boxes_bad_keys.hive b/hive/boxes_bad_keys.hive new file mode 100644 index 0000000000..e69de29bb2 diff --git a/hive/dartdoc_options.yaml b/hive/dartdoc_options.yaml new file mode 120000 index 0000000000..7cbb8c0d74 --- /dev/null +++ b/hive/dartdoc_options.yaml @@ -0,0 +1 @@ +../dart/dartdoc_options.yaml \ No newline at end of file diff --git a/hive/example/example.dart b/hive/example/example.dart new file mode 100644 index 0000000000..b6d824e576 --- /dev/null +++ b/hive/example/example.dart @@ -0,0 +1,54 @@ +import 'package:sentry/sentry.dart'; +import 'package:hive/hive.dart'; +import 'package:sentry_hive/sentry_hive.dart'; + +part 'main.g.dart'; + +Future main() async { + // ATTENTION: Change the DSN below with your own to see the events in Sentry. Get one at sentry.io + const dsn = + 'https://e85b375ffb9f43cf8bdf9787768149e0@o447951.ingest.sentry.io/5428562'; + + await Sentry.init( + (options) { + options.dsn = dsn; + options.tracesSampleRate = 1.0; + options.debug = true; + }, + appRunner: runApp, // Init your App. + ); +} + +Future runApp() async { + // Use [SentryHive] where you would use [Hive] + SentryHive + ..init(Directory.current.path) + ..registerAdapter(PersonAdapter()); + + var box = await SentryHive.openBox('testBox'); + + var person = Person( + name: 'Dave', + age: 22, + ); + + await box.put('dave', person); + + print(box.get('dave')); // Dave: 22 +} + +@HiveType(typeId: 1) +class Person { + Person({required this.name, required this.age}); + + @HiveField(0) + String name; + + @HiveField(1) + int age; + + @override + String toString() { + return '$name: $age'; + } +} diff --git a/hive/lib/sentry_hive.dart b/hive/lib/sentry_hive.dart new file mode 100644 index 0000000000..03be720ca1 --- /dev/null +++ b/hive/lib/sentry_hive.dart @@ -0,0 +1,15 @@ +library sentry_hive; + +import 'package:meta/meta.dart'; +import 'package:hive/hive.dart'; +import 'src/sentry_hive_impl.dart'; +import 'src/sentry_hive_interface.dart'; + +export 'src/sentry_hive_interface.dart'; +export 'src/sentry_box_collection.dart'; + +/// Use [SentryHive] constant instead of [Hive] to get automatic performance +/// monitoring. +@experimental +// ignore: non_constant_identifier_names +SentryHiveInterface SentryHive = SentryHiveImpl(Hive); diff --git a/hive/lib/src/default_compaction_strategy.dart b/hive/lib/src/default_compaction_strategy.dart new file mode 100644 index 0000000000..0bcd0ecdb7 --- /dev/null +++ b/hive/lib/src/default_compaction_strategy.dart @@ -0,0 +1,9 @@ +const _deletedRatio = 0.15; +const _deletedThreshold = 60; + +/// Default compaction strategy compacts if 15% of total values and at least 60 +/// values have been deleted +bool defaultCompactionStrategy(int entries, int deletedEntries) { + return deletedEntries > _deletedThreshold && + deletedEntries / entries > _deletedRatio; +} diff --git a/hive/lib/src/default_key_comparator.dart b/hive/lib/src/default_key_comparator.dart new file mode 100644 index 0000000000..d7833ff536 --- /dev/null +++ b/hive/lib/src/default_key_comparator.dart @@ -0,0 +1,20 @@ +/// Efficient default implementation to compare keys +int defaultKeyComparator(dynamic k1, dynamic k2) { + if (k1 is int) { + if (k2 is int) { + if (k1 > k2) { + return 1; + } else if (k1 < k2) { + return -1; + } else { + return 0; + } + } else { + return -1; + } + } else if (k2 is String) { + return (k1 as String).compareTo(k2); + } else { + return 1; + } +} diff --git a/hive/lib/src/sentry_box.dart b/hive/lib/src/sentry_box.dart new file mode 100644 index 0000000000..f405307d43 --- /dev/null +++ b/hive/lib/src/sentry_box.dart @@ -0,0 +1,37 @@ +import 'package:meta/meta.dart'; +import 'package:hive/hive.dart'; +import 'package:sentry/sentry.dart'; + +import 'sentry_box_base.dart'; + +/// @nodoc +@internal +class SentryBox extends SentryBoxBase implements Box { + final Box _box; + + /// @nodoc + SentryBox(this._box, @internal Hub hub) : super(_box, hub); + + @override + E? get(key, {E? defaultValue}) { + return _box.get(key, defaultValue: defaultValue); + } + + @override + E? getAt(int index) { + return _box.getAt(index); + } + + @override + Map toMap() { + return _box.toMap(); + } + + @override + Iterable get values => _box.values; + + @override + Iterable valuesBetween({startKey, endKey}) { + return _box.valuesBetween(startKey: startKey, endKey: endKey); + } +} diff --git a/hive/lib/src/sentry_box_base.dart b/hive/lib/src/sentry_box_base.dart new file mode 100644 index 0000000000..6623fed5ad --- /dev/null +++ b/hive/lib/src/sentry_box_base.dart @@ -0,0 +1,203 @@ +import 'package:hive/hive.dart'; +import 'package:meta/meta.dart'; +import 'package:sentry/sentry.dart'; +import 'sentry_span_helper.dart'; + +/// @nodoc +@internal +class SentryBoxBase implements BoxBase { + final BoxBase _boxBase; + final Hub _hub; + + final _spanHelper = SentrySpanHelper( + // ignore: invalid_use_of_internal_member + SentryTraceOrigins.autoDbHiveBoxBase, + ); + + /// @nodoc + SentryBoxBase(this._boxBase, this._hub) { + _spanHelper.setHub(this._hub); + } + + @override + Future add(E value) async { + return _spanHelper.asyncWrapInSpan( + 'add', + () { + return _boxBase.add(value); + }, + dbName: name, + ); + } + + @override + Future> addAll(Iterable values) { + return _spanHelper.asyncWrapInSpan( + 'addAll', + () { + return _boxBase.addAll(values); + }, + dbName: name, + ); + } + + @override + Future clear() { + return _spanHelper.asyncWrapInSpan( + 'clear', + () { + return _boxBase.clear(); + }, + dbName: name, + ); + } + + @override + Future close() { + return _spanHelper.asyncWrapInSpan( + 'close', + () { + return _boxBase.close(); + }, + dbName: name, + ); + } + + @override + Future compact() { + return _spanHelper.asyncWrapInSpan( + 'compact', + () { + return _boxBase.compact(); + }, + dbName: name, + ); + } + + @override + bool containsKey(key) { + return _boxBase.containsKey(key); + } + + @override + Future delete(key) { + return _spanHelper.asyncWrapInSpan( + 'delete', + () { + return _boxBase.delete(key); + }, + dbName: name, + ); + } + + @override + Future deleteAll(Iterable keys) { + return _spanHelper.asyncWrapInSpan( + 'deleteAll', + () { + return _boxBase.deleteAll(keys); + }, + dbName: name, + ); + } + + @override + Future deleteAt(int index) { + return _spanHelper.asyncWrapInSpan( + 'deleteAt', + () { + return _boxBase.deleteAt(index); + }, + dbName: name, + ); + } + + @override + Future deleteFromDisk() { + return _spanHelper.asyncWrapInSpan( + 'deleteFromDisk', + () { + return _boxBase.deleteFromDisk(); + }, + dbName: name, + ); + } + + @override + Future flush() { + return _spanHelper.asyncWrapInSpan( + 'flush', + () { + return _boxBase.flush(); + }, + dbName: name, + ); + } + + @override + bool get isEmpty => _boxBase.isEmpty; + + @override + bool get isNotEmpty => _boxBase.isNotEmpty; + + @override + bool get isOpen => _boxBase.isOpen; + + @override + keyAt(int index) { + return _boxBase.keyAt(index); + } + + @override + Iterable get keys => _boxBase.keys; + + @override + bool get lazy => _boxBase.lazy; + + @override + int get length => _boxBase.length; + + @override + String get name => _boxBase.name; + + @override + String? get path => _boxBase.path; + + @override + Future put(key, value) { + return _spanHelper.asyncWrapInSpan( + 'put', + () { + return _boxBase.put(key, value); + }, + dbName: name, + ); + } + + @override + Future putAll(Map entries) { + return _spanHelper.asyncWrapInSpan( + 'putAll', + () { + return _boxBase.putAll(entries); + }, + dbName: name, + ); + } + + @override + Future putAt(int index, value) { + return _spanHelper.asyncWrapInSpan( + 'putAt', + () { + return _boxBase.putAt(index, value); + }, + dbName: name, + ); + } + + @override + Stream watch({key}) { + return _boxBase.watch(key: key); + } +} diff --git a/hive/lib/src/sentry_box_collection.dart b/hive/lib/src/sentry_box_collection.dart new file mode 100644 index 0000000000..d4c605efe2 --- /dev/null +++ b/hive/lib/src/sentry_box_collection.dart @@ -0,0 +1,125 @@ +import 'package:hive/hive.dart'; +import 'package:meta/meta.dart'; +import 'package:sentry/sentry.dart'; + +import 'sentry_span_helper.dart'; + +// ignore: implementation_imports +import 'package:hive/src/box_collection/box_collection_stub.dart' as stub; + +// ignore: implementation_imports +import 'package:hive/src/box_collection/box_collection_stub.dart' + if (dart.library.html) 'package:hive/src/box_collection/box_collection_indexed_db.dart' + if (dart.library.io) 'package:hive/src/box_collection/box_collection.dart' + as impl; + +/// Use instead of [BoxCollection] to add automatic tracing. +class SentryBoxCollection implements stub.BoxCollection { + final impl.BoxCollection _boxCollection; + + final _spanHelper = SentrySpanHelper( + // ignore: invalid_use_of_internal_member + SentryTraceOrigins.autoDbHiveBoxCollection, + ); + + /// Init with [impl.BoxCollection] + SentryBoxCollection(this._boxCollection); + + @override + Set get boxNames => _boxCollection.boxNames; + + @override + void close() { + _boxCollection.close(); + } + + /// @nodoc + @internal + void setHub(Hub hub) { + _spanHelper.setHub(hub); + } + + @override + Future deleteFromDisk() { + return _spanHelper.asyncWrapInSpan( + 'deleteFromDisk', + () { + return _boxCollection.deleteFromDisk(); + }, + dbName: name, + ); + } + + @override + String get name => _boxCollection.name; + + // ignore: public_member_api_docs + static Future open( + String name, + Set boxNames, { + String? path, + HiveCipher? key, + Hub? hub, + }) async { + final spanHelper = SentrySpanHelper( + // ignore: invalid_use_of_internal_member + SentryTraceOrigins.autoDbHiveBoxCollection, + ); + spanHelper.setHub(hub ?? HubAdapter()); + + return await spanHelper.asyncWrapInSpan( + 'open', + () async { + final boxCollection = await impl.BoxCollection.open( + name, + boxNames, + path: path, + key: key, + ); + final sbc = SentryBoxCollection(boxCollection); + sbc.setHub(hub ?? HubAdapter()); + return sbc; + }, + dbName: name, + ); + } + + @override + Future> openBox( + String name, { + bool preload = false, + stub.CollectionBox Function(String p1, stub.BoxCollection p2)? + boxCreator, + }) { + return _spanHelper.asyncWrapInSpan( + 'openBox', + () { + return _boxCollection.openBox( + name, + preload: preload, + boxCreator: boxCreator, + ); + }, + dbName: this.name, + ); + } + + @override + Future transaction( + Future Function() action, { + List? boxNames, + bool readOnly = false, + }) async { + return await _spanHelper.asyncWrapInSpan( + 'transaction', + () { + return _boxCollection.transaction( + action, + boxNames: boxNames, + readOnly: readOnly, + ); + }, + dbName: name, + ); + } +} diff --git a/hive/lib/src/sentry_hive_impl.dart b/hive/lib/src/sentry_hive_impl.dart new file mode 100644 index 0000000000..83e0e2234a --- /dev/null +++ b/hive/lib/src/sentry_hive_impl.dart @@ -0,0 +1,208 @@ +import 'dart:typed_data'; + +import 'package:hive/hive.dart'; +import 'package:meta/meta.dart'; +import 'package:sentry/sentry.dart'; +import 'version.dart'; +import 'sentry_box.dart'; +import 'sentry_lazy_box.dart'; +import 'sentry_hive_interface.dart'; + +import 'default_compaction_strategy.dart'; +import 'default_key_comparator.dart'; +import 'sentry_span_helper.dart'; + +/// @nodoc +@internal +class SentryHiveImpl implements SentryHiveInterface { + @internal + // ignore: public_member_api_docs + static const dbOp = 'db'; + + @internal + // ignore: public_member_api_docs + static const dbSystemKey = 'db.system'; + @internal + // ignore: public_member_api_docs + static const dbSystem = 'flutter_hive'; + + @internal + // ignore: public_member_api_docs + static const dbNameKey = 'db.name'; + + final HiveInterface _hive; + Hub _hub = HubAdapter(); + + /// @nodoc + SentryHiveImpl(this._hive); + + final _spanHelper = SentrySpanHelper( + // ignore: invalid_use_of_internal_member + SentryTraceOrigins.autoDbHive, + ); + + // SentryHiveInterface + + @override + void setHub(Hub hub) { + // ignore: invalid_use_of_internal_member + final options = hub.options; + options.sdk.addIntegration('SentryHiveTracing'); + options.sdk.addPackage(packageName, sdkVersion); + _hub = hub; + _spanHelper.setHub(hub); + } + + // HiveInterface + + @override + void init( + String? path, { + HiveStorageBackendPreference backendPreference = + HiveStorageBackendPreference.native, + }) { + return Hive.init(path, backendPreference: backendPreference); + } + + @override + Box box(String name) { + return _hive.box(name); + } + + @override + Future boxExists(String name, {String? path}) { + return _spanHelper.asyncWrapInSpan('boxExists', () { + return _hive.boxExists(name, path: path); + }); + } + + @override + Future close() { + return _spanHelper.asyncWrapInSpan('close', () { + return _hive.close(); + }); + } + + @override + Future deleteBoxFromDisk(String name, {String? path}) { + return _spanHelper.asyncWrapInSpan('deleteBoxFromDisk', () { + return _hive.deleteBoxFromDisk(name, path: path); + }); + } + + @override + Future deleteFromDisk() { + return _spanHelper.asyncWrapInSpan('deleteFromDisk', () { + return _hive.deleteFromDisk(); + }); + } + + @override + List generateSecureKey() { + return _hive.generateSecureKey(); + } + + @override + void ignoreTypeId(int typeId) { + return _hive.ignoreTypeId(typeId); + } + + @override + bool isAdapterRegistered(int typeId) { + return _hive.isAdapterRegistered(typeId); + } + + @override + bool isBoxOpen(String name) { + return _hive.isBoxOpen(name); + } + + @override + LazyBox lazyBox(String name) { + return _hive.lazyBox(name); + } + + @override + Future> openBox( + String name, { + HiveCipher? encryptionCipher, + KeyComparator keyComparator = defaultKeyComparator, + CompactionStrategy compactionStrategy = defaultCompactionStrategy, + bool crashRecovery = true, + String? path, + Uint8List? bytes, + String? collection, + @Deprecated('Use encryptionCipher instead') List? encryptionKey, + }) { + return _spanHelper.asyncWrapInSpan( + 'openBox', + () async { + final Box box = await _hive.openBox( + name, + encryptionCipher: encryptionCipher, + keyComparator: keyComparator, + compactionStrategy: compactionStrategy, + crashRecovery: crashRecovery, + path: path, + bytes: bytes, + collection: collection, + // ignore: deprecated_member_use + encryptionKey: encryptionKey, + ); + return SentryBox(box, _hub); + }, + dbName: name, + ); + } + + @override + Future> openLazyBox( + String name, { + HiveCipher? encryptionCipher, + KeyComparator keyComparator = defaultKeyComparator, + CompactionStrategy compactionStrategy = defaultCompactionStrategy, + bool crashRecovery = true, + String? path, + String? collection, + @Deprecated('Use encryptionCipher instead') List? encryptionKey, + }) { + return _spanHelper.asyncWrapInSpan( + 'openLazyBox', + () async { + final LazyBox lazyBox = await _hive.openLazyBox( + name, + encryptionCipher: encryptionCipher, + keyComparator: keyComparator, + compactionStrategy: compactionStrategy, + crashRecovery: crashRecovery, + path: path, + collection: collection, + // ignore: deprecated_member_use + encryptionKey: encryptionKey, + ); + return SentryLazyBox(lazyBox, _hub); + }, + dbName: name, + ); + } + + @override + void registerAdapter( + TypeAdapter adapter, { + bool internal = false, + bool override = false, + }) { + return _hive.registerAdapter( + adapter, + internal: internal, + override: override, + ); + } + + @visibleForTesting + @override + void resetAdapters() { + // ignore: invalid_use_of_visible_for_testing_member + return _hive.resetAdapters(); + } +} diff --git a/hive/lib/src/sentry_hive_interface.dart b/hive/lib/src/sentry_hive_interface.dart new file mode 100644 index 0000000000..18c76611e8 --- /dev/null +++ b/hive/lib/src/sentry_hive_interface.dart @@ -0,0 +1,11 @@ +import 'package:hive/hive.dart'; +import 'package:meta/meta.dart'; +import 'package:sentry/sentry.dart'; + +/// The main API interface of SentryHive. Available through the `SentryHive` +/// constant. +@experimental +abstract class SentryHiveInterface implements HiveInterface { + /// Set the Sentry [Hub] + void setHub(Hub hub); +} diff --git a/hive/lib/src/sentry_lazy_box.dart b/hive/lib/src/sentry_lazy_box.dart new file mode 100644 index 0000000000..86eabb9fdd --- /dev/null +++ b/hive/lib/src/sentry_lazy_box.dart @@ -0,0 +1,45 @@ +import 'package:hive/hive.dart'; +import 'package:meta/meta.dart'; +import 'package:sentry/sentry.dart'; + +import 'sentry_box_base.dart'; +import 'sentry_span_helper.dart'; + +/// @nodoc +@internal +class SentryLazyBox extends SentryBoxBase implements LazyBox { + final LazyBox _lazyBox; + final Hub _hub; + + final _spanHelper = SentrySpanHelper( + // ignore: invalid_use_of_internal_member + SentryTraceOrigins.autoDbHiveLazyBox, + ); + + /// @nodoc + SentryLazyBox(this._lazyBox, @internal this._hub) : super(_lazyBox, _hub) { + _spanHelper.setHub(_hub); + } + + @override + Future get(key, {E? defaultValue}) { + return _spanHelper.asyncWrapInSpan( + 'get', + () { + return _lazyBox.get(key, defaultValue: defaultValue); + }, + dbName: name, + ); + } + + @override + Future getAt(int index) { + return _spanHelper.asyncWrapInSpan( + 'getAt', + () { + return _lazyBox.getAt(index); + }, + dbName: name, + ); + } +} diff --git a/hive/lib/src/sentry_span_helper.dart b/hive/lib/src/sentry_span_helper.dart new file mode 100644 index 0000000000..38a67501a4 --- /dev/null +++ b/hive/lib/src/sentry_span_helper.dart @@ -0,0 +1,78 @@ +import 'package:meta/meta.dart'; +import 'package:sentry/sentry.dart'; +import 'sentry_hive_impl.dart'; + +/// @nodoc +@internal +class SentrySpanHelper { + /// @nodoc + Hub _hub = HubAdapter(); + + /// @nodoc + final String _origin; + + /// @nodoc + SentrySpanHelper(this._origin); + + /// @nodoc + void setHub(Hub hub) { + _hub = hub; + } + + /// @nodoc + @internal + Future asyncWrapInSpan( + String description, + Future Function() execute, { + String? dbName, + }) async { + final currentSpan = _hub.getSpan(); + final span = currentSpan?.startChild( + SentryHiveImpl.dbOp, + description: description, + ); + + // ignore: invalid_use_of_internal_member + span?.origin = _origin; + + var breadcrumb = Breadcrumb( + message: description, + data: {}, + type: 'query', + ); + + span?.setData(SentryHiveImpl.dbSystemKey, SentryHiveImpl.dbSystem); + if (dbName != null) { + span?.setData(SentryHiveImpl.dbNameKey, dbName); + } + + breadcrumb.data?[SentryHiveImpl.dbSystemKey] = SentryHiveImpl.dbSystem; + if (dbName != null) { + breadcrumb.data?[SentryHiveImpl.dbNameKey] = dbName; + } + + try { + final result = await execute(); + + span?.status = SpanStatus.ok(); + breadcrumb.data?['status'] = 'ok'; + + return result; + } catch (exception) { + span?.throwable = exception; + span?.status = SpanStatus.internalError(); + + breadcrumb.data?['status'] = 'internal_error'; + breadcrumb = breadcrumb.copyWith( + level: SentryLevel.warning, + ); + + rethrow; + } finally { + await span?.finish(); + + // ignore: invalid_use_of_internal_member + await _hub.scope.addBreadcrumb(breadcrumb); + } + } +} diff --git a/hive/lib/src/version.dart b/hive/lib/src/version.dart new file mode 100644 index 0000000000..ac6247b5a5 --- /dev/null +++ b/hive/lib/src/version.dart @@ -0,0 +1,5 @@ +/// The SDK version reported to Sentry.io in the submitted events. +const String sdkVersion = '7.16.0'; + +/// The package name reported to Sentry.io in the submitted events. +const String packageName = 'pub:sentry_hive'; diff --git a/hive/people-box-collection_bad_keys.hive b/hive/people-box-collection_bad_keys.hive new file mode 100644 index 0000000000..e69de29bb2 diff --git a/hive/pubspec.yaml b/hive/pubspec.yaml new file mode 100644 index 0000000000..cbcb5b16e6 --- /dev/null +++ b/hive/pubspec.yaml @@ -0,0 +1,22 @@ +name: sentry_hive +description: An integration which adds support for performance tracing for the hive package. +version: 7.16.0 +homepage: https://docs.sentry.io/platforms/flutter/ +repository: https://github.com/getsentry/sentry-dart +issue_tracker: https://github.com/getsentry/sentry-dart/issues + +environment: + sdk: '>=2.17.0 <4.0.0' + +dependencies: + sentry: 7.16.0 + hive: ^2.2.3 + meta: ^1.3.0 + +dev_dependencies: + lints: ^2.0.0 + test: ^1.21.0 + yaml: ^3.1.0 # needed for version match (code and pubspec) + mockito: ^5.1.0 + build_runner: ^2.4.2 + coverage: ^1.3.0 diff --git a/hive/pubspec_overrides.yaml b/hive/pubspec_overrides.yaml new file mode 100644 index 0000000000..16e71d16f0 --- /dev/null +++ b/hive/pubspec_overrides.yaml @@ -0,0 +1,3 @@ +dependency_overrides: + sentry: + path: ../dart diff --git a/hive/test/mocks/mocks.dart b/hive/test/mocks/mocks.dart new file mode 100644 index 0000000000..9b2db0e30d --- /dev/null +++ b/hive/test/mocks/mocks.dart @@ -0,0 +1,18 @@ +import 'package:hive/hive.dart'; +import 'package:mockito/annotations.dart'; +import 'package:sentry/sentry.dart'; + +import 'package:hive/src/box_collection/box_collection_stub.dart' + if (dart.library.html) 'package:hive/src/box_collection/box_collection_indexed_db.dart' + if (dart.library.io) 'package:hive/src/box_collection/box_collection.dart' + as impl; + +@GenerateMocks([ + Hub, + Box, + LazyBox, + HiveInterface, + // Edit generated code to make sure correct impl/stub class is used + impl.BoxCollection, +]) +void main() {} diff --git a/hive/test/mocks/mocks.mocks.dart b/hive/test/mocks/mocks.mocks.dart new file mode 100644 index 0000000000..6d1bb907d7 --- /dev/null +++ b/hive/test/mocks/mocks.mocks.dart @@ -0,0 +1,1307 @@ +// Mocks generated by Mockito 5.4.2 from annotations +// in sentry_hive/test/mocks/mocks.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i5; +import 'dart:typed_data' as _i8; + +import 'package:hive/hive.dart' as _i3; +import 'package:hive/src/box/default_compaction_strategy.dart' as _i7; +import 'package:hive/src/box/default_key_comparator.dart' as _i6; +import 'package:mockito/mockito.dart' as _i1; +import 'package:sentry/sentry.dart' as _i2; +import 'package:sentry/src/profiling.dart' as _i4; + +import 'package:hive/src/box_collection/box_collection_stub.dart' as stub; + +// ignore: implementation_imports +import 'package:hive/src/box_collection/box_collection_stub.dart' + if (dart.library.html) 'package:hive/src/box_collection/box_collection_indexed_db.dart' + if (dart.library.io) 'package:hive/src/box_collection/box_collection.dart' + as impl; + +// 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 _FakeSentryOptions_0 extends _i1.SmartFake implements _i2.SentryOptions { + _FakeSentryOptions_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeSentryId_1 extends _i1.SmartFake implements _i2.SentryId { + _FakeSentryId_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeScope_2 extends _i1.SmartFake implements _i2.Scope { + _FakeScope_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeHub_3 extends _i1.SmartFake implements _i2.Hub { + _FakeHub_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeISentrySpan_4 extends _i1.SmartFake implements _i2.ISentrySpan { + _FakeISentrySpan_4( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeBox_5 extends _i1.SmartFake implements _i3.Box { + _FakeBox_5( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeLazyBox_6 extends _i1.SmartFake implements _i3.LazyBox { + _FakeLazyBox_6( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeCollectionBox_7 extends _i1.SmartFake + implements _i3.CollectionBox { + _FakeCollectionBox_7( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [Hub]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockHub extends _i1.Mock implements _i2.Hub { + MockHub() { + _i1.throwOnMissingStub(this); + } + + @override + _i2.SentryOptions get options => (super.noSuchMethod( + Invocation.getter(#options), + returnValue: _FakeSentryOptions_0( + this, + Invocation.getter(#options), + ), + ) as _i2.SentryOptions); + + @override + bool get isEnabled => (super.noSuchMethod( + Invocation.getter(#isEnabled), + returnValue: false, + ) as bool); + + @override + _i2.SentryId get lastEventId => (super.noSuchMethod( + Invocation.getter(#lastEventId), + returnValue: _FakeSentryId_1( + this, + Invocation.getter(#lastEventId), + ), + ) as _i2.SentryId); + + @override + _i2.Scope get scope => (super.noSuchMethod( + Invocation.getter(#scope), + returnValue: _FakeScope_2( + this, + Invocation.getter(#scope), + ), + ) as _i2.Scope); + + @override + set profilerFactory(_i4.SentryProfilerFactory? value) => super.noSuchMethod( + Invocation.setter( + #profilerFactory, + value, + ), + returnValueForMissingStub: null, + ); + + @override + _i5.Future<_i2.SentryId> captureEvent( + dynamic event, { + dynamic stackTrace, + _i2.Hint? hint, + _i2.ScopeCallback? withScope, + }) => + (super.noSuchMethod( + Invocation.method( + #captureEvent, + [event], + { + #stackTrace: stackTrace, + #hint: hint, + #withScope: withScope, + }, + ), + returnValue: _i5.Future<_i2.SentryId>.value(_FakeSentryId_1( + this, + Invocation.method( + #captureEvent, + [event], + { + #stackTrace: stackTrace, + #hint: hint, + #withScope: withScope, + }, + ), + )), + ) as _i5.Future<_i2.SentryId>); + + @override + _i5.Future<_i2.SentryId> captureException( + dynamic throwable, { + dynamic stackTrace, + _i2.Hint? hint, + _i2.ScopeCallback? withScope, + }) => + (super.noSuchMethod( + Invocation.method( + #captureException, + [throwable], + { + #stackTrace: stackTrace, + #hint: hint, + #withScope: withScope, + }, + ), + returnValue: _i5.Future<_i2.SentryId>.value(_FakeSentryId_1( + this, + Invocation.method( + #captureException, + [throwable], + { + #stackTrace: stackTrace, + #hint: hint, + #withScope: withScope, + }, + ), + )), + ) as _i5.Future<_i2.SentryId>); + + @override + _i5.Future<_i2.SentryId> captureMessage( + String? message, { + _i2.SentryLevel? level, + String? template, + List? params, + _i2.Hint? hint, + _i2.ScopeCallback? withScope, + }) => + (super.noSuchMethod( + Invocation.method( + #captureMessage, + [message], + { + #level: level, + #template: template, + #params: params, + #hint: hint, + #withScope: withScope, + }, + ), + returnValue: _i5.Future<_i2.SentryId>.value(_FakeSentryId_1( + this, + Invocation.method( + #captureMessage, + [message], + { + #level: level, + #template: template, + #params: params, + #hint: hint, + #withScope: withScope, + }, + ), + )), + ) as _i5.Future<_i2.SentryId>); + + @override + _i5.Future captureUserFeedback(_i2.SentryUserFeedback? userFeedback) => + (super.noSuchMethod( + Invocation.method( + #captureUserFeedback, + [userFeedback], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future addBreadcrumb( + _i2.Breadcrumb? crumb, { + _i2.Hint? hint, + }) => + (super.noSuchMethod( + Invocation.method( + #addBreadcrumb, + [crumb], + {#hint: hint}, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + void bindClient(_i2.SentryClient? client) => super.noSuchMethod( + Invocation.method( + #bindClient, + [client], + ), + returnValueForMissingStub: null, + ); + + @override + _i2.Hub clone() => (super.noSuchMethod( + Invocation.method( + #clone, + [], + ), + returnValue: _FakeHub_3( + this, + Invocation.method( + #clone, + [], + ), + ), + ) as _i2.Hub); + + @override + _i5.Future close() => (super.noSuchMethod( + Invocation.method( + #close, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.FutureOr configureScope(_i2.ScopeCallback? callback) => + (super.noSuchMethod(Invocation.method( + #configureScope, + [callback], + )) as _i5.FutureOr); + + @override + _i2.ISentrySpan startTransaction( + String? name, + String? operation, { + String? description, + DateTime? startTimestamp, + bool? bindToScope, + bool? waitForChildren, + Duration? autoFinishAfter, + bool? trimEnd, + _i2.OnTransactionFinish? onFinish, + Map? customSamplingContext, + }) => + (super.noSuchMethod( + Invocation.method( + #startTransaction, + [ + name, + operation, + ], + { + #description: description, + #startTimestamp: startTimestamp, + #bindToScope: bindToScope, + #waitForChildren: waitForChildren, + #autoFinishAfter: autoFinishAfter, + #trimEnd: trimEnd, + #onFinish: onFinish, + #customSamplingContext: customSamplingContext, + }, + ), + returnValue: _FakeISentrySpan_4( + this, + Invocation.method( + #startTransaction, + [ + name, + operation, + ], + { + #description: description, + #startTimestamp: startTimestamp, + #bindToScope: bindToScope, + #waitForChildren: waitForChildren, + #autoFinishAfter: autoFinishAfter, + #trimEnd: trimEnd, + #onFinish: onFinish, + #customSamplingContext: customSamplingContext, + }, + ), + ), + ) as _i2.ISentrySpan); + + @override + _i2.ISentrySpan startTransactionWithContext( + _i2.SentryTransactionContext? transactionContext, { + Map? customSamplingContext, + DateTime? startTimestamp, + bool? bindToScope, + bool? waitForChildren, + Duration? autoFinishAfter, + bool? trimEnd, + _i2.OnTransactionFinish? onFinish, + }) => + (super.noSuchMethod( + Invocation.method( + #startTransactionWithContext, + [transactionContext], + { + #customSamplingContext: customSamplingContext, + #startTimestamp: startTimestamp, + #bindToScope: bindToScope, + #waitForChildren: waitForChildren, + #autoFinishAfter: autoFinishAfter, + #trimEnd: trimEnd, + #onFinish: onFinish, + }, + ), + returnValue: _FakeISentrySpan_4( + this, + Invocation.method( + #startTransactionWithContext, + [transactionContext], + { + #customSamplingContext: customSamplingContext, + #startTimestamp: startTimestamp, + #bindToScope: bindToScope, + #waitForChildren: waitForChildren, + #autoFinishAfter: autoFinishAfter, + #trimEnd: trimEnd, + #onFinish: onFinish, + }, + ), + ), + ) as _i2.ISentrySpan); + + @override + _i5.Future<_i2.SentryId> captureTransaction( + _i2.SentryTransaction? transaction, { + _i2.SentryTraceContextHeader? traceContext, + }) => + (super.noSuchMethod( + Invocation.method( + #captureTransaction, + [transaction], + {#traceContext: traceContext}, + ), + returnValue: _i5.Future<_i2.SentryId>.value(_FakeSentryId_1( + this, + Invocation.method( + #captureTransaction, + [transaction], + {#traceContext: traceContext}, + ), + )), + ) as _i5.Future<_i2.SentryId>); + + @override + void setSpanContext( + dynamic throwable, + _i2.ISentrySpan? span, + String? transaction, + ) => + super.noSuchMethod( + Invocation.method( + #setSpanContext, + [ + throwable, + span, + transaction, + ], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [Box]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockBox extends _i1.Mock implements _i3.Box { + MockBox() { + _i1.throwOnMissingStub(this); + } + + @override + Iterable get values => (super.noSuchMethod( + Invocation.getter(#values), + returnValue: [], + ) as Iterable); + + @override + String get name => (super.noSuchMethod( + Invocation.getter(#name), + returnValue: '', + ) as String); + + @override + bool get isOpen => (super.noSuchMethod( + Invocation.getter(#isOpen), + returnValue: false, + ) as bool); + + @override + bool get lazy => (super.noSuchMethod( + Invocation.getter(#lazy), + returnValue: false, + ) as bool); + + @override + Iterable get keys => (super.noSuchMethod( + Invocation.getter(#keys), + returnValue: [], + ) as Iterable); + + @override + int get length => (super.noSuchMethod( + Invocation.getter(#length), + returnValue: 0, + ) as int); + + @override + bool get isEmpty => (super.noSuchMethod( + Invocation.getter(#isEmpty), + returnValue: false, + ) as bool); + + @override + bool get isNotEmpty => (super.noSuchMethod( + Invocation.getter(#isNotEmpty), + returnValue: false, + ) as bool); + + @override + Iterable valuesBetween({ + dynamic startKey, + dynamic endKey, + }) => + (super.noSuchMethod( + Invocation.method( + #valuesBetween, + [], + { + #startKey: startKey, + #endKey: endKey, + }, + ), + returnValue: [], + ) as Iterable); + + @override + E? getAt(int? index) => (super.noSuchMethod(Invocation.method( + #getAt, + [index], + )) as E?); + + @override + Map toMap() => (super.noSuchMethod( + Invocation.method( + #toMap, + [], + ), + returnValue: {}, + ) as Map); + + @override + dynamic keyAt(int? index) => super.noSuchMethod(Invocation.method( + #keyAt, + [index], + )); + + @override + _i5.Stream<_i3.BoxEvent> watch({dynamic key}) => (super.noSuchMethod( + Invocation.method( + #watch, + [], + {#key: key}, + ), + returnValue: _i5.Stream<_i3.BoxEvent>.empty(), + ) as _i5.Stream<_i3.BoxEvent>); + + @override + bool containsKey(dynamic key) => (super.noSuchMethod( + Invocation.method( + #containsKey, + [key], + ), + returnValue: false, + ) as bool); + + @override + _i5.Future put( + dynamic key, + E? value, + ) => + (super.noSuchMethod( + Invocation.method( + #put, + [ + key, + value, + ], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future putAt( + int? index, + E? value, + ) => + (super.noSuchMethod( + Invocation.method( + #putAt, + [ + index, + value, + ], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future putAll(Map? entries) => (super.noSuchMethod( + Invocation.method( + #putAll, + [entries], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future add(E? value) => (super.noSuchMethod( + Invocation.method( + #add, + [value], + ), + returnValue: _i5.Future.value(0), + ) as _i5.Future); + + @override + _i5.Future> addAll(Iterable? values) => (super.noSuchMethod( + Invocation.method( + #addAll, + [values], + ), + returnValue: _i5.Future>.value([]), + ) as _i5.Future>); + + @override + _i5.Future delete(dynamic key) => (super.noSuchMethod( + Invocation.method( + #delete, + [key], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future deleteAt(int? index) => (super.noSuchMethod( + Invocation.method( + #deleteAt, + [index], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future deleteAll(Iterable? keys) => (super.noSuchMethod( + Invocation.method( + #deleteAll, + [keys], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future compact() => (super.noSuchMethod( + Invocation.method( + #compact, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future clear() => (super.noSuchMethod( + Invocation.method( + #clear, + [], + ), + returnValue: _i5.Future.value(0), + ) as _i5.Future); + + @override + _i5.Future close() => (super.noSuchMethod( + Invocation.method( + #close, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future deleteFromDisk() => (super.noSuchMethod( + Invocation.method( + #deleteFromDisk, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future flush() => (super.noSuchMethod( + Invocation.method( + #flush, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); +} + +/// A class which mocks [LazyBox]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockLazyBox extends _i1.Mock implements _i3.LazyBox { + MockLazyBox() { + _i1.throwOnMissingStub(this); + } + + @override + String get name => (super.noSuchMethod( + Invocation.getter(#name), + returnValue: '', + ) as String); + + @override + bool get isOpen => (super.noSuchMethod( + Invocation.getter(#isOpen), + returnValue: false, + ) as bool); + + @override + bool get lazy => (super.noSuchMethod( + Invocation.getter(#lazy), + returnValue: false, + ) as bool); + + @override + Iterable get keys => (super.noSuchMethod( + Invocation.getter(#keys), + returnValue: [], + ) as Iterable); + + @override + int get length => (super.noSuchMethod( + Invocation.getter(#length), + returnValue: 0, + ) as int); + + @override + bool get isEmpty => (super.noSuchMethod( + Invocation.getter(#isEmpty), + returnValue: false, + ) as bool); + + @override + bool get isNotEmpty => (super.noSuchMethod( + Invocation.getter(#isNotEmpty), + returnValue: false, + ) as bool); + + @override + _i5.Future get( + dynamic key, { + E? defaultValue, + }) => + (super.noSuchMethod( + Invocation.method( + #get, + [key], + {#defaultValue: defaultValue}, + ), + returnValue: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future getAt(int? index) => (super.noSuchMethod( + Invocation.method( + #getAt, + [index], + ), + returnValue: _i5.Future.value(), + ) as _i5.Future); + + @override + dynamic keyAt(int? index) => super.noSuchMethod(Invocation.method( + #keyAt, + [index], + )); + + @override + _i5.Stream<_i3.BoxEvent> watch({dynamic key}) => (super.noSuchMethod( + Invocation.method( + #watch, + [], + {#key: key}, + ), + returnValue: _i5.Stream<_i3.BoxEvent>.empty(), + ) as _i5.Stream<_i3.BoxEvent>); + + @override + bool containsKey(dynamic key) => (super.noSuchMethod( + Invocation.method( + #containsKey, + [key], + ), + returnValue: false, + ) as bool); + + @override + _i5.Future put( + dynamic key, + E? value, + ) => + (super.noSuchMethod( + Invocation.method( + #put, + [ + key, + value, + ], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future putAt( + int? index, + E? value, + ) => + (super.noSuchMethod( + Invocation.method( + #putAt, + [ + index, + value, + ], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future putAll(Map? entries) => (super.noSuchMethod( + Invocation.method( + #putAll, + [entries], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future add(E? value) => (super.noSuchMethod( + Invocation.method( + #add, + [value], + ), + returnValue: _i5.Future.value(0), + ) as _i5.Future); + + @override + _i5.Future> addAll(Iterable? values) => (super.noSuchMethod( + Invocation.method( + #addAll, + [values], + ), + returnValue: _i5.Future>.value([]), + ) as _i5.Future>); + + @override + _i5.Future delete(dynamic key) => (super.noSuchMethod( + Invocation.method( + #delete, + [key], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future deleteAt(int? index) => (super.noSuchMethod( + Invocation.method( + #deleteAt, + [index], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future deleteAll(Iterable? keys) => (super.noSuchMethod( + Invocation.method( + #deleteAll, + [keys], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future compact() => (super.noSuchMethod( + Invocation.method( + #compact, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future clear() => (super.noSuchMethod( + Invocation.method( + #clear, + [], + ), + returnValue: _i5.Future.value(0), + ) as _i5.Future); + + @override + _i5.Future close() => (super.noSuchMethod( + Invocation.method( + #close, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future deleteFromDisk() => (super.noSuchMethod( + Invocation.method( + #deleteFromDisk, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future flush() => (super.noSuchMethod( + Invocation.method( + #flush, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); +} + +/// A class which mocks [HiveInterface]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockHiveInterface extends _i1.Mock implements _i3.HiveInterface { + MockHiveInterface() { + _i1.throwOnMissingStub(this); + } + + @override + void init( + String? path, { + _i3.HiveStorageBackendPreference? backendPreference = + _i3.HiveStorageBackendPreference.native, + }) => + super.noSuchMethod( + Invocation.method( + #init, + [path], + {#backendPreference: backendPreference}, + ), + returnValueForMissingStub: null, + ); + + @override + _i5.Future<_i3.Box> openBox( + String? name, { + _i3.HiveCipher? encryptionCipher, + _i3.KeyComparator? keyComparator = _i6.defaultKeyComparator, + _i3.CompactionStrategy? compactionStrategy = _i7.defaultCompactionStrategy, + bool? crashRecovery = true, + String? path, + _i8.Uint8List? bytes, + String? collection, + List? encryptionKey, + }) => + (super.noSuchMethod( + Invocation.method( + #openBox, + [name], + { + #encryptionCipher: encryptionCipher, + #keyComparator: keyComparator, + #compactionStrategy: compactionStrategy, + #crashRecovery: crashRecovery, + #path: path, + #bytes: bytes, + #collection: collection, + #encryptionKey: encryptionKey, + }, + ), + returnValue: _i5.Future<_i3.Box>.value(_FakeBox_5( + this, + Invocation.method( + #openBox, + [name], + { + #encryptionCipher: encryptionCipher, + #keyComparator: keyComparator, + #compactionStrategy: compactionStrategy, + #crashRecovery: crashRecovery, + #path: path, + #bytes: bytes, + #collection: collection, + #encryptionKey: encryptionKey, + }, + ), + )), + ) as _i5.Future<_i3.Box>); + + @override + _i5.Future<_i3.LazyBox> openLazyBox( + String? name, { + _i3.HiveCipher? encryptionCipher, + _i3.KeyComparator? keyComparator = _i6.defaultKeyComparator, + _i3.CompactionStrategy? compactionStrategy = _i7.defaultCompactionStrategy, + bool? crashRecovery = true, + String? path, + String? collection, + List? encryptionKey, + }) => + (super.noSuchMethod( + Invocation.method( + #openLazyBox, + [name], + { + #encryptionCipher: encryptionCipher, + #keyComparator: keyComparator, + #compactionStrategy: compactionStrategy, + #crashRecovery: crashRecovery, + #path: path, + #collection: collection, + #encryptionKey: encryptionKey, + }, + ), + returnValue: _i5.Future<_i3.LazyBox>.value(_FakeLazyBox_6( + this, + Invocation.method( + #openLazyBox, + [name], + { + #encryptionCipher: encryptionCipher, + #keyComparator: keyComparator, + #compactionStrategy: compactionStrategy, + #crashRecovery: crashRecovery, + #path: path, + #collection: collection, + #encryptionKey: encryptionKey, + }, + ), + )), + ) as _i5.Future<_i3.LazyBox>); + + @override + _i3.Box box(String? name) => (super.noSuchMethod( + Invocation.method( + #box, + [name], + ), + returnValue: _FakeBox_5( + this, + Invocation.method( + #box, + [name], + ), + ), + ) as _i3.Box); + + @override + _i3.LazyBox lazyBox(String? name) => (super.noSuchMethod( + Invocation.method( + #lazyBox, + [name], + ), + returnValue: _FakeLazyBox_6( + this, + Invocation.method( + #lazyBox, + [name], + ), + ), + ) as _i3.LazyBox); + + @override + bool isBoxOpen(String? name) => (super.noSuchMethod( + Invocation.method( + #isBoxOpen, + [name], + ), + returnValue: false, + ) as bool); + + @override + _i5.Future close() => (super.noSuchMethod( + Invocation.method( + #close, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future deleteBoxFromDisk( + String? name, { + String? path, + }) => + (super.noSuchMethod( + Invocation.method( + #deleteBoxFromDisk, + [name], + {#path: path}, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future deleteFromDisk() => (super.noSuchMethod( + Invocation.method( + #deleteFromDisk, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + List generateSecureKey() => (super.noSuchMethod( + Invocation.method( + #generateSecureKey, + [], + ), + returnValue: [], + ) as List); + + @override + _i5.Future boxExists( + String? name, { + String? path, + }) => + (super.noSuchMethod( + Invocation.method( + #boxExists, + [name], + {#path: path}, + ), + returnValue: _i5.Future.value(false), + ) as _i5.Future); + + @override + void resetAdapters() => super.noSuchMethod( + Invocation.method( + #resetAdapters, + [], + ), + returnValueForMissingStub: null, + ); + + @override + void registerAdapter( + _i3.TypeAdapter? adapter, { + bool? internal = false, + bool? override = false, + }) => + super.noSuchMethod( + Invocation.method( + #registerAdapter, + [adapter], + { + #internal: internal, + #override: override, + }, + ), + returnValueForMissingStub: null, + ); + + @override + bool isAdapterRegistered(int? typeId) => (super.noSuchMethod( + Invocation.method( + #isAdapterRegistered, + [typeId], + ), + returnValue: false, + ) as bool); + + @override + void ignoreTypeId(int? typeId) => super.noSuchMethod( + Invocation.method( + #ignoreTypeId, + [typeId], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [BoxCollection]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockBoxCollection extends _i1.Mock implements impl.BoxCollection { + MockBoxCollection() { + _i1.throwOnMissingStub(this); + } + + @override + String get name => (super.noSuchMethod( + Invocation.getter(#name), + returnValue: '', + ) as String); + + @override + Set get boxNames => (super.noSuchMethod( + Invocation.getter(#boxNames), + returnValue: {}, + ) as Set); + + @override + _i5.Future> openBox( + String? name, { + bool? preload = false, + stub.CollectionBox Function( + String, + impl.BoxCollection, + )? boxCreator, + }) => + (super.noSuchMethod( + Invocation.method( + #openBox, + [name], + { + #preload: preload, + #boxCreator: boxCreator, + }, + ), + returnValue: + _i5.Future>.value(_FakeCollectionBox_7( + this, + Invocation.method( + #openBox, + [name], + { + #preload: preload, + #boxCreator: boxCreator, + }, + ), + )), + ) as _i5.Future>); + + @override + _i5.Future transaction( + _i5.Future Function()? action, { + List? boxNames, + bool? readOnly = false, + }) => + (super.noSuchMethod( + Invocation.method( + #transaction, + [action], + { + #boxNames: boxNames, + #readOnly: readOnly, + }, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + void close() => super.noSuchMethod( + Invocation.method( + #close, + [], + ), + returnValueForMissingStub: null, + ); + + @override + _i5.Future deleteFromDisk() => (super.noSuchMethod( + Invocation.method( + #deleteFromDisk, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); +} diff --git a/hive/test/person.dart b/hive/test/person.dart new file mode 100644 index 0000000000..9e9e06e13e --- /dev/null +++ b/hive/test/person.dart @@ -0,0 +1,24 @@ +import 'package:hive/hive.dart'; + +@HiveType(typeId: 0) +class Person extends HiveObject { + @HiveField(0) + final String name; + + Person(this.name); +} + +class PersonAdapter extends TypeAdapter { + @override + final typeId = 0; + + @override + Person read(BinaryReader reader) { + return Person(reader.read() as String); + } + + @override + void write(BinaryWriter writer, Person obj) { + writer.write(obj.name); + } +} diff --git a/hive/test/sentry_box_base_test.dart b/hive/test/sentry_box_base_test.dart new file mode 100644 index 0000000000..3821b8b341 --- /dev/null +++ b/hive/test/sentry_box_base_test.dart @@ -0,0 +1,569 @@ +@TestOn('vm') + +import 'dart:io'; + +import 'package:hive/hive.dart'; +import 'package:mockito/mockito.dart'; +import 'package:sentry/sentry.dart'; +import 'package:sentry_hive/src/sentry_box_base.dart'; +import 'package:sentry_hive/src/sentry_hive_impl.dart'; +import 'package:test/test.dart'; +import 'package:sentry/src/sentry_tracer.dart'; + +import 'mocks/mocks.mocks.dart'; +import 'person.dart'; + +void main() { + void verifySpan(String description, SentrySpan? span) { + expect(span?.context.operation, SentryHiveImpl.dbOp); + expect(span?.context.description, description); + expect(span?.status, SpanStatus.ok()); + // ignore: invalid_use_of_internal_member + expect(span?.origin, SentryTraceOrigins.autoDbHiveBoxBase); + expect(span?.data[SentryHiveImpl.dbSystemKey], SentryHiveImpl.dbSystem); + expect(span?.data[SentryHiveImpl.dbNameKey], Fixture.dbName); + } + + void verifyErrorSpan( + String description, + Exception exception, + SentrySpan? span, + ) { + expect(span?.context.operation, SentryHiveImpl.dbOp); + expect(span?.context.description, description); + expect(span?.status, SpanStatus.internalError()); + // ignore: invalid_use_of_internal_member + expect(span?.origin, SentryTraceOrigins.autoDbHiveBoxBase); + expect(span?.data[SentryHiveImpl.dbSystemKey], SentryHiveImpl.dbSystem); + expect(span?.data[SentryHiveImpl.dbNameKey], Fixture.dbName); + + expect(span?.throwable, exception); + } + + void verifyBreadcrumb( + String message, + Breadcrumb? crumb, { + bool checkName = false, + String status = 'ok', + }) { + expect( + crumb?.message, + message, + ); + expect(crumb?.type, 'query'); + if (checkName) { + expect(crumb?.data?[SentryHiveImpl.dbNameKey], Fixture.dbName); + } + expect(crumb?.data?['status'], status); + } + + group('adds span', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + await fixture.setUp(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.hub.scope).thenReturn(fixture.scope); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('add adds span', () async { + final sut = fixture.getSut(); + + await sut.add(Person('Joe Dirt')); + + verifySpan('add', fixture.getCreatedSpan()); + }); + + test('addAll adds span', () async { + final sut = fixture.getSut(); + + await sut.addAll([Person('Joe Dirt')]); + + verifySpan('addAll', fixture.getCreatedSpan()); + }); + + test('clear adds span', () async { + final sut = fixture.getSut(); + + await sut.clear(); + + verifySpan('clear', fixture.getCreatedSpan()); + }); + + test('close adds span', () async { + final sut = fixture.getSut(); + + await sut.close(); + + verifySpan('close', fixture.getCreatedSpan()); + }); + + test('compact adds span', () async { + final sut = fixture.getSut(); + + await sut.compact(); + + verifySpan('compact', fixture.getCreatedSpan()); + }); + + test('delete adds span', () async { + final sut = fixture.getSut(); + + await sut.delete('fixture-key'); + + verifySpan('delete', fixture.getCreatedSpan()); + }); + + test('deleteAll adds span', () async { + final sut = fixture.getSut(); + + await sut.deleteAll(['fixture-key']); + + verifySpan('deleteAll', fixture.getCreatedSpan()); + }); + + test('deleteAt adds span', () async { + final sut = fixture.getSut(); + + await sut.add(Person('Joe Dirt')); + await sut.deleteAt(0); + + verifySpan('deleteAt', fixture.getCreatedSpan()); + }); + }); + + group('adds error span', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + await fixture.setUp(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.mockBox.name).thenReturn(Fixture.dbName); + when(fixture.hub.scope).thenReturn(fixture.scope); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('throwing add adds error span', () async { + when(fixture.mockBox.add(any)).thenThrow(fixture.exception); + + final sut = fixture.getSut(injectMockBox: true); + + try { + await sut.add(Person('Joe Dirt')); + } catch (error) { + expect(error, fixture.exception); + } + + verifyErrorSpan('add', fixture.exception, fixture.getCreatedSpan()); + }); + + test('throwing addAll adds error span', () async { + when(fixture.mockBox.addAll(any)).thenThrow(fixture.exception); + + final sut = fixture.getSut(injectMockBox: true); + + try { + await sut.addAll([Person('Joe Dirt')]); + } catch (error) { + expect(error, fixture.exception); + } + + verifyErrorSpan('addAll', fixture.exception, fixture.getCreatedSpan()); + }); + + test('throwing clear adds error span', () async { + when(fixture.mockBox.clear()).thenThrow(fixture.exception); + + final sut = fixture.getSut(injectMockBox: true); + + try { + await sut.clear(); + } catch (error) { + expect(error, fixture.exception); + } + + verifyErrorSpan('clear', fixture.exception, fixture.getCreatedSpan()); + }); + + test('throwing close adds error span', () async { + when(fixture.mockBox.close()).thenThrow(fixture.exception); + + final sut = fixture.getSut(injectMockBox: true); + + try { + await sut.close(); + } catch (error) { + expect(error, fixture.exception); + } + + verifyErrorSpan('close', fixture.exception, fixture.getCreatedSpan()); + }); + + test('throwing compact adds error span', () async { + when(fixture.mockBox.compact()).thenThrow(fixture.exception); + + final sut = fixture.getSut(injectMockBox: true); + + try { + await sut.compact(); + } catch (error) { + expect(error, fixture.exception); + } + + verifyErrorSpan('compact', fixture.exception, fixture.getCreatedSpan()); + }); + + test('throwing delete adds error span', () async { + when(fixture.mockBox.delete(any)).thenThrow(fixture.exception); + + final sut = fixture.getSut(injectMockBox: true); + + try { + await sut.delete('fixture-key'); + } catch (error) { + expect(error, fixture.exception); + } + + verifyErrorSpan('delete', fixture.exception, fixture.getCreatedSpan()); + }); + + test('throwing deleteAll adds error span', () async { + when(fixture.mockBox.deleteAll(any)).thenThrow(fixture.exception); + + final sut = fixture.getSut(injectMockBox: true); + + try { + await sut.deleteAll(['fixture-key']); + } catch (error) { + expect(error, fixture.exception); + } + + verifyErrorSpan('deleteAll', fixture.exception, fixture.getCreatedSpan()); + }); + + test('throwing deleteAt adds error span', () async { + when(fixture.mockBox.add(any)).thenAnswer((_) async { + return 1; + }); + when(fixture.mockBox.deleteAt(any)).thenThrow(fixture.exception); + + final sut = fixture.getSut(injectMockBox: true); + + await sut.add(Person('Joe Dirt')); + try { + await sut.deleteAt(0); + } catch (error) { + expect(error, fixture.exception); + } + + verifyErrorSpan('deleteAt', fixture.exception, fixture.getCreatedSpan()); + }); + }); + + group('adds breadcrumb', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + await fixture.setUp(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.hub.scope).thenReturn(fixture.scope); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('add adds breadcrumb', () async { + final sut = fixture.getSut(); + + await sut.add(Person('Joe Dirt')); + + verifyBreadcrumb('add', fixture.getCreatedBreadcrumb()); + }); + + test('addAll adds breadcrumb', () async { + final sut = fixture.getSut(); + + await sut.addAll([Person('Joe Dirt')]); + + verifyBreadcrumb('addAll', fixture.getCreatedBreadcrumb()); + }); + + test('clear adds breadcrumb', () async { + final sut = fixture.getSut(); + + await sut.clear(); + + verifyBreadcrumb('clear', fixture.getCreatedBreadcrumb()); + }); + + test('close adds breadcrumb', () async { + final sut = fixture.getSut(); + + await sut.close(); + + verifyBreadcrumb('close', fixture.getCreatedBreadcrumb()); + }); + + test('compact adds breadcrumb', () async { + final sut = fixture.getSut(); + + await sut.compact(); + + verifyBreadcrumb('compact', fixture.getCreatedBreadcrumb()); + }); + + test('delete adds breadcrumb', () async { + final sut = fixture.getSut(); + + await sut.delete('fixture-key'); + + verifyBreadcrumb('delete', fixture.getCreatedBreadcrumb()); + }); + + test('deleteAll adds breadcrumb', () async { + final sut = fixture.getSut(); + + await sut.deleteAll(['fixture-key']); + + verifyBreadcrumb('deleteAll', fixture.getCreatedBreadcrumb()); + }); + + test('deleteAt adds breadcrumb', () async { + final sut = fixture.getSut(); + + await sut.add(Person('Joe Dirt')); + await sut.deleteAt(0); + + verifyBreadcrumb('deleteAt', fixture.getCreatedBreadcrumb()); + }); + }); + + group('adds error breadcrumb', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + await fixture.setUp(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.mockBox.name).thenReturn(Fixture.dbName); + when(fixture.hub.scope).thenReturn(fixture.scope); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('throwing add adds error breadcrumb', () async { + when(fixture.mockBox.add(any)).thenThrow(fixture.exception); + + final sut = fixture.getSut(injectMockBox: true); + + try { + await sut.add(Person('Joe Dirt')); + } catch (error) { + expect(error, fixture.exception); + } + + verifyBreadcrumb( + 'add', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing addAll adds error breadcrumb', () async { + when(fixture.mockBox.addAll(any)).thenThrow(fixture.exception); + + final sut = fixture.getSut(injectMockBox: true); + + try { + await sut.addAll([Person('Joe Dirt')]); + } catch (error) { + expect(error, fixture.exception); + } + + verifyBreadcrumb( + 'addAll', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing clear adds error breadcrumb', () async { + when(fixture.mockBox.clear()).thenThrow(fixture.exception); + + final sut = fixture.getSut(injectMockBox: true); + + try { + await sut.clear(); + } catch (error) { + expect(error, fixture.exception); + } + + verifyBreadcrumb( + 'clear', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing close adds error breadcrumb', () async { + when(fixture.mockBox.close()).thenThrow(fixture.exception); + + final sut = fixture.getSut(injectMockBox: true); + + try { + await sut.close(); + } catch (error) { + expect(error, fixture.exception); + } + + verifyBreadcrumb( + 'close', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing compact adds error breadcrumb', () async { + when(fixture.mockBox.compact()).thenThrow(fixture.exception); + + final sut = fixture.getSut(injectMockBox: true); + + try { + await sut.compact(); + } catch (error) { + expect(error, fixture.exception); + } + + verifyBreadcrumb( + 'compact', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing delete adds error breadcrumb', () async { + when(fixture.mockBox.delete(any)).thenThrow(fixture.exception); + + final sut = fixture.getSut(injectMockBox: true); + + try { + await sut.delete('fixture-key'); + } catch (error) { + expect(error, fixture.exception); + } + + verifyBreadcrumb( + 'delete', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing deleteAll adds error breadcrumb', () async { + when(fixture.mockBox.deleteAll(any)).thenThrow(fixture.exception); + + final sut = fixture.getSut(injectMockBox: true); + + try { + await sut.deleteAll(['fixture-key']); + } catch (error) { + expect(error, fixture.exception); + } + + verifyBreadcrumb( + 'deleteAll', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing deleteAt adds error breadcrumb', () async { + when(fixture.mockBox.add(any)).thenAnswer((_) async { + return 1; + }); + when(fixture.mockBox.deleteAt(any)).thenThrow(fixture.exception); + + final sut = fixture.getSut(injectMockBox: true); + + await sut.add(Person('Joe Dirt')); + try { + await sut.deleteAt(0); + } catch (error) { + expect(error, fixture.exception); + } + + verifyBreadcrumb( + 'deleteAt', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + }); +} + +class Fixture { + late final Box box; + late final mockBox = MockBox(); + final options = SentryOptions(); + final hub = MockHub(); + final exception = Exception('fixture-exception'); + + static final dbName = 'people-box-base'; + + final _context = SentryTransactionContext('name', 'operation'); + late final tracer = SentryTracer(_context, hub); + late final scope = Scope(options); + + Future setUp() async { + Hive.init(Directory.systemTemp.path); + if (!Hive.isAdapterRegistered(0)) { + Hive.registerAdapter(PersonAdapter()); + } + box = await Hive.openBox(dbName); + } + + Future tearDown() async { + if (box.isOpen) { + await box.deleteFromDisk(); + await box.close(); + } + await Hive.close(); + } + + SentryBoxBase getSut({bool injectMockBox = false}) { + if (injectMockBox) { + return SentryBoxBase(mockBox, hub); + } else { + return SentryBoxBase(box, hub); + } + } + + SentrySpan? getCreatedSpan() { + return tracer.children.last; + } + + Breadcrumb? getCreatedBreadcrumb() { + return hub.scope.breadcrumbs.last; + } +} diff --git a/hive/test/sentry_box_collection_test.dart b/hive/test/sentry_box_collection_test.dart new file mode 100644 index 0000000000..f13b95e1c8 --- /dev/null +++ b/hive/test/sentry_box_collection_test.dart @@ -0,0 +1,398 @@ +@TestOn('vm') + +import 'dart:io'; + +import 'package:mockito/mockito.dart'; +import 'package:sentry/sentry.dart'; +import 'package:sentry_hive/sentry_hive.dart'; +import 'package:sentry_hive/src/sentry_box_collection.dart'; +import 'package:sentry_hive/src/sentry_hive_impl.dart'; +import 'package:test/test.dart'; +import 'package:sentry/src/sentry_tracer.dart'; + +import 'mocks/mocks.mocks.dart'; +import 'person.dart'; + +import 'package:hive/src/box_collection/box_collection_stub.dart' as stub; + +void main() { + void verifySpan(String description, SentrySpan? span) { + expect(span?.context.operation, SentryHiveImpl.dbOp); + expect(span?.context.description, description); + expect(span?.status, SpanStatus.ok()); + // ignore: invalid_use_of_internal_member + expect(span?.origin, SentryTraceOrigins.autoDbHiveBoxCollection); + expect(span?.data[SentryHiveImpl.dbSystemKey], SentryHiveImpl.dbSystem); + expect(span?.data[SentryHiveImpl.dbNameKey], Fixture.dbName); + } + + void verifyErrorSpan( + String description, + Exception exception, + SentrySpan? span, + ) { + expect(span?.context.operation, SentryHiveImpl.dbOp); + expect(span?.context.description, description); + expect(span?.status, SpanStatus.internalError()); + // ignore: invalid_use_of_internal_member + expect(span?.origin, SentryTraceOrigins.autoDbHiveBoxCollection); + expect(span?.data[SentryHiveImpl.dbSystemKey], SentryHiveImpl.dbSystem); + expect(span?.data[SentryHiveImpl.dbNameKey], Fixture.dbName); + + expect(span?.throwable, exception); + } + + void verifyBreadcrumb( + String message, + Breadcrumb? crumb, { + bool checkName = false, + String status = 'ok', + }) { + expect( + crumb?.message, + message, + ); + expect(crumb?.type, 'query'); + if (checkName) { + expect(crumb?.data?[SentryHiveImpl.dbNameKey], Fixture.dbName); + } + expect(crumb?.data?['status'], status); + } + + group('adds span when calling', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + await fixture.setUp(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.hub.scope).thenReturn(fixture.scope); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('open', () async { + await SentryBoxCollection.open( + Fixture.dbName, + {'people'}, + hub: fixture.hub, + ); + + final span = fixture.getCreatedSpan(); + verifySpan('open', span); + }); + + test('openBox', () async { + final sut = await fixture.getSut(); + + await sut.openBox('people'); + + final span = fixture.getCreatedSpan(); + verifySpan('openBox', span); + }); + + test('transaction', () async { + final sut = await fixture.getSut(); + + final people = await sut.openBox('people'); + await sut.transaction( + () async { + print(people.name); + }, + boxNames: ['people'], + ); + final span = fixture.getCreatedSpan(); + verifySpan('transaction', span); + }); + + test('deleteFromDisk', () async { + final sut = await fixture.getSut(); + + await sut.deleteFromDisk(); + + final span = fixture.getCreatedSpan(); + verifySpan('deleteFromDisk', span); + }); + }); + + group('adds error span when calling', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + await fixture.setUp(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.mockBoxCollection.name).thenReturn(Fixture.dbName); + when(fixture.hub.scope).thenReturn(fixture.scope); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + // open is static and cannot be mocked + + test('throwing openBox', () async { + when( + // ignore: inference_failure_on_function_invocation + fixture.mockBoxCollection.openBox( + any, + preload: anyNamed('preload'), + boxCreator: anyNamed('boxCreator'), + ), + ).thenThrow(fixture.exception); + + final sut = await fixture.getSut(injectMock: true); + + try { + // ignore: inference_failure_on_function_invocation + await sut.openBox('people'); + } catch (error) { + expect(error, fixture.exception); + } + + verifyErrorSpan('openBox', fixture.exception, fixture.getCreatedSpan()); + }); + + test('throwing transaction', () async { + when( + fixture.mockBoxCollection.transaction( + any, + boxNames: anyNamed('boxNames'), + readOnly: anyNamed('readOnly'), + ), + ).thenThrow(fixture.exception); + + final sut = await fixture.getSut(injectMock: true); + + try { + await sut.transaction(() async {}); + } catch (error) { + expect(error, fixture.exception); + } + + verifyErrorSpan( + 'transaction', + fixture.exception, + fixture.getCreatedSpan(), + ); + }); + + test('throwing deleteFromDisk', () async { + when(fixture.mockBoxCollection.deleteFromDisk()) + .thenThrow(fixture.exception); + + final sut = await fixture.getSut(injectMock: true); + + try { + await sut.deleteFromDisk(); + } catch (error) { + expect(error, fixture.exception); + } + + verifyErrorSpan( + 'deleteFromDisk', + fixture.exception, + fixture.getCreatedSpan(), + ); + }); + }); + + group('adds breadcrumb when calling', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + await fixture.setUp(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.hub.scope).thenReturn(fixture.scope); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('open', () async { + await SentryBoxCollection.open( + Fixture.dbName, + {'people'}, + hub: fixture.hub, + ); + + final span = fixture.getCreatedBreadcrumb(); + verifyBreadcrumb('open', span); + }); + + test('openBox', () async { + final sut = await fixture.getSut(); + + await sut.openBox('people'); + + final span = fixture.getCreatedBreadcrumb(); + verifyBreadcrumb('openBox', span); + }); + + test('transaction', () async { + final sut = await fixture.getSut(); + + final people = await sut.openBox('people'); + await sut.transaction( + () async { + print(people.name); + }, + boxNames: ['people'], + ); + final span = fixture.getCreatedBreadcrumb(); + verifyBreadcrumb('transaction', span); + }); + + test('deleteFromDisk', () async { + final sut = await fixture.getSut(); + + await sut.deleteFromDisk(); + + final span = fixture.getCreatedBreadcrumb(); + verifyBreadcrumb('deleteFromDisk', span); + }); + }); + + group('adds error breadcrumb when calling', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + await fixture.setUp(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.mockBoxCollection.name).thenReturn(Fixture.dbName); + when(fixture.hub.scope).thenReturn(fixture.scope); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + // open is static and cannot be mocked + + test('throwing openBox', () async { + when( + // ignore: inference_failure_on_function_invocation + fixture.mockBoxCollection.openBox( + any, + preload: anyNamed('preload'), + boxCreator: anyNamed('boxCreator'), + ), + ).thenThrow(fixture.exception); + + final sut = await fixture.getSut(injectMock: true); + + try { + // ignore: inference_failure_on_function_invocation + await sut.openBox('people'); + } catch (error) { + expect(error, fixture.exception); + } + + verifyBreadcrumb( + 'openBox', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing transaction', () async { + when( + fixture.mockBoxCollection.transaction( + any, + boxNames: anyNamed('boxNames'), + readOnly: anyNamed('readOnly'), + ), + ).thenThrow(fixture.exception); + + final sut = await fixture.getSut(injectMock: true); + + try { + await sut.transaction(() async {}); + } catch (error) { + expect(error, fixture.exception); + } + + verifyBreadcrumb( + 'transaction', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing deleteFromDisk', () async { + when(fixture.mockBoxCollection.deleteFromDisk()) + .thenThrow(fixture.exception); + + final sut = await fixture.getSut(injectMock: true); + + try { + await sut.deleteFromDisk(); + } catch (error) { + expect(error, fixture.exception); + } + + verifyBreadcrumb( + 'deleteFromDisk', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + }); +} + +class Fixture { + final options = SentryOptions(); + final hub = MockHub(); + final exception = Exception('fixture-exception'); + + late final mockBoxCollection = MockBoxCollection(); + + static final dbName = 'people-box-collection'; + + final _context = SentryTransactionContext('name', 'operation'); + late final tracer = SentryTracer(_context, hub); + late final scope = Scope(options); + + Future setUp() async { + SentryHive.init(Directory.systemTemp.path); + if (!SentryHive.isAdapterRegistered(0)) { + SentryHive.registerAdapter(PersonAdapter()); + } + } + + Future tearDown() async { + await SentryHive.close(); + } + + Future getSut({bool injectMock = false}) async { + if (injectMock) { + final sbc = SentryBoxCollection(mockBoxCollection); + sbc.setHub(hub); + return sbc; + } else { + return await SentryBoxCollection.open(dbName, {'people'}, hub: hub); + } + } + + SentrySpan? getCreatedSpan() { + return tracer.children.last; + } + + Breadcrumb? getCreatedBreadcrumb() { + return hub.scope.breadcrumbs.last; + } +} diff --git a/hive/test/sentry_hive_impl_test.dart b/hive/test/sentry_hive_impl_test.dart new file mode 100644 index 0000000000..521415d1ed --- /dev/null +++ b/hive/test/sentry_hive_impl_test.dart @@ -0,0 +1,625 @@ +@TestOn('vm') + +import 'dart:io'; + +import 'package:hive/hive.dart'; +import 'package:mockito/mockito.dart'; +import 'package:sentry/sentry.dart'; +import 'package:sentry/src/sentry_tracer.dart'; +import 'package:sentry_hive/src/sentry_box.dart'; +import 'package:sentry_hive/src/sentry_hive_impl.dart'; +import 'package:sentry_hive/src/sentry_lazy_box.dart'; +import 'package:sentry_hive/src/version.dart'; +import 'package:test/test.dart'; + +import 'mocks/mocks.mocks.dart'; +import 'person.dart'; + +void main() { + void verifySpan( + String description, + SentrySpan? span, { + bool checkName = false, + }) { + expect(span?.context.operation, SentryHiveImpl.dbOp); + expect(span?.context.description, description); + expect(span?.status, SpanStatus.ok()); + // ignore: invalid_use_of_internal_member + expect(span?.origin, SentryTraceOrigins.autoDbHive); + // expect(span?.data[SentryHiveImpl.dbSystemKey], SentryHiveImpl.dbSystem); + if (checkName) { + expect(span?.data[SentryHiveImpl.dbNameKey], Fixture.dbName); + } + } + + void verifyErrorSpan(String description, SentrySpan? span, Exception error) { + expect(span?.context.operation, SentryHiveImpl.dbOp); + expect(span?.context.description, description); + expect(span?.status, SpanStatus.internalError()); + // ignore: invalid_use_of_internal_member + expect(span?.origin, SentryTraceOrigins.autoDbHive); + expect(span?.throwable, error); + } + + void verifyBreadcrumb( + String message, + Breadcrumb? crumb, { + bool checkName = false, + String status = 'ok', + }) { + expect( + crumb?.message, + message, + ); + expect(crumb?.type, 'query'); + if (checkName) { + expect(crumb?.data?[SentryHiveImpl.dbNameKey], Fixture.dbName); + } + expect(crumb?.data?['status'], status); + } + + group('adds span', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.hub.scope).thenReturn(fixture.scope); + + await fixture.setUp(); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('boxExists adds span', () async { + final sut = fixture.getSut(); + + await sut.openBox(Fixture.dbName); + await sut.boxExists(Fixture.dbName); + + verifySpan('boxExists', fixture.getCreatedSpan()); + }); + + test('close adds span', () async { + final sut = fixture.getSut(); + + await sut.close(); + + verifySpan('close', fixture.getCreatedSpan()); + }); + + test('deleteBoxFromDisk adds span', () async { + final sut = fixture.getSut(); + + await sut.openBox(Fixture.dbName); + await sut.deleteBoxFromDisk(Fixture.dbName); + + verifySpan('deleteBoxFromDisk', fixture.getCreatedSpan()); + }); + + test('deleteFromDisk adds span', () async { + final sut = fixture.getSut(); + + await sut.deleteFromDisk(); + + verifySpan('deleteFromDisk', fixture.getCreatedSpan()); + }); + + test('openBox adds span', () async { + final sut = fixture.getSut(); + + final box = await sut.openBox(Fixture.dbName); + + expect(box is SentryBox, true); + verifySpan('openBox', fixture.getCreatedSpan(), checkName: true); + }); + + test('openLazyBox adds span', () async { + final sut = fixture.getSut(); + + final box = await sut.openLazyBox(Fixture.dbName); + + expect(box is SentryLazyBox, true); + verifySpan('openLazyBox', fixture.getCreatedSpan(), checkName: true); + }); + }); + + group('adds error span', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.mockHive.close()).thenAnswer((_) async => {}); + when(fixture.hub.scope).thenReturn(fixture.scope); + + await fixture.setUp(injectMockHive: true); + }); + + test('throwing boxExists adds error span', () async { + final Box box = MockBox(); + when( + fixture.mockHive.openBox( + any, + encryptionCipher: anyNamed('encryptionCipher'), + keyComparator: anyNamed('keyComparator'), + compactionStrategy: anyNamed('compactionStrategy'), + crashRecovery: anyNamed('crashRecovery'), + path: anyNamed('path'), + bytes: anyNamed('bytes'), + collection: anyNamed('collection'), + encryptionKey: anyNamed('encryptionKey'), + ), + ).thenAnswer((_) => Future(() => box)); + when(fixture.mockHive.boxExists(any)).thenThrow(fixture.exception); + + final sut = fixture.getSut(); + + await sut.openBox(Fixture.dbName); + try { + await sut.boxExists(Fixture.dbName); + } catch (error) { + expect(error, fixture.exception); + } + + verifyErrorSpan('boxExists', fixture.getCreatedSpan(), fixture.exception); + }); + + test('throwing close adds error span', () async { + when(fixture.mockHive.close()).thenThrow(fixture.exception); + + final sut = fixture.getSut(); + + try { + await sut.close(); + } catch (error) { + expect(error, fixture.exception); + } + + verifyErrorSpan('close', fixture.getCreatedSpan(), fixture.exception); + }); + + test('throwing deleteBoxFromDisk adds error span', () async { + final Box box = MockBox(); + when( + fixture.mockHive.openBox( + any, + encryptionCipher: anyNamed('encryptionCipher'), + keyComparator: anyNamed('keyComparator'), + compactionStrategy: anyNamed('compactionStrategy'), + crashRecovery: anyNamed('crashRecovery'), + path: anyNamed('path'), + bytes: anyNamed('bytes'), + collection: anyNamed('collection'), + encryptionKey: anyNamed('encryptionKey'), + ), + ).thenAnswer((_) => Future(() => box)); + when(fixture.mockHive.deleteBoxFromDisk(any)) + .thenThrow(fixture.exception); + + final sut = fixture.getSut(); + + await sut.openBox(Fixture.dbName); + try { + await sut.deleteBoxFromDisk(Fixture.dbName); + } catch (error) { + expect(error, fixture.exception); + } + + verifyErrorSpan( + 'deleteBoxFromDisk', + fixture.getCreatedSpan(), + fixture.exception, + ); + }); + + test('throwing deleteFromDisk adds error span', () async { + when(fixture.mockHive.deleteFromDisk()).thenThrow(fixture.exception); + + final sut = fixture.getSut(); + + try { + await sut.deleteFromDisk(); + } catch (error) { + expect(error, fixture.exception); + } + + verifyErrorSpan( + 'deleteFromDisk', + fixture.getCreatedSpan(), + fixture.exception, + ); + }); + + test('throwing openBox adds error span', () async { + when( + fixture.mockHive.openBox( + any, + encryptionCipher: anyNamed('encryptionCipher'), + keyComparator: anyNamed('keyComparator'), + compactionStrategy: anyNamed('compactionStrategy'), + crashRecovery: anyNamed('crashRecovery'), + path: anyNamed('path'), + bytes: anyNamed('bytes'), + collection: anyNamed('collection'), + encryptionKey: anyNamed('encryptionKey'), + ), + ).thenThrow(fixture.exception); + + final sut = fixture.getSut(); + + try { + await sut.openBox(Fixture.dbName); + } catch (error) { + expect(error, fixture.exception); + } + + verifyErrorSpan('openBox', fixture.getCreatedSpan(), fixture.exception); + }); + + test('throwing openLazyBox adds error span', () async { + when( + fixture.mockHive.openLazyBox( + any, + encryptionCipher: anyNamed('encryptionCipher'), + keyComparator: anyNamed('keyComparator'), + compactionStrategy: anyNamed('compactionStrategy'), + crashRecovery: anyNamed('crashRecovery'), + path: anyNamed('path'), + collection: anyNamed('collection'), + encryptionKey: anyNamed('encryptionKey'), + ), + ).thenThrow(fixture.exception); + + final sut = fixture.getSut(); + + try { + await sut.openLazyBox(Fixture.dbName); + } catch (error) { + expect(error, fixture.exception); + } + + verifyErrorSpan( + 'openLazyBox', + fixture.getCreatedSpan(), + fixture.exception, + ); + }); + }); + + group('adds breadcrumbs', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.hub.scope).thenReturn(fixture.scope); + + await fixture.setUp(); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('boxExists adds breadcrumb', () async { + final sut = fixture.getSut(); + + await sut.openBox(Fixture.dbName); + await sut.boxExists(Fixture.dbName); + + verifyBreadcrumb('boxExists', fixture.getCreatedBreadcrumb()); + }); + + test('close adds breadcrumb', () async { + final sut = fixture.getSut(); + + await sut.close(); + + verifyBreadcrumb('close', fixture.getCreatedBreadcrumb()); + }); + + test('deleteBoxFromDisk adds breadcrumb', () async { + final sut = fixture.getSut(); + + await sut.openBox(Fixture.dbName); + await sut.deleteBoxFromDisk(Fixture.dbName); + + verifyBreadcrumb('deleteBoxFromDisk', fixture.getCreatedBreadcrumb()); + }); + + test('deleteFromDisk adds breadcrumb', () async { + final sut = fixture.getSut(); + + await sut.deleteFromDisk(); + + verifyBreadcrumb('deleteFromDisk', fixture.getCreatedBreadcrumb()); + }); + + test('openBox adds breadcrumb', () async { + final sut = fixture.getSut(); + + await sut.openBox(Fixture.dbName); + + verifyBreadcrumb( + 'openBox', + fixture.getCreatedBreadcrumb(), + checkName: true, + ); + }); + + test('openLazyBox adds breadcrumb', () async { + final sut = fixture.getSut(); + + await sut.openLazyBox(Fixture.dbName); + + verifyBreadcrumb( + 'openLazyBox', + fixture.getCreatedBreadcrumb(), + checkName: true, + ); + }); + }); + + group('adds error breadcrumb', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.mockHive.close()).thenAnswer((_) async => {}); + when(fixture.hub.scope).thenReturn(fixture.scope); + + await fixture.setUp(injectMockHive: true); + }); + + test('throwing boxExists adds error span', () async { + final Box box = MockBox(); + when( + fixture.mockHive.openBox( + any, + encryptionCipher: anyNamed('encryptionCipher'), + keyComparator: anyNamed('keyComparator'), + compactionStrategy: anyNamed('compactionStrategy'), + crashRecovery: anyNamed('crashRecovery'), + path: anyNamed('path'), + bytes: anyNamed('bytes'), + collection: anyNamed('collection'), + encryptionKey: anyNamed('encryptionKey'), + ), + ).thenAnswer((_) => Future(() => box)); + when(fixture.mockHive.boxExists(any)).thenThrow(fixture.exception); + + final sut = fixture.getSut(); + + await sut.openBox(Fixture.dbName); + try { + await sut.boxExists(Fixture.dbName); + } catch (error) { + expect(error, fixture.exception); + } + + verifyBreadcrumb( + 'boxExists', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing close adds error span', () async { + when(fixture.mockHive.close()).thenThrow(fixture.exception); + + final sut = fixture.getSut(); + + try { + await sut.close(); + } catch (error) { + expect(error, fixture.exception); + } + + verifyBreadcrumb( + 'close', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing deleteBoxFromDisk adds error span', () async { + final Box box = MockBox(); + when( + fixture.mockHive.openBox( + any, + encryptionCipher: anyNamed('encryptionCipher'), + keyComparator: anyNamed('keyComparator'), + compactionStrategy: anyNamed('compactionStrategy'), + crashRecovery: anyNamed('crashRecovery'), + path: anyNamed('path'), + bytes: anyNamed('bytes'), + collection: anyNamed('collection'), + encryptionKey: anyNamed('encryptionKey'), + ), + ).thenAnswer((_) => Future(() => box)); + when(fixture.mockHive.deleteBoxFromDisk(any)) + .thenThrow(fixture.exception); + + final sut = fixture.getSut(); + + await sut.openBox(Fixture.dbName); + try { + await sut.deleteBoxFromDisk(Fixture.dbName); + } catch (error) { + expect(error, fixture.exception); + } + + verifyBreadcrumb( + 'deleteBoxFromDisk', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing deleteFromDisk adds error span', () async { + when(fixture.mockHive.deleteFromDisk()).thenThrow(fixture.exception); + + final sut = fixture.getSut(); + + try { + await sut.deleteFromDisk(); + } catch (error) { + expect(error, fixture.exception); + } + + verifyBreadcrumb( + 'deleteFromDisk', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing openBox adds error span', () async { + when( + fixture.mockHive.openBox( + any, + encryptionCipher: anyNamed('encryptionCipher'), + keyComparator: anyNamed('keyComparator'), + compactionStrategy: anyNamed('compactionStrategy'), + crashRecovery: anyNamed('crashRecovery'), + path: anyNamed('path'), + bytes: anyNamed('bytes'), + collection: anyNamed('collection'), + encryptionKey: anyNamed('encryptionKey'), + ), + ).thenThrow(fixture.exception); + + final sut = fixture.getSut(); + + try { + await sut.openBox(Fixture.dbName); + } catch (error) { + expect(error, fixture.exception); + } + + verifyBreadcrumb( + 'openBox', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing openLazyBox adds error span', () async { + when( + fixture.mockHive.openLazyBox( + any, + encryptionCipher: anyNamed('encryptionCipher'), + keyComparator: anyNamed('keyComparator'), + compactionStrategy: anyNamed('compactionStrategy'), + crashRecovery: anyNamed('crashRecovery'), + path: anyNamed('path'), + collection: anyNamed('collection'), + encryptionKey: anyNamed('encryptionKey'), + ), + ).thenThrow(fixture.exception); + + final sut = fixture.getSut(); + + try { + await sut.openLazyBox(Fixture.dbName); + } catch (error) { + expect(error, fixture.exception); + } + + verifyBreadcrumb( + 'openLazyBox', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + }); + + group('integrations', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.hub.scope).thenReturn(fixture.scope); + + await fixture.setUp(); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('adds integration', () { + expect( + fixture.options.sdk.integrations.contains('SentryHiveTracing'), + true, + ); + }); + + test('adds package', () { + expect( + fixture.options.sdk.packages.any( + (element) => + element.name == packageName && element.version == sdkVersion, + ), + true, + ); + }); + }); +} + +class Fixture { + final options = SentryOptions(); + late final mockHive = MockHiveInterface(); + final hub = MockHub(); + static final dbName = 'people-hive-impl'; + final exception = Exception('fixture-exception'); + + final _context = SentryTransactionContext('name', 'operation'); + late final tracer = SentryTracer(_context, hub); + late SentryHiveImpl sut; + late final scope = Scope(options); + + Future setUp({bool injectMockHive = false}) async { + if (injectMockHive) { + sut = SentryHiveImpl(mockHive); + } else { + sut = SentryHiveImpl(Hive); + sut.init(Directory.systemTemp.path); + if (!sut.isAdapterRegistered(0)) { + sut.registerAdapter(PersonAdapter()); + } + } + sut.setHub(hub); + } + + Future tearDown() async { + await sut.close(); + } + + SentryHiveImpl getSut() { + return sut; + } + + SentrySpan? getCreatedSpan() { + return tracer.children.last; + } + + Breadcrumb? getCreatedBreadcrumb() { + return hub.scope.breadcrumbs.last; + } +} diff --git a/hive/test/sentry_lazy_box_test.dart b/hive/test/sentry_lazy_box_test.dart new file mode 100644 index 0000000000..291dc3fc20 --- /dev/null +++ b/hive/test/sentry_lazy_box_test.dart @@ -0,0 +1,291 @@ +@TestOn('vm') + +import 'dart:io'; + +import 'package:hive/hive.dart'; +import 'package:mockito/mockito.dart'; +import 'package:sentry/sentry.dart'; +import 'package:sentry/src/sentry_tracer.dart'; +import 'package:sentry_hive/src/sentry_hive_impl.dart'; +import 'package:sentry_hive/src/sentry_lazy_box.dart'; +import 'package:test/test.dart'; + +import 'mocks/mocks.mocks.dart'; +import 'person.dart'; + +void main() { + void verifySpan(String description, SentrySpan? span) { + expect(span?.context.operation, SentryHiveImpl.dbOp); + expect(span?.context.description, description); + expect(span?.status, SpanStatus.ok()); + // ignore: invalid_use_of_internal_member + expect(span?.origin, SentryTraceOrigins.autoDbHiveLazyBox); + expect(span?.data[SentryHiveImpl.dbSystemKey], SentryHiveImpl.dbSystem); + expect(span?.data[SentryHiveImpl.dbNameKey], Fixture.dbName); + } + + void verifyErrorSpan( + String description, + Exception exception, + SentrySpan? span, + ) { + expect(span?.context.operation, SentryHiveImpl.dbOp); + expect(span?.context.description, description); + expect(span?.status, SpanStatus.internalError()); + // ignore: invalid_use_of_internal_member + expect(span?.origin, SentryTraceOrigins.autoDbHiveLazyBox); + expect(span?.data[SentryHiveImpl.dbSystemKey], SentryHiveImpl.dbSystem); + expect(span?.data[SentryHiveImpl.dbNameKey], Fixture.dbName); + + expect(span?.throwable, exception); + } + + void verifyBreadcrumb( + String message, + Breadcrumb? crumb, { + bool checkName = false, + String status = 'ok', + }) { + expect( + crumb?.message, + message, + ); + expect(crumb?.type, 'query'); + if (checkName) { + expect(crumb?.data?[SentryHiveImpl.dbNameKey], Fixture.dbName); + } + expect(crumb?.data?['status'], status); + } + + group('adds span', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + await fixture.setUp(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.hub.scope).thenReturn(fixture.scope); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('get adds span', () async { + final sut = fixture.getSut(); + + await sut.put('fixture-key', Person('John Malkovich')); + await sut.get('fixture-key'); + + verifySpan('get', fixture.getCreatedSpan()); + }); + + test('getAt adds span', () async { + final sut = fixture.getSut(); + + await sut.add(Person('John Malkovich')); + await sut.getAt(0); + + verifySpan('getAt', fixture.getCreatedSpan()); + }); + }); + + group('adds error span', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + await fixture.setUp(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.mockBox.name).thenReturn(Fixture.dbName); + when(fixture.hub.scope).thenReturn(fixture.scope); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('throwing get adds error span', () async { + when(fixture.mockBox.add(any)).thenAnswer((_) async { + return 1; + }); + when(fixture.mockBox.get(any)).thenThrow(fixture.exception); + + final sut = fixture.getSut(injectMockBox: true); + + await sut.put('fixture-key', Person('John Malkovich')); + try { + await sut.get('fixture-key'); + } catch (error) { + expect(error, fixture.exception); + } + + verifyErrorSpan('get', fixture.exception, fixture.getCreatedSpan()); + }); + + test('throwing getAt adds error span', () async { + when(fixture.mockBox.add(any)).thenAnswer((_) async { + return 1; + }); + when(fixture.mockBox.getAt(any)).thenThrow(fixture.exception); + + final sut = fixture.getSut(injectMockBox: true); + + await sut.add(Person('John Malkovich')); + try { + await sut.getAt(0); + } catch (error) { + expect(error, fixture.exception); + } + + verifyErrorSpan('getAt', fixture.exception, fixture.getCreatedSpan()); + }); + }); + + group('adds breadcrumb', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + await fixture.setUp(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.hub.scope).thenReturn(fixture.scope); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('get adds breadcrumb', () async { + final sut = fixture.getSut(); + + await sut.put('fixture-key', Person('John Malkovich')); + await sut.get('fixture-key'); + + verifyBreadcrumb('get', fixture.getCreatedBreadcrumb()); + }); + + test('getAt adds breadcrumb', () async { + final sut = fixture.getSut(); + + await sut.add(Person('John Malkovich')); + await sut.getAt(0); + + verifyBreadcrumb('getAt', fixture.getCreatedBreadcrumb()); + }); + }); + + group('adds error breadcrumbs', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + await fixture.setUp(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.mockBox.name).thenReturn(Fixture.dbName); + when(fixture.hub.scope).thenReturn(fixture.scope); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('throwing get adds error breadcrumbs', () async { + when(fixture.mockBox.add(any)).thenAnswer((_) async { + return 1; + }); + when(fixture.mockBox.get(any)).thenThrow(fixture.exception); + + final sut = fixture.getSut(injectMockBox: true); + + await sut.put('fixture-key', Person('John Malkovich')); + try { + await sut.get('fixture-key'); + } catch (error) { + expect(error, fixture.exception); + } + + verifyBreadcrumb( + 'get', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing getAt adds error breadcrumbs', () async { + when(fixture.mockBox.add(any)).thenAnswer((_) async { + return 1; + }); + when(fixture.mockBox.getAt(any)).thenThrow(fixture.exception); + + final sut = fixture.getSut(injectMockBox: true); + + await sut.add(Person('John Malkovich')); + try { + await sut.getAt(0); + } catch (error) { + expect(error, fixture.exception); + } + + verifyBreadcrumb( + 'getAt', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + }); +} + +class Fixture { + late final LazyBox box; + late final mockBox = MockLazyBox(); + final options = SentryOptions(); + final hub = MockHub(); + final exception = Exception('fixture-exception'); + + static final dbName = 'people-lazy-box'; + + final _context = SentryTransactionContext('name', 'operation'); + late final tracer = SentryTracer(_context, hub); + late final scope = Scope(options); + + Future setUp() async { + Hive.init(Directory.systemTemp.path); + if (!Hive.isAdapterRegistered(0)) { + Hive.registerAdapter(PersonAdapter()); + } + box = await Hive.openLazyBox(dbName); + } + + Future tearDown() async { + if (box.isOpen) { + await box.deleteFromDisk(); + await box.close(); + } + await Hive.close(); + } + + SentryLazyBox getSut({bool injectMockBox = false}) { + if (injectMockBox) { + return SentryLazyBox(mockBox, hub); + } else { + return SentryLazyBox(box, hub); + } + } + + SentrySpan? getCreatedSpan() { + return tracer.children.last; + } + + Breadcrumb? getCreatedBreadcrumb() { + return hub.scope.breadcrumbs.last; + } +} diff --git a/isar/.gitignore b/isar/.gitignore new file mode 100644 index 0000000000..fdd96ceb43 --- /dev/null +++ b/isar/.gitignore @@ -0,0 +1,17 @@ +# Omit committing pubspec.lock for library packages; see +# https://dart.dev/guides/libraries/private-files#pubspeclock. +pubspec.lock + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.packages +.pub-cache/ +.pub/ +/build/ + +# Downloaded on demand by tests for correct architecture. +libisar.dylib diff --git a/isar/.metadata b/isar/.metadata new file mode 100644 index 0000000000..eea17bc4a0 --- /dev/null +++ b/isar/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "2f708eb8396e362e280fac22cf171c2cb467343c" + channel: "stable" + +project_type: package diff --git a/isar/CHANGELOG.md b/isar/CHANGELOG.md new file mode 120000 index 0000000000..04c99a55ca --- /dev/null +++ b/isar/CHANGELOG.md @@ -0,0 +1 @@ +../CHANGELOG.md \ No newline at end of file diff --git a/isar/LICENSE b/isar/LICENSE new file mode 100644 index 0000000000..2a6964d84d --- /dev/null +++ b/isar/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Sentry + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/isar/README.md b/isar/README.md new file mode 100644 index 0000000000..06fa32dd48 --- /dev/null +++ b/isar/README.md @@ -0,0 +1,84 @@ +

+ + + +
+

+ +Sentry integration for `isar` package +=========== + +| package | build | pub | likes | popularity | pub points | +| ------- | ------- | ------- | ------- | ------- | ------- | +| sentry_isar | [![build](https://github.com/getsentry/sentry-dart/actions/workflows/isar.yml/badge.svg?branch=main)](https://github.com/getsentry/sentry-dart/actions?query=workflow%3Asentry-isar) | [![pub package](https://img.shields.io/pub/v/sentry_isar.svg)](https://pub.dev/packages/sentry_isar) | [![likes](https://img.shields.io/pub/likes/sentry_isar)](https://pub.dev/packages/sentry_isar/score) | [![popularity](https://img.shields.io/pub/popularity/sentry_isar)](https://pub.dev/packages/sentry_isar/score) | [![pub points](https://img.shields.io/pub/points/sentry_isar)](https://pub.dev/packages/sentry_isar/score) + +Integration for the [`isar`](https://pub.dev/packages/isar) package. + +#### Usage + +- Sign up for a Sentry.io account and get a DSN at https://sentry.io. + +- Follow the installing instructions on [pub.dev](https://pub.dev/packages/sentry/install). + +- Initialize the Sentry SDK using the DSN issued by Sentry.io. + +- Call... + +```dart +import 'package:path_provider/path_provider.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; +import 'package:sentry_isar/sentry_isar.dart'; + +import 'user.dart'; + +Future main() async { + await SentryFlutter.init( + (options) { + options.dsn = 'https://example@sentry.io/add-your-dsn-here'; + options.tracesSampleRate = 1.0; + }, + // Init your App. + appRunner: () => runApp(MyApp()), + ); +} + +Future runApp() async { + final tr = Sentry.startTransaction( + 'isarTest', + 'db', + bindToScope: true, + ); + + final dir = await getApplicationDocumentsDirectory(); + + final isar = await SentryIsar.open( + [UserSchema], + directory: dir.path, + ); + + final newUser = User() + ..name = 'Joe Dirt' + ..age = 36; + + await isar.writeTxn(() async { + await isar.users.put(newUser); // insert & update + }); + + final existingUser = await isar.users.get(newUser.id); // get + + await isar.writeTxn(() async { + await isar.users.delete(existingUser!.id); // delete + }); + + await tr.finish(status: const SpanStatus.ok()); +} +``` + +#### Resources + +* [![Flutter docs](https://img.shields.io/badge/documentation-sentry.io-green.svg?label=flutter%20docs)](https://docs.sentry.io/platforms/flutter/) +* [![Dart docs](https://img.shields.io/badge/documentation-sentry.io-green.svg?label=dart%20docs)](https://docs.sentry.io/platforms/dart/) +* [![Discussions](https://img.shields.io/github/discussions/getsentry/sentry-dart.svg)](https://github.com/getsentry/sentry-dart/discussions) +* [![Discord Chat](https://img.shields.io/discord/621778831602221064?logo=discord&logoColor=ffffff&color=7389D8)](https://discord.gg/PXa5Apfe7K) +* [![Stack Overflow](https://img.shields.io/badge/stack%20overflow-sentry-green.svg)](https://stackoverflow.com/questions/tagged/sentry) +* [![Twitter Follow](https://img.shields.io/twitter/follow/getsentry?label=getsentry&style=social)](https://twitter.com/intent/follow?screen_name=getsentry) \ No newline at end of file diff --git a/isar/analysis_options.yaml b/isar/analysis_options.yaml new file mode 100644 index 0000000000..92c8931384 --- /dev/null +++ b/isar/analysis_options.yaml @@ -0,0 +1,33 @@ +include: package:lints/recommended.yaml + +analyzer: + language: + strict-casts: true + strict-inference: true + strict-raw-types: true + errors: + # treat missing required parameters as a warning (not a hint) + missing_required_param: error + # treat missing returns as a warning (not a hint) + missing_return: error + # allow having TODOs in the code + todo: ignore + # allow self-reference to deprecated members (we do this because otherwise we have + # to annotate every member in every test, assert, etc, when we deprecate something) + deprecated_member_use_from_same_package: warning + # ignore sentry/path on pubspec as we change it on deployment + invalid_dependency: ignore + unnecessary_import: ignore + exclude: + - example/** + +linter: + rules: + - prefer_final_locals + - public_member_api_docs + - prefer_single_quotes + - prefer_relative_imports + - unnecessary_brace_in_string_interps + - implementation_imports + - require_trailing_commas + - unawaited_futures diff --git a/isar/dartdoc_options.yaml b/isar/dartdoc_options.yaml new file mode 120000 index 0000000000..7cbb8c0d74 --- /dev/null +++ b/isar/dartdoc_options.yaml @@ -0,0 +1 @@ +../dart/dartdoc_options.yaml \ No newline at end of file diff --git a/isar/example/main.dart b/isar/example/main.dart new file mode 100644 index 0000000000..7c9972b50d --- /dev/null +++ b/isar/example/main.dart @@ -0,0 +1,47 @@ +import 'package:path_provider/path_provider.dart'; +import 'package:sentry_flutter/sentry_flutter.dart'; +import 'package:sentry_isar/sentry_isar.dart'; + +import 'user.dart'; + +Future main() async { + // ATTENTION: Change the DSN below with your own to see the events in Sentry. Get one at sentry.io + const dsn = + 'https://e85b375ffb9f43cf8bdf9787768149e0@o447951.ingest.sentry.io/5428562'; + + await SentryFlutter.init( + (options) { + options.dsn = dsn; + options.tracesSampleRate = 1.0; + options.debug = true; + }, + appRunner: runApp, // Init your App. + ); +} + +Future runApp() async { + final tr = Sentry.startTransaction('isar', 'db', bindToScope: true); + + final dir = await getApplicationDocumentsDirectory(); + + final isar = await SentryIsar.open( + [UserSchema], + directory: dir.path, + ); + + final newUser = User() + ..name = 'Joe Dirt' + ..age = 36; + + await isar.writeTxn(() async { + await isar.users.put(newUser); // insert & update + }); + + final existingUser = await isar.users.get(newUser.id); // get + + await isar.writeTxn(() async { + await isar.users.delete(existingUser!.id); // delete + }); + + await tr.finish(status: const SpanStatus.ok()); +} diff --git a/isar/example/user.dart b/isar/example/user.dart new file mode 100644 index 0000000000..f255d2389d --- /dev/null +++ b/isar/example/user.dart @@ -0,0 +1,12 @@ +import 'package:isar/isar.dart'; + +part 'user.g.dart'; + +@collection +class User { + Id id = Isar.autoIncrement; + + String? name; + + int? age; +} diff --git a/isar/example/user.g.dart b/isar/example/user.g.dart new file mode 100644 index 0000000000..370c40860f --- /dev/null +++ b/isar/example/user.g.dart @@ -0,0 +1,553 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user.dart'; + +// ************************************************************************** +// IsarCollectionGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +extension GetUserCollection on Isar { + IsarCollection get users => this.collection(); +} + +const UserSchema = CollectionSchema( + name: r'User', + id: -7838171048429979076, + properties: { + r'age': PropertySchema( + id: 0, + name: r'age', + type: IsarType.long, + ), + r'name': PropertySchema( + id: 1, + name: r'name', + type: IsarType.string, + ) + }, + estimateSize: _userEstimateSize, + serialize: _userSerialize, + deserialize: _userDeserialize, + deserializeProp: _userDeserializeProp, + idName: r'id', + indexes: {}, + links: {}, + embeddedSchemas: {}, + getId: _userGetId, + getLinks: _userGetLinks, + attach: _userAttach, + version: '3.1.0+1', +); + +int _userEstimateSize( + User object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + { + final value = object.name; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + return bytesCount; +} + +void _userSerialize( + User object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeLong(offsets[0], object.age); + writer.writeString(offsets[1], object.name); +} + +User _userDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = User(); + object.age = reader.readLongOrNull(offsets[0]); + object.id = id; + object.name = reader.readStringOrNull(offsets[1]); + return object; +} + +P _userDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readLongOrNull(offset)) as P; + case 1: + return (reader.readStringOrNull(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +Id _userGetId(User object) { + return object.id; +} + +List> _userGetLinks(User object) { + return []; +} + +void _userAttach(IsarCollection col, Id id, User object) { + object.id = id; +} + +extension UserQueryWhereSort on QueryBuilder { + QueryBuilder anyId() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(const IdWhereClause.any()); + }); + } +} + +extension UserQueryWhere on QueryBuilder { + QueryBuilder idEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: id, + upper: id, + )); + }); + } + + QueryBuilder idNotEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ) + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ); + } else { + return query + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ) + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ); + } + }); + } + + QueryBuilder idGreaterThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: include), + ); + }); + } + + QueryBuilder idLessThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: include), + ); + }); + } + + QueryBuilder idBetween( + Id lowerId, + Id upperId, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: lowerId, + includeLower: includeLower, + upper: upperId, + includeUpper: includeUpper, + )); + }); + } +} + +extension UserQueryFilter on QueryBuilder { + QueryBuilder ageIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'age', + )); + }); + } + + QueryBuilder ageIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'age', + )); + }); + } + + QueryBuilder ageEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'age', + value: value, + )); + }); + } + + QueryBuilder ageGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'age', + value: value, + )); + }); + } + + QueryBuilder ageLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'age', + value: value, + )); + }); + } + + QueryBuilder ageBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'age', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder idEqualTo(Id value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idGreaterThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idLessThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idBetween( + Id lower, + Id upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'id', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder nameIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'name', + )); + }); + } + + QueryBuilder nameIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'name', + )); + }); + } + + QueryBuilder nameEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'name', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameContains(String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameMatches(String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'name', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'name', + value: '', + )); + }); + } + + QueryBuilder nameIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'name', + value: '', + )); + }); + } +} + +extension UserQueryObject on QueryBuilder {} + +extension UserQueryLinks on QueryBuilder {} + +extension UserQuerySortBy on QueryBuilder { + QueryBuilder sortByAge() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'age', Sort.asc); + }); + } + + QueryBuilder sortByAgeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'age', Sort.desc); + }); + } + + QueryBuilder sortByName() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'name', Sort.asc); + }); + } + + QueryBuilder sortByNameDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'name', Sort.desc); + }); + } +} + +extension UserQuerySortThenBy on QueryBuilder { + QueryBuilder thenByAge() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'age', Sort.asc); + }); + } + + QueryBuilder thenByAgeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'age', Sort.desc); + }); + } + + QueryBuilder thenById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.asc); + }); + } + + QueryBuilder thenByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.desc); + }); + } + + QueryBuilder thenByName() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'name', Sort.asc); + }); + } + + QueryBuilder thenByNameDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'name', Sort.desc); + }); + } +} + +extension UserQueryWhereDistinct on QueryBuilder { + QueryBuilder distinctByAge() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'age'); + }); + } + + QueryBuilder distinctByName( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'name', caseSensitive: caseSensitive); + }); + } +} + +extension UserQueryProperty on QueryBuilder { + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'id'); + }); + } + + QueryBuilder ageProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'age'); + }); + } + + QueryBuilder nameProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'name'); + }); + } +} diff --git a/isar/lib/sentry_isar.dart b/isar/lib/sentry_isar.dart new file mode 100644 index 0000000000..75e63c47ea --- /dev/null +++ b/isar/lib/sentry_isar.dart @@ -0,0 +1,4 @@ +library sentry_isar; + +export 'src/sentry_isar.dart'; +export 'src/sentry_isar_collection.dart'; diff --git a/isar/lib/src/sentry_isar.dart b/isar/lib/src/sentry_isar.dart new file mode 100644 index 0000000000..e6e174a8eb --- /dev/null +++ b/isar/lib/src/sentry_isar.dart @@ -0,0 +1,253 @@ +import 'package:isar/isar.dart'; +import 'package:meta/meta.dart'; +import 'package:sentry/sentry.dart'; +import 'version.dart'; + +import 'sentry_isar_collection.dart'; +import 'sentry_span_helper.dart'; + +/// A sentry wrapper around the Isar Database +@experimental +class SentryIsar implements Isar { + @internal + // ignore: public_member_api_docs + static const dbOp = 'db'; + + @internal + // ignore: public_member_api_docs + static const dbSystemKey = 'db.system'; + @internal + // ignore: public_member_api_docs + static const dbSystem = 'isar'; + + @internal + // ignore: public_member_api_docs + static const dbNameKey = 'db.name'; + + @internal + // ignore: public_member_api_docs + static const dbCollectionKey = 'db.collection'; + + final Isar _isar; + final Hub _hub; + final _spanHelper = SentrySpanHelper( + // ignore: invalid_use_of_internal_member + SentryTraceOrigins.autoDbIsar, + ); + + /// ctor of SentryIsar + SentryIsar(this._isar, this._hub) { + _spanHelper.setHub(_hub); + + // ignore: invalid_use_of_internal_member + final options = _hub.options; + options.sdk.addIntegration('SentryIsarTracing'); + options.sdk.addPackage(packageName, sdkVersion); + } + + /// Open a new Isar instance, wrapped by SentryIsar + static Future open( + List> schemas, { + required String directory, + String name = Isar.defaultName, + int maxSizeMiB = Isar.defaultMaxSizeMiB, + bool relaxedDurability = true, + CompactCondition? compactOnLaunch, + bool inspector = true, + Hub? hub, + }) async { + final spanHelper = SentrySpanHelper( + // ignore: invalid_use_of_internal_member + SentryTraceOrigins.autoDbIsar, + ); + final hubToUse = hub ?? HubAdapter(); + spanHelper.setHub(hubToUse); + + final isar = await spanHelper.asyncWrapInSpan( + 'open', + () async { + return await Isar.open( + schemas, + directory: directory, + name: name, + maxSizeMiB: maxSizeMiB, + relaxedDurability: relaxedDurability, + compactOnLaunch: compactOnLaunch, + inspector: inspector, + ); + }, + dbName: name, + ); + + return SentryIsar(isar, hubToUse); + } + + /// Open a new Isar instance, wrapped by SentryIsar + static Isar openSync( + List> schemas, { + required String directory, + String name = Isar.defaultName, + int maxSizeMiB = Isar.defaultMaxSizeMiB, + bool relaxedDurability = true, + CompactCondition? compactOnLaunch, + bool inspector = true, + Hub? hub, + }) { + final isar = Isar.openSync( + schemas, + directory: directory, + name: name, + maxSizeMiB: maxSizeMiB, + relaxedDurability: relaxedDurability, + compactOnLaunch: compactOnLaunch, + inspector: inspector, + ); + return SentryIsar(isar, hub ?? HubAdapter()); + } + + @override + void attachCollections(Map> collections) { + _isar.attachCollections(collections); + } + + @override + Future clear() { + return _spanHelper.asyncWrapInSpan( + 'clear', + () { + return _isar.clear(); + }, + dbName: name, + ); + } + + @override + void clearSync() { + _isar.clearSync(); + } + + @override + Future close({bool deleteFromDisk = false}) { + return _spanHelper.asyncWrapInSpan( + 'close', + () { + return _isar.close(deleteFromDisk: deleteFromDisk); + }, + dbName: name, + ); + } + + @override + IsarCollection collection() { + return SentryIsarCollection(_isar.collection(), _hub, name); + } + + @override + Future copyToFile(String targetPath) { + return _spanHelper.asyncWrapInSpan( + 'copyToFile', + () { + return _isar.copyToFile(targetPath); + }, + dbName: name, + ); + } + + @override + String? get directory => _isar.directory; + + @override + IsarCollection? getCollectionByNameInternal(String name) { + final collection = _isar.getCollectionByNameInternal(name); + if (collection != null) { + return SentryIsarCollection(collection, _hub, name); + } else { + return null; + } + } + + @override + Future getSize({ + bool includeIndexes = false, + bool includeLinks = false, + }) { + return _spanHelper.asyncWrapInSpan( + 'getSize', + () { + return _isar.getSize( + includeIndexes: includeIndexes, + includeLinks: includeLinks, + ); + }, + dbName: name, + ); + } + + @override + int getSizeSync({bool includeIndexes = false, bool includeLinks = false}) { + return _isar.getSizeSync( + includeIndexes: includeIndexes, + includeLinks: includeLinks, + ); + } + + @override + bool get isOpen => _isar.isOpen; + + @override + String get name => _isar.name; + + @override + String? get path => _isar.path; + + @override + void requireOpen() { + _isar.requireOpen(); + } + + @override + Future txn(Future Function() callback) { + return _spanHelper.asyncWrapInSpan( + 'txn', + () { + return _isar.txn(callback); + }, + dbName: name, + ); + } + + @override + T txnSync(T Function() callback) { + return _isar.txnSync(callback); + } + + @override + @visibleForTesting + @experimental + Future verify() { + return _spanHelper.asyncWrapInSpan( + 'verify', + () { + // ignore: invalid_use_of_visible_for_testing_member + return _isar.verify(); + }, + dbName: name, + ); + } + + @override + Future writeTxn(Future Function() callback, {bool silent = false}) { + return _spanHelper.asyncWrapInSpan( + 'writeTxn', + () { + return _isar.writeTxn(callback, silent: silent); + }, + dbName: name, + ); + } + + @override + T writeTxnSync(T Function() callback, {bool silent = false}) { + return _isar.writeTxnSync(callback, silent: silent); + } +} diff --git a/isar/lib/src/sentry_isar_collection.dart b/isar/lib/src/sentry_isar_collection.dart new file mode 100644 index 0000000000..3f85242bbe --- /dev/null +++ b/isar/lib/src/sentry_isar_collection.dart @@ -0,0 +1,433 @@ +import 'dart:typed_data'; +import 'package:isar/isar.dart'; +import 'package:meta/meta.dart'; +import 'package:sentry/sentry.dart'; + +import 'sentry_span_helper.dart'; + +/// Sentry wrapper around IsarCollection +@experimental +class SentryIsarCollection implements IsarCollection { + final IsarCollection _isarCollection; + final Hub _hub; + final String _dbName; + + final _spanHelper = SentrySpanHelper( + // ignore: invalid_use_of_internal_member + SentryTraceOrigins.autoDbIsarCollection, + ); + + /// ctor of SentryIsarCollection + SentryIsarCollection(this._isarCollection, this._hub, this._dbName) { + _spanHelper.setHub(_hub); + } + + @override + Query buildQuery({ + List whereClauses = const [], + bool whereDistinct = false, + Sort whereSort = Sort.asc, + FilterOperation? filter, + List sortBy = const [], + List distinctBy = const [], + int? offset, + int? limit, + String? property, + }) { + return _isarCollection.buildQuery( + whereClauses: whereClauses, + whereDistinct: whereDistinct, + whereSort: whereSort, + filter: filter, + sortBy: sortBy, + distinctBy: distinctBy, + offset: offset, + limit: limit, + property: property, + ); + } + + @override + Future clear() { + return _spanHelper.asyncWrapInSpan( + 'clear', + () { + return _isarCollection.clear(); + }, + dbName: _dbName, + collectionName: name, + ); + } + + @override + void clearSync() { + _isarCollection.clearSync(); + } + + @override + Future count() { + return _spanHelper.asyncWrapInSpan( + 'count', + () { + return _isarCollection.count(); + }, + dbName: _dbName, + collectionName: name, + ); + } + + @override + int countSync() { + return _isarCollection.countSync(); + } + + @override + Future delete(Id id) { + return _spanHelper.asyncWrapInSpan( + 'delete', + () { + return _isarCollection.delete(id); + }, + dbName: _dbName, + collectionName: name, + ); + } + + @override + Future deleteAll(List ids) { + return _spanHelper.asyncWrapInSpan( + 'deleteAll', + () { + return _isarCollection.deleteAll(ids); + }, + dbName: _dbName, + collectionName: name, + ); + } + + @override + Future deleteAllByIndex(String indexName, List keys) { + return _spanHelper.asyncWrapInSpan( + 'deleteAllByIndex', + () { + return _isarCollection.deleteAllByIndex(indexName, keys); + }, + dbName: _dbName, + collectionName: name, + ); + } + + @override + int deleteAllByIndexSync(String indexName, List keys) { + return _isarCollection.deleteAllByIndexSync(indexName, keys); + } + + @override + int deleteAllSync(List ids) { + return _isarCollection.deleteAllSync(ids); + } + + @override + Future deleteByIndex(String indexName, IndexKey key) { + return _spanHelper.asyncWrapInSpan( + 'deleteByIndex', + () { + return _isarCollection.deleteByIndex(indexName, key); + }, + dbName: _dbName, + collectionName: name, + ); + } + + @override + bool deleteByIndexSync(String indexName, IndexKey key) { + return _isarCollection.deleteByIndexSync(indexName, key); + } + + @override + bool deleteSync(Id id) { + return _isarCollection.deleteSync(id); + } + + @override + QueryBuilder filter() { + return _isarCollection.filter(); + } + + @override + Future get(Id id) { + return _spanHelper.asyncWrapInSpan( + 'get', + () { + return _isarCollection.get(id); + }, + dbName: _dbName, + collectionName: name, + ); + } + + @override + Future> getAll(List ids) { + return _spanHelper.asyncWrapInSpan( + 'getAll', + () { + return _isarCollection.getAll(ids); + }, + dbName: _dbName, + collectionName: name, + ); + } + + @override + Future> getAllByIndex(String indexName, List keys) { + return _spanHelper.asyncWrapInSpan( + 'getAllByIndex', + () { + return _isarCollection.getAllByIndex(indexName, keys); + }, + dbName: _dbName, + collectionName: name, + ); + } + + @override + List getAllByIndexSync(String indexName, List keys) { + return _isarCollection.getAllByIndexSync(indexName, keys); + } + + @override + List getAllSync(List ids) { + return _isarCollection.getAllSync(ids); + } + + @override + Future getByIndex(String indexName, IndexKey key) { + return _spanHelper.asyncWrapInSpan( + 'getByIndex', + () { + return _isarCollection.getByIndex(indexName, key); + }, + dbName: _dbName, + collectionName: name, + ); + } + + @override + OBJ? getByIndexSync(String indexName, IndexKey key) { + return _isarCollection.getByIndexSync(indexName, key); + } + + @override + Future getSize({ + bool includeIndexes = false, + bool includeLinks = false, + }) { + return _spanHelper.asyncWrapInSpan( + 'getSize', + () { + return _isarCollection.getSize( + includeIndexes: includeIndexes, + includeLinks: includeLinks, + ); + }, + dbName: _dbName, + collectionName: name, + ); + } + + @override + int getSizeSync({bool includeIndexes = false, bool includeLinks = false}) { + return _isarCollection.getSizeSync( + includeIndexes: includeIndexes, + includeLinks: includeLinks, + ); + } + + @override + OBJ? getSync(Id id) { + return _isarCollection.getSync(id); + } + + @override + Future importJson(List> json) { + return _spanHelper.asyncWrapInSpan( + 'importJson', + () { + return _isarCollection.importJson(json); + }, + dbName: _dbName, + collectionName: name, + ); + } + + @override + Future importJsonRaw(Uint8List jsonBytes) { + return _spanHelper.asyncWrapInSpan( + 'importJsonRaw', + () { + return _isarCollection.importJsonRaw(jsonBytes); + }, + dbName: _dbName, + collectionName: name, + ); + } + + @override + void importJsonRawSync(Uint8List jsonBytes) { + _isarCollection.importJsonRawSync(jsonBytes); + } + + @override + void importJsonSync(List> json) { + _isarCollection.importJsonSync(json); + } + + @override + Isar get isar => _isarCollection.isar; + + @override + String get name => _isarCollection.name; + + @override + Future put(OBJ object) { + return _spanHelper.asyncWrapInSpan( + 'put', + () { + return _isarCollection.put(object); + }, + dbName: _dbName, + collectionName: name, + ); + } + + @override + Future> putAll(List objects) { + return _spanHelper.asyncWrapInSpan( + 'putAll', + () { + return _isarCollection.putAll(objects); + }, + dbName: _dbName, + collectionName: name, + ); + } + + @override + Future> putAllByIndex(String indexName, List objects) { + return _spanHelper.asyncWrapInSpan( + 'putAllByIndex', + () { + return _isarCollection.putAllByIndex(indexName, objects); + }, + dbName: _dbName, + collectionName: name, + ); + } + + @override + List putAllByIndexSync( + String indexName, + List objects, { + bool saveLinks = true, + }) { + return _isarCollection.putAllByIndexSync( + indexName, + objects, + saveLinks: saveLinks, + ); + } + + @override + List putAllSync(List objects, {bool saveLinks = true}) { + return _isarCollection.putAllSync(objects, saveLinks: saveLinks); + } + + @override + Future putByIndex(String indexName, OBJ object) { + return _spanHelper.asyncWrapInSpan( + 'putByIndex', + () { + return _isarCollection.putByIndex(indexName, object); + }, + dbName: _dbName, + collectionName: name, + ); + } + + @override + Id putByIndexSync(String indexName, OBJ object, {bool saveLinks = true}) { + return _isarCollection.putByIndexSync( + indexName, + object, + saveLinks: saveLinks, + ); + } + + @override + Id putSync(OBJ object, {bool saveLinks = true}) { + return _isarCollection.putSync(object, saveLinks: saveLinks); + } + + @override + CollectionSchema get schema => _isarCollection.schema; + + @override + @visibleForTesting + @experimental + Future verify(List objects) { + return _spanHelper.asyncWrapInSpan( + 'verify', + () { + // ignore: invalid_use_of_visible_for_testing_member + return _isarCollection.verify(objects); + }, + dbName: _dbName, + collectionName: name, + ); + } + + @override + @visibleForTesting + @experimental + Future verifyLink( + String linkName, + List sourceIds, + List targetIds, + ) { + return _spanHelper.asyncWrapInSpan( + 'verifyLink', + () { + // ignore: invalid_use_of_visible_for_testing_member + return _isarCollection.verifyLink(linkName, sourceIds, targetIds); + }, + dbName: _dbName, + collectionName: name, + ); + } + + @override + Stream watchLazy({bool fireImmediately = false}) { + return _isarCollection.watchLazy(fireImmediately: fireImmediately); + } + + @override + Stream watchObject(Id id, {bool fireImmediately = false}) { + return _isarCollection.watchObject(id, fireImmediately: fireImmediately); + } + + @override + Stream watchObjectLazy(Id id, {bool fireImmediately = false}) { + return _isarCollection.watchObjectLazy( + id, + fireImmediately: fireImmediately, + ); + } + + @override + QueryBuilder where({ + bool distinct = false, + Sort sort = Sort.asc, + }) { + return _isarCollection.where(distinct: distinct, sort: sort); + } +} diff --git a/isar/lib/src/sentry_span_helper.dart b/isar/lib/src/sentry_span_helper.dart new file mode 100644 index 0000000000..ec1823c7ca --- /dev/null +++ b/isar/lib/src/sentry_span_helper.dart @@ -0,0 +1,83 @@ +// ignore_for_file: invalid_internal_annotation + +import 'package:meta/meta.dart'; +import 'package:sentry/sentry.dart'; +import 'sentry_isar.dart'; + +/// @nodoc +@internal +class SentrySpanHelper { + /// @nodoc + Hub _hub = HubAdapter(); + + /// @nodoc + final String _origin; + + /// @nodoc + SentrySpanHelper(this._origin); + + /// @nodoc + void setHub(Hub hub) { + _hub = hub; + } + + /// @nodoc + @internal + Future asyncWrapInSpan( + String description, + Future Function() execute, { + String? dbName, + String? collectionName, + }) async { + final currentSpan = _hub.getSpan(); + final span = currentSpan?.startChild( + SentryIsar.dbOp, + description: description, + ); + + // ignore: invalid_use_of_internal_member + span?.origin = _origin; + + var breadcrumb = Breadcrumb( + message: description, + data: {}, + type: 'query', + ); + + span?.setData(SentryIsar.dbSystemKey, SentryIsar.dbSystem); + + if (dbName != null) { + span?.setData(SentryIsar.dbNameKey, dbName); + breadcrumb.data?[SentryIsar.dbNameKey] = dbName; + } + + if (collectionName != null) { + span?.setData(SentryIsar.dbCollectionKey, collectionName); + breadcrumb.data?[SentryIsar.dbCollectionKey] = collectionName; + } + + try { + final result = await execute(); + + span?.status = SpanStatus.ok(); + breadcrumb.data?['status'] = 'ok'; + + return result; + } catch (exception) { + span?.throwable = exception; + span?.status = SpanStatus.internalError(); + + breadcrumb.data?['status'] = 'internal_error'; + breadcrumb = breadcrumb.copyWith( + level: SentryLevel.warning, + ); + + rethrow; + } finally { + await span?.finish(); + + // ignore: invalid_use_of_internal_member + await _hub.scope.addBreadcrumb(breadcrumb); + } + } +} diff --git a/isar/lib/src/version.dart b/isar/lib/src/version.dart new file mode 100644 index 0000000000..0e551e8349 --- /dev/null +++ b/isar/lib/src/version.dart @@ -0,0 +1,5 @@ +/// The SDK version reported to Sentry.io in the submitted events. +const String sdkVersion = '7.16.0'; + +/// The package name reported to Sentry.io in the submitted events. +const String packageName = 'pub:sentry_isar'; diff --git a/isar/pubspec.yaml b/isar/pubspec.yaml new file mode 100644 index 0000000000..81770c4d52 --- /dev/null +++ b/isar/pubspec.yaml @@ -0,0 +1,28 @@ +name: sentry_isar +description: An integration which adds support for performance tracing for the isar package. +version: 7.16.0 +homepage: https://docs.sentry.io/platforms/flutter/ +repository: https://github.com/getsentry/sentry-dart +issue_tracker: https://github.com/getsentry/sentry-dart/issues + +environment: + sdk: '>=2.17.0 <4.0.0' + flutter: '>=3.3.0' + +dependencies: + isar: ^3.1.0 + isar_flutter_libs: ^3.1.0 # contains Isar Core + sentry: 7.16.0 + meta: ^1.3.0 + path: ^1.8.3 + +dev_dependencies: + isar_generator: ^3.1.0 + build_runner: ^2.4.6 + lints: ^3.0.0 + flutter_test: + sdk: flutter + coverage: ^1.3.0 + mockito: ^5.1.0 + yaml: ^3.1.0 # needed for version match (code and pubspec) + path_provider: ^2.1.1 diff --git a/isar/pubspec_overrides.yaml b/isar/pubspec_overrides.yaml new file mode 100644 index 0000000000..16e71d16f0 --- /dev/null +++ b/isar/pubspec_overrides.yaml @@ -0,0 +1,3 @@ +dependency_overrides: + sentry: + path: ../dart diff --git a/isar/test/mocks/mocks.dart b/isar/test/mocks/mocks.dart new file mode 100644 index 0000000000..55f59b6de3 --- /dev/null +++ b/isar/test/mocks/mocks.dart @@ -0,0 +1,10 @@ +import 'package:isar/isar.dart'; +import 'package:mockito/annotations.dart'; +import 'package:sentry/sentry.dart'; + +@GenerateMocks([ + Hub, + Isar, + IsarCollection, +]) +void main() {} diff --git a/isar/test/mocks/mocks.mocks.dart b/isar/test/mocks/mocks.mocks.dart new file mode 100644 index 0000000000..4f7adfed86 --- /dev/null +++ b/isar/test/mocks/mocks.mocks.dart @@ -0,0 +1,1340 @@ +// Mocks generated by Mockito 5.4.2 from annotations +// in sentry_isar/test/mocks/mocks.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes, invalid_use_of_internal_member +import 'dart:async' as _i3; +import 'dart:typed_data' as _i7; + +import 'package:isar/isar.dart' as _i4; +import 'package:mockito/mockito.dart' as _i1; +import 'package:mockito/src/dummies.dart' as _i6; +import 'package:sentry/sentry.dart' as _i2; +import 'package:sentry/src/profiling.dart' as _i5; + +// 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 _FakeSentryOptions_0 extends _i1.SmartFake implements _i2.SentryOptions { + _FakeSentryOptions_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeSentryId_1 extends _i1.SmartFake implements _i2.SentryId { + _FakeSentryId_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeScope_2 extends _i1.SmartFake implements _i2.Scope { + _FakeScope_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeHub_3 extends _i1.SmartFake implements _i2.Hub { + _FakeHub_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeISentrySpan_4 extends _i1.SmartFake implements _i2.ISentrySpan { + _FakeISentrySpan_4( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeFuture_5 extends _i1.SmartFake implements _i3.Future { + _FakeFuture_5( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeIsarCollection_6 extends _i1.SmartFake + implements _i4.IsarCollection { + _FakeIsarCollection_6( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeIsar_7 extends _i1.SmartFake implements _i4.Isar { + _FakeIsar_7( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeCollectionSchema_8 extends _i1.SmartFake + implements _i4.CollectionSchema { + _FakeCollectionSchema_8( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeQueryBuilder_9 extends _i1.SmartFake + implements _i4.QueryBuilder { + _FakeQueryBuilder_9( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeQuery_10 extends _i1.SmartFake implements _i4.Query { + _FakeQuery_10( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [Hub]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockHub extends _i1.Mock implements _i2.Hub { + MockHub() { + _i1.throwOnMissingStub(this); + } + + @override + _i2.SentryOptions get options => (super.noSuchMethod( + Invocation.getter(#options), + returnValue: _FakeSentryOptions_0( + this, + Invocation.getter(#options), + ), + ) as _i2.SentryOptions); + + @override + bool get isEnabled => (super.noSuchMethod( + Invocation.getter(#isEnabled), + returnValue: false, + ) as bool); + + @override + _i2.SentryId get lastEventId => (super.noSuchMethod( + Invocation.getter(#lastEventId), + returnValue: _FakeSentryId_1( + this, + Invocation.getter(#lastEventId), + ), + ) as _i2.SentryId); + + @override + _i2.Scope get scope => (super.noSuchMethod( + Invocation.getter(#scope), + returnValue: _FakeScope_2( + this, + Invocation.getter(#scope), + ), + ) as _i2.Scope); + + @override + set profilerFactory(_i5.SentryProfilerFactory? value) => super.noSuchMethod( + Invocation.setter( + #profilerFactory, + value, + ), + returnValueForMissingStub: null, + ); + + @override + _i3.Future<_i2.SentryId> captureEvent( + _i2.SentryEvent? event, { + dynamic stackTrace, + _i2.Hint? hint, + _i2.ScopeCallback? withScope, + }) => + (super.noSuchMethod( + Invocation.method( + #captureEvent, + [event], + { + #stackTrace: stackTrace, + #hint: hint, + #withScope: withScope, + }, + ), + returnValue: _i3.Future<_i2.SentryId>.value(_FakeSentryId_1( + this, + Invocation.method( + #captureEvent, + [event], + { + #stackTrace: stackTrace, + #hint: hint, + #withScope: withScope, + }, + ), + )), + ) as _i3.Future<_i2.SentryId>); + + @override + _i3.Future<_i2.SentryId> captureException( + dynamic throwable, { + dynamic stackTrace, + _i2.Hint? hint, + _i2.ScopeCallback? withScope, + }) => + (super.noSuchMethod( + Invocation.method( + #captureException, + [throwable], + { + #stackTrace: stackTrace, + #hint: hint, + #withScope: withScope, + }, + ), + returnValue: _i3.Future<_i2.SentryId>.value(_FakeSentryId_1( + this, + Invocation.method( + #captureException, + [throwable], + { + #stackTrace: stackTrace, + #hint: hint, + #withScope: withScope, + }, + ), + )), + ) as _i3.Future<_i2.SentryId>); + + @override + _i3.Future<_i2.SentryId> captureMessage( + String? message, { + _i2.SentryLevel? level, + String? template, + List? params, + _i2.Hint? hint, + _i2.ScopeCallback? withScope, + }) => + (super.noSuchMethod( + Invocation.method( + #captureMessage, + [message], + { + #level: level, + #template: template, + #params: params, + #hint: hint, + #withScope: withScope, + }, + ), + returnValue: _i3.Future<_i2.SentryId>.value(_FakeSentryId_1( + this, + Invocation.method( + #captureMessage, + [message], + { + #level: level, + #template: template, + #params: params, + #hint: hint, + #withScope: withScope, + }, + ), + )), + ) as _i3.Future<_i2.SentryId>); + + @override + _i3.Future captureUserFeedback(_i2.SentryUserFeedback? userFeedback) => + (super.noSuchMethod( + Invocation.method( + #captureUserFeedback, + [userFeedback], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future addBreadcrumb( + _i2.Breadcrumb? crumb, { + _i2.Hint? hint, + }) => + (super.noSuchMethod( + Invocation.method( + #addBreadcrumb, + [crumb], + {#hint: hint}, + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + void bindClient(_i2.SentryClient? client) => super.noSuchMethod( + Invocation.method( + #bindClient, + [client], + ), + returnValueForMissingStub: null, + ); + + @override + _i2.Hub clone() => (super.noSuchMethod( + Invocation.method( + #clone, + [], + ), + returnValue: _FakeHub_3( + this, + Invocation.method( + #clone, + [], + ), + ), + ) as _i2.Hub); + + @override + _i3.Future close() => (super.noSuchMethod( + Invocation.method( + #close, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.FutureOr configureScope(_i2.ScopeCallback? callback) => + (super.noSuchMethod(Invocation.method( + #configureScope, + [callback], + )) as _i3.FutureOr); + + @override + _i2.ISentrySpan startTransaction( + String? name, + String? operation, { + String? description, + DateTime? startTimestamp, + bool? bindToScope, + bool? waitForChildren, + Duration? autoFinishAfter, + bool? trimEnd, + _i2.OnTransactionFinish? onFinish, + Map? customSamplingContext, + }) => + (super.noSuchMethod( + Invocation.method( + #startTransaction, + [ + name, + operation, + ], + { + #description: description, + #startTimestamp: startTimestamp, + #bindToScope: bindToScope, + #waitForChildren: waitForChildren, + #autoFinishAfter: autoFinishAfter, + #trimEnd: trimEnd, + #onFinish: onFinish, + #customSamplingContext: customSamplingContext, + }, + ), + returnValue: _FakeISentrySpan_4( + this, + Invocation.method( + #startTransaction, + [ + name, + operation, + ], + { + #description: description, + #startTimestamp: startTimestamp, + #bindToScope: bindToScope, + #waitForChildren: waitForChildren, + #autoFinishAfter: autoFinishAfter, + #trimEnd: trimEnd, + #onFinish: onFinish, + #customSamplingContext: customSamplingContext, + }, + ), + ), + ) as _i2.ISentrySpan); + + @override + _i2.ISentrySpan startTransactionWithContext( + _i2.SentryTransactionContext? transactionContext, { + Map? customSamplingContext, + DateTime? startTimestamp, + bool? bindToScope, + bool? waitForChildren, + Duration? autoFinishAfter, + bool? trimEnd, + _i2.OnTransactionFinish? onFinish, + }) => + (super.noSuchMethod( + Invocation.method( + #startTransactionWithContext, + [transactionContext], + { + #customSamplingContext: customSamplingContext, + #startTimestamp: startTimestamp, + #bindToScope: bindToScope, + #waitForChildren: waitForChildren, + #autoFinishAfter: autoFinishAfter, + #trimEnd: trimEnd, + #onFinish: onFinish, + }, + ), + returnValue: _FakeISentrySpan_4( + this, + Invocation.method( + #startTransactionWithContext, + [transactionContext], + { + #customSamplingContext: customSamplingContext, + #startTimestamp: startTimestamp, + #bindToScope: bindToScope, + #waitForChildren: waitForChildren, + #autoFinishAfter: autoFinishAfter, + #trimEnd: trimEnd, + #onFinish: onFinish, + }, + ), + ), + ) as _i2.ISentrySpan); + + @override + _i3.Future<_i2.SentryId> captureTransaction( + _i2.SentryTransaction? transaction, { + _i2.SentryTraceContextHeader? traceContext, + }) => + (super.noSuchMethod( + Invocation.method( + #captureTransaction, + [transaction], + {#traceContext: traceContext}, + ), + returnValue: _i3.Future<_i2.SentryId>.value(_FakeSentryId_1( + this, + Invocation.method( + #captureTransaction, + [transaction], + {#traceContext: traceContext}, + ), + )), + ) as _i3.Future<_i2.SentryId>); + + @override + void setSpanContext( + dynamic throwable, + _i2.ISentrySpan? span, + String? transaction, + ) => + super.noSuchMethod( + Invocation.method( + #setSpanContext, + [ + throwable, + span, + transaction, + ], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [Isar]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockIsar extends _i1.Mock implements _i4.Isar { + MockIsar() { + _i1.throwOnMissingStub(this); + } + + @override + String get name => (super.noSuchMethod( + Invocation.getter(#name), + returnValue: '', + ) as String); + + @override + bool get isOpen => (super.noSuchMethod( + Invocation.getter(#isOpen), + returnValue: false, + ) as bool); + + @override + void requireOpen() => super.noSuchMethod( + Invocation.method( + #requireOpen, + [], + ), + returnValueForMissingStub: null, + ); + + @override + _i3.Future txn(_i3.Future Function()? callback) => + (super.noSuchMethod( + Invocation.method( + #txn, + [callback], + ), + returnValue: _i6.ifNotNull( + _i6.dummyValueOrNull( + this, + Invocation.method( + #txn, + [callback], + ), + ), + (T v) => _i3.Future.value(v), + ) ?? + _FakeFuture_5( + this, + Invocation.method( + #txn, + [callback], + ), + ), + ) as _i3.Future); + + @override + _i3.Future writeTxn( + _i3.Future Function()? callback, { + bool? silent = false, + }) => + (super.noSuchMethod( + Invocation.method( + #writeTxn, + [callback], + {#silent: silent}, + ), + returnValue: _i6.ifNotNull( + _i6.dummyValueOrNull( + this, + Invocation.method( + #writeTxn, + [callback], + {#silent: silent}, + ), + ), + (T v) => _i3.Future.value(v), + ) ?? + _FakeFuture_5( + this, + Invocation.method( + #writeTxn, + [callback], + {#silent: silent}, + ), + ), + ) as _i3.Future); + + @override + T txnSync(T Function()? callback) => (super.noSuchMethod( + Invocation.method( + #txnSync, + [callback], + ), + returnValue: _i6.dummyValue( + this, + Invocation.method( + #txnSync, + [callback], + ), + ), + ) as T); + + @override + T writeTxnSync( + T Function()? callback, { + bool? silent = false, + }) => + (super.noSuchMethod( + Invocation.method( + #writeTxnSync, + [callback], + {#silent: silent}, + ), + returnValue: _i6.dummyValue( + this, + Invocation.method( + #writeTxnSync, + [callback], + {#silent: silent}, + ), + ), + ) as T); + + @override + void attachCollections(Map>? collections) => + super.noSuchMethod( + Invocation.method( + #attachCollections, + [collections], + ), + returnValueForMissingStub: null, + ); + + @override + _i4.IsarCollection collection() => (super.noSuchMethod( + Invocation.method( + #collection, + [], + ), + returnValue: _FakeIsarCollection_6( + this, + Invocation.method( + #collection, + [], + ), + ), + ) as _i4.IsarCollection); + + @override + _i4.IsarCollection? getCollectionByNameInternal(String? name) => + (super.noSuchMethod(Invocation.method( + #getCollectionByNameInternal, + [name], + )) as _i4.IsarCollection?); + + @override + _i3.Future clear() => (super.noSuchMethod( + Invocation.method( + #clear, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + void clearSync() => super.noSuchMethod( + Invocation.method( + #clearSync, + [], + ), + returnValueForMissingStub: null, + ); + + @override + _i3.Future getSize({ + bool? includeIndexes = false, + bool? includeLinks = false, + }) => + (super.noSuchMethod( + Invocation.method( + #getSize, + [], + { + #includeIndexes: includeIndexes, + #includeLinks: includeLinks, + }, + ), + returnValue: _i3.Future.value(0), + ) as _i3.Future); + + @override + int getSizeSync({ + bool? includeIndexes = false, + bool? includeLinks = false, + }) => + (super.noSuchMethod( + Invocation.method( + #getSizeSync, + [], + { + #includeIndexes: includeIndexes, + #includeLinks: includeLinks, + }, + ), + returnValue: 0, + ) as int); + + @override + _i3.Future copyToFile(String? targetPath) => (super.noSuchMethod( + Invocation.method( + #copyToFile, + [targetPath], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future close({bool? deleteFromDisk = false}) => (super.noSuchMethod( + Invocation.method( + #close, + [], + {#deleteFromDisk: deleteFromDisk}, + ), + returnValue: _i3.Future.value(false), + ) as _i3.Future); + + @override + _i3.Future verify() => (super.noSuchMethod( + Invocation.method( + #verify, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); +} + +/// A class which mocks [IsarCollection]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockIsarCollection extends _i1.Mock + implements _i4.IsarCollection { + MockIsarCollection() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.Isar get isar => (super.noSuchMethod( + Invocation.getter(#isar), + returnValue: _FakeIsar_7( + this, + Invocation.getter(#isar), + ), + ) as _i4.Isar); + + @override + _i4.CollectionSchema get schema => (super.noSuchMethod( + Invocation.getter(#schema), + returnValue: _FakeCollectionSchema_8( + this, + Invocation.getter(#schema), + ), + ) as _i4.CollectionSchema); + + @override + String get name => (super.noSuchMethod( + Invocation.getter(#name), + returnValue: '', + ) as String); + + @override + _i3.Future get(int? id) => (super.noSuchMethod( + Invocation.method( + #get, + [id], + ), + returnValue: _i3.Future.value(), + ) as _i3.Future); + + @override + OBJ? getSync(int? id) => (super.noSuchMethod(Invocation.method( + #getSync, + [id], + )) as OBJ?); + + @override + _i3.Future> getAll(List? ids) => (super.noSuchMethod( + Invocation.method( + #getAll, + [ids], + ), + returnValue: _i3.Future>.value([]), + ) as _i3.Future>); + + @override + List getAllSync(List? ids) => (super.noSuchMethod( + Invocation.method( + #getAllSync, + [ids], + ), + returnValue: [], + ) as List); + + @override + _i3.Future getByIndex( + String? indexName, + List? key, + ) => + (super.noSuchMethod( + Invocation.method( + #getByIndex, + [ + indexName, + key, + ], + ), + returnValue: _i3.Future.value(), + ) as _i3.Future); + + @override + OBJ? getByIndexSync( + String? indexName, + List? key, + ) => + (super.noSuchMethod(Invocation.method( + #getByIndexSync, + [ + indexName, + key, + ], + )) as OBJ?); + + @override + _i3.Future> getAllByIndex( + String? indexName, + List>? keys, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllByIndex, + [ + indexName, + keys, + ], + ), + returnValue: _i3.Future>.value([]), + ) as _i3.Future>); + + @override + List getAllByIndexSync( + String? indexName, + List>? keys, + ) => + (super.noSuchMethod( + Invocation.method( + #getAllByIndexSync, + [ + indexName, + keys, + ], + ), + returnValue: [], + ) as List); + + @override + _i3.Future put(OBJ? object) => (super.noSuchMethod( + Invocation.method( + #put, + [object], + ), + returnValue: _i3.Future.value(0), + ) as _i3.Future); + + @override + int putSync( + OBJ? object, { + bool? saveLinks = true, + }) => + (super.noSuchMethod( + Invocation.method( + #putSync, + [object], + {#saveLinks: saveLinks}, + ), + returnValue: 0, + ) as int); + + @override + _i3.Future> putAll(List? objects) => (super.noSuchMethod( + Invocation.method( + #putAll, + [objects], + ), + returnValue: _i3.Future>.value([]), + ) as _i3.Future>); + + @override + List putAllSync( + List? objects, { + bool? saveLinks = true, + }) => + (super.noSuchMethod( + Invocation.method( + #putAllSync, + [objects], + {#saveLinks: saveLinks}, + ), + returnValue: [], + ) as List); + + @override + _i3.Future putByIndex( + String? indexName, + OBJ? object, + ) => + (super.noSuchMethod( + Invocation.method( + #putByIndex, + [ + indexName, + object, + ], + ), + returnValue: _i3.Future.value(0), + ) as _i3.Future); + + @override + int putByIndexSync( + String? indexName, + OBJ? object, { + bool? saveLinks = true, + }) => + (super.noSuchMethod( + Invocation.method( + #putByIndexSync, + [ + indexName, + object, + ], + {#saveLinks: saveLinks}, + ), + returnValue: 0, + ) as int); + + @override + _i3.Future> putAllByIndex( + String? indexName, + List? objects, + ) => + (super.noSuchMethod( + Invocation.method( + #putAllByIndex, + [ + indexName, + objects, + ], + ), + returnValue: _i3.Future>.value([]), + ) as _i3.Future>); + + @override + List putAllByIndexSync( + String? indexName, + List? objects, { + bool? saveLinks = true, + }) => + (super.noSuchMethod( + Invocation.method( + #putAllByIndexSync, + [ + indexName, + objects, + ], + {#saveLinks: saveLinks}, + ), + returnValue: [], + ) as List); + + @override + _i3.Future delete(int? id) => (super.noSuchMethod( + Invocation.method( + #delete, + [id], + ), + returnValue: _i3.Future.value(false), + ) as _i3.Future); + + @override + bool deleteSync(int? id) => (super.noSuchMethod( + Invocation.method( + #deleteSync, + [id], + ), + returnValue: false, + ) as bool); + + @override + _i3.Future deleteAll(List? ids) => (super.noSuchMethod( + Invocation.method( + #deleteAll, + [ids], + ), + returnValue: _i3.Future.value(0), + ) as _i3.Future); + + @override + int deleteAllSync(List? ids) => (super.noSuchMethod( + Invocation.method( + #deleteAllSync, + [ids], + ), + returnValue: 0, + ) as int); + + @override + _i3.Future deleteByIndex( + String? indexName, + List? key, + ) => + (super.noSuchMethod( + Invocation.method( + #deleteByIndex, + [ + indexName, + key, + ], + ), + returnValue: _i3.Future.value(false), + ) as _i3.Future); + + @override + bool deleteByIndexSync( + String? indexName, + List? key, + ) => + (super.noSuchMethod( + Invocation.method( + #deleteByIndexSync, + [ + indexName, + key, + ], + ), + returnValue: false, + ) as bool); + + @override + _i3.Future deleteAllByIndex( + String? indexName, + List>? keys, + ) => + (super.noSuchMethod( + Invocation.method( + #deleteAllByIndex, + [ + indexName, + keys, + ], + ), + returnValue: _i3.Future.value(0), + ) as _i3.Future); + + @override + int deleteAllByIndexSync( + String? indexName, + List>? keys, + ) => + (super.noSuchMethod( + Invocation.method( + #deleteAllByIndexSync, + [ + indexName, + keys, + ], + ), + returnValue: 0, + ) as int); + + @override + _i3.Future clear() => (super.noSuchMethod( + Invocation.method( + #clear, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + void clearSync() => super.noSuchMethod( + Invocation.method( + #clearSync, + [], + ), + returnValueForMissingStub: null, + ); + + @override + _i3.Future importJsonRaw(_i7.Uint8List? jsonBytes) => + (super.noSuchMethod( + Invocation.method( + #importJsonRaw, + [jsonBytes], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + void importJsonRawSync(_i7.Uint8List? jsonBytes) => super.noSuchMethod( + Invocation.method( + #importJsonRawSync, + [jsonBytes], + ), + returnValueForMissingStub: null, + ); + + @override + _i3.Future importJson(List>? json) => + (super.noSuchMethod( + Invocation.method( + #importJson, + [json], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + void importJsonSync(List>? json) => super.noSuchMethod( + Invocation.method( + #importJsonSync, + [json], + ), + returnValueForMissingStub: null, + ); + + @override + _i4.QueryBuilder where({ + bool? distinct = false, + _i4.Sort? sort = _i4.Sort.asc, + }) => + (super.noSuchMethod( + Invocation.method( + #where, + [], + { + #distinct: distinct, + #sort: sort, + }, + ), + returnValue: _FakeQueryBuilder_9( + this, + Invocation.method( + #where, + [], + { + #distinct: distinct, + #sort: sort, + }, + ), + ), + ) as _i4.QueryBuilder); + + @override + _i4.QueryBuilder filter() => + (super.noSuchMethod( + Invocation.method( + #filter, + [], + ), + returnValue: _FakeQueryBuilder_9( + this, + Invocation.method( + #filter, + [], + ), + ), + ) as _i4.QueryBuilder); + + @override + _i4.Query buildQuery({ + List<_i4.WhereClause>? whereClauses = const [], + bool? whereDistinct = false, + _i4.Sort? whereSort = _i4.Sort.asc, + _i4.FilterOperation? filter, + List<_i4.SortProperty>? sortBy = const [], + List<_i4.DistinctProperty>? distinctBy = const [], + int? offset, + int? limit, + String? property, + }) => + (super.noSuchMethod( + Invocation.method( + #buildQuery, + [], + { + #whereClauses: whereClauses, + #whereDistinct: whereDistinct, + #whereSort: whereSort, + #filter: filter, + #sortBy: sortBy, + #distinctBy: distinctBy, + #offset: offset, + #limit: limit, + #property: property, + }, + ), + returnValue: _FakeQuery_10( + this, + Invocation.method( + #buildQuery, + [], + { + #whereClauses: whereClauses, + #whereDistinct: whereDistinct, + #whereSort: whereSort, + #filter: filter, + #sortBy: sortBy, + #distinctBy: distinctBy, + #offset: offset, + #limit: limit, + #property: property, + }, + ), + ), + ) as _i4.Query); + + @override + _i3.Future count() => (super.noSuchMethod( + Invocation.method( + #count, + [], + ), + returnValue: _i3.Future.value(0), + ) as _i3.Future); + + @override + int countSync() => (super.noSuchMethod( + Invocation.method( + #countSync, + [], + ), + returnValue: 0, + ) as int); + + @override + _i3.Future getSize({ + bool? includeIndexes = false, + bool? includeLinks = false, + }) => + (super.noSuchMethod( + Invocation.method( + #getSize, + [], + { + #includeIndexes: includeIndexes, + #includeLinks: includeLinks, + }, + ), + returnValue: _i3.Future.value(0), + ) as _i3.Future); + + @override + int getSizeSync({ + bool? includeIndexes = false, + bool? includeLinks = false, + }) => + (super.noSuchMethod( + Invocation.method( + #getSizeSync, + [], + { + #includeIndexes: includeIndexes, + #includeLinks: includeLinks, + }, + ), + returnValue: 0, + ) as int); + + @override + _i3.Stream watchLazy({bool? fireImmediately = false}) => + (super.noSuchMethod( + Invocation.method( + #watchLazy, + [], + {#fireImmediately: fireImmediately}, + ), + returnValue: _i3.Stream.empty(), + ) as _i3.Stream); + + @override + _i3.Stream watchObject( + int? id, { + bool? fireImmediately = false, + }) => + (super.noSuchMethod( + Invocation.method( + #watchObject, + [id], + {#fireImmediately: fireImmediately}, + ), + returnValue: _i3.Stream.empty(), + ) as _i3.Stream); + + @override + _i3.Stream watchObjectLazy( + int? id, { + bool? fireImmediately = false, + }) => + (super.noSuchMethod( + Invocation.method( + #watchObjectLazy, + [id], + {#fireImmediately: fireImmediately}, + ), + returnValue: _i3.Stream.empty(), + ) as _i3.Stream); + + @override + _i3.Future verify(List? objects) => (super.noSuchMethod( + Invocation.method( + #verify, + [objects], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future verifyLink( + String? linkName, + List? sourceIds, + List? targetIds, + ) => + (super.noSuchMethod( + Invocation.method( + #verifyLink, + [ + linkName, + sourceIds, + targetIds, + ], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); +} diff --git a/isar/test/person.dart b/isar/test/person.dart new file mode 100644 index 0000000000..385ae69e04 --- /dev/null +++ b/isar/test/person.dart @@ -0,0 +1,11 @@ +import 'package:isar/isar.dart'; + +part 'person.g.dart'; + +@collection +class Person { + Id id = Isar.autoIncrement; + + @Index() + String? name; +} diff --git a/isar/test/person.g.dart b/isar/test/person.g.dart new file mode 100644 index 0000000000..cbd85e6fe5 --- /dev/null +++ b/isar/test/person.g.dart @@ -0,0 +1,518 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'person.dart'; + +// ************************************************************************** +// IsarCollectionGenerator +// ************************************************************************** + +// coverage:ignore-file +// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types + +extension GetPersonCollection on Isar { + IsarCollection get persons => this.collection(); +} + +const PersonSchema = CollectionSchema( + name: r'Person', + id: 7854610480646705599, + properties: { + r'name': PropertySchema( + id: 0, + name: r'name', + type: IsarType.string, + ) + }, + estimateSize: _personEstimateSize, + serialize: _personSerialize, + deserialize: _personDeserialize, + deserializeProp: _personDeserializeProp, + idName: r'id', + indexes: { + r'name': IndexSchema( + id: 879695947855722453, + name: r'name', + unique: false, + replace: false, + properties: [ + IndexPropertySchema( + name: r'name', + type: IndexType.hash, + caseSensitive: true, + ) + ], + ) + }, + links: {}, + embeddedSchemas: {}, + getId: _personGetId, + getLinks: _personGetLinks, + attach: _personAttach, + version: '3.1.0+1', +); + +int _personEstimateSize( + Person object, + List offsets, + Map> allOffsets, +) { + var bytesCount = offsets.last; + { + final value = object.name; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } + return bytesCount; +} + +void _personSerialize( + Person object, + IsarWriter writer, + List offsets, + Map> allOffsets, +) { + writer.writeString(offsets[0], object.name); +} + +Person _personDeserialize( + Id id, + IsarReader reader, + List offsets, + Map> allOffsets, +) { + final object = Person(); + object.id = id; + object.name = reader.readStringOrNull(offsets[0]); + return object; +} + +P _personDeserializeProp

( + IsarReader reader, + int propertyId, + int offset, + Map> allOffsets, +) { + switch (propertyId) { + case 0: + return (reader.readStringOrNull(offset)) as P; + default: + throw IsarError('Unknown property with id $propertyId'); + } +} + +Id _personGetId(Person object) { + return object.id; +} + +List> _personGetLinks(Person object) { + return []; +} + +void _personAttach(IsarCollection col, Id id, Person object) { + object.id = id; +} + +extension PersonQueryWhereSort on QueryBuilder { + QueryBuilder anyId() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(const IdWhereClause.any()); + }); + } +} + +extension PersonQueryWhere on QueryBuilder { + QueryBuilder idEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: id, + upper: id, + )); + }); + } + + QueryBuilder idNotEqualTo(Id id) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ) + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ); + } else { + return query + .addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: false), + ) + .addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: false), + ); + } + }); + } + + QueryBuilder idGreaterThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.greaterThan(lower: id, includeLower: include), + ); + }); + } + + QueryBuilder idLessThan(Id id, + {bool include = false}) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause( + IdWhereClause.lessThan(upper: id, includeUpper: include), + ); + }); + } + + QueryBuilder idBetween( + Id lowerId, + Id upperId, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IdWhereClause.between( + lower: lowerId, + includeLower: includeLower, + upper: upperId, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder nameIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IndexWhereClause.equalTo( + indexName: r'name', + value: [null], + )); + }); + } + + QueryBuilder nameIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IndexWhereClause.between( + indexName: r'name', + lower: [null], + includeLower: false, + upper: [], + )); + }); + } + + QueryBuilder nameEqualTo(String? name) { + return QueryBuilder.apply(this, (query) { + return query.addWhereClause(IndexWhereClause.equalTo( + indexName: r'name', + value: [name], + )); + }); + } + + QueryBuilder nameNotEqualTo(String? name) { + return QueryBuilder.apply(this, (query) { + if (query.whereSort == Sort.asc) { + return query + .addWhereClause(IndexWhereClause.between( + indexName: r'name', + lower: [], + upper: [name], + includeUpper: false, + )) + .addWhereClause(IndexWhereClause.between( + indexName: r'name', + lower: [name], + includeLower: false, + upper: [], + )); + } else { + return query + .addWhereClause(IndexWhereClause.between( + indexName: r'name', + lower: [name], + includeLower: false, + upper: [], + )) + .addWhereClause(IndexWhereClause.between( + indexName: r'name', + lower: [], + upper: [name], + includeUpper: false, + )); + } + }); + } +} + +extension PersonQueryFilter on QueryBuilder { + QueryBuilder idEqualTo(Id value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idGreaterThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idLessThan( + Id value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'id', + value: value, + )); + }); + } + + QueryBuilder idBetween( + Id lower, + Id upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'id', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder nameIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'name', + )); + }); + } + + QueryBuilder nameIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'name', + )); + }); + } + + QueryBuilder nameEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameBetween( + String? lower, + String? upper, { + bool includeLower = true, + bool includeUpper = true, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'name', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameContains(String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'name', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'name', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder nameIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'name', + value: '', + )); + }); + } + + QueryBuilder nameIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'name', + value: '', + )); + }); + } +} + +extension PersonQueryObject on QueryBuilder {} + +extension PersonQueryLinks on QueryBuilder {} + +extension PersonQuerySortBy on QueryBuilder { + QueryBuilder sortByName() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'name', Sort.asc); + }); + } + + QueryBuilder sortByNameDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'name', Sort.desc); + }); + } +} + +extension PersonQuerySortThenBy on QueryBuilder { + QueryBuilder thenById() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.asc); + }); + } + + QueryBuilder thenByIdDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'id', Sort.desc); + }); + } + + QueryBuilder thenByName() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'name', Sort.asc); + }); + } + + QueryBuilder thenByNameDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'name', Sort.desc); + }); + } +} + +extension PersonQueryWhereDistinct on QueryBuilder { + QueryBuilder distinctByName( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'name', caseSensitive: caseSensitive); + }); + } +} + +extension PersonQueryProperty on QueryBuilder { + QueryBuilder idProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'id'); + }); + } + + QueryBuilder nameProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'name'); + }); + } +} diff --git a/isar/test/sentry_isar_collection_test.dart b/isar/test/sentry_isar_collection_test.dart new file mode 100644 index 0000000000..de55ac5989 --- /dev/null +++ b/isar/test/sentry_isar_collection_test.dart @@ -0,0 +1,928 @@ +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:isar/isar.dart'; +import 'package:mockito/mockito.dart'; +import 'package:sentry/sentry.dart'; +import 'package:sentry_isar/sentry_isar.dart'; +import 'package:sentry_isar/src/sentry_isar.dart'; + +import 'package:sentry/src/sentry_tracer.dart'; + +import 'mocks/mocks.mocks.dart'; +import 'person.dart'; + +void main() { + void verifySpan( + String description, + SentrySpan? span, + ) { + expect(span?.context.operation, SentryIsar.dbOp); + expect(span?.context.description, description); + expect(span?.status, SpanStatus.ok()); + // ignore: invalid_use_of_internal_member + expect(span?.origin, SentryTraceOrigins.autoDbIsarCollection); + expect(span?.data[SentryIsar.dbNameKey], Fixture.dbName); + expect(span?.data[SentryIsar.dbCollectionKey], 'Person'); + } + + void verifyErrorSpan(String description, SentrySpan? span, Exception error) { + expect(span?.context.operation, SentryIsar.dbOp); + expect(span?.context.description, description); + expect(span?.status, SpanStatus.internalError()); + // ignore: invalid_use_of_internal_member + expect(span?.origin, SentryTraceOrigins.autoDbIsarCollection); + expect(span?.throwable, error); + } + + void verifyBreadcrumb( + String message, + Breadcrumb? crumb, { + String status = 'ok', + }) { + expect( + crumb?.message, + message, + ); + expect(crumb?.type, 'query'); + expect(crumb?.data?['status'], status); + if (status != 'ok') { + expect(crumb?.level, SentryLevel.warning); + } + } + + group('add spans', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.hub.scope).thenReturn(fixture.scope); + + await fixture.setUp(); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('clear adds span', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().clear(); + }); + final span = fixture.getCreatedSpan(); + verifySpan('clear', span); + }); + + test('count adds span', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().count(); + }); + final span = fixture.getCreatedSpan(); + verifySpan('count', span); + }); + + test('delete adds span', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().delete(0); + }); + final span = fixture.getCreatedSpan(); + verifySpan('delete', span); + }); + + test('deleteAll adds span', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().deleteAll([0]); + }); + final span = fixture.getCreatedSpan(); + verifySpan('deleteAll', span); + }); + + test('deleteAllByIndex adds span', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().putByIndex('name', Person()..name = 'Joe'); + await fixture.getSut().deleteAllByIndex('name', []); + }); + final span = fixture.getCreatedSpan(); + verifySpan('deleteAllByIndex', span); + }); + + test('deleteByIndex adds span', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().putByIndex('name', Person()..name = 'Joe'); + await fixture.getSut().deleteByIndex('name', []); + }); + final span = fixture.getCreatedSpan(); + verifySpan('deleteByIndex', span); + }); + + test('get adds span', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().get(1); + }); + final span = fixture.getCreatedSpan(); + verifySpan('get', span); + }); + + test('getAll adds span', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().getAll([1]); + }); + final span = fixture.getCreatedSpan(); + verifySpan('getAll', span); + }); + + test('getAllByIndex adds span', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().getAllByIndex('name', []); + }); + final span = fixture.getCreatedSpan(); + verifySpan('getAllByIndex', span); + }); + + test('getByIndex adds span', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().getByIndex('name', []); + }); + final span = fixture.getCreatedSpan(); + verifySpan('getByIndex', span); + }); + + test('getSize adds span', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().getSize(); + }); + final span = fixture.getCreatedSpan(); + verifySpan('getSize', span); + }); + + test('importJson adds span', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().importJson([]); + }); + final span = fixture.getCreatedSpan(); + verifySpan('importJson', span); + }); + + test('importJsonRaw adds span', () async { + await fixture.sentryIsar.writeTxn(() async { + final query = fixture.getSut().buildQuery(); + Uint8List jsonRaw = Uint8List.fromList([]); + await query.exportJsonRaw((raw) { + jsonRaw = Uint8List.fromList(raw); + }); + await fixture.getSut().importJsonRaw(jsonRaw); + }); + final span = fixture.getCreatedSpan(); + verifySpan('importJsonRaw', span); + }); + + test('put adds span', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().put(Person()); + }); + final span = fixture.getCreatedSpan(); + verifySpan('put', span); + }); + + test('putAll adds span', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().putAll([Person()]); + }); + final span = fixture.getCreatedSpan(); + verifySpan('putAll', span); + }); + + test('putAllByIndex adds span', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().putAllByIndex('name', [Person()]); + }); + final span = fixture.getCreatedSpan(); + verifySpan('putAllByIndex', span); + }); + + test('putByIndex adds span', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().putByIndex('name', Person()); + }); + final span = fixture.getCreatedSpan(); + verifySpan('putByIndex', span); + }); + }); + + group('add error spans', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.hub.scope).thenReturn(fixture.scope); + when(fixture.isarCollection.name).thenReturn(Fixture.dbCollection); + + await fixture.setUp(); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('throwing clear adds error span', () async { + when(fixture.isarCollection.clear()).thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).clear(); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan('clear', fixture.getCreatedSpan(), fixture.exception); + }); + + test('throwing count adds error span', () async { + when(fixture.isarCollection.count()).thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).count(); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan('count', fixture.getCreatedSpan(), fixture.exception); + }); + + test('throwing delete adds error span', () async { + when(fixture.isarCollection.delete(any)).thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).delete(0); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan('delete', fixture.getCreatedSpan(), fixture.exception); + }); + + test('throwing deleteAll adds error span', () async { + when(fixture.isarCollection.deleteAll(any)).thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).deleteAll([0]); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan('deleteAll', fixture.getCreatedSpan(), fixture.exception); + }); + + test('throwing deleteAllByIndex adds error span', () async { + when(fixture.isarCollection.deleteAllByIndex(any, any)) + .thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).deleteAllByIndex('name', []); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan( + 'deleteAllByIndex', + fixture.getCreatedSpan(), + fixture.exception, + ); + }); + + test('throwing deleteByIndex adds error span', () async { + when(fixture.isarCollection.deleteByIndex(any, any)) + .thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).deleteByIndex('name', []); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan( + 'deleteByIndex', + fixture.getCreatedSpan(), + fixture.exception, + ); + }); + + test('throwing get adds error span', () async { + when(fixture.isarCollection.get(any)).thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).get(1); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan('get', fixture.getCreatedSpan(), fixture.exception); + }); + + test('throwing getAll adds error span', () async { + when(fixture.isarCollection.getAll(any)).thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).getAll([1]); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan('getAll', fixture.getCreatedSpan(), fixture.exception); + }); + + test('throwing getAllByIndex adds error span', () async { + when(fixture.isarCollection.getAllByIndex(any, any)) + .thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).getAllByIndex('name', []); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan( + 'getAllByIndex', + fixture.getCreatedSpan(), + fixture.exception, + ); + }); + + test('throwing getByIndex adds error span', () async { + when(fixture.isarCollection.getByIndex(any, any)) + .thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).getByIndex('name', []); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan( + 'getByIndex', + fixture.getCreatedSpan(), + fixture.exception, + ); + }); + + test('throwing getSize adds error span', () async { + when(fixture.isarCollection.getSize()).thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).getSize(); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan('getSize', fixture.getCreatedSpan(), fixture.exception); + }); + + test('throwing importJson adds error span', () async { + when(fixture.isarCollection.importJson(any)).thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).importJson([]); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan( + 'importJson', + fixture.getCreatedSpan(), + fixture.exception, + ); + }); + + test('throwing importJsonRaw adds error span', () async { + when(fixture.isarCollection.importJsonRaw(any)) + .thenThrow(fixture.exception); + try { + await fixture + .getSut(injectMock: true) + .importJsonRaw(Uint8List.fromList([])); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan( + 'importJsonRaw', + fixture.getCreatedSpan(), + fixture.exception, + ); + }); + + test('throwing put adds error span', () async { + when(fixture.isarCollection.put(any)).thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).put(Person()); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan('put', fixture.getCreatedSpan(), fixture.exception); + }); + + test('throwing putAll adds error span', () async { + when(fixture.isarCollection.putAll(any)).thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).putAll([Person()]); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan('putAll', fixture.getCreatedSpan(), fixture.exception); + }); + + test('throwing putAllByIndex adds error span', () async { + when(fixture.isarCollection.putAllByIndex(any, any)) + .thenThrow(fixture.exception); + try { + await fixture + .getSut(injectMock: true) + .putAllByIndex('name', [Person()]); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan( + 'putAllByIndex', + fixture.getCreatedSpan(), + fixture.exception, + ); + }); + + test('throwing putByIndex adds error span', () async { + when(fixture.isarCollection.putByIndex(any, any)) + .thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).putByIndex('name', Person()); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan( + 'putByIndex', + fixture.getCreatedSpan(), + fixture.exception, + ); + }); + }); + + group('add breadcrumbs', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.hub.scope).thenReturn(fixture.scope); + + await fixture.setUp(); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('clear adds breadcrumb', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().clear(); + }); + final breadcrumb = fixture.hub.scope.breadcrumbs[1]; + verifyBreadcrumb('clear', breadcrumb); + }); + + test('count adds breadcrumb', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().count(); + }); + final breadcrumb = fixture.hub.scope.breadcrumbs[1]; + verifyBreadcrumb('count', breadcrumb); + }); + + test('delete adds breadcrumb', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().delete(0); + }); + final breadcrumb = fixture.hub.scope.breadcrumbs[1]; + verifyBreadcrumb('delete', breadcrumb); + }); + + test('deleteAll adds breadcrumb', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().deleteAll([0]); + }); + final breadcrumb = fixture.hub.scope.breadcrumbs[1]; + verifyBreadcrumb('deleteAll', breadcrumb); + }); + + test('deleteAllByIndex adds breadcrumb', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().putByIndex('name', Person()..name = 'Joe'); + await fixture.getSut().deleteAllByIndex('name', []); + }); + final breadcrumb = fixture.hub.scope.breadcrumbs[2]; + verifyBreadcrumb('deleteAllByIndex', breadcrumb); + }); + + test('deleteByIndex adds breadcrumb', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().putByIndex('name', Person()..name = 'Joe'); + await fixture.getSut().deleteByIndex('name', []); + }); + final breadcrumb = fixture.hub.scope.breadcrumbs[2]; + verifyBreadcrumb('deleteByIndex', breadcrumb); + }); + + test('get adds breadcrumb', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().get(1); + }); + final breadcrumb = fixture.hub.scope.breadcrumbs[1]; + verifyBreadcrumb('get', breadcrumb); + }); + + test('getAll adds breadcrumb', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().getAll([1]); + }); + final breadcrumb = fixture.hub.scope.breadcrumbs[1]; + verifyBreadcrumb('getAll', breadcrumb); + }); + + test('getAllByIndex adds breadcrumb', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().getAllByIndex('name', []); + }); + final breadcrumb = fixture.hub.scope.breadcrumbs[1]; + verifyBreadcrumb('getAllByIndex', breadcrumb); + }); + + test('getByIndex adds breadcrumb', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().getByIndex('name', []); + }); + final breadcrumb = fixture.hub.scope.breadcrumbs[1]; + verifyBreadcrumb('getByIndex', breadcrumb); + }); + + test('getSize adds breadcrumb', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().getSize(); + }); + final breadcrumb = fixture.hub.scope.breadcrumbs[1]; + verifyBreadcrumb('getSize', breadcrumb); + }); + + test('importJson adds breadcrumb', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().importJson([]); + }); + final breadcrumb = fixture.hub.scope.breadcrumbs[1]; + verifyBreadcrumb('importJson', breadcrumb); + }); + + test('importJsonRaw adds breadcrumb', () async { + await fixture.sentryIsar.writeTxn(() async { + final query = fixture.getSut().buildQuery(); + Uint8List jsonRaw = Uint8List.fromList([]); + await query.exportJsonRaw((raw) { + jsonRaw = Uint8List.fromList(raw); + }); + await fixture.getSut().importJsonRaw(jsonRaw); + }); + final breadcrumb = fixture.hub.scope.breadcrumbs[1]; + verifyBreadcrumb('importJsonRaw', breadcrumb); + }); + + test('put adds breadcrumb', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().put(Person()); + }); + final breadcrumb = fixture.hub.scope.breadcrumbs[1]; + verifyBreadcrumb('put', breadcrumb); + }); + + test('putAll adds breadcrumb', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().putAll([Person()]); + }); + final breadcrumb = fixture.hub.scope.breadcrumbs[1]; + verifyBreadcrumb('putAll', breadcrumb); + }); + + test('putAllByIndex adds breadcrumb', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().putAllByIndex('name', [Person()]); + }); + final breadcrumb = fixture.hub.scope.breadcrumbs[1]; + verifyBreadcrumb('putAllByIndex', breadcrumb); + }); + + test('putByIndex adds breadcrumb', () async { + await fixture.sentryIsar.writeTxn(() async { + await fixture.getSut().putByIndex('name', Person()); + }); + final breadcrumb = fixture.hub.scope.breadcrumbs[1]; + verifyBreadcrumb('putByIndex', breadcrumb); + }); + }); + + group('add error breadcrumbs', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.hub.scope).thenReturn(fixture.scope); + when(fixture.isarCollection.name).thenReturn(Fixture.dbCollection); + + await fixture.setUp(); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('throwing clear adds error breadcrumb', () async { + when(fixture.isarCollection.clear()).thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).clear(); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'clear', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing count adds error breadcrumb', () async { + when(fixture.isarCollection.count()).thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).count(); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'count', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing delete adds error breadcrumb', () async { + when(fixture.isarCollection.delete(any)).thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).delete(0); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'delete', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing deleteAll adds error breadcrumb', () async { + when(fixture.isarCollection.deleteAll(any)).thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).deleteAll([0]); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'deleteAll', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing deleteAllByIndex adds error breadcrumb', () async { + when(fixture.isarCollection.deleteAllByIndex(any, any)) + .thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).deleteAllByIndex('name', []); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'deleteAllByIndex', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing deleteByIndex adds error breadcrumb', () async { + when(fixture.isarCollection.deleteByIndex(any, any)) + .thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).deleteByIndex('name', []); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'deleteByIndex', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing get adds error breadcrumb', () async { + when(fixture.isarCollection.get(any)).thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).get(1); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'get', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing getAll adds error breadcrumb', () async { + when(fixture.isarCollection.getAll(any)).thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).getAll([1]); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'getAll', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing getAllByIndex adds error breadcrumb', () async { + when(fixture.isarCollection.getAllByIndex(any, any)) + .thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).getAllByIndex('name', []); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'getAllByIndex', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing getByIndex adds error breadcrumb', () async { + when(fixture.isarCollection.getByIndex(any, any)) + .thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).getByIndex('name', []); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'getByIndex', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing getSize adds error breadcrumb', () async { + when(fixture.isarCollection.getSize()).thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).getSize(); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'getSize', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing importJson adds error breadcrumb', () async { + when(fixture.isarCollection.importJson(any)).thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).importJson([]); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'importJson', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing importJsonRaw adds error breadcrumb', () async { + when(fixture.isarCollection.importJsonRaw(any)) + .thenThrow(fixture.exception); + try { + await fixture + .getSut(injectMock: true) + .importJsonRaw(Uint8List.fromList([])); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'importJsonRaw', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing put adds error breadcrumb', () async { + when(fixture.isarCollection.put(any)).thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).put(Person()); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'put', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing putAll adds error breadcrumb', () async { + when(fixture.isarCollection.putAll(any)).thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).putAll([Person()]); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'putAll', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing putAllByIndex adds error breadcrumb', () async { + when(fixture.isarCollection.putAllByIndex(any, any)) + .thenThrow(fixture.exception); + try { + await fixture + .getSut(injectMock: true) + .putAllByIndex('name', [Person()]); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'putAllByIndex', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing putByIndex adds error breadcrumb', () async { + when(fixture.isarCollection.putByIndex(any, any)) + .thenThrow(fixture.exception); + try { + await fixture.getSut(injectMock: true).putByIndex('name', Person()); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'putByIndex', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + }); +} + +class Fixture { + final options = SentryOptions(); + final hub = MockHub(); + final isarCollection = MockIsarCollection(); + + static final dbName = 'people-isar'; + static final dbCollection = 'Person'; + final exception = Exception('fixture-exception'); + + final _context = SentryTransactionContext('name', 'operation'); + late final tracer = SentryTracer(_context, hub); + late Isar sentryIsar; + late final scope = Scope(options); + + Future setUp() async { + // Make sure to use flutter test -j 1 to avoid tests running in parallel. This would break the automatic download. + await Isar.initializeIsarCore(download: true); + sentryIsar = await SentryIsar.open( + [PersonSchema], + directory: Directory.systemTemp.path, + name: dbName, + hub: hub, + ); + } + + Future tearDown() async { + try { + // ignore: invalid_use_of_protected_member + sentryIsar.requireOpen(); + await sentryIsar.close(); + } catch (_) { + // Don't close multiple times + } + } + + IsarCollection getSut({bool injectMock = false}) { + if (injectMock) { + return SentryIsarCollection(isarCollection, hub, sentryIsar.name); + } else { + return sentryIsar.collection(); + } + } + + SentrySpan? getCreatedSpan() { + return tracer.children.last; + } + + Breadcrumb? getCreatedBreadcrumb() { + return hub.scope.breadcrumbs.last; + } +} diff --git a/isar/test/sentry_isar_test.dart b/isar/test/sentry_isar_test.dart new file mode 100644 index 0000000000..222226fa53 --- /dev/null +++ b/isar/test/sentry_isar_test.dart @@ -0,0 +1,476 @@ +@TestOn('vm') + +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:isar/isar.dart'; +import 'package:mockito/mockito.dart'; +import 'package:sentry/sentry.dart'; +import 'package:sentry_isar/src/sentry_isar.dart'; + +import 'package:sentry/src/sentry_tracer.dart'; +import 'package:sentry_isar/src/version.dart'; + +import 'mocks/mocks.mocks.dart'; +import 'person.dart'; + +void main() { + void verifySpan(String description, SentrySpan? span) { + expect(span?.context.operation, SentryIsar.dbOp); + expect(span?.context.description, description); + expect(span?.status, SpanStatus.ok()); + // ignore: invalid_use_of_internal_member + expect(span?.origin, SentryTraceOrigins.autoDbIsar); + expect(span?.data[SentryIsar.dbNameKey], Fixture.dbName); + } + + void verifyErrorSpan(String description, SentrySpan? span, Exception error) { + expect(span?.context.operation, SentryIsar.dbOp); + expect(span?.context.description, description); + expect(span?.status, SpanStatus.internalError()); + // ignore: invalid_use_of_internal_member + expect(span?.origin, SentryTraceOrigins.autoDbIsar); + expect(span?.throwable, error); + } + + void verifyBreadcrumb( + String message, + Breadcrumb? crumb, { + String status = 'ok', + }) { + expect( + crumb?.message, + message, + ); + expect(crumb?.type, 'query'); + expect(crumb?.data?[SentryIsar.dbNameKey], Fixture.dbName); + expect(crumb?.data?['status'], status); + if (status != 'ok') { + expect(crumb?.level, SentryLevel.warning); + } + } + + group('add spans', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.hub.scope).thenReturn(fixture.scope); + + await fixture.setUp(); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('open adds span', () async { + final span = fixture.getCreatedSpan(); + verifySpan('open', span); + }); + + test('clear adds span', () async { + await fixture.sut.writeTxn(() async { + await fixture.sut.clear(); + }); + final span = fixture.getCreatedSpan(); + verifySpan('clear', span); + }); + + test('close adds span', () async { + await fixture.sut.close(); + final span = fixture.getCreatedSpan(); + verifySpan('close', span); + }); + + test('copyToFile adds span', () async { + await fixture.sut.copyToFile(fixture.copyPath); + final span = fixture.getCreatedSpan(); + verifySpan('copyToFile', span); + }); + + test('getSize adds span', () async { + await fixture.sut.getSize(); + final span = fixture.getCreatedSpan(); + verifySpan('getSize', span); + }); + + test('txn adds span', () async { + await fixture.sut.txn(() async {}); + final span = fixture.getCreatedSpan(); + verifySpan('txn', span); + }); + + test('writeTxn adds span', () async { + await fixture.sut.writeTxn(() async {}); + final span = fixture.getCreatedSpan(); + verifySpan('writeTxn', span); + }); + }); + + group('add error spans', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.hub.scope).thenReturn(fixture.scope); + + when(fixture.isar.close()).thenAnswer((_) async { + return true; + }); + when(fixture.isar.name).thenReturn(Fixture.dbName); + + await fixture.setUp(injectMock: true); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('throwing close adds error span', () async { + when(fixture.isar.close()).thenThrow(fixture.exception); + try { + await fixture.sut.close(); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan('close', fixture.getCreatedSpan(), fixture.exception); + }); + + test('throwing clear adds error span', () async { + when(fixture.isar.clear()).thenThrow(fixture.exception); + try { + await fixture.sut.clear(); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan('clear', fixture.getCreatedSpan(), fixture.exception); + }); + + test('throwing copyToFile adds error span', () async { + when(fixture.isar.copyToFile(any)).thenThrow(fixture.exception); + try { + await fixture.sut.copyToFile(fixture.copyPath); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan( + 'copyToFile', + fixture.getCreatedSpan(), + fixture.exception, + ); + }); + + test('throwing getSize adds error span', () async { + when(fixture.isar.getSize()).thenThrow(fixture.exception); + try { + await fixture.sut.getSize(); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan('getSize', fixture.getCreatedSpan(), fixture.exception); + }); + + test('throwing txn adds error span', () async { + param() async {} + when(fixture.isar.txn(param)).thenThrow(fixture.exception); + try { + await fixture.sut.txn(param); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan('txn', fixture.getCreatedSpan(), fixture.exception); + }); + + test('throwing writeTxn adds error span', () async { + param() async {} + when(fixture.isar.writeTxn(param)).thenThrow(fixture.exception); + try { + await fixture.sut.writeTxn(param); + } catch (error) { + expect(error, fixture.exception); + } + verifyErrorSpan('writeTxn', fixture.getCreatedSpan(), fixture.exception); + }); + }); + + group('adds breadcrumbs', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.hub.scope).thenReturn(fixture.scope); + + await fixture.setUp(); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('open adds breadcrumb', () async { + final breadcrumb = fixture.getCreatedBreadcrumb(); + verifyBreadcrumb('open', breadcrumb); + }); + + test('clear adds breadcrumb', () async { + await fixture.sut.writeTxn(() async { + await fixture.sut.clear(); + }); + + // order: open, clear, writeTxn + + final openCrumb = fixture.hub.scope.breadcrumbs[0]; + verifyBreadcrumb('open', openCrumb); + + final clearCrumb = fixture.hub.scope.breadcrumbs[1]; + verifyBreadcrumb('clear', clearCrumb); + + final writeTxnCrumb = fixture.hub.scope.breadcrumbs[2]; + verifyBreadcrumb('writeTxn', writeTxnCrumb); + }); + + test('close adds breadcrumb', () async { + await fixture.sut.close(); + final breadcrumb = fixture.getCreatedBreadcrumb(); + verifyBreadcrumb('close', breadcrumb); + }); + + test('copyToFile adds breadcrumb', () async { + await fixture.sut.copyToFile(fixture.copyPath); + final breadcrumb = fixture.getCreatedBreadcrumb(); + verifyBreadcrumb('copyToFile', breadcrumb); + }); + + test('getSize adds breadcrumb', () async { + await fixture.sut.getSize(); + final breadcrumb = fixture.getCreatedBreadcrumb(); + verifyBreadcrumb('getSize', breadcrumb); + }); + + test('txn adds breadcrumb', () async { + await fixture.sut.txn(() async {}); + final breadcrumb = fixture.getCreatedBreadcrumb(); + verifyBreadcrumb('txn', breadcrumb); + }); + + test('writeTxn adds breadcrumb', () async { + await fixture.sut.writeTxn(() async {}); + final breadcrumb = fixture.getCreatedBreadcrumb(); + verifyBreadcrumb('writeTxn', breadcrumb); + }); + }); + + group('add error breadcrumbs', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.hub.scope).thenReturn(fixture.scope); + + when(fixture.isar.close()).thenAnswer((_) async { + return true; + }); + when(fixture.isar.name).thenReturn(Fixture.dbName); + + await fixture.setUp(injectMock: true); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('throwing close adds error breadcrumb', () async { + when(fixture.isar.close()).thenThrow(fixture.exception); + try { + await fixture.sut.close(); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'close', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing clear adds error breadcrumb', () async { + when(fixture.isar.clear()).thenThrow(fixture.exception); + try { + await fixture.sut.clear(); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'clear', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing copyToFile adds error breadcrumb', () async { + when(fixture.isar.copyToFile(any)).thenThrow(fixture.exception); + try { + await fixture.sut.copyToFile(fixture.copyPath); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'copyToFile', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing getSize adds error breadcrumb', () async { + when(fixture.isar.getSize()).thenThrow(fixture.exception); + try { + await fixture.sut.getSize(); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'getSize', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing txn adds error breadcrumb', () async { + param() async {} + when(fixture.isar.txn(param)).thenThrow(fixture.exception); + try { + await fixture.sut.txn(param); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'txn', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + + test('throwing writeTxn adds error breadcrumb', () async { + param() async {} + when(fixture.isar.writeTxn(param)).thenThrow(fixture.exception); + try { + await fixture.sut.writeTxn(param); + } catch (error) { + expect(error, fixture.exception); + } + verifyBreadcrumb( + 'writeTxn', + fixture.getCreatedBreadcrumb(), + status: 'internal_error', + ); + }); + }); + + group('integrations', () { + late Fixture fixture; + + setUp(() async { + fixture = Fixture(); + + when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.getSpan()).thenReturn(fixture.tracer); + when(fixture.hub.scope).thenReturn(fixture.scope); + + await fixture.setUp(); + }); + + tearDown(() async { + await fixture.tearDown(); + }); + + test('adds integration', () { + expect( + fixture.options.sdk.integrations.contains('SentryIsarTracing'), + true, + ); + }); + + test('adds package', () { + expect( + fixture.options.sdk.packages.any( + (element) => + element.name == packageName && element.version == sdkVersion, + ), + true, + ); + }); + }); +} + +class Fixture { + final options = SentryOptions(); + final hub = MockHub(); + final isar = MockIsar(); + + static final dbName = 'people-isar'; + final exception = Exception('fixture-exception'); + final copyPath = '${Directory.systemTemp.path}/copy'; + + final _context = SentryTransactionContext('name', 'operation'); + late final tracer = SentryTracer(_context, hub); + late Isar sut; + late final scope = Scope(options); + + Future setUp({bool injectMock = false}) async { + if (injectMock) { + sut = SentryIsar(isar, hub); + } else { + // Make sure to use flutter test -j 1 to avoid tests running in parallel. This would break the automatic download. + await Isar.initializeIsarCore(download: true); + sut = await SentryIsar.open( + [PersonSchema], + directory: Directory.systemTemp.path, + name: dbName, + hub: hub, + ); + } + await deleteCopyPath(); + } + + Future tearDown() async { + try { + // ignore: invalid_use_of_protected_member + sut.requireOpen(); + await sut.close(); + } catch (_) { + // Don't close multiple times + } + } + + Isar getSut() { + return sut; + } + + SentrySpan? getCreatedSpan() { + return tracer.children.last; + } + + Breadcrumb? getCreatedBreadcrumb() { + return hub.scope.breadcrumbs.last; + } + + Future deleteCopyPath() async { + final file = File(copyPath); + if (await file.exists()) { + await file.delete(recursive: true); + } + } +} diff --git a/logging/README.md b/logging/README.md index 0b4b4fcfef..488ebb8adf 100644 --- a/logging/README.md +++ b/logging/README.md @@ -43,8 +43,9 @@ void initApp() { #### Resources -* [![Documentation](https://img.shields.io/badge/documentation-sentry.io-green.svg)](https://docs.sentry.io/platforms/dart/) -* [![Forum](https://img.shields.io/badge/forum-sentry-green.svg)](https://forum.sentry.io/c/sdks) -* [![Discord](https://img.shields.io/discord/621778831602221064)](https://discord.gg/Ww9hbqr) +* [![Flutter docs](https://img.shields.io/badge/documentation-sentry.io-green.svg?label=flutter%20docs)](https://docs.sentry.io/platforms/flutter/) +* [![Dart docs](https://img.shields.io/badge/documentation-sentry.io-green.svg?label=dart%20docs)](https://docs.sentry.io/platforms/dart/) +* [![Discussions](https://img.shields.io/github/discussions/getsentry/sentry-dart.svg)](https://github.com/getsentry/sentry-dart/discussions) +* [![Discord Chat](https://img.shields.io/discord/621778831602221064?logo=discord&logoColor=ffffff&color=7389D8)](https://discord.gg/PXa5Apfe7K) * [![Stack Overflow](https://img.shields.io/badge/stack%20overflow-sentry-green.svg)](https://stackoverflow.com/questions/tagged/sentry) -* [![Twitter Follow](https://img.shields.io/twitter/follow/getsentry?label=getsentry&style=social)](https://twitter.com/intent/follow?screen_name=getsentry) +* [![Twitter Follow](https://img.shields.io/twitter/follow/getsentry?label=getsentry&style=social)](https://twitter.com/intent/follow?screen_name=getsentry) \ No newline at end of file diff --git a/logging/class-diagram.svg b/logging/class-diagram.svg new file mode 100644 index 0000000000..327f533953 --- /dev/null +++ b/logging/class-diagram.svg @@ -0,0 +1,69 @@ + + + + + + + + +cluster~ + +logging + + +cluster~/lib + +lib + + +cluster~/lib/src + +src + + + +/lib/src/version.dart + +version + + + +/lib/src/logging_integration.dart + +logging_integration + + + +/lib/src/logging_integration.dart->/lib/src/version.dart + + + + + +/lib/src/extension.dart + +extension + + + +/lib/src/logging_integration.dart->/lib/src/extension.dart + + + + + +/lib/sentry_logging.dart + +sentry_logging + + + +/lib/sentry_logging.dart->/lib/src/logging_integration.dart + + + + + diff --git a/logging/example/sentry_logging_example.dart b/logging/example/sentry_logging_example.dart index 408c40d799..d7b1713e44 100644 --- a/logging/example/sentry_logging_example.dart +++ b/logging/example/sentry_logging_example.dart @@ -20,7 +20,7 @@ Future main() async { Future runApp() async { final log = Logger('MyAwesomeLogger'); - log.warning('a warning!'); + log.warning('this is a warning!'); try { throw Exception(); diff --git a/logging/lib/src/version.dart b/logging/lib/src/version.dart index 3905a5c4dc..47dc6b25a2 100644 --- a/logging/lib/src/version.dart +++ b/logging/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '7.9.0'; +const String sdkVersion = '7.16.0'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_logging'; diff --git a/logging/pubspec.yaml b/logging/pubspec.yaml index b964b9d9fd..97e888064b 100644 --- a/logging/pubspec.yaml +++ b/logging/pubspec.yaml @@ -1,20 +1,20 @@ name: sentry_logging description: An integration which adds support for recording log from the logging package. -version: 7.9.0 +version: 7.16.0 homepage: https://docs.sentry.io/platforms/dart/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues -documentation: https://docs.sentry.io/platforms/dart/configuration/integrations/logging/ +documentation: https://docs.sentry.io/platforms/dart/integrations/logging/ environment: sdk: '>=2.17.0 <4.0.0' dependencies: logging: ^1.0.0 - sentry: 7.9.0 + sentry: 7.16.0 dev_dependencies: - lints: ^2.0.0 + lints: ^3.0.0 test: ^1.21.1 yaml: ^3.1.0 # needed for version match (code and pubspec) coverage: ^1.3.0 diff --git a/metrics/flutter.properties b/metrics/flutter.properties index 12a11ee1de..5b903acb68 100644 --- a/metrics/flutter.properties +++ b/metrics/flutter.properties @@ -1,2 +1,2 @@ -version = 3.10.3 +version = 3.16.9 repo = https://github.com/flutter/flutter diff --git a/scripts/bump-version.sh b/scripts/bump-version.sh index 30ddf659dd..dedd3e1b66 100755 --- a/scripts/bump-version.sh +++ b/scripts/bump-version.sh @@ -10,7 +10,7 @@ NEW_VERSION="${2}" echo "Current version: ${OLD_VERSION}" echo "Bumping version: ${NEW_VERSION}" -for pkg in {dart,flutter,logging,dio,file,sqflite}; do +for pkg in {dart,flutter,logging,dio,file,sqflite,drift,hive,isar}; do # Bump version in pubspec.yaml perl -pi -e "s/^version: .*/version: $NEW_VERSION/" $pkg/pubspec.yaml # Bump sentry dependency version in pubspec.yaml diff --git a/scripts/commit-formatted-code.sh b/scripts/commit-code.sh similarity index 67% rename from scripts/commit-formatted-code.sh rename to scripts/commit-code.sh index 8f77921ceb..b3c1ad9914 100755 --- a/scripts/commit-formatted-code.sh +++ b/scripts/commit-code.sh @@ -2,15 +2,16 @@ set -euo pipefail GITHUB_BRANCH="${1}" +COMMIT_MESSAGE="${2}" if [[ $(git status) == *"nothing to commit"* ]]; then - echo "Nothing to commit. All code formatted correctly." + echo "Nothing to commit." else - echo "Formatted some code. Going to push the changes." + echo "Changed some code. Going to push the changes." git config --global user.name 'Sentry Github Bot' git config --global user.email 'bot+github-bot@sentry.io' git fetch git checkout ${GITHUB_BRANCH} - git commit -am "Format & fix code" + git commit -am "${COMMIT_MESSAGE}" git push --set-upstream origin ${GITHUB_BRANCH} fi diff --git a/scripts/flutter_symbol_collector/.gitignore b/scripts/flutter_symbol_collector/.gitignore new file mode 100644 index 0000000000..d0e14b73aa --- /dev/null +++ b/scripts/flutter_symbol_collector/.gitignore @@ -0,0 +1,6 @@ +# https://dart.dev/guides/libraries/private-files +# Created by `dart pub` +.dart_tool/ + +.temp +.cache diff --git a/scripts/flutter_symbol_collector/README.md b/scripts/flutter_symbol_collector/README.md new file mode 100644 index 0000000000..55c60bca27 --- /dev/null +++ b/scripts/flutter_symbol_collector/README.md @@ -0,0 +1,4 @@ +# Flutter symbol collector + +This is an internal tool to collect Flutter debug symbols and upload them to Sentry. +This application is not intended for public usage - we're uploading the symbols in CI automatically so you don't have to. diff --git a/scripts/flutter_symbol_collector/analysis_options.yaml b/scripts/flutter_symbol_collector/analysis_options.yaml new file mode 100644 index 0000000000..9fe3182f8d --- /dev/null +++ b/scripts/flutter_symbol_collector/analysis_options.yaml @@ -0,0 +1,7 @@ +include: package:lints/recommended.yaml + +linter: + rules: + prefer_relative_imports: true + unnecessary_brace_in_string_interps: true + unawaited_futures: true diff --git a/scripts/flutter_symbol_collector/bin/flutter_symbol_collector.dart b/scripts/flutter_symbol_collector/bin/flutter_symbol_collector.dart new file mode 100644 index 0000000000..424134eea7 --- /dev/null +++ b/scripts/flutter_symbol_collector/bin/flutter_symbol_collector.dart @@ -0,0 +1,96 @@ +import 'package:args/args.dart'; +import 'package:file/local.dart'; +import 'package:flutter_symbol_collector/flutter_symbol_collector.dart'; +import 'package:github/github.dart'; +import 'package:logging/logging.dart'; + +const githubToken = String.fromEnvironment('GITHUB_TOKEN'); +final githubAuth = githubToken.isEmpty + ? Authentication.anonymous() + : Authentication.withToken(githubToken); +final source = FlutterSymbolSource(githubAuth: githubAuth); +final fs = LocalFileSystem(); +final tempDir = fs.currentDirectory.childDirectory('.temp'); +final stateCache = + DirectoryStatusCache(fs.currentDirectory.childDirectory('.cache')); +late final SymbolCollectorCli collector; + +void main(List arguments) async { + Logger.root.level = Level.ALL; + Logger.root.onRecord.listen((record) { + print('${record.level.name}: ${record.time}: ${record.message}' + '${record.error == null ? '' : ': ${record.error}'}'); + }); + + final parser = ArgParser()..addOption('version', defaultsTo: ''); + final args = parser.parse(arguments); + final argVersion = args['version'] as String; + + collector = await SymbolCollectorCli.setup(tempDir); + + // If a specific version was given, run just for this version. + if (argVersion.isNotEmpty && + !argVersion.contains('*') && + argVersion.split('.').length == 3) { + Logger.root.info('Running for a single flutter version: $argVersion'); + await processFlutterVersion(FlutterVersion(argVersion)); + } else { + // Otherwise, walk all the versions and run for the matching ones. + final versionRegex = RegExp(argVersion.isEmpty + ? '.*' + : '^${argVersion.replaceAll('.', '\\.').replaceAll('*', '.+')}\$'); + Logger.root.info('Running for all Flutter versions matching $versionRegex'); + final versions = await source + .listFlutterVersions() + .where((v) => !v.isPreRelease) + .where((v) => versionRegex.hasMatch(v.tagName)) + .toList(); + Logger.root.info( + 'Found ${versions.length} Flutter versions matching $versionRegex'); + for (var version in versions) { + await processFlutterVersion(version); + } + } +} + +Future processFlutterVersion(FlutterVersion version) async { + if (bool.hasEnvironment('CI')) { + print('::group::Processing Flutter ${version.tagName}'); + } + Logger.root.info('Processing Flutter ${version.tagName}'); + Logger.root.info('Engine version: ${await version.engineVersion}'); + + final archives = await source.listSymbolArchives(version); + final dir = tempDir.childDirectory(version.tagName); + for (final archive in archives) { + final status = await stateCache.getStatus(archive); + if (status == SymbolArchiveStatus.success) { + Logger.root + .info('Skipping ${archive.path} - already processed successfully'); + continue; + } + + final archiveDir = dir.childDirectory(archive.platform.operatingSystem); + try { + if (await source.downloadAndExtractTo(archiveDir, archive.path)) { + if (await collector.upload(archiveDir, archive.platform, version)) { + await stateCache.setStatus(archive, SymbolArchiveStatus.success); + continue; + } + } + await stateCache.setStatus(archive, SymbolArchiveStatus.error); + } finally { + if (await archiveDir.exists()) { + await archiveDir.delete(recursive: true); + } + } + } + + if (await dir.exists()) { + await dir.delete(recursive: true); + } + + if (bool.hasEnvironment('CI')) { + print('::endgroup::'); + } +} diff --git a/scripts/flutter_symbol_collector/lib/flutter_symbol_collector.dart b/scripts/flutter_symbol_collector/lib/flutter_symbol_collector.dart new file mode 100644 index 0000000000..a972b43f75 --- /dev/null +++ b/scripts/flutter_symbol_collector/lib/flutter_symbol_collector.dart @@ -0,0 +1,5 @@ +export 'src/flutter_symbol_source.dart'; +export 'src/flutter_version.dart'; +export 'src/symbol_collector_cli.dart'; +export 'src/status_cache.dart'; +export 'src/symbol_archive.dart'; diff --git a/scripts/flutter_symbol_collector/lib/src/flutter_symbol_resolver.dart b/scripts/flutter_symbol_collector/lib/src/flutter_symbol_resolver.dart new file mode 100644 index 0000000000..93d9b7e02f --- /dev/null +++ b/scripts/flutter_symbol_collector/lib/src/flutter_symbol_resolver.dart @@ -0,0 +1,73 @@ +import 'package:gcloud/storage.dart'; +import 'package:platform/platform.dart'; + +import 'symbol_archive.dart'; + +abstract class FlutterSymbolResolver { + final String _prefix; + final Bucket _bucket; + final _resolvedFiles = List.empty(growable: true); + Platform get platform; + + FlutterSymbolResolver(this._bucket, String prefix) + : _prefix = prefix.endsWith('/') + ? prefix.substring(0, prefix.length - 1) + : prefix; + + Future tryResolve(String path) async { + path = '$_prefix/$path'; + final matches = await _bucket + .list(prefix: path) + .where((v) => v.isObject) + .where((v) => v.name == path) // because it's a prefix search + .map((v) => v.name) + .toList(); + if (matches.isNotEmpty) { + _resolvedFiles.add(SymbolArchive(matches.single, platform)); + } + } + + Future> listArchives(); +} + +class IosSymbolResolver extends FlutterSymbolResolver { + IosSymbolResolver(super.bucket, super.prefix); + + @override + final platform = FakePlatform(operatingSystem: Platform.iOS); + + @override + Future> listArchives() async { + await tryResolve('ios-release/Flutter.dSYM.zip'); + return _resolvedFiles; + } +} + +class MacOSSymbolResolver extends FlutterSymbolResolver { + MacOSSymbolResolver(super.bucket, super.prefix); + + @override + final platform = FakePlatform(operatingSystem: Platform.macOS); + + @override + Future> listArchives() async { + // darwin-x64-release directory contains a fat (arm64+x86_64) binary. + await tryResolve('darwin-x64-release/FlutterMacOS.dSYM.zip'); + return _resolvedFiles; + } +} + +class AndroidSymbolResolver extends FlutterSymbolResolver { + final String architecture; + + AndroidSymbolResolver(super.bucket, super.prefix, this.architecture); + + @override + final platform = FakePlatform(operatingSystem: Platform.android); + + @override + Future> listArchives() async { + await tryResolve('android-$architecture-release/symbols.zip'); + return _resolvedFiles; + } +} diff --git a/scripts/flutter_symbol_collector/lib/src/flutter_symbol_source.dart b/scripts/flutter_symbol_collector/lib/src/flutter_symbol_source.dart new file mode 100644 index 0000000000..aca3a1e187 --- /dev/null +++ b/scripts/flutter_symbol_collector/lib/src/flutter_symbol_source.dart @@ -0,0 +1,156 @@ +import 'dart:typed_data'; + +import 'package:archive/archive.dart'; +import 'package:archive/archive_io.dart'; +import 'package:file/file.dart'; +import 'package:github/github.dart' as github; +import 'package:gcloud/storage.dart'; +import 'package:http/http.dart'; +import 'package:logging/logging.dart'; +import 'package:path/path.dart' as path; + +import 'flutter_version.dart'; +import 'flutter_symbol_resolver.dart'; +import 'symbol_archive.dart'; + +class FlutterSymbolSource { + late final Logger _log; + final github.GitHub _github; + late final _flutterRepo = github.RepositorySlug('flutter', 'flutter'); + late final _symbolsBucket = + Storage(Client(), '').bucket('flutter_infra_release'); + + FlutterSymbolSource( + {Logger? logger, + github.Authentication githubAuth = + const github.Authentication.anonymous()}) + : _log = logger ?? Logger.root, + _github = github.GitHub(auth: githubAuth); + + Stream listFlutterVersions() => _github.repositories + .listTags(_flutterRepo, perPage: 30) + .map((t) => FlutterVersion(t.name)); + + /// Returns false as the first record value in case there was any error fetching the symbol archives. + Future> listSymbolArchives(FlutterVersion version) async { + // example: https://console.cloud.google.com/storage/browser/flutter_infra_release/flutter/9064459a8b0dcd32877107f6002cc429a71659d1 + final prefix = 'flutter/${await version.engineVersion}/'; + + late final List resolvers; + if (version.tagName.startsWith('3.')) { + resolvers = [ + IosSymbolResolver(_symbolsBucket, prefix), + MacOSSymbolResolver(_symbolsBucket, prefix), + AndroidSymbolResolver(_symbolsBucket, prefix, 'arm'), + AndroidSymbolResolver(_symbolsBucket, prefix, 'arm64') + ]; + } else { + _log.warning('No symbol resolvers registered for ${version.tagName}'); + return []; + } + + assert(resolvers.isNotEmpty); + final archives = List.empty(growable: true); + for (var resolver in resolvers) { + final files = await resolver.listArchives(); + if (files.isEmpty) { + _log.warning( + 'Flutter ${version.tagName}: no debug symbols found by ${resolver.runtimeType}'); + } else { + _log.fine( + 'Flutter ${version.tagName}: ${resolver.runtimeType} found ${files.length} debug symbols: ${files.map((v) => path.basename(v.path))}'); + archives.addAll(files); + } + } + + return archives; + } + + /// Streams the remote file contents. + Stream> download(String filePath) { + _log.fine('Downloading $filePath'); + return _symbolsBucket.read(filePath); + } + + /// Downloads the remote [filePath] to the given [target] directory. + /// If it's an archive, extracts the content instead. + /// returns `true` if the file was downloaded and extracted successfully. + Future downloadAndExtractTo(Directory target, String filePath) async { + if (path.extension(filePath) == '.zip') { + target = await target + .childDirectory(path.withoutExtension(filePath)) + .create(recursive: true); + try { + final buffer = BytesBuilder(); + await download(filePath).forEach(buffer.add); + final archive = ZipDecoder().decodeBytes(buffer.toBytes()); + buffer.clear(); + _log.fine('Extracting $filePath to $target'); + await _extractZip(target, archive); + } catch (e, trace) { + _log.warning('Failed to download $filePath to $target', e, trace); + // Remove the directory so that we don't leave a partial extraction. + await target.delete(recursive: true); + return false; + } + } else { + _log.fine('Downloading $filePath to $target'); + final file = await target + .childFile(filePath) + .create(recursive: true, exclusive: true); + final sink = file.openWrite(); + try { + await sink.addStream(download(filePath)); + await sink.flush(); + await sink.close(); + } catch (e, trace) { + _log.warning('Failed to download $filePath to $target', e, trace); + await sink.close(); + await file.delete(); + return false; + } + } + return true; + } + + Future _extractZip(Directory target, Archive archive) async { + for (var entry in archive.files) { + // Make sure we don't have any zip-slip issues. + final entryPath = _pathNormalize(entry.name); + if (!_pathNormalize(target.childFile(entryPath).path) + .startsWith(target.path)) { + throw Exception( + 'Invalid ZIP entry path (looks like a zip-slip issue): ${entry.name}'); + } + + if (!entry.isFile) { + // If it's a directory - create it. + await target.childDirectory(entryPath).create(recursive: true); + } else { + // Note: package:archive doesn't support extracting directly to an + // IOSink. See https://github.com/brendan-duncan/archive/issues/12 + final stream = OutputStream(); + entry.writeContent(stream, freeMemory: true); + stream.flush(); + + // If it's an inner ZIP archive - extract it recursively. + if (path.extension(entryPath) == '.zip') { + final innerArchive = ZipDecoder().decodeBytes(stream.getBytes()); + stream.clear(); + final innerTarget = + target.childDirectory(path.withoutExtension(entryPath)); + _log.fine('Extracting inner archive $entryPath to $innerTarget'); + await _extractZip(innerTarget, innerArchive); + } else { + final file = + await target.childFile(entryPath).create(exclusive: true); + _log.finer('Writing $file: ${stream.length} bytes'); + await file.writeAsBytes(stream.getBytes(), flush: true); + } + } + } + } + + String _pathNormalize(String p) => + path.normalize(p).replaceAll(path.separator, '/'); +} diff --git a/scripts/flutter_symbol_collector/lib/src/flutter_version.dart b/scripts/flutter_symbol_collector/lib/src/flutter_version.dart new file mode 100644 index 0000000000..6461a4c1fe --- /dev/null +++ b/scripts/flutter_symbol_collector/lib/src/flutter_version.dart @@ -0,0 +1,16 @@ +import 'package:http/http.dart' as http; +import 'package:meta/meta.dart'; + +@immutable +class FlutterVersion { + final String tagName; + + late final engineVersion = http + .get(Uri.https('raw.githubusercontent.com', + 'flutter/flutter/$tagName/bin/internal/engine.version')) + .then((value) => value.body.trim()); + + FlutterVersion(this.tagName); + + bool get isPreRelease => tagName.endsWith('.pre'); +} diff --git a/scripts/flutter_symbol_collector/lib/src/status_cache.dart b/scripts/flutter_symbol_collector/lib/src/status_cache.dart new file mode 100644 index 0000000000..6c456b73c8 --- /dev/null +++ b/scripts/flutter_symbol_collector/lib/src/status_cache.dart @@ -0,0 +1,61 @@ +import 'package:file/file.dart'; +import 'package:logging/logging.dart'; + +import 'symbol_archive.dart'; + +enum SymbolArchiveStatus { + /// The archive has been successfully processed. + success, + + /// The archive has been processed but there was an error. + error, + + /// The archive hasn't been processed yet + pending, +} + +/// Stores and retrieves information about symbol processing status. +abstract class SymbolArchiveStatusCache { + Future setStatus(SymbolArchive archive, SymbolArchiveStatus status); + Future getStatus(SymbolArchive archive); +} + +/// Stores information about symbol processing status in a local directory. +class DirectoryStatusCache implements SymbolArchiveStatusCache { + final Directory _dir; + + DirectoryStatusCache(this._dir) { + _dir.createSync(recursive: true); + } + + File _statusFile(SymbolArchive archive) => + _dir.childFile('${archive.path.toLowerCase()}.status'); + + @override + Future getStatus(SymbolArchive archive) async { + final file = _statusFile(archive); + if (!await file.exists()) { + return SymbolArchiveStatus.pending; + } + return file.readAsString().then((value) { + switch (value) { + case 'success': + return SymbolArchiveStatus.success; + case 'error': + return SymbolArchiveStatus.error; + default: + Logger.root.warning('Unknown status \'$value\' in $file'); + return SymbolArchiveStatus.error; + } + }); + } + + @override + Future setStatus( + SymbolArchive archive, SymbolArchiveStatus status) async { + final file = _statusFile(archive); + Logger.root.info('Setting ${file.path} status to ${status.name}'); + await file.create(recursive: true); + await file.writeAsString(status.name); + } +} diff --git a/scripts/flutter_symbol_collector/lib/src/symbol_archive.dart b/scripts/flutter_symbol_collector/lib/src/symbol_archive.dart new file mode 100644 index 0000000000..f4681e44be --- /dev/null +++ b/scripts/flutter_symbol_collector/lib/src/symbol_archive.dart @@ -0,0 +1,10 @@ +import 'package:platform/platform.dart'; +import 'package:meta/meta.dart'; + +@immutable +class SymbolArchive { + final String path; + final Platform platform; + + SymbolArchive(this.path, this.platform); +} diff --git a/scripts/flutter_symbol_collector/lib/src/symbol_collector_cli.dart b/scripts/flutter_symbol_collector/lib/src/symbol_collector_cli.dart new file mode 100644 index 0000000000..1d4e29a66a --- /dev/null +++ b/scripts/flutter_symbol_collector/lib/src/symbol_collector_cli.dart @@ -0,0 +1,147 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:archive/archive.dart'; +import 'package:archive/archive_io.dart'; +import 'package:file/file.dart'; +import 'package:http/http.dart' as http; +import 'package:logging/logging.dart'; +import 'package:meta/meta.dart'; +import 'package:platform/platform.dart'; +import 'package:posix/posix.dart' as posix; +import 'package:path/path.dart' as path; + +import 'flutter_version.dart'; + +class SymbolCollectorCli { + late final Logger _log = Logger.root; + late bool _isExecutable; + + // https://github.com/getsentry/symbol-collector/releases + @internal + static const version = '1.14.0'; + + @internal + late final String cli; + + @internal + static Platform platform = LocalPlatform(); + + SymbolCollectorCli._(); + + // Downloads the CLI to the given temporary directory and prepares it for use. + static Future setup(Directory tempDir) async { + late final String platformIdentifier; + final executableName = 'symbol-collector'; + + if (platform.isLinux) { + platformIdentifier = 'linux-x64'; + } else if (platform.isMacOS) { + platformIdentifier = 'osx-x64'; + } else { + throw UnsupportedError( + 'Cannot run symbol-collector CLI on this platform - there\'s no binary available at this time.'); + } + + final self = SymbolCollectorCli._(); + + self._log.fine( + 'Downloading symbol-collector CLI v$version for $platformIdentifier'); + final zipData = await http.readBytes(Uri.parse( + 'https://github.com/getsentry/symbol-collector/releases/download/$version/symbolcollector-console-$platformIdentifier.zip')); + self._log.fine( + 'Download successful, received ${zipData.length} bytes; extracting the archive'); + + final archive = ZipDecoder().decodeBytes(zipData); + final stream = OutputStream(); + archive.single.writeContent(stream, freeMemory: true); + stream.flush(); + + await tempDir.create(); + final executableFile = await tempDir.childFile(executableName).create(); + self.cli = executableFile.path; + + await executableFile.writeAsBytes(stream.getBytes(), flush: true); + self._log.fine( + 'Symbol-collector CLI extracted to ${executableFile.path}: ${await executableFile.length()} bytes'); + self._isExecutable = platform.isWindows; + return self; + } + + void _ensureIsExecutable() { + if (!_isExecutable) { + if (LocalPlatform().operatingSystem == platform.operatingSystem) { + if (platform.isLinux || platform.isMacOS) { + _log.fine('Making Symbol-collector CLI executable (chmod +x)'); + + posix.chmod(cli, '0700'); + } + _isExecutable = true; + } else { + _log.warning( + 'Symbol-collector CLI has been run with a platform that is not the current OS platform.' + 'This should only be done in tests because we can\'t execute the downloaded program'); + } + } + } + + Future getVersion() => _execute(['--version', '-h']); + + Future upload( + Directory dir, Platform symbolsPlatform, FlutterVersion flutterVersion, + {bool dryRun = false}) async { + final type = symbolsPlatform.operatingSystem; + try { + await _execute([ + '--upload', + 'directory', + '--path', + dir.path, + '--batch-type', + type, + '--bundle-id', + 'flutter-${flutterVersion.tagName}-$type', + '--server-endpoint', + 'https://symbol-collector.services.sentry.io/', + ]); + } catch (e) { + _log.warning('Failed to upload symbols from ${dir.path}', e); + return false; + } + return true; + } + + Future _execute(List arguments) async { + _ensureIsExecutable(); + + _log.fine('Executing ${path.basename(cli)} ${arguments.join(' ')}'); + final process = await Process.start(cli, arguments); + + final output = StringBuffer(); + handleOutput(Level level, String message) { + message.trimRight().split('\n').forEach((s) => _log.log(level, ' $s')); + output.write(message); + } + + final pipes = [ + process.stdout + .transform(utf8.decoder) + .forEach((s) => handleOutput(Level.FINER, s)), + process.stderr + .transform(utf8.decoder) + .forEach((s) => handleOutput(Level.SEVERE, s)) + ]; + + final exitCode = await process.exitCode; + await Future.wait(pipes); + final strOutput = output.toString().trimRight(); + if (exitCode != 0) { + throw Exception('Symbol-collector CLI failed with exit code $exitCode.'); + } else if (strOutput.contains('Exception:')) { + // see https://github.com/getsentry/symbol-collector/issues/167 + throw Exception('Symbol-collector CLI failed with an exception.'); + } + + return strOutput; + } +} diff --git a/scripts/flutter_symbol_collector/pubspec.yaml b/scripts/flutter_symbol_collector/pubspec.yaml new file mode 100644 index 0000000000..0464e16e0d --- /dev/null +++ b/scripts/flutter_symbol_collector/pubspec.yaml @@ -0,0 +1,24 @@ +name: flutter_symbol_collector +description: Internal tool to collect Flutter debug symbols and upload them to Sentry +publish_to: none + +environment: + sdk: ^3.0.0 + +dependencies: + archive: ^3.4.6 + args: ^2.4.2 + file: ^7.0.0 + gcloud: ^0.8.11 + github: ^9.19.0 + http: ^1.1.0 + logging: ^1.2.0 + meta: ^1.11.0 + path: ^1.8.3 + platform: ^3.1.3 + posix: ^5.0.0 + + +dev_dependencies: + lints: ^2.0.0 + test: ^1.21.0 diff --git a/scripts/flutter_symbol_collector/test/common.dart b/scripts/flutter_symbol_collector/test/common.dart new file mode 100644 index 0000000000..22d1877435 --- /dev/null +++ b/scripts/flutter_symbol_collector/test/common.dart @@ -0,0 +1,9 @@ +import 'package:logging/logging.dart'; + +void setupLogging() { + Logger.root.level = Level.ALL; + Logger.root.onRecord.listen((record) { + print('${record.level.name}: ${record.time}: ${record.message}' + '${record.error == null ? '' : ': ${record.error}'}'); + }); +} diff --git a/scripts/flutter_symbol_collector/test/flutter_symbol_source_test.dart b/scripts/flutter_symbol_collector/test/flutter_symbol_source_test.dart new file mode 100644 index 0000000000..9153ac3128 --- /dev/null +++ b/scripts/flutter_symbol_collector/test/flutter_symbol_source_test.dart @@ -0,0 +1,81 @@ +import 'package:file/file.dart'; +import 'package:file/memory.dart'; +import 'package:flutter_symbol_collector/flutter_symbol_collector.dart'; +import 'package:test/test.dart'; + +import 'common.dart'; + +void main() { + setupLogging(); + late FileSystem fs; + late FlutterSymbolSource sut; + + setUp(() { + fs = MemoryFileSystem.test(); + sut = FlutterSymbolSource(); + }); + + test('listFlutterVersions() returns a stable list', () async { + final versions = await sut.listFlutterVersions().take(3).toList(); + expect(versions.map((v) => v.tagName), + equals(['v1.16.3', 'v1.16.2', 'v1.16.1'])); + }); + + test('listFlutterVersions() fetches items across multiple API page requests', + () async { + // the page size defaults to 30 at the moment, see listFlutterVersions() + final versions = await sut.listFlutterVersions().take(105).toList(); + expect(versions.length, equals(105)); + }); + + test('Engine versions match expected values', () async { + final versions = await sut.listFlutterVersions().take(3).toList(); + final engines = List.empty(growable: true); + for (var v in versions) { + engines.add("${v.tagName} => ${await v.engineVersion}"); + } + expect( + engines, + equals([ + 'v1.16.3 => b2bdeb3f0f1683f3e0562f491b5e316240dfbc2c', + 'v1.16.2 => 2d42c74a348d98d2fd372a91953c104e58f185cd', + 'v1.16.1 => 216c420a2c06e5266a60a768b3fd0b660551cc9c' + ])); + }); + + test('listSymbolArchives() supports expected platforms', () async { + final archives = await sut.listSymbolArchives(FlutterVersion('3.13.4')); + const prefix = 'flutter/9064459a8b0dcd32877107f6002cc429a71659d1'; + expect( + archives.map((v) => '${v.platform.operatingSystem} - ${v.path}'), + equals([ + 'ios - $prefix/ios-release/Flutter.dSYM.zip', + 'macos - $prefix/darwin-x64-release/FlutterMacOS.dSYM.zip', + 'android - flutter/9064459a8b0dcd32877107f6002cc429a71659d1/android-arm-release/symbols.zip', + 'android - flutter/9064459a8b0dcd32877107f6002cc429a71659d1/android-arm64-release/symbols.zip' + ])); + }); + + test('download() downloads the file', () async { + // No need to download a large archive, just some small file to test this. + final content = await sut + .download('test.txt') + .map(String.fromCharCodes) + .reduce((a, b) => '$a$b'); + expect(content, equals('test\n')); + }); + + test('downloadAndExtractTo() downloads a plain file', () async { + await sut.downloadAndExtractTo(fs.currentDirectory, 'test.txt'); + expect(fs.isFileSync('test.txt'), isTrue); + expect(fs.file('test.txt').readAsStringSync(), equals('test\n')); + }); + + test('downloadAndExtractTo() extracts a zip file', () async { + const path = 'flutter/0005149dca9b248663adcde4bdd7c6c915a76584'; + await sut.downloadAndExtractTo(fs.currentDirectory, '$path/sky_engine.zip'); + expect(fs.isDirectorySync('$path/sky_engine/sky_engine'), isTrue); + expect(fs.file('$path/sky_engine/sky_engine/README.md').readAsStringSync(), + startsWith('Flutter Engine')); + }); +} diff --git a/scripts/flutter_symbol_collector/test/flutter_version_test.dart b/scripts/flutter_symbol_collector/test/flutter_version_test.dart new file mode 100644 index 0000000000..5786292dc0 --- /dev/null +++ b/scripts/flutter_symbol_collector/test/flutter_version_test.dart @@ -0,0 +1,11 @@ +import 'package:flutter_symbol_collector/flutter_symbol_collector.dart'; +import 'package:test/test.dart'; + +void main() { + test('$FlutterVersion.isPrerelease()', () async { + expect(FlutterVersion('v1.16.3').isPreRelease, false); + expect(FlutterVersion('v1.16.3.pre').isPreRelease, true); + expect(FlutterVersion('3.16.0-9.0').isPreRelease, false); + expect(FlutterVersion('3.16.0-9.0.pre').isPreRelease, true); + }); +} diff --git a/scripts/flutter_symbol_collector/test/status_cache_test.dart b/scripts/flutter_symbol_collector/test/status_cache_test.dart new file mode 100644 index 0000000000..f8b929db79 --- /dev/null +++ b/scripts/flutter_symbol_collector/test/status_cache_test.dart @@ -0,0 +1,43 @@ +import 'package:file/file.dart'; +import 'package:file/memory.dart'; +import 'package:flutter_symbol_collector/flutter_symbol_collector.dart'; +import 'package:platform/platform.dart'; +import 'package:test/test.dart'; + +import 'common.dart'; + +void main() { + setupLogging(); + + group('DirectoryStatusCache', () { + late FileSystem fs; + late SymbolArchiveStatusCache sut; + final archive = SymbolArchive('path/to/archive.zip', LocalPlatform()); + + setUp(() { + fs = MemoryFileSystem.test(); + sut = DirectoryStatusCache(fs.currentDirectory); + }); + + test('retrieve unprocessed file', () async { + expect(await sut.getStatus(archive), SymbolArchiveStatus.pending); + }); + + test('store and retrieve error', () async { + await sut.setStatus(archive, SymbolArchiveStatus.error); + expect(await sut.getStatus(archive), SymbolArchiveStatus.error); + }); + + test('store and retrieve success', () async { + await sut.setStatus(archive, SymbolArchiveStatus.success); + expect(await sut.getStatus(archive), SymbolArchiveStatus.success); + }); + + test('store, overwrite and retrieve', () async { + await sut.setStatus(archive, SymbolArchiveStatus.error); + expect(await sut.getStatus(archive), SymbolArchiveStatus.error); + await sut.setStatus(archive, SymbolArchiveStatus.success); + expect(await sut.getStatus(archive), SymbolArchiveStatus.success); + }); + }); +} diff --git a/scripts/flutter_symbol_collector/test/symbol_collector_cli_test.dart b/scripts/flutter_symbol_collector/test/symbol_collector_cli_test.dart new file mode 100644 index 0000000000..dbd9a50e12 --- /dev/null +++ b/scripts/flutter_symbol_collector/test/symbol_collector_cli_test.dart @@ -0,0 +1,72 @@ +import 'package:file/file.dart'; +import 'package:file/local.dart'; +import 'package:file/memory.dart'; +import 'package:flutter_symbol_collector/src/flutter_version.dart'; +import 'package:flutter_symbol_collector/src/symbol_collector_cli.dart'; +import 'package:platform/platform.dart'; +import 'package:test/test.dart'; + +import 'common.dart'; + +void main() { + setupLogging(); + + group('setup() downloads CLI on', () { + late FileSystem fs; + + setUp(() { + fs = MemoryFileSystem.test(); + }); + for (final platform in [Platform.macOS, Platform.linux]) { + test(platform, () async { + const path = 'temp/symbol-collector'; + + // make sure the file is overwritten if there's an older version + await fs + .file(path) + .create(recursive: true) + .then((file) => file.writeAsString('foo')); + expect(fs.file(path).lengthSync(), equals(3)); + + final originalPlatform = SymbolCollectorCli.platform; + try { + SymbolCollectorCli.platform = FakePlatform(operatingSystem: platform); + final sut = await SymbolCollectorCli.setup(fs.directory('temp')); + expect(sut.cli, equals(path)); + expect(fs.file(path).existsSync(), isTrue); + expect(fs.file(path).lengthSync(), greaterThan(1000000)); + } finally { + SymbolCollectorCli.platform = originalPlatform; + } + }); + } + }); + + group('execute', () { + final tmpDir = LocalFileSystem() + .systemTempDirectory + .createTempSync('symbol_collector_test'); + late final SymbolCollectorCli sut; + + setUpAll(() async => sut = await SymbolCollectorCli.setup(tmpDir)); + tearDownAll(() => tmpDir.delete(recursive: true)); + + test('getVersion()', () async { + final output = await sut.getVersion(); + expect(output, startsWith('${SymbolCollectorCli.version}+')); + expect(output.split("\n").length, equals(1)); + }); + + test('upload()', () async { + final uploadDir = LocalFileSystem() + .systemTempDirectory + .createTempSync('symbol_collector_upload_test'); + try { + await sut.upload( + uploadDir, LocalPlatform(), FlutterVersion('v0.0.0-test')); + } finally { + uploadDir.deleteSync(); + } + }); + }, skip: LocalPlatform().isWindows); +} diff --git a/scripts/update-symbol-collector.sh b/scripts/update-symbol-collector.sh new file mode 100755 index 0000000000..0df03b9434 --- /dev/null +++ b/scripts/update-symbol-collector.sh @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +set -euo pipefail + +cd $(dirname "$0")/flutter_symbol_collector +file='lib/src/symbol_collector_cli.dart' +content=$(cat $file) +regex="(static const version = )'([0-9\.]+)'" +if ! [[ $content =~ $regex ]]; then + echo "Failed to find the plugin version in $file" + exit 1 +fi + +case $1 in +get-version) + echo ${BASH_REMATCH[2]} + ;; +get-repo) + echo "https://github.com/getsentry/symbol-collector.git" + ;; +set-version) + newValue="${BASH_REMATCH[1]}'$2'" + echo "${content/${BASH_REMATCH[0]}/$newValue}" >$file + ;; +*) + echo "Unknown argument $1" + exit 1 + ;; +esac diff --git a/sqflite/README.md b/sqflite/README.md index ed2b3c4f9d..ff5774ba74 100644 --- a/sqflite/README.md +++ b/sqflite/README.md @@ -62,8 +62,9 @@ Future insertProducts() async { #### Resources -* [![Documentation](https://img.shields.io/badge/documentation-sentry.io-green.svg)](https://docs.sentry.io/platforms/dart/) -* [![Forum](https://img.shields.io/badge/forum-sentry-green.svg)](https://forum.sentry.io/c/sdks) -* [![Discord](https://img.shields.io/discord/621778831602221064)](https://discord.gg/Ww9hbqr) +* [![Flutter docs](https://img.shields.io/badge/documentation-sentry.io-green.svg?label=flutter%20docs)](https://docs.sentry.io/platforms/flutter/) +* [![Dart docs](https://img.shields.io/badge/documentation-sentry.io-green.svg?label=dart%20docs)](https://docs.sentry.io/platforms/dart/) +* [![Discussions](https://img.shields.io/github/discussions/getsentry/sentry-dart.svg)](https://github.com/getsentry/sentry-dart/discussions) +* [![Discord Chat](https://img.shields.io/discord/621778831602221064?logo=discord&logoColor=ffffff&color=7389D8)](https://discord.gg/PXa5Apfe7K) * [![Stack Overflow](https://img.shields.io/badge/stack%20overflow-sentry-green.svg)](https://stackoverflow.com/questions/tagged/sentry) -* [![Twitter Follow](https://img.shields.io/twitter/follow/getsentry?label=getsentry&style=social)](https://twitter.com/intent/follow?screen_name=getsentry) +* [![Twitter Follow](https://img.shields.io/twitter/follow/getsentry?label=getsentry&style=social)](https://twitter.com/intent/follow?screen_name=getsentry) \ No newline at end of file diff --git a/sqflite/class-diagram.svg b/sqflite/class-diagram.svg new file mode 100644 index 0000000000..882e930afe --- /dev/null +++ b/sqflite/class-diagram.svg @@ -0,0 +1,194 @@ + + + + + + + + +cluster~ + +sqflite + + +cluster~/lib + +lib + + +cluster~/lib/src + +src + + +cluster~/lib/src/utils + +utils + + + +/lib/src/version.dart + +version + + + +/lib/src/sentry_database.dart + +sentry_database + + + +/lib/src/sentry_database.dart->/lib/src/version.dart + + + + + +/lib/src/sentry_database_executor.dart + +sentry_database_executor + + + +/lib/src/sentry_database.dart->/lib/src/sentry_database_executor.dart + + + + + +/lib/src/utils/sentry_database_span_attributes.dart + +sentry_database_span_attributes + + + +/lib/src/sentry_database.dart->/lib/src/utils/sentry_database_span_attributes.dart + + + + + +/lib/src/sentry_sqflite_transaction.dart + +sentry_sqflite_transaction + + + +/lib/src/sentry_database.dart->/lib/src/sentry_sqflite_transaction.dart + + + + + +/lib/src/sentry_batch.dart + +sentry_batch + + + +/lib/src/sentry_batch.dart->/lib/src/sentry_database.dart + + + + + +/lib/src/sentry_batch.dart->/lib/src/utils/sentry_database_span_attributes.dart + + + + + +/lib/src/sentry_database_executor.dart->/lib/src/sentry_database.dart + + + + + +/lib/src/sentry_database_executor.dart->/lib/src/sentry_batch.dart + + + + + +/lib/src/sentry_database_executor.dart->/lib/src/utils/sentry_database_span_attributes.dart + + + + + +/lib/src/sentry_sqflite_database_factory.dart + +sentry_sqflite_database_factory + + + +/lib/src/sentry_sqflite_database_factory.dart->/lib/src/sentry_database.dart + + + + + +/lib/src/sentry_sqflite.dart + +sentry_sqflite + + + +/lib/src/sentry_sqflite.dart->/lib/src/sentry_database.dart + + + + + +/lib/sentry_sqflite.dart + +sentry_sqflite + + + +/lib/src/utils/sentry_database_span_attributes.dart->/lib/sentry_sqflite.dart + + + + + +/lib/src/sentry_sqflite_transaction.dart->/lib/src/sentry_batch.dart + + + + + +/lib/sentry_sqflite.dart->/lib/src/sentry_database.dart + + + + + +/lib/sentry_sqflite.dart->/lib/src/sentry_batch.dart + + + + + +/lib/sentry_sqflite.dart->/lib/src/sentry_sqflite_database_factory.dart + + + + + +/lib/sentry_sqflite.dart->/lib/src/sentry_sqflite.dart + + + + + +/lib/sentry_sqflite.dart->/lib/src/sentry_sqflite_transaction.dart + + + + + diff --git a/sqflite/lib/src/sentry_batch.dart b/sqflite/lib/src/sentry_batch.dart index 95949125bd..a510ad186f 100644 --- a/sqflite/lib/src/sentry_batch.dart +++ b/sqflite/lib/src/sentry_batch.dart @@ -6,6 +6,7 @@ import 'package:sqflite/sqflite.dart'; import 'package:sqflite_common/src/sql_builder.dart'; import 'sentry_database.dart'; +import 'utils/sentry_database_span_attributes.dart'; /// A [Batch] wrapper that adds Sentry support. /// @@ -21,6 +22,7 @@ import 'sentry_database.dart'; class SentryBatch implements Batch { final Batch _batch; final Hub _hub; + final String? _dbName; // we don't clear the buffer because SqfliteBatch don't either final _buffer = StringBuffer(); @@ -36,7 +38,9 @@ class SentryBatch implements Batch { SentryBatch( this._batch, { @internal Hub? hub, - }) : _hub = hub ?? HubAdapter(); + @internal String? dbName, + }) : _hub = hub ?? HubAdapter(), + _dbName = dbName; @override Future> apply({bool? noResult, bool? continueOnError}) { @@ -47,8 +51,17 @@ class SentryBatch implements Batch { SentryDatabase.dbOp, description: _buffer.toString().trim(), ); + // ignore: invalid_use_of_internal_member span?.origin = SentryTraceOrigins.autoDbSqfliteBatch; + setDatabaseAttributeData(span, _dbName); + + var breadcrumb = Breadcrumb( + message: _buffer.toString().trim(), + data: {}, + type: 'query', + ); + setDatabaseAttributeOnBreadcrumb(breadcrumb, _dbName); try { final result = await _batch.apply( @@ -58,14 +71,23 @@ class SentryBatch implements Batch { span?.status = SpanStatus.ok(); + breadcrumb.data?['status'] = 'ok'; + return result; } catch (exception) { span?.throwable = exception; span?.status = SpanStatus.internalError(); + breadcrumb.data?['status'] = 'internal_error'; + breadcrumb = breadcrumb.copyWith( + level: SentryLevel.warning, + ); + rethrow; } finally { await span?.finish(); + // ignore: invalid_use_of_internal_member + await _hub.scope.addBreadcrumb(breadcrumb); } }); } @@ -86,6 +108,14 @@ class SentryBatch implements Batch { ); // ignore: invalid_use_of_internal_member span?.origin = SentryTraceOrigins.autoDbSqfliteBatch; + setDatabaseAttributeData(span, _dbName); + + var breadcrumb = Breadcrumb( + message: _buffer.toString().trim(), + data: {}, + type: 'query', + ); + setDatabaseAttributeOnBreadcrumb(breadcrumb, _dbName); try { final result = await _batch.commit( @@ -95,15 +125,23 @@ class SentryBatch implements Batch { ); span?.status = SpanStatus.ok(); + breadcrumb.data?['status'] = 'ok'; return result; } catch (exception) { span?.throwable = exception; span?.status = SpanStatus.internalError(); + breadcrumb.data?['status'] = 'internal_error'; + breadcrumb = breadcrumb.copyWith( + level: SentryLevel.warning, + ); + rethrow; } finally { await span?.finish(); + // ignore: invalid_use_of_internal_member + await _hub.scope.addBreadcrumb(breadcrumb); } }); } diff --git a/sqflite/lib/src/sentry_database.dart b/sqflite/lib/src/sentry_database.dart index f47551cff8..23ac1dae63 100644 --- a/sqflite/lib/src/sentry_database.dart +++ b/sqflite/lib/src/sentry_database.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:meta/meta.dart'; import 'package:sentry/sentry.dart'; import 'package:sqflite/sqflite.dart'; @@ -5,6 +7,8 @@ import 'package:sqflite/sqflite.dart'; import 'sentry_database_executor.dart'; import 'sentry_sqflite_transaction.dart'; import 'version.dart'; +import 'utils/sentry_database_span_attributes.dart'; +import 'package:path/path.dart' as p; /// A [Database] wrapper that adds Sentry support. /// @@ -30,7 +34,22 @@ class SentryDatabase extends SentryDatabaseExecutor implements Database { // ignore: public_member_api_docs static const dbSqlQueryOp = 'db.sql.query'; - static const _dbSqlOp = 'db.sql.transaction'; + static const _dbSqlTransactionOp = 'db.sql.transaction'; + + static const _dbSqlReadTransactionOp = 'db.sql.read_transaction'; + + @internal + // ignore: public_member_api_docs + static const dbSystemKey = 'db.system'; + @internal + // ignore: public_member_api_docs + static const dbSystem = 'sqlite'; + @internal + // ignore: public_member_api_docs + static const dbNameKey = 'db.name'; + @internal + // ignore: public_member_api_docs + String dbName; /// ```dart /// import 'package:sqflite/sqflite.dart'; @@ -43,7 +62,12 @@ class SentryDatabase extends SentryDatabaseExecutor implements Database { this._database, { @internal Hub? hub, }) : _hub = hub ?? HubAdapter(), - super(_database, hub: hub) { + dbName = p.basenameWithoutExtension(_database.path), + super( + _database, + hub: hub, + dbName: p.basenameWithoutExtension(_database.path), + ) { // ignore: invalid_use_of_internal_member final options = _hub.options; options.sdk.addIntegration('SentrySqfliteTracing'); @@ -56,24 +80,39 @@ class SentryDatabase extends SentryDatabaseExecutor implements Database { Future close() { return Future(() async { final currentSpan = _hub.getSpan(); + final description = 'Close DB: ${_database.path}'; final span = currentSpan?.startChild( dbOp, - description: 'Close DB: ${_database.path}', + description: description, ); // ignore: invalid_use_of_internal_member span?.origin = SentryTraceOrigins.autoDbSqfliteDatabase; + var breadcrumb = Breadcrumb( + message: description, + category: dbOp, + data: {}, + type: 'query', + ); + try { await _database.close(); span?.status = SpanStatus.ok(); + breadcrumb.data?['status'] = 'ok'; } catch (exception) { span?.throwable = exception; span?.status = SpanStatus.internalError(); + breadcrumb.data?['status'] = 'internal_error'; + breadcrumb = breadcrumb.copyWith( + level: SentryLevel.warning, + ); rethrow; } finally { await span?.finish(); + // ignore: invalid_use_of_internal_member + await _hub.scope.addBreadcrumb(breadcrumb); } }); } @@ -107,18 +146,32 @@ class SentryDatabase extends SentryDatabaseExecutor implements Database { }) { return Future(() async { final currentSpan = _hub.getSpan(); + final description = 'Transaction DB: ${_database.path}'; final span = currentSpan?.startChild( - _dbSqlOp, - description: 'Transaction DB: ${_database.path}', + _dbSqlTransactionOp, + description: description, ); // ignore: invalid_use_of_internal_member span?.origin = SentryTraceOrigins.autoDbSqfliteDatabase; + setDatabaseAttributeData(span, dbName); + + var breadcrumb = Breadcrumb( + message: description, + category: _dbSqlTransactionOp, + data: {}, + type: 'query', + ); + setDatabaseAttributeOnBreadcrumb(breadcrumb, dbName); Future newAction(Transaction txn) async { - final executor = - SentryDatabaseExecutor(txn, parentSpan: span, hub: _hub); + final executor = SentryDatabaseExecutor( + txn, + parentSpan: span, + hub: _hub, + dbName: dbName, + ); final sentrySqfliteTransaction = - SentrySqfliteTransaction(executor, hub: _hub); + SentrySqfliteTransaction(executor, hub: _hub, dbName: dbName); return await action(sentrySqfliteTransaction); } @@ -128,16 +181,106 @@ class SentryDatabase extends SentryDatabaseExecutor implements Database { await _database.transaction(newAction, exclusive: exclusive); span?.status = SpanStatus.ok(); + breadcrumb.data?['status'] = 'ok'; + + return result; + } catch (exception) { + span?.throwable = exception; + span?.status = SpanStatus.internalError(); + breadcrumb.data?['status'] = 'internal_error'; + breadcrumb = breadcrumb.copyWith( + level: SentryLevel.warning, + ); + + rethrow; + } finally { + await span?.finish(); + + // ignore: invalid_use_of_internal_member + await _hub.scope.addBreadcrumb(breadcrumb); + } + }); + } + + @override + // ignore: override_on_non_overriding_member, public_member_api_docs + Future readTransaction(Future Function(Transaction txn) action) { + return Future(() async { + final currentSpan = _hub.getSpan(); + final description = 'Transaction DB: ${_database.path}'; + final span = currentSpan?.startChild( + _dbSqlReadTransactionOp, + description: description, + ); + // ignore: invalid_use_of_internal_member + span?.origin = SentryTraceOrigins.autoDbSqfliteDatabase; + setDatabaseAttributeData(span, dbName); + + var breadcrumb = Breadcrumb( + message: description, + category: _dbSqlReadTransactionOp, + data: {}, + type: 'query', + ); + setDatabaseAttributeOnBreadcrumb(breadcrumb, dbName); + + Future newAction(Transaction txn) async { + final executor = SentryDatabaseExecutor( + txn, + parentSpan: span, + hub: _hub, + dbName: dbName, + ); + final sentrySqfliteTransaction = + SentrySqfliteTransaction(executor, hub: _hub, dbName: dbName); + + return await action(sentrySqfliteTransaction); + } + + try { + final futureOrResult = _resolvedReadTransaction(newAction); + T result; + + if (futureOrResult is Future) { + result = await futureOrResult; + } else { + result = futureOrResult; + } + + span?.status = SpanStatus.ok(); + breadcrumb.data?['status'] = 'ok'; return result; } catch (exception) { span?.throwable = exception; span?.status = SpanStatus.internalError(); + breadcrumb.data?['status'] = 'internal_error'; + breadcrumb = breadcrumb.copyWith( + level: SentryLevel.warning, + ); rethrow; } finally { await span?.finish(); + + // ignore: invalid_use_of_internal_member + await _hub.scope.addBreadcrumb(breadcrumb); } }); } + + FutureOr _resolvedReadTransaction( + Future Function(Transaction txn) action, + ) async { + try { + // ignore: return_of_invalid_type + final result = await (_database as dynamic).readTransaction(action); + // Await and cast, as directly returning the future resulted in a runtime error. + return result as T; + } on NoSuchMethodError catch (_) { + // The `readTransaction` does not exists on sqflite version < 2.5.0+2. + // Fallback to transaction instead. + return _database.transaction(action); + } + } } diff --git a/sqflite/lib/src/sentry_database_executor.dart b/sqflite/lib/src/sentry_database_executor.dart index b43d13c8d6..f13b0eb261 100644 --- a/sqflite/lib/src/sentry_database_executor.dart +++ b/sqflite/lib/src/sentry_database_executor.dart @@ -7,24 +7,28 @@ import 'package:sqflite_common/src/sql_builder.dart'; import 'sentry_batch.dart'; import 'sentry_database.dart'; +import 'utils/sentry_database_span_attributes.dart'; @internal // ignore: public_member_api_docs class SentryDatabaseExecutor implements DatabaseExecutor { final DatabaseExecutor _executor; final ISentrySpan? _parentSpan; + final String? _dbName; // ignore: public_member_api_docs SentryDatabaseExecutor( this._executor, { ISentrySpan? parentSpan, @internal Hub? hub, + @internal String? dbName, }) : _parentSpan = parentSpan, - _hub = hub ?? HubAdapter(); + _hub = hub ?? HubAdapter(), + _dbName = dbName; final Hub _hub; @override - Batch batch() => SentryBatch(_executor.batch(), hub: _hub); + Batch batch() => SentryBatch(_executor.batch(), hub: _hub, dbName: _dbName); @override Database get database => _executor.database; @@ -41,21 +45,37 @@ class SentryDatabaseExecutor implements DatabaseExecutor { ); // ignore: invalid_use_of_internal_member span?.origin = SentryTraceOrigins.autoDbSqfliteDatabaseExecutor; + setDatabaseAttributeData(span, _dbName); + + var breadcrumb = Breadcrumb( + message: builder.sql, + category: SentryDatabase.dbSqlExecuteOp, + data: {}, + type: 'query', + ); + setDatabaseAttributeOnBreadcrumb(breadcrumb, _dbName); try { final result = await _executor.delete(table, where: where, whereArgs: whereArgs); span?.status = SpanStatus.ok(); + breadcrumb.data?['status'] = 'ok'; return result; } catch (exception) { span?.throwable = exception; span?.status = SpanStatus.internalError(); + breadcrumb.data?['status'] = 'internal_error'; + breadcrumb = breadcrumb.copyWith( + level: SentryLevel.warning, + ); rethrow; } finally { await span?.finish(); + // ignore: invalid_use_of_internal_member + await _hub.scope.addBreadcrumb(breadcrumb); } }); } @@ -68,20 +88,37 @@ class SentryDatabaseExecutor implements DatabaseExecutor { SentryDatabase.dbSqlExecuteOp, description: sql, ); + span?.setData(SentryDatabase.dbSystemKey, SentryDatabase.dbSystem); // ignore: invalid_use_of_internal_member span?.origin = SentryTraceOrigins.autoDbSqfliteDatabaseExecutor; + setDatabaseAttributeData(span, _dbName); + + var breadcrumb = Breadcrumb( + message: sql, + category: SentryDatabase.dbSqlExecuteOp, + data: {}, + type: 'query', + ); + setDatabaseAttributeOnBreadcrumb(breadcrumb, _dbName); try { await _executor.execute(sql, arguments); span?.status = SpanStatus.ok(); + breadcrumb.data?['status'] = 'ok'; } catch (exception) { span?.throwable = exception; span?.status = SpanStatus.internalError(); + breadcrumb.data?['status'] = 'internal_error'; + breadcrumb = breadcrumb.copyWith( + level: SentryLevel.warning, + ); rethrow; } finally { await span?.finish(); + // ignore: invalid_use_of_internal_member + await _hub.scope.addBreadcrumb(breadcrumb); } }); } @@ -107,6 +144,15 @@ class SentryDatabaseExecutor implements DatabaseExecutor { ); // ignore: invalid_use_of_internal_member span?.origin = SentryTraceOrigins.autoDbSqfliteDatabaseExecutor; + setDatabaseAttributeData(span, _dbName); + + var breadcrumb = Breadcrumb( + message: builder.sql, + category: SentryDatabase.dbSqlExecuteOp, + data: {}, + type: 'query', + ); + setDatabaseAttributeOnBreadcrumb(breadcrumb, _dbName); try { final result = await _executor.insert( @@ -117,15 +163,22 @@ class SentryDatabaseExecutor implements DatabaseExecutor { ); span?.status = SpanStatus.ok(); + breadcrumb.data?['status'] = 'ok'; return result; } catch (exception) { span?.throwable = exception; span?.status = SpanStatus.internalError(); + breadcrumb.data?['status'] = 'internal_error'; + breadcrumb = breadcrumb.copyWith( + level: SentryLevel.warning, + ); rethrow; } finally { await span?.finish(); + // ignore: invalid_use_of_internal_member + await _hub.scope.addBreadcrumb(breadcrumb); } }); } @@ -163,6 +216,15 @@ class SentryDatabaseExecutor implements DatabaseExecutor { ); // ignore: invalid_use_of_internal_member span?.origin = SentryTraceOrigins.autoDbSqfliteDatabaseExecutor; + setDatabaseAttributeData(span, _dbName); + + var breadcrumb = Breadcrumb( + message: builder.sql, + category: SentryDatabase.dbSqlQueryOp, + data: {}, + type: 'query', + ); + setDatabaseAttributeOnBreadcrumb(breadcrumb, _dbName); try { final result = await _executor.query( @@ -179,15 +241,22 @@ class SentryDatabaseExecutor implements DatabaseExecutor { ); span?.status = SpanStatus.ok(); + breadcrumb.data?['status'] = 'ok'; return result; } catch (exception) { span?.throwable = exception; span?.status = SpanStatus.internalError(); + breadcrumb.data?['status'] = 'internal_error'; + breadcrumb = breadcrumb.copyWith( + level: SentryLevel.warning, + ); rethrow; } finally { await span?.finish(); + // ignore: invalid_use_of_internal_member + await _hub.scope.addBreadcrumb(breadcrumb); } }); } @@ -226,6 +295,15 @@ class SentryDatabaseExecutor implements DatabaseExecutor { ); // ignore: invalid_use_of_internal_member span?.origin = SentryTraceOrigins.autoDbSqfliteDatabaseExecutor; + setDatabaseAttributeData(span, _dbName); + + var breadcrumb = Breadcrumb( + message: builder.sql, + category: SentryDatabase.dbSqlQueryOp, + data: {}, + type: 'query', + ); + setDatabaseAttributeOnBreadcrumb(breadcrumb, _dbName); try { final result = await _executor.queryCursor( @@ -243,15 +321,22 @@ class SentryDatabaseExecutor implements DatabaseExecutor { ); span?.status = SpanStatus.ok(); + breadcrumb.data?['status'] = 'ok'; return result; } catch (exception) { span?.throwable = exception; span?.status = SpanStatus.internalError(); + breadcrumb.data?['status'] = 'internal_error'; + breadcrumb = breadcrumb.copyWith( + level: SentryLevel.warning, + ); rethrow; } finally { await span?.finish(); + // ignore: invalid_use_of_internal_member + await _hub.scope.addBreadcrumb(breadcrumb); } }); } @@ -266,20 +351,36 @@ class SentryDatabaseExecutor implements DatabaseExecutor { ); // ignore: invalid_use_of_internal_member span?.origin = SentryTraceOrigins.autoDbSqfliteDatabaseExecutor; + setDatabaseAttributeData(span, _dbName); + + var breadcrumb = Breadcrumb( + message: sql, + category: SentryDatabase.dbSqlExecuteOp, + data: {}, + type: 'query', + ); + setDatabaseAttributeOnBreadcrumb(breadcrumb, _dbName); try { final result = await _executor.rawDelete(sql, arguments); span?.status = SpanStatus.ok(); + breadcrumb.data?['status'] = 'ok'; return result; } catch (exception) { span?.throwable = exception; span?.status = SpanStatus.internalError(); + breadcrumb.data?['status'] = 'internal_error'; + breadcrumb = breadcrumb.copyWith( + level: SentryLevel.warning, + ); rethrow; } finally { await span?.finish(); + // ignore: invalid_use_of_internal_member + await _hub.scope.addBreadcrumb(breadcrumb); } }); } @@ -294,20 +395,36 @@ class SentryDatabaseExecutor implements DatabaseExecutor { ); // ignore: invalid_use_of_internal_member span?.origin = SentryTraceOrigins.autoDbSqfliteDatabaseExecutor; + setDatabaseAttributeData(span, _dbName); + + var breadcrumb = Breadcrumb( + message: sql, + category: SentryDatabase.dbSqlExecuteOp, + data: {}, + type: 'query', + ); + setDatabaseAttributeOnBreadcrumb(breadcrumb, _dbName); try { final result = await _executor.rawInsert(sql, arguments); span?.status = SpanStatus.ok(); + breadcrumb.data?['status'] = 'ok'; return result; } catch (exception) { span?.throwable = exception; span?.status = SpanStatus.internalError(); + breadcrumb.data?['status'] = 'internal_error'; + breadcrumb = breadcrumb.copyWith( + level: SentryLevel.warning, + ); rethrow; } finally { await span?.finish(); + // ignore: invalid_use_of_internal_member + await _hub.scope.addBreadcrumb(breadcrumb); } }); } @@ -325,20 +442,36 @@ class SentryDatabaseExecutor implements DatabaseExecutor { ); // ignore: invalid_use_of_internal_member span?.origin = SentryTraceOrigins.autoDbSqfliteDatabaseExecutor; + setDatabaseAttributeData(span, _dbName); + + var breadcrumb = Breadcrumb( + message: sql, + category: SentryDatabase.dbSqlQueryOp, + data: {}, + type: 'query', + ); + setDatabaseAttributeOnBreadcrumb(breadcrumb, _dbName); try { final result = await _executor.rawQuery(sql, arguments); span?.status = SpanStatus.ok(); + breadcrumb.data?['status'] = 'ok'; return result; } catch (exception) { span?.throwable = exception; span?.status = SpanStatus.internalError(); + breadcrumb.data?['status'] = 'internal_error'; + breadcrumb = breadcrumb.copyWith( + level: SentryLevel.warning, + ); rethrow; } finally { await span?.finish(); + // ignore: invalid_use_of_internal_member + await _hub.scope.addBreadcrumb(breadcrumb); } }); } @@ -357,6 +490,15 @@ class SentryDatabaseExecutor implements DatabaseExecutor { ); // ignore: invalid_use_of_internal_member span?.origin = SentryTraceOrigins.autoDbSqfliteDatabaseExecutor; + setDatabaseAttributeData(span, _dbName); + + var breadcrumb = Breadcrumb( + message: sql, + category: SentryDatabase.dbSqlQueryOp, + data: {}, + type: 'query', + ); + setDatabaseAttributeOnBreadcrumb(breadcrumb, _dbName); try { final result = await _executor.rawQueryCursor( @@ -366,15 +508,22 @@ class SentryDatabaseExecutor implements DatabaseExecutor { ); span?.status = SpanStatus.ok(); + breadcrumb.data?['status'] = 'ok'; return result; } catch (exception) { span?.throwable = exception; span?.status = SpanStatus.internalError(); + breadcrumb.data?['status'] = 'internal_error'; + breadcrumb = breadcrumb.copyWith( + level: SentryLevel.warning, + ); rethrow; } finally { await span?.finish(); + // ignore: invalid_use_of_internal_member + await _hub.scope.addBreadcrumb(breadcrumb); } }); } @@ -389,20 +538,36 @@ class SentryDatabaseExecutor implements DatabaseExecutor { ); // ignore: invalid_use_of_internal_member span?.origin = SentryTraceOrigins.autoDbSqfliteDatabaseExecutor; + setDatabaseAttributeData(span, _dbName); + + var breadcrumb = Breadcrumb( + message: sql, + category: SentryDatabase.dbSqlExecuteOp, + data: {}, + type: 'query', + ); + setDatabaseAttributeOnBreadcrumb(breadcrumb, _dbName); try { final result = await _executor.rawUpdate(sql, arguments); span?.status = SpanStatus.ok(); + breadcrumb.data?['status'] = 'ok'; return result; } catch (exception) { span?.throwable = exception; span?.status = SpanStatus.internalError(); + breadcrumb.data?['status'] = 'internal_error'; + breadcrumb = breadcrumb.copyWith( + level: SentryLevel.warning, + ); rethrow; } finally { await span?.finish(); + // ignore: invalid_use_of_internal_member + await _hub.scope.addBreadcrumb(breadcrumb); } }); } @@ -430,6 +595,15 @@ class SentryDatabaseExecutor implements DatabaseExecutor { ); // ignore: invalid_use_of_internal_member span?.origin = SentryTraceOrigins.autoDbSqfliteDatabaseExecutor; + setDatabaseAttributeData(span, _dbName); + + var breadcrumb = Breadcrumb( + message: builder.sql, + category: SentryDatabase.dbSqlExecuteOp, + data: {}, + type: 'query', + ); + setDatabaseAttributeOnBreadcrumb(breadcrumb, _dbName); try { final result = await _executor.update( @@ -441,15 +615,22 @@ class SentryDatabaseExecutor implements DatabaseExecutor { ); span?.status = SpanStatus.ok(); + breadcrumb.data?['status'] = 'ok'; return result; } catch (exception) { span?.throwable = exception; span?.status = SpanStatus.internalError(); + breadcrumb.data?['status'] = 'internal_error'; + breadcrumb = breadcrumb.copyWith( + level: SentryLevel.warning, + ); rethrow; } finally { await span?.finish(); + // ignore: invalid_use_of_internal_member + await _hub.scope.addBreadcrumb(breadcrumb); } }); } diff --git a/sqflite/lib/src/sentry_sqflite.dart b/sqflite/lib/src/sentry_sqflite.dart index ebd39b547b..b26b767808 100644 --- a/sqflite/lib/src/sentry_sqflite.dart +++ b/sqflite/lib/src/sentry_sqflite.dart @@ -40,13 +40,20 @@ Future openDatabaseWithSentry( final newHub = hub ?? HubAdapter(); final currentSpan = newHub.getSpan(); + final description = 'Open DB: $path'; final span = currentSpan?.startChild( SentryDatabase.dbOp, - description: 'Open DB: $path', + description: description, ); // ignore: invalid_use_of_internal_member span?.origin = SentryTraceOrigins.autoDbSqfliteOpenDatabase; + var breadcrumb = Breadcrumb( + message: description, + category: SentryDatabase.dbOp, + data: {}, + ); + try { final database = await databaseFactory.openDatabase(path, options: dbOptions); @@ -54,14 +61,22 @@ Future openDatabaseWithSentry( final sentryDatabase = SentryDatabase(database, hub: newHub); span?.status = SpanStatus.ok(); + breadcrumb.data?['status'] = 'ok'; + return sentryDatabase; } catch (exception) { span?.throwable = exception; span?.status = SpanStatus.internalError(); + breadcrumb.data?['status'] = 'internal_error'; + breadcrumb = breadcrumb.copyWith( + level: SentryLevel.warning, + ); rethrow; } finally { await span?.finish(); + // ignore: invalid_use_of_internal_member + await newHub.scope.addBreadcrumb(breadcrumb); } }); } diff --git a/sqflite/lib/src/sentry_sqflite_database_factory.dart b/sqflite/lib/src/sentry_sqflite_database_factory.dart index 4fff7479b1..827e516afa 100644 --- a/sqflite/lib/src/sentry_sqflite_database_factory.dart +++ b/sqflite/lib/src/sentry_sqflite_database_factory.dart @@ -59,15 +59,22 @@ class SentrySqfliteDatabaseFactory with SqfliteDatabaseFactoryMixin { return Future(() async { final currentSpan = _hub.getSpan(); + final description = 'Open DB: $path'; final span = currentSpan?.startChild( SentryDatabase.dbOp, - description: 'Open DB: $path', + description: description, ); span?.origin = // ignore: invalid_use_of_internal_member SentryTraceOrigins.autoDbSqfliteDatabaseFactory; + var breadcrumb = Breadcrumb( + message: description, + category: SentryDatabase.dbOp, + data: {}, + ); + try { final database = await databaseFactory.openDatabase(path, options: options); @@ -75,14 +82,21 @@ class SentrySqfliteDatabaseFactory with SqfliteDatabaseFactoryMixin { final sentryDatabase = SentryDatabase(database, hub: _hub); span?.status = SpanStatus.ok(); + breadcrumb.data?['status'] = 'ok'; + return sentryDatabase; } catch (exception) { span?.throwable = exception; span?.status = SpanStatus.internalError(); - + breadcrumb.data?['status'] = 'internal_error'; + breadcrumb = breadcrumb.copyWith( + level: SentryLevel.warning, + ); rethrow; } finally { await span?.finish(); + // ignore: invalid_use_of_internal_member + await _hub.scope.addBreadcrumb(breadcrumb); } }); } diff --git a/sqflite/lib/src/sentry_sqflite_transaction.dart b/sqflite/lib/src/sentry_sqflite_transaction.dart index c207023e9c..78c41b487d 100644 --- a/sqflite/lib/src/sentry_sqflite_transaction.dart +++ b/sqflite/lib/src/sentry_sqflite_transaction.dart @@ -21,16 +21,19 @@ import 'sentry_batch.dart'; class SentrySqfliteTransaction extends Transaction implements DatabaseExecutor { final DatabaseExecutor _executor; final Hub _hub; + final String? _dbName; // ignore: public_member_api_docs @internal SentrySqfliteTransaction( this._executor, { @internal Hub? hub, - }) : _hub = hub ?? HubAdapter(); + @internal String? dbName, + }) : _hub = hub ?? HubAdapter(), + _dbName = dbName; @override - Batch batch() => SentryBatch(_executor.batch(), hub: _hub); + Batch batch() => SentryBatch(_executor.batch(), hub: _hub, dbName: _dbName); @override Database get database => _executor.database; diff --git a/sqflite/lib/src/utils/sentry_database_span_attributes.dart b/sqflite/lib/src/utils/sentry_database_span_attributes.dart new file mode 100644 index 0000000000..347c750ee8 --- /dev/null +++ b/sqflite/lib/src/utils/sentry_database_span_attributes.dart @@ -0,0 +1,21 @@ +import 'package:sentry/sentry.dart'; + +import '../../sentry_sqflite.dart'; + +/// Sets the database attributes on the [span]. +/// It contains the database system and the database name. +void setDatabaseAttributeData(ISentrySpan? span, String? dbName) { + span?.setData(SentryDatabase.dbSystemKey, SentryDatabase.dbSystem); + if (dbName != null) { + span?.setData(SentryDatabase.dbNameKey, dbName); + } +} + +/// Sets the database attributes on the [breadcrumb]. +/// It contains the database system and the database name. +void setDatabaseAttributeOnBreadcrumb(Breadcrumb breadcrumb, String? dbName) { + breadcrumb.data?[SentryDatabase.dbSystemKey] = SentryDatabase.dbSystem; + if (dbName != null) { + breadcrumb.data?[SentryDatabase.dbNameKey] = dbName; + } +} diff --git a/sqflite/lib/src/version.dart b/sqflite/lib/src/version.dart index 67be6e3068..6982ffcf1f 100644 --- a/sqflite/lib/src/version.dart +++ b/sqflite/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '7.9.0'; +const String sdkVersion = '7.16.0'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_sqflite'; diff --git a/sqflite/pubspec.yaml b/sqflite/pubspec.yaml index db60eec2a5..4fae66faf9 100644 --- a/sqflite/pubspec.yaml +++ b/sqflite/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_sqflite description: An integration which adds support for performance tracing for the sqflite package. -version: 7.9.0 +version: 7.16.0 homepage: https://docs.sentry.io/platforms/flutter/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues @@ -10,13 +10,14 @@ environment: flutter: '>=3.3.0' # matching sqflite dependencies: - sentry: 7.9.0 + sentry: 7.16.0 sqflite: ^2.0.0 sqflite_common: ^2.0.0 meta: ^1.3.0 + path: ^1.8.3 dev_dependencies: - lints: ^2.0.0 + lints: ^3.0.0 flutter_test: sdk: flutter coverage: ^1.3.0 diff --git a/sqflite/test/mocks/mocks.mocks.dart b/sqflite/test/mocks/mocks.mocks.dart index 582663e5f9..6c4c5e362e 100644 --- a/sqflite/test/mocks/mocks.mocks.dart +++ b/sqflite/test/mocks/mocks.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.2 from annotations // in sentry_sqflite/test/mocks/mocks.dart. // Do not manually edit this file. @@ -6,12 +6,13 @@ import 'dart:async' as _i4; import 'package:mockito/mockito.dart' as _i1; +import 'package:mockito/src/dummies.dart' as _i7; import 'package:sentry/sentry.dart' as _i2; import 'package:sentry/src/sentry_tracer.dart' as _i5; import 'package:sqflite_common/sql.dart' as _i6; import 'package:sqflite_common/sqlite_api.dart' as _i3; -import 'mocks.dart' as _i7; +import 'mocks.dart' as _i8; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values @@ -76,7 +77,7 @@ class _FakeDatabase_4 extends _i1.SmartFake implements _i3.Database { ); } -class _FakeFuture_5 extends _i1.SmartFake implements _i4.Future { +class _FakeFuture_5 extends _i1.SmartFake implements _i4.Future { _FakeFuture_5( Object parent, Invocation parentInvocation, @@ -126,8 +127,18 @@ class _FakeSentryId_9 extends _i1.SmartFake implements _i2.SentryId { ); } -class _FakeHub_10 extends _i1.SmartFake implements _i2.Hub { - _FakeHub_10( +class _FakeScope_10 extends _i1.SmartFake implements _i2.Scope { + _FakeScope_10( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeHub_11 extends _i1.SmartFake implements _i2.Hub { + _FakeHub_11( Object parent, Invocation parentInvocation, ) : super( @@ -666,14 +677,25 @@ class MockDatabase extends _i1.Mock implements _i3.Database { [action], {#exclusive: exclusive}, ), - returnValue: _FakeFuture_5( - this, - Invocation.method( - #transaction, - [action], - {#exclusive: exclusive}, - ), - ), + returnValue: _i7.ifNotNull( + _i7.dummyValueOrNull( + this, + Invocation.method( + #transaction, + [action], + {#exclusive: exclusive}, + ), + ), + (T v) => _i4.Future.value(v), + ) ?? + _FakeFuture_5( + this, + Invocation.method( + #transaction, + [action], + {#exclusive: exclusive}, + ), + ), ) as _i4.Future); @override _i4.Future devInvokeMethod( @@ -688,16 +710,29 @@ class MockDatabase extends _i1.Mock implements _i3.Database { arguments, ], ), - returnValue: _FakeFuture_5( - this, - Invocation.method( - #devInvokeMethod, - [ - method, - arguments, - ], - ), - ), + returnValue: _i7.ifNotNull( + _i7.dummyValueOrNull( + this, + Invocation.method( + #devInvokeMethod, + [ + method, + arguments, + ], + ), + ), + (T v) => _i4.Future.value(v), + ) ?? + _FakeFuture_5( + this, + Invocation.method( + #devInvokeMethod, + [ + method, + arguments, + ], + ), + ), ) as _i4.Future); @override _i4.Future devInvokeSqlMethod( @@ -714,17 +749,31 @@ class MockDatabase extends _i1.Mock implements _i3.Database { arguments, ], ), - returnValue: _FakeFuture_5( - this, - Invocation.method( - #devInvokeSqlMethod, - [ - method, - sql, - arguments, - ], - ), - ), + returnValue: _i7.ifNotNull( + _i7.dummyValueOrNull( + this, + Invocation.method( + #devInvokeSqlMethod, + [ + method, + sql, + arguments, + ], + ), + ), + (T v) => _i4.Future.value(v), + ) ?? + _FakeFuture_5( + this, + Invocation.method( + #devInvokeSqlMethod, + [ + method, + sql, + arguments, + ], + ), + ), ) as _i4.Future); @override _i4.Future execute( @@ -1300,6 +1349,14 @@ class MockHub extends _i1.Mock implements _i2.Hub { ), ) as _i2.SentryId); @override + _i2.Scope get scope => (super.noSuchMethod( + Invocation.getter(#scope), + returnValue: _FakeScope_10( + this, + Invocation.getter(#scope), + ), + ) as _i2.Scope); + @override _i4.Future<_i2.SentryId> captureEvent( _i2.SentryEvent? event, { dynamic stackTrace, @@ -1433,7 +1490,7 @@ class MockHub extends _i1.Mock implements _i2.Hub { #clone, [], ), - returnValue: _FakeHub_10( + returnValue: _FakeHub_11( this, Invocation.method( #clone, @@ -1487,7 +1544,7 @@ class MockHub extends _i1.Mock implements _i2.Hub { #customSamplingContext: customSamplingContext, }, ), - returnValue: _i7.startTransactionShim( + returnValue: _i8.startTransactionShim( name, operation, description: description, diff --git a/sqflite/test/sentry_batch_test.dart b/sqflite/test/sentry_batch_test.dart index e01aa4d5c7..b9c53b8762 100644 --- a/sqflite/test/sentry_batch_test.dart +++ b/sqflite/test/sentry_batch_test.dart @@ -22,6 +22,7 @@ void main() { fixture = Fixture(); when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.scope).thenReturn(fixture.scope); when(fixture.hub.getSpan()).thenReturn(fixture.tracer); // using ffi for testing on vm @@ -63,6 +64,9 @@ void main() { // ignore: invalid_use_of_internal_member expect(span.origin, SentryTraceOrigins.autoDbSqfliteBatch); + final breadcrumb = fixture.hub.scope.breadcrumbs.last; + expect(breadcrumb.data?['status'], 'ok'); + await db.close(); }); @@ -79,6 +83,9 @@ void main() { // ignore: invalid_use_of_internal_member expect(span.origin, SentryTraceOrigins.autoDbSqfliteBatch); + final breadcrumb = fixture.hub.scope.breadcrumbs.last; + expect(breadcrumb.data?['status'], 'ok'); + await db.close(); }); @@ -102,6 +109,24 @@ void main() { await db.close(); }); + test('creates insert breadcrumb', () async { + final db = await fixture.getDatabase(); + final batch = db.batch(); + + batch.insert('Product', {'title': 'Product 1'}); + + await batch.commit(); + + final breadcrumb = fixture.hub.scope.breadcrumbs.last; + expect( + breadcrumb.message, + 'INSERT INTO Product (title) VALUES (?)', + ); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + test('creates raw insert span', () async { final db = await fixture.getDatabase(); final batch = db.batch(); @@ -122,6 +147,24 @@ void main() { await db.close(); }); + test('creates raw insert breadcrumb', () async { + final db = await fixture.getDatabase(); + final batch = db.batch(); + + batch.rawInsert('INSERT INTO Product (title) VALUES (?)', ['Product 1']); + + await batch.commit(); + + final breadcrumb = fixture.hub.scope.breadcrumbs.last; + expect( + breadcrumb.message, + 'INSERT INTO Product (title) VALUES (?)', + ); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + test('creates update span', () async { final db = await fixture.getDatabase(); final batch = db.batch(); @@ -139,6 +182,24 @@ void main() { await db.close(); }); + test('creates update breadcrumb', () async { + final db = await fixture.getDatabase(); + final batch = db.batch(); + + batch.update('Product', {'title': 'Product 1'}); + + await batch.commit(); + + final breadcrumb = fixture.hub.scope.breadcrumbs.last; + expect( + breadcrumb.message, + 'UPDATE Product SET title = ?', + ); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + test('creates raw update span', () async { final db = await fixture.getDatabase(); final batch = db.batch(); @@ -156,6 +217,24 @@ void main() { await db.close(); }); + test('creates raw update breadcrumb', () async { + final db = await fixture.getDatabase(); + final batch = db.batch(); + + batch.rawUpdate('UPDATE Product SET title = ?', ['Product 1']); + + await batch.commit(); + + final breadcrumb = fixture.hub.scope.breadcrumbs.last; + expect( + breadcrumb.message, + 'UPDATE Product SET title = ?', + ); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + test('creates delete span', () async { final db = await fixture.getDatabase(); final batch = db.batch(); @@ -173,6 +252,24 @@ void main() { await db.close(); }); + test('creates delete breadcrumb', () async { + final db = await fixture.getDatabase(); + final batch = db.batch(); + + batch.delete('Product'); + + await batch.commit(); + + final breadcrumb = fixture.hub.scope.breadcrumbs.last; + expect( + breadcrumb.message, + 'DELETE FROM Product', + ); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + test('creates raw delete span', () async { final db = await fixture.getDatabase(); final batch = db.batch(); @@ -190,6 +287,24 @@ void main() { await db.close(); }); + test('creates raw delete breadcrumb', () async { + final db = await fixture.getDatabase(); + final batch = db.batch(); + + batch.rawDelete('DELETE FROM Product'); + + await batch.commit(); + + final breadcrumb = fixture.hub.scope.breadcrumbs.last; + expect( + breadcrumb.message, + 'DELETE FROM Product', + ); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + test('creates execute span', () async { final db = await fixture.getDatabase(); final batch = db.batch(); @@ -207,6 +322,24 @@ void main() { await db.close(); }); + test('creates execute breadcrumb', () async { + final db = await fixture.getDatabase(); + final batch = db.batch(); + + batch.execute('DELETE FROM Product'); + + await batch.commit(); + + final breadcrumb = fixture.hub.scope.breadcrumbs.last; + expect( + breadcrumb.message, + 'DELETE FROM Product', + ); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + test('creates query span', () async { final db = await fixture.getDatabase(); final batch = db.batch(); @@ -224,6 +357,24 @@ void main() { await db.close(); }); + test('creates query breadcrumb', () async { + final db = await fixture.getDatabase(); + final batch = db.batch(); + + batch.query('Product'); + + await batch.commit(); + + final breadcrumb = fixture.hub.scope.breadcrumbs.last; + expect( + breadcrumb.message, + 'SELECT * FROM Product', + ); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + test('creates raw query span', () async { final db = await fixture.getDatabase(); final batch = db.batch(); @@ -241,6 +392,24 @@ void main() { await db.close(); }); + test('creates raw query breadcrumb', () async { + final db = await fixture.getDatabase(); + final batch = db.batch(); + + batch.rawQuery('SELECT * FROM Product'); + + await batch.commit(); + + final breadcrumb = fixture.hub.scope.breadcrumbs.last; + expect( + breadcrumb.message, + 'SELECT * FROM Product', + ); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + test('creates span with batch description', () async { final db = await fixture.getDatabase(); final batch = db.batch(); @@ -263,6 +432,25 @@ SELECT * FROM Product'''; await db.close(); }); + test('creates breadcrumb with batch description', () async { + final db = await fixture.getDatabase(); + final batch = db.batch(); + + batch.insert('Product', {'title': 'Product 1'}); + batch.query('Product'); + + await batch.commit(); + + final desc = '''INSERT INTO Product (title) VALUES (?) +SELECT * FROM Product'''; + + final breadcrumb = fixture.hub.scope.breadcrumbs.last; + expect(breadcrumb.message, desc); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + test('creates span with batch description using apply', () async { final db = await fixture.getDatabase(); final batch = db.batch(); @@ -285,6 +473,118 @@ SELECT * FROM Product'''; await db.close(); }); + test('creates breadcrumb with batch description using apply', () async { + final db = await fixture.getDatabase(); + final batch = db.batch(); + + batch.insert('Product', {'title': 'Product 1'}); + batch.query('Product'); + + await batch.apply(); + + final desc = '''INSERT INTO Product (title) VALUES (?) +SELECT * FROM Product'''; + + final breadcrumb = fixture.hub.scope.breadcrumbs.last; + expect(breadcrumb.message, desc); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + + test('apply creates db span with dbSystem and dbName attributes', () async { + final db = await fixture.getDatabase(); + final batch = db.batch(); + + batch.insert('Product', {'title': 'Product 1'}); + + await batch.apply(); + + final span = fixture.tracer.children.last; + expect(span.data[SentryDatabase.dbSystemKey], SentryDatabase.dbSystem); + expect( + span.data[SentryDatabase.dbNameKey], + (db as SentryDatabase).dbName, + ); + + final breadcrumb = fixture.hub.scope.breadcrumbs.last; + expect( + breadcrumb.data?[SentryDatabase.dbSystemKey], + SentryDatabase.dbSystem, + ); + expect( + breadcrumb.data?[SentryDatabase.dbNameKey], + db.dbName, + ); + + await db.close(); + }); + + test('apply creates a breadcrumb with dbSystem and dbName attributes', + () async { + final db = await fixture.getDatabase(); + final batch = db.batch(); + + batch.insert('Product', {'title': 'Product 1'}); + + await batch.apply(); + + final breadcrumb = fixture.hub.scope.breadcrumbs.last; + expect( + breadcrumb.data?[SentryDatabase.dbSystemKey], + SentryDatabase.dbSystem, + ); + expect( + breadcrumb.data?[SentryDatabase.dbNameKey], + (db as SentryDatabase).dbName, + ); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + + test('commit creates db span with dbSystem and dbName attributes', + () async { + final db = await fixture.getDatabase(); + final batch = db.batch(); + + batch.insert('Product', {'title': 'Product 1'}); + + await batch.commit(); + + final span = fixture.tracer.children.last; + expect(span.data[SentryDatabase.dbSystemKey], SentryDatabase.dbSystem); + expect( + span.data[SentryDatabase.dbNameKey], + (db as SentryDatabase).dbName, + ); + + await db.close(); + }); + + test('commit creates breadcrumb with dbSystem and dbName attributes', + () async { + final db = await fixture.getDatabase(); + final batch = db.batch(); + + batch.insert('Product', {'title': 'Product 1'}); + + await batch.commit(); + + final breadcrumb = fixture.hub.scope.breadcrumbs.last; + expect( + breadcrumb.data?[SentryDatabase.dbSystemKey], + SentryDatabase.dbSystem, + ); + expect( + breadcrumb.data?[SentryDatabase.dbNameKey], + (db as SentryDatabase).dbName, + ); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + tearDown(() { databaseFactory = sqfliteDatabaseFactoryDefault; }); @@ -297,6 +597,7 @@ SELECT * FROM Product'''; fixture = Fixture(); when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.scope).thenReturn(fixture.scope); when(fixture.hub.getSpan()).thenReturn(fixture.tracer); }); @@ -316,6 +617,21 @@ SELECT * FROM Product'''; expect(span.origin, SentryTraceOrigins.autoDbSqfliteBatch); }); + test('commit sets batch to internal error if its thrown', () async { + final batch = SentryBatch(fixture.batch, hub: fixture.hub); + + when(fixture.batch.commit()).thenThrow(fixture.exception); + + batch.insert('Product', {'title': 'Product 1'}); + + await expectLater(() async => await batch.commit(), throwsException); + + final breadcrumb = fixture.hub.scope.breadcrumbs.last; + expect(breadcrumb.data?['status'], 'internal_error'); + expect(breadcrumb.type, 'query'); + expect(breadcrumb.level, SentryLevel.warning); + }); + test('apply sets span to internal error if its thrown', () async { final batch = SentryBatch(fixture.batch, hub: fixture.hub); @@ -331,6 +647,21 @@ SELECT * FROM Product'''; // ignore: invalid_use_of_internal_member expect(span.origin, SentryTraceOrigins.autoDbSqfliteBatch); }); + + test('apply sets breadcrumb to internal error if its thrown', () async { + final batch = SentryBatch(fixture.batch, hub: fixture.hub); + + when(fixture.batch.apply()).thenThrow(fixture.exception); + + batch.insert('Product', {'title': 'Product 1'}); + + await expectLater(() async => await batch.apply(), throwsException); + + final breadcrumb = fixture.hub.scope.breadcrumbs.last; + expect(breadcrumb.data?['status'], 'internal_error'); + expect(breadcrumb.type, 'query'); + expect(breadcrumb.level, SentryLevel.warning); + }); }); } @@ -341,6 +672,7 @@ class Fixture { late final tracer = SentryTracer(_context, hub); final batch = MockBatch(); final exception = Exception('error'); + late final scope = Scope(options); Future getDatabase({ double? tracesSampleRate = 1.0, diff --git a/sqflite/test/sentry_database_test.dart b/sqflite/test/sentry_database_test.dart index 3a76d8066e..492da311df 100644 --- a/sqflite/test/sentry_database_test.dart +++ b/sqflite/test/sentry_database_test.dart @@ -26,6 +26,7 @@ void main() { fixture = Fixture(); when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.scope).thenReturn(fixture.scope); when(fixture.hub.getSpan()).thenReturn(fixture.tracer); // using ffi for testing on vm @@ -74,6 +75,17 @@ void main() { ); }); + test('creates close breadcrumb', () async { + final db = await fixture.getSut(); + + await db.close(); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.message, 'Close DB: $inMemoryDatabasePath'); + expect(breadcrumb.category, SentryDatabase.dbOp); + expect(breadcrumb.type, 'query'); + }); + test('creates transaction span', () async { final db = await fixture.getSut(); @@ -84,6 +96,8 @@ void main() { expect(span.context.operation, 'db.sql.transaction'); expect(span.context.description, 'Transaction DB: $inMemoryDatabasePath'); expect(span.status, SpanStatus.ok()); + expect(span.data[SentryDatabase.dbSystemKey], SentryDatabase.dbSystem); + expect(span.data[SentryDatabase.dbNameKey], inMemoryDatabasePath); expect( span.origin, // ignore: invalid_use_of_internal_member @@ -93,6 +107,69 @@ void main() { await db.close(); }); + test('creates readTransaction span', () async { + final db = await fixture.getSut(); + + await db.readTransaction((txn) async { + expect(txn is SentrySqfliteTransaction, true); + }); + final span = fixture.tracer.children.last; + expect(span.context.operation, 'db.sql.read_transaction'); + expect(span.context.description, 'Transaction DB: $inMemoryDatabasePath'); + expect(span.status, SpanStatus.ok()); + expect(span.data[SentryDatabase.dbSystemKey], SentryDatabase.dbSystem); + expect(span.data[SentryDatabase.dbNameKey], inMemoryDatabasePath); + expect( + span.origin, + // ignore: invalid_use_of_internal_member + SentryTraceOrigins.autoDbSqfliteDatabase, + ); + + await db.close(); + }); + + test('creates transaction breadcrumb', () async { + final db = await fixture.getSut(); + + await db.transaction((txn) async { + expect(txn is SentrySqfliteTransaction, true); + }); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.message, 'Transaction DB: $inMemoryDatabasePath'); + expect(breadcrumb.category, 'db.sql.transaction'); + expect(breadcrumb.data?['status'], 'ok'); + expect( + breadcrumb.data?[SentryDatabase.dbSystemKey], + SentryDatabase.dbSystem, + ); + expect(breadcrumb.data?[SentryDatabase.dbNameKey], inMemoryDatabasePath); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + + test('creates readTransaction breadcrumb', () async { + final db = await fixture.getSut(); + + await db.readTransaction((txn) async { + expect(txn is SentrySqfliteTransaction, true); + }); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.message, 'Transaction DB: $inMemoryDatabasePath'); + expect(breadcrumb.category, 'db.sql.read_transaction'); + expect(breadcrumb.data?['status'], 'ok'); + expect( + breadcrumb.data?[SentryDatabase.dbSystemKey], + SentryDatabase.dbSystem, + ); + expect(breadcrumb.data?[SentryDatabase.dbNameKey], inMemoryDatabasePath); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + test('creates transaction children run by the transaction', () async { final db = await fixture.getSut(); @@ -109,6 +186,11 @@ void main() { ); expect(insertSpan.context.parentSpanId, trSpan.context.spanId); expect(insertSpan.status, SpanStatus.ok()); + expect( + insertSpan.data[SentryDatabase.dbSystemKey], + SentryDatabase.dbSystem, + ); + expect(insertSpan.data[SentryDatabase.dbNameKey], inMemoryDatabasePath); expect( insertSpan.origin, @@ -130,6 +212,34 @@ void main() { await db.close(); }); + test('opening db sets currentDbName with :memory:', () async { + final db = await fixture.getSut(); + + expect(db.dbName, ':memory:'); + + await db.close(); + }); + + test('opening db sets currentDbName with db file without extension', + () async { + final db = await fixture.getSut( + database: await openDatabase('path/database/mydatabase.db'), + execute: false, + ); + + expect(db.dbName, 'mydatabase'); + + await db.close(); + }); + + test('closing db sets currentDbName to null', () async { + final db = await fixture.getSut(); + + expect(db.dbName, inMemoryDatabasePath); + + await db.close(); + }); + tearDown(() { databaseFactory = sqfliteDatabaseFactoryDefault; }); @@ -142,6 +252,7 @@ void main() { fixture = Fixture(); when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.scope).thenReturn(fixture.scope); when(fixture.hub.getSpan()).thenReturn(fixture.tracer); when(fixture.database.path).thenReturn('/path/db'); @@ -166,6 +277,19 @@ void main() { ); }); + test('close sets breadcrumb to internal error', () async { + when(fixture.database.close()).thenThrow(fixture.exception); + + final db = await fixture.getSut(database: fixture.database); + + await expectLater(() async => await db.close(), throwsException); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.data?['status'], 'internal_error'); + expect(breadcrumb.type, 'query'); + expect(breadcrumb.level, SentryLevel.warning); + }); + test('transaction sets span to internal error', () async { // ignore: inference_failure_on_function_invocation when(fixture.database.transaction(any)).thenThrow(fixture.exception); @@ -187,6 +311,23 @@ void main() { SentryTraceOrigins.autoDbSqfliteDatabase, ); }); + + test('transaction sets breadcrumb to internal error', () async { + // ignore: inference_failure_on_function_invocation + when(fixture.database.transaction(any)).thenThrow(fixture.exception); + + final db = await fixture.getSut(database: fixture.database); + + await expectLater( + () async => await db.transaction((txn) async {}), + throwsException, + ); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.data?['status'], 'internal_error'); + expect(breadcrumb.type, 'query'); + expect(breadcrumb.level, SentryLevel.warning); + }); }); group('$SentryDatabaseExecutor success', () { @@ -196,6 +337,7 @@ void main() { fixture = Fixture(); when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.scope).thenReturn(fixture.scope); when(fixture.hub.getSpan()).thenReturn(fixture.tracer); // using ffi for testing on vm @@ -212,6 +354,8 @@ void main() { expect(span.context.operation, 'db.sql.execute'); expect(span.context.description, 'DELETE FROM Product'); expect(span.status, SpanStatus.ok()); + expect(span.data[SentryDatabase.dbSystemKey], SentryDatabase.dbSystem); + expect(span.data[SentryDatabase.dbNameKey], inMemoryDatabasePath); expect( span.origin, @@ -222,6 +366,25 @@ void main() { await db.close(); }); + test('creates delete breadcrumb', () async { + final db = await fixture.getSut(); + + await db.delete('Product'); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.category, 'db.sql.execute'); + expect(breadcrumb.message, 'DELETE FROM Product'); + expect(breadcrumb.data?['status'], 'ok'); + expect( + breadcrumb.data?[SentryDatabase.dbSystemKey], + SentryDatabase.dbSystem, + ); + expect(breadcrumb.data?[SentryDatabase.dbNameKey], inMemoryDatabasePath); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + test('creates execute span', () async { final db = await fixture.getSut(); @@ -231,6 +394,8 @@ void main() { expect(span.context.operation, 'db.sql.execute'); expect(span.context.description, 'DELETE FROM Product'); expect(span.status, SpanStatus.ok()); + expect(span.data[SentryDatabase.dbSystemKey], SentryDatabase.dbSystem); + expect(span.data[SentryDatabase.dbNameKey], inMemoryDatabasePath); expect( span.origin, @@ -241,6 +406,25 @@ void main() { await db.close(); }); + test('creates execute breadcrumb', () async { + final db = await fixture.getSut(); + + await db.execute('DELETE FROM Product'); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.category, 'db.sql.execute'); + expect(breadcrumb.message, 'DELETE FROM Product'); + expect(breadcrumb.data?['status'], 'ok'); + expect( + breadcrumb.data?[SentryDatabase.dbSystemKey], + SentryDatabase.dbSystem, + ); + expect(breadcrumb.data?[SentryDatabase.dbNameKey], inMemoryDatabasePath); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + test('creates insert span', () async { final db = await fixture.getSut(); @@ -253,6 +437,8 @@ void main() { 'INSERT INTO Product (title) VALUES (?)', ); expect(span.status, SpanStatus.ok()); + expect(span.data[SentryDatabase.dbSystemKey], SentryDatabase.dbSystem); + expect(span.data[SentryDatabase.dbNameKey], inMemoryDatabasePath); expect( span.origin, @@ -263,6 +449,28 @@ void main() { await db.close(); }); + test('creates insert breadcrumb', () async { + final db = await fixture.getSut(); + + await db.insert('Product', {'title': 'Product 1'}); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.category, 'db.sql.execute'); + expect( + breadcrumb.message, + 'INSERT INTO Product (title) VALUES (?)', + ); + expect(breadcrumb.data?['status'], 'ok'); + expect( + breadcrumb.data?[SentryDatabase.dbSystemKey], + SentryDatabase.dbSystem, + ); + expect(breadcrumb.data?[SentryDatabase.dbNameKey], inMemoryDatabasePath); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + test('creates query span', () async { final db = await fixture.getSut(); @@ -272,6 +480,8 @@ void main() { expect(span.context.operation, 'db.sql.query'); expect(span.context.description, 'SELECT * FROM Product'); expect(span.status, SpanStatus.ok()); + expect(span.data[SentryDatabase.dbSystemKey], SentryDatabase.dbSystem); + expect(span.data[SentryDatabase.dbNameKey], inMemoryDatabasePath); expect( span.origin, @@ -282,6 +492,26 @@ void main() { await db.close(); }); + test('creates query breadcrumb', () async { + final db = await fixture.getSut(); + + await db.query('Product'); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.category, 'db.sql.query'); + expect(breadcrumb.type, 'query'); + expect(breadcrumb.message, 'SELECT * FROM Product'); + expect(breadcrumb.data?['status'], 'ok'); + expect( + breadcrumb.data?[SentryDatabase.dbSystemKey], + SentryDatabase.dbSystem, + ); + expect(breadcrumb.data?[SentryDatabase.dbNameKey], inMemoryDatabasePath); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + test('creates query cursor span', () async { final db = await fixture.getSut(); @@ -291,6 +521,8 @@ void main() { expect(span.context.operation, 'db.sql.query'); expect(span.context.description, 'SELECT * FROM Product'); expect(span.status, SpanStatus.ok()); + expect(span.data[SentryDatabase.dbSystemKey], SentryDatabase.dbSystem); + expect(span.data[SentryDatabase.dbNameKey], inMemoryDatabasePath); expect( span.origin, @@ -301,6 +533,26 @@ void main() { await db.close(); }); + test('creates query cursor breadcrumb', () async { + final db = await fixture.getSut(); + + await db.queryCursor('Product'); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.category, 'db.sql.query'); + expect(breadcrumb.type, 'query'); + expect(breadcrumb.message, 'SELECT * FROM Product'); + expect(breadcrumb.data?['status'], 'ok'); + expect( + breadcrumb.data?[SentryDatabase.dbSystemKey], + SentryDatabase.dbSystem, + ); + expect(breadcrumb.data?[SentryDatabase.dbNameKey], inMemoryDatabasePath); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + test('creates raw delete span', () async { final db = await fixture.getSut(); @@ -310,6 +562,8 @@ void main() { expect(span.context.operation, 'db.sql.execute'); expect(span.context.description, 'DELETE FROM Product'); expect(span.status, SpanStatus.ok()); + expect(span.data[SentryDatabase.dbSystemKey], SentryDatabase.dbSystem); + expect(span.data[SentryDatabase.dbNameKey], inMemoryDatabasePath); expect( span.origin, @@ -320,6 +574,25 @@ void main() { await db.close(); }); + test('creates raw delete breadcrumb', () async { + final db = await fixture.getSut(); + + await db.rawDelete('DELETE FROM Product'); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.category, 'db.sql.execute'); + expect(breadcrumb.message, 'DELETE FROM Product'); + expect(breadcrumb.data?['status'], 'ok'); + expect( + breadcrumb.data?[SentryDatabase.dbSystemKey], + SentryDatabase.dbSystem, + ); + expect(breadcrumb.data?[SentryDatabase.dbNameKey], inMemoryDatabasePath); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + test('creates raw insert span', () async { final db = await fixture.getSut(); @@ -333,6 +606,8 @@ void main() { 'INSERT INTO Product (title) VALUES (?)', ); expect(span.status, SpanStatus.ok()); + expect(span.data[SentryDatabase.dbSystemKey], SentryDatabase.dbSystem); + expect(span.data[SentryDatabase.dbNameKey], inMemoryDatabasePath); expect( span.origin, @@ -343,6 +618,26 @@ void main() { await db.close(); }); + test('creates raw insert breadcrumb', () async { + final db = await fixture.getSut(); + + await db + .rawInsert('INSERT INTO Product (title) VALUES (?)', ['Product 1']); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.category, 'db.sql.execute'); + expect(breadcrumb.message, 'INSERT INTO Product (title) VALUES (?)'); + expect(breadcrumb.data?['status'], 'ok'); + expect( + breadcrumb.data?[SentryDatabase.dbSystemKey], + SentryDatabase.dbSystem, + ); + expect(breadcrumb.data?[SentryDatabase.dbNameKey], inMemoryDatabasePath); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + test('creates raw query span', () async { final db = await fixture.getSut(); @@ -352,6 +647,8 @@ void main() { expect(span.context.operation, 'db.sql.query'); expect(span.context.description, 'SELECT * FROM Product'); expect(span.status, SpanStatus.ok()); + expect(span.data[SentryDatabase.dbSystemKey], SentryDatabase.dbSystem); + expect(span.data[SentryDatabase.dbNameKey], inMemoryDatabasePath); expect( span.origin, @@ -362,6 +659,26 @@ void main() { await db.close(); }); + test('creates raw query breadcrumb', () async { + final db = await fixture.getSut(); + + await db.rawQuery('SELECT * FROM Product'); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.category, 'db.sql.query'); + expect(breadcrumb.type, 'query'); + expect(breadcrumb.message, 'SELECT * FROM Product'); + expect(breadcrumb.data?['status'], 'ok'); + expect( + breadcrumb.data?[SentryDatabase.dbSystemKey], + SentryDatabase.dbSystem, + ); + expect(breadcrumb.data?[SentryDatabase.dbNameKey], inMemoryDatabasePath); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + test('creates raw query cursor span', () async { final db = await fixture.getSut(); @@ -371,6 +688,8 @@ void main() { expect(span.context.operation, 'db.sql.query'); expect(span.context.description, 'SELECT * FROM Product'); expect(span.status, SpanStatus.ok()); + expect(span.data[SentryDatabase.dbSystemKey], SentryDatabase.dbSystem); + expect(span.data[SentryDatabase.dbNameKey], inMemoryDatabasePath); expect( span.origin, @@ -381,6 +700,26 @@ void main() { await db.close(); }); + test('creates raw query cursor breadcrumb', () async { + final db = await fixture.getSut(); + + await db.rawQueryCursor('SELECT * FROM Product', []); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.category, 'db.sql.query'); + expect(breadcrumb.type, 'query'); + expect(breadcrumb.message, 'SELECT * FROM Product'); + expect(breadcrumb.data?['status'], 'ok'); + expect( + breadcrumb.data?[SentryDatabase.dbSystemKey], + SentryDatabase.dbSystem, + ); + expect(breadcrumb.data?[SentryDatabase.dbNameKey], inMemoryDatabasePath); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + test('creates raw update span', () async { final db = await fixture.getSut(); @@ -390,6 +729,8 @@ void main() { expect(span.context.operation, 'db.sql.execute'); expect(span.context.description, 'UPDATE Product SET title = ?'); expect(span.status, SpanStatus.ok()); + expect(span.data[SentryDatabase.dbSystemKey], SentryDatabase.dbSystem); + expect(span.data[SentryDatabase.dbNameKey], inMemoryDatabasePath); expect( span.origin, @@ -400,6 +741,25 @@ void main() { await db.close(); }); + test('creates raw update breadcrumb', () async { + final db = await fixture.getSut(); + + await db.rawUpdate('UPDATE Product SET title = ?', ['Product 1']); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.category, 'db.sql.execute'); + expect(breadcrumb.message, 'UPDATE Product SET title = ?'); + expect(breadcrumb.data?['status'], 'ok'); + expect( + breadcrumb.data?[SentryDatabase.dbSystemKey], + SentryDatabase.dbSystem, + ); + expect(breadcrumb.data?[SentryDatabase.dbNameKey], inMemoryDatabasePath); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + test('creates update span', () async { final db = await fixture.getSut(); @@ -409,6 +769,8 @@ void main() { expect(span.context.operation, 'db.sql.execute'); expect(span.context.description, 'UPDATE Product SET title = ?'); expect(span.status, SpanStatus.ok()); + expect(span.data[SentryDatabase.dbSystemKey], SentryDatabase.dbSystem); + expect(span.data[SentryDatabase.dbNameKey], inMemoryDatabasePath); expect( span.origin, @@ -419,6 +781,25 @@ void main() { await db.close(); }); + test('creates update breadcrumb', () async { + final db = await fixture.getSut(); + + await db.update('Product', {'title': 'Product 1'}); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.category, 'db.sql.execute'); + expect(breadcrumb.message, 'UPDATE Product SET title = ?'); + expect(breadcrumb.data?['status'], 'ok'); + expect( + breadcrumb.data?[SentryDatabase.dbSystemKey], + SentryDatabase.dbSystem, + ); + expect(breadcrumb.data?[SentryDatabase.dbNameKey], inMemoryDatabasePath); + expect(breadcrumb.type, 'query'); + + await db.close(); + }); + tearDown(() { databaseFactory = sqfliteDatabaseFactoryDefault; }); @@ -431,6 +812,7 @@ void main() { fixture = Fixture(); when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.scope).thenReturn(fixture.scope); when(fixture.hub.getSpan()).thenReturn(fixture.tracer); }); @@ -667,6 +1049,185 @@ void main() { SentryTraceOrigins.autoDbSqfliteDatabaseExecutor, ); }); + + test('delete sets breadcrumb to internal error', () async { + when(fixture.executor.delete(any)).thenThrow(fixture.exception); + + final executor = fixture.getExecutorSut(); + + await expectLater( + () async => await executor.delete('Product'), + throwsException, + ); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.data?['status'], 'internal_error'); + expect(breadcrumb.type, 'query'); + expect(breadcrumb.level, SentryLevel.warning); + }); + + test('execute sets breadcrumb to internal error', () async { + when(fixture.executor.execute(any)).thenThrow(fixture.exception); + + final executor = fixture.getExecutorSut(); + + await expectLater( + () async => await executor.execute('sql'), + throwsException, + ); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.data?['status'], 'internal_error'); + expect(breadcrumb.type, 'query'); + expect(breadcrumb.level, SentryLevel.warning); + }); + + test('insert sets breadcrumb to internal error', () async { + when(fixture.executor.insert(any, any)).thenThrow(fixture.exception); + + final executor = fixture.getExecutorSut(); + + await expectLater( + () async => await executor + .insert('Product', {'title': 'Product 1'}), + throwsException, + ); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.data?['status'], 'internal_error'); + expect(breadcrumb.type, 'query'); + expect(breadcrumb.level, SentryLevel.warning); + }); + + test('query sets breadcrumb to internal error', () async { + when(fixture.executor.query(any)).thenThrow(fixture.exception); + + final executor = fixture.getExecutorSut(); + + await expectLater( + () async => await executor.query('sql'), + throwsException, + ); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.data?['status'], 'internal_error'); + expect(breadcrumb.type, 'query'); + expect(breadcrumb.level, SentryLevel.warning); + }); + + test('query cursor sets breadcrumb to internal error', () async { + when(fixture.executor.queryCursor(any)).thenThrow(fixture.exception); + + final executor = fixture.getExecutorSut(); + + await expectLater( + () async => await executor.queryCursor('sql'), + throwsException, + ); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.data?['status'], 'internal_error'); + expect(breadcrumb.type, 'query'); + expect(breadcrumb.level, SentryLevel.warning); + }); + + test('raw delete sets breadcrumb to internal error', () async { + when(fixture.executor.rawDelete(any)).thenThrow(fixture.exception); + + final executor = fixture.getExecutorSut(); + + await expectLater( + () async => await executor.rawDelete('sql'), + throwsException, + ); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.data?['status'], 'internal_error'); + expect(breadcrumb.type, 'query'); + expect(breadcrumb.level, SentryLevel.warning); + }); + + test('raw insert sets breadcrumb to internal error', () async { + when(fixture.executor.rawInsert(any)).thenThrow(fixture.exception); + + final executor = fixture.getExecutorSut(); + + await expectLater( + () async => await executor.rawInsert('sql'), + throwsException, + ); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.data?['status'], 'internal_error'); + expect(breadcrumb.type, 'query'); + expect(breadcrumb.level, SentryLevel.warning); + }); + + test('raw query sets breadcrumb to internal error', () async { + when(fixture.executor.rawQuery(any)).thenThrow(fixture.exception); + + final executor = fixture.getExecutorSut(); + + await expectLater( + () async => await executor.rawQuery('sql'), + throwsException, + ); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.data?['status'], 'internal_error'); + expect(breadcrumb.type, 'query'); + expect(breadcrumb.level, SentryLevel.warning); + }); + + test('raw query cursor sets breadcrumb to internal error', () async { + when(fixture.executor.rawQueryCursor(any, any)) + .thenThrow(fixture.exception); + + final executor = fixture.getExecutorSut(); + + await expectLater( + () async => await executor.rawQueryCursor('sql', []), + throwsException, + ); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.data?['status'], 'internal_error'); + expect(breadcrumb.type, 'query'); + expect(breadcrumb.level, SentryLevel.warning); + }); + + test('raw update sets breadcrumb to internal error', () async { + when(fixture.executor.rawUpdate(any)).thenThrow(fixture.exception); + + final executor = fixture.getExecutorSut(); + + await expectLater( + () async => await executor.rawUpdate('sql'), + throwsException, + ); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.data?['status'], 'internal_error'); + expect(breadcrumb.type, 'query'); + expect(breadcrumb.level, SentryLevel.warning); + }); + + test('update sets breadcrumb to internal error', () async { + when(fixture.executor.update(any, any)).thenThrow(fixture.exception); + + final executor = fixture.getExecutorSut(); + + await expectLater( + () async => await executor + .update('Product', {'title': 'Product 1'}), + throwsException, + ); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.data?['status'], 'internal_error'); + expect(breadcrumb.type, 'query'); + expect(breadcrumb.level, SentryLevel.warning); + }); }); } @@ -678,6 +1239,7 @@ class Fixture { final database = MockDatabase(); final exception = Exception('error'); final executor = MockDatabaseExecutor(); + late final scope = Scope(options); Future getSut({ double? tracesSampleRate = 1.0, diff --git a/sqflite/test/sentry_sqflite_database_factory_dart_test.dart b/sqflite/test/sentry_sqflite_database_factory_dart_test.dart index 61f8aaa9ca..9eeac66734 100644 --- a/sqflite/test/sentry_sqflite_database_factory_dart_test.dart +++ b/sqflite/test/sentry_sqflite_database_factory_dart_test.dart @@ -24,6 +24,7 @@ void main() { fixture = Fixture(); when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.scope).thenReturn(fixture.scope); when(fixture.hub.getSpan()).thenReturn(fixture.tracer); // using ffi for testing on vm @@ -38,6 +39,7 @@ void main() { final db = await openDatabase(inMemoryDatabasePath); expect(db is SentryDatabase, true); + expect((db as SentryDatabase).dbName, inMemoryDatabasePath); await db.close(); }); @@ -56,10 +58,11 @@ void main() { () async { final db = await openDatabase(inMemoryDatabasePath); + expect((db as SentryDatabase).dbName, inMemoryDatabasePath); + final span = fixture.tracer.children.last; expect(span.context.operation, 'db'); expect(span.context.description, 'Open DB: $inMemoryDatabasePath'); - expect(span.context.description, 'Open DB: $inMemoryDatabasePath'); expect( span.origin, @@ -68,6 +71,20 @@ void main() { ); await db.close(); }); + + test('starts and finishes a open db breadcrumb when performance enabled', + () async { + final db = await openDatabase(inMemoryDatabasePath); + + expect((db as SentryDatabase).dbName, inMemoryDatabasePath); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.category, 'db'); + expect(breadcrumb.message, 'Open DB: $inMemoryDatabasePath'); + expect(breadcrumb.data?['status'], 'ok'); + + await db.close(); + }); }); tearDown(() { @@ -80,4 +97,5 @@ class Fixture { final options = SentryOptions(dsn: fakeDsn)..tracesSampleRate = 1.0; final _context = SentryTransactionContext('name', 'operation'); late final tracer = SentryTracer(_context, hub); + late final scope = Scope(options); } diff --git a/sqflite/test/sentry_sqflite_test.dart b/sqflite/test/sentry_sqflite_test.dart index 54ff24232d..27851881b0 100644 --- a/sqflite/test/sentry_sqflite_test.dart +++ b/sqflite/test/sentry_sqflite_test.dart @@ -24,6 +24,7 @@ void main() { fixture = Fixture(); when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.scope).thenReturn(fixture.scope); when(fixture.hub.getSpan()).thenReturn(fixture.tracer); // using ffi for testing on vm @@ -68,6 +69,7 @@ void main() { fixture = Fixture(); when(fixture.hub.options).thenReturn(fixture.options); + when(fixture.hub.scope).thenReturn(fixture.scope); when(fixture.hub.getSpan()).thenReturn(fixture.tracer); // using ffi for testing on vm @@ -97,6 +99,19 @@ void main() { expect(span.status, SpanStatus.ok()); // ignore: invalid_use_of_internal_member expect(span.origin, SentryTraceOrigins.autoDbSqfliteOpenDatabase); + expect((db as SentryDatabase).dbName, inMemoryDatabasePath); + + await db.close(); + }); + + test('creates db open breadcrumb', () async { + final db = + await openDatabaseWithSentry(inMemoryDatabasePath, hub: fixture.hub); + + final breadcrumb = fixture.hub.scope.breadcrumbs.first; + expect(breadcrumb.category, SentryDatabase.dbOp); + expect(breadcrumb.message, 'Open DB: $inMemoryDatabasePath'); + expect(breadcrumb.data?['status'], 'ok'); await db.close(); }); @@ -108,4 +123,5 @@ class Fixture { final options = SentryOptions(dsn: fakeDsn)..tracesSampleRate = 1.0; final _context = SentryTransactionContext('name', 'operation'); late final tracer = SentryTracer(_context, hub); + late final scope = Scope(options); } From fab52ebadc751726f078091a9489bf9a909caaca Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Wed, 31 Jan 2024 14:08:05 +0100 Subject: [PATCH 09/36] chore(v8): update to min ios version 12 (#1821) * update to min ios version 12 * Update CHANGELOG * Update CHANGELOG * Update CHANGELOG * Re-enable iOS flutter integration test * Update CHANGELOG --- .github/workflows/flutter_test.yml | 3 +-- CHANGELOG.md | 3 ++- flutter/example/ios/Podfile | 2 +- flutter/ios/sentry_flutter.podspec | 2 +- min_version_test/ios/Podfile | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/flutter_test.yml b/.github/workflows/flutter_test.yml index 66c8239fcd..4bbe7a5215 100644 --- a/.github/workflows/flutter_test.yml +++ b/.github/workflows/flutter_test.yml @@ -120,8 +120,7 @@ jobs: fail-fast: false matrix: sdk: ["stable", "beta"] - # TODO: remove ios for now, will be fixed in v8 - target: ["macos"] + target: ["ios", "macos"] steps: - name: checkout uses: actions/checkout@v4 diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c1e59ae8a..262bdd0d7e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ### Breaking Changes +- Bump iOS minimum deployment target from **11** to **12** ([#1821](https://github.com/getsentry/sentry-dart/pull/1821)) - Mark exceptions not handled by the user as `handled: false` ([#1535](https://github.com/getsentry/sentry-dart/pull/1535)) - This will affect your release health data, and is therefore considered a breaking change. - Refrain from overwriting the span status for unfinished spans ([#1577](https://github.com/getsentry/sentry-dart/pull/1577)) @@ -16,7 +17,7 @@ - Now the device context from Android is available in `BeforeSendCallback` - Set ip_address to {{auto}} by default, even if sendDefaultPII is disabled ([#1665](https://github.com/getsentry/sentry-dart/pull/1665)) - Instead use the "Prevent Storing of IP Addresses" option in the "Security & Privacy" project settings on sentry.io - + ## 7.16.0 ### Features diff --git a/flutter/example/ios/Podfile b/flutter/example/ios/Podfile index 877d653518..55ddd63416 100644 --- a/flutter/example/ios/Podfile +++ b/flutter/example/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -platform :ios, '11.0' +platform :ios, '12.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' diff --git a/flutter/ios/sentry_flutter.podspec b/flutter/ios/sentry_flutter.podspec index 03220ac7bf..b5cf5dd606 100644 --- a/flutter/ios/sentry_flutter.podspec +++ b/flutter/ios/sentry_flutter.podspec @@ -15,7 +15,7 @@ Sentry SDK for Flutter with support to native through sentry-cocoa. s.dependency 'Sentry/HybridSDK', '8.19.0' s.ios.dependency 'Flutter' s.osx.dependency 'FlutterMacOS' - s.ios.deployment_target = '11.0' + s.ios.deployment_target = '12.0' # Flutter 3.7 requires 10.14 s.osx.deployment_target = '10.13' diff --git a/min_version_test/ios/Podfile b/min_version_test/ios/Podfile index 88359b225f..2c068c404b 100644 --- a/min_version_test/ios/Podfile +++ b/min_version_test/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '11.0' +platform :ios, '12.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' From 69e55ceb7d392b36823fef0b6fcd0a7ee57fc883 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Uek=C3=B6tter?= Date: Mon, 5 Feb 2024 19:28:18 +0100 Subject: [PATCH 10/36] Exception aggregate --- dart/lib/src/protocol/mechanism.dart | 52 ++++++++++++++++++++++++++ dart/test/protocol/mechanism_test.dart | 17 +++++++++ 2 files changed, 69 insertions(+) diff --git a/dart/lib/src/protocol/mechanism.dart b/dart/lib/src/protocol/mechanism.dart index 2c06c954f6..90bfe2cfeb 100644 --- a/dart/lib/src/protocol/mechanism.dart +++ b/dart/lib/src/protocol/mechanism.dart @@ -44,6 +44,38 @@ class Mechanism { /// This may be because they are created at a central place (like a crash handler), and are all called the same: Error, Segfault etc. When the flag is set, Sentry will then try to use other information (top in-app frame function) rather than exception type and value in the UI for the primary event display. This flag should be set for all "segfaults" for instance as every single error group would look very similar otherwise. final bool? synthetic; + /// An optional boolean value, set `true` when the exception is the exception + /// group type specific to the platform or language. + /// The default is false when omitted. + /// For example, exceptions of type (PlatformException)[https://api.flutter.dev/flutter/services/PlatformException-class.html] + /// have set it to `true`, others are set to `false`. + final bool? isExceptionGroup; + + /// An optional string value describing the source of the exception. + /// + /// The SDK should populate this with the name of the property or attribute of + /// the parent exception that this exception was acquired from. + /// In the case of an array, it should include the zero-based array index as + /// well. + final String? source; + + /// An optional numeric value providing an ID for the exception relative to + /// this specific event. + /// + /// The SDK should assign simple incrementing integers to each exception in + /// the tree, starting with 0 for the root of the tree. + /// In other words, when flattened into the list provided in the exception + /// values on the event, the last exception in the list should have ID 0, + /// the previous one should have ID 1, the next previous should have ID 2, etc. + final int? exceptionId; + + /// An optional numeric value pointing at the [exceptionId] that is the parent + /// of this exception. + /// + /// The SDK should assign this to all exceptions except the root exception + /// (the last to be listed in the exception values). + final int? parentId; + Mechanism({ required this.type, this.description, @@ -52,6 +84,10 @@ class Mechanism { this.synthetic, Map? meta, Map? data, + this.isExceptionGroup, + this.source, + this.exceptionId, + this.parentId, }) : _meta = meta != null ? Map.from(meta) : null, _data = data != null ? Map.from(data) : null; @@ -63,6 +99,10 @@ class Mechanism { Map? meta, Map? data, bool? synthetic, + bool? isExceptionGroup, + String? source, + int? exceptionId, + int? parentId, }) => Mechanism( type: type ?? this.type, @@ -72,6 +112,10 @@ class Mechanism { meta: meta ?? this.meta, data: data ?? this.data, synthetic: synthetic ?? this.synthetic, + isExceptionGroup: isExceptionGroup ?? this.isExceptionGroup, + source: source ?? this.source, + exceptionId: exceptionId ?? this.exceptionId, + parentId: parentId ?? this.parentId, ); /// Deserializes a [Mechanism] from JSON [Map]. @@ -94,6 +138,10 @@ class Mechanism { meta: meta, data: data, synthetic: json['synthetic'], + isExceptionGroup: json['is_exception_group'], + source: json['source'], + exceptionId: json['exception_id'], + parentId: json['parent_id'], ); } @@ -107,6 +155,10 @@ class Mechanism { if (_meta?.isNotEmpty ?? false) 'meta': _meta, if (_data?.isNotEmpty ?? false) 'data': _data, if (synthetic != null) 'synthetic': synthetic, + if (isExceptionGroup != null) 'is_exception_group': isExceptionGroup, + if (source != null) 'source': source, + if (exceptionId != null) 'exception_id': exceptionId, + if (parentId != null) 'parent_id': parentId, }; } } diff --git a/dart/test/protocol/mechanism_test.dart b/dart/test/protocol/mechanism_test.dart index 4b484d2ca3..7861f39e43 100644 --- a/dart/test/protocol/mechanism_test.dart +++ b/dart/test/protocol/mechanism_test.dart @@ -11,6 +11,10 @@ void main() { synthetic: true, meta: {'key': 'value'}, data: {'keyb': 'valueb'}, + isExceptionGroup: false, + exceptionId: 0, + parentId: 0, + source: 'source', ); final mechanismJson = { @@ -21,6 +25,10 @@ void main() { 'meta': {'key': 'value'}, 'data': {'keyb': 'valueb'}, 'synthetic': true, + 'isExceptionGroup': true, + 'exceptionId': 0, + 'parentId': 0, + 'source': 'source', }; group('json', () { @@ -51,6 +59,7 @@ void main() { expect(data.toJson(), copy.toJson()); }); + test('copyWith takes new values', () { final data = mechanism; @@ -62,6 +71,10 @@ void main() { synthetic: false, meta: {'key1': 'value1'}, data: {'keyb1': 'valueb1'}, + exceptionId: 1, + parentId: 1, + isExceptionGroup: false, + source: 'foo', ); expect('type1', copy.type); @@ -71,6 +84,10 @@ void main() { expect(false, copy.synthetic); expect({'key1': 'value1'}, copy.meta); expect({'keyb1': 'valueb1'}, copy.data); + expect(1, copy.exceptionId); + expect(1, copy.parentId); + expect(false, copy.isExceptionGroup); + expect('foo', copy.source); }); }); } From 8b62c192afb8b5b92e8587457c62be12317bf80e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Uek=C3=B6tter?= Date: Mon, 5 Feb 2024 19:30:59 +0100 Subject: [PATCH 11/36] changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 262bdd0d7e..5f54221762 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,10 @@ - Now the device context from Android is available in `BeforeSendCallback` - Set ip_address to {{auto}} by default, even if sendDefaultPII is disabled ([#1665](https://github.com/getsentry/sentry-dart/pull/1665)) - Instead use the "Prevent Storing of IP Addresses" option in the "Security & Privacy" project settings on sentry.io + +### Features + +- Add support for exception aggregates ([#xxxx](https://github.com/getsentry/sentry-dart/pull/xxxx)) ## 7.16.0 From c050ff7378f74d55510a665c57dfd930b0a02df3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Uek=C3=B6tter?= Date: Mon, 5 Feb 2024 19:34:47 +0100 Subject: [PATCH 12/36] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f54221762..3a3810f32c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,7 @@ ### Features -- Add support for exception aggregates ([#xxxx](https://github.com/getsentry/sentry-dart/pull/xxxx)) +- Add support for exception aggregates ([#1866](https://github.com/getsentry/sentry-dart/pull/1866)) ## 7.16.0 From 0fb55cfb64063098f7a91f703ae83e508138564e Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Wed, 7 Feb 2024 15:45:06 +0100 Subject: [PATCH 13/36] v8 prep: merge main into 8.0.0 branch (#1871) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ci: update actions (#1617) * Add tests for the Android and iOS plugin (#1587) * Normalize `data` properties of `SentryUser` and `Breadcrumb` before sending over method channel (#1591) * chore(deps): update Cocoa SDK to v8.11.0 (#1626) Co-authored-by: GitHub * Tracing without performance (#1621) * implement propagationContext * remove sampled and parentSpanId for now * update changelog * fix build error * create new propagation context on startTransaction if tracing is disabled * remove print * propagate trace for http requests * add tracing client test * fix tests * format * fix compile * tests * fix analysis score * fix analysis score * fix compilation * fix score * fix score * fix score * fix score * update tests * [starfish] add attributes to db spans data (#1629) * add db attibutes to spans * change variable names * update changelog * update changelog * update tests * update imports * update tests * remove unused import * couple dbName to db instance * format * use path pub * don't set dbName to null when db close() is called * [starfish] add http.request.method attribute to http spans (#1633) * add http.request.method to http spans * update changelog * Fix Android & iOS CI issues (#1627) * Disable scope sync for cloned scopes (#1628) * chore: update flutter/scripts/update-android.sh to 6.29.0 (#1630) Co-authored-by: GitHub * Discard empty stack frames (#1625) * Introduce workflow dispatch action for`format` & `fix --apply` (#1575) * feat/refactor: add cocoa FFI binding (#1631) * refactor: move native code to its own directory (#1638) * Log SDK errors to the console if the log level is `fatal` even if `debug` is disabled (#1635) * Fix autoPerformanceTracingEnabled flag in andorid plugin (#1640) * Add Sampling Decision to Trace Envelope Header (#1639) * add sampled flag * fmt * update changelog * redo fmt * fix tests * chore: update metrics/flutter.properties to 3.13.3 (#1632) Co-authored-by: GitHub * fix: add missing FFI depdendency (#1642) * release: 7.10.1 * ci: macos integration test (#1645) * fix: generated cocoa bindings (#1648) * Update uuid (#1647) Co-authored-by: Ivan Dlugos <6349682+vaind@users.noreply.github.com> * chore(deps): update Cocoa SDK to v8.12.0 (#1650) Co-authored-by: GitHub * Breadcrumbs for file I/O operations (#1649) * ci: don't run CI on markdown updates (#1651) * chore(deps): update Flutter SDK (metrics) to v3.13.6 (#1659) * chore: update metrics/flutter.properties to 3.13.6 * Update flutter.properties --------- Co-authored-by: GitHub Co-authored-by: Stefano * chore: update flutter/scripts/update-android.sh to 6.30.0 (#1660) * chore: update flutter/scripts/update-cocoa.sh to 8.13.0 (#1655) * Generate class diagrams (#1646) * Rename `options.devMode` to `options.automatedTestMode` (#1664) * chore: update flutter/scripts/update-cocoa.sh to 8.13.1 (#1677) Co-authored-by: GitHub * chore: update flutter/scripts/update-android.sh to 6.31.0 (#1676) * chore: update metrics/flutter.properties to 3.13.7 (#1674) Co-authored-by: GitHub * Add dependabot (#1670) * Bump codecov/codecov-action from 3.1.1 to 3.1.4 (#1680) * chore: update flutter/scripts/update-android.sh to 6.32.0 (#1688) Co-authored-by: GitHub * chore(deps): update Cocoa SDK to v8.14.2 (#1691) * chore: update flutter/scripts/update-cocoa.sh to 8.14.2 --------- Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor * chore: update changelog (#1699) * Update changelog * release: 7.11.0 * Bump lints from 2.1.1 to 3.0.0 in /sqflite (#1697) Bumps [lints](https://github.com/dart-lang/lints) from 2.1.1 to 3.0.0. - [Release notes](https://github.com/dart-lang/lints/releases) - [Changelog](https://github.com/dart-lang/lints/blob/main/CHANGELOG.md) - [Commits](https://github.com/dart-lang/lints/compare/v2.1.1...v3.0.0) --- updated-dependencies: - dependency-name: lints dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump lints from 2.1.1 to 3.0.0 in /logging (#1696) Bumps [lints](https://github.com/dart-lang/lints) from 2.1.1 to 3.0.0. - [Release notes](https://github.com/dart-lang/lints/releases) - [Changelog](https://github.com/dart-lang/lints/blob/main/CHANGELOG.md) - [Commits](https://github.com/dart-lang/lints/compare/v2.1.1...v3.0.0) --- updated-dependencies: - dependency-name: lints dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump lints from 2.1.1 to 3.0.0 in /file (#1694) Bumps [lints](https://github.com/dart-lang/lints) from 2.1.1 to 3.0.0. - [Release notes](https://github.com/dart-lang/lints/releases) - [Changelog](https://github.com/dart-lang/lints/blob/main/CHANGELOG.md) - [Commits](https://github.com/dart-lang/lints/compare/v2.1.1...v3.0.0) --- updated-dependencies: - dependency-name: lints dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump lints from 2.1.1 to 3.0.0 in /dio (#1693) Bumps [lints](https://github.com/dart-lang/lints) from 2.1.1 to 3.0.0. - [Release notes](https://github.com/dart-lang/lints/releases) - [Changelog](https://github.com/dart-lang/lints/blob/main/CHANGELOG.md) - [Commits](https://github.com/dart-lang/lints/compare/v2.1.1...v3.0.0) --- updated-dependencies: - dependency-name: lints dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat: profiling for iOS/macOS (#1611) Co-authored-by: Bruno Garcia Co-authored-by: Denis Andrašec Co-authored-by: Stefano * chore: update metrics/flutter.properties to 3.13.9 (#1702) * chore: log warning if both tracesSampleRate and tracesSampler are set (#1701) * Log warning if both tracesSampleRate and tracesSampler are set * Update CHANGELOG * Update log * Update CHANGELOG * chore: flutter symbol collector CLI tool (#1673) * release: 7.12.0 * Add `SentryNavigatorObserver` current route to `event.app.contexts.viewNames` (#1545) * fix: coverage not ignoring generated binding.dart (#1707) * Remove coverage for binding.dart * Breadcrumbs for database operations (#1656) * Bump actions/checkout from 3 to 4 (#1683) Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump ScaCap/action-ktlint from 1.7.1 to 1.8.0 (#1681) Bumps [ScaCap/action-ktlint](https://github.com/scacap/action-ktlint) from 1.7.1 to 1.8.0. - [Release notes](https://github.com/scacap/action-ktlint/releases) - [Commits](https://github.com/scacap/action-ktlint/compare/2cf245b99bc91f73bc4c96a3d9d57bb5da3533ae...0ff81efa49425bd0df46caabd8005aafdc8f2cf2) --- updated-dependencies: - dependency-name: ScaCap/action-ktlint dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump styfle/cancel-workflow-action from 0.11.0 to 0.12.0 (#1682) Bumps [styfle/cancel-workflow-action](https://github.com/styfle/cancel-workflow-action) from 0.11.0 to 0.12.0. - [Release notes](https://github.com/styfle/cancel-workflow-action/releases) - [Commits](https://github.com/styfle/cancel-workflow-action/compare/b173b6ec0100793626c2d9e6b90435061f4fc3e5...01ce38bf961b4e243a6342cbade0dbc8ba3f0432) --- updated-dependencies: - dependency-name: styfle/cancel-workflow-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Stefano Co-authored-by: Giancarlo Buenaflor * Bump dart-lang/setup-dart from 1.3.0 to 1.6.0 (#1692) Bumps [dart-lang/setup-dart](https://github.com/dart-lang/setup-dart) from 1.3.0 to 1.6.0. - [Release notes](https://github.com/dart-lang/setup-dart/releases) - [Changelog](https://github.com/dart-lang/setup-dart/blob/main/CHANGELOG.md) - [Commits](https://github.com/dart-lang/setup-dart/compare/6a218f2413a3e78e9087f638a238f6b40893203d...b64355ae6ca0b5d484f0106a033dd1388965d06d) --- updated-dependencies: - dependency-name: dart-lang/setup-dart dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * chore: update flutter/scripts/update-android.sh to 6.33.0 (#1710) Co-authored-by: GitHub * build(deps): bump subosito/flutter-action from 2.10.0 to 2.12.0 (#1711) Bumps [subosito/flutter-action](https://github.com/subosito/flutter-action) from 2.10.0 to 2.12.0. - [Release notes](https://github.com/subosito/flutter-action/releases) - [Commits](https://github.com/subosito/flutter-action/compare/48cafc24713cca54bbe03cdc3a423187d413aafa...2783a3f08e1baf891508463f8c6653c258246225) --- updated-dependencies: - dependency-name: subosito/flutter-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Add `attachScreenshotOnlyWhenResumed` to options (#1700) * chore: update flutter/scripts/update-android.sh to 6.33.1 (#1713) Co-authored-by: GitHub * chore: update flutter/scripts/update-cocoa.sh to 8.15.0 (#1712) Co-authored-by: GitHub * chore: update flutter/scripts/update-cocoa.sh to 8.15.1 (#1714) Co-authored-by: GitHub * fix: unsupported types with expando (#1690) * Support string, int, double and bool as throwable for expando * Rename the test file and move it to utils folder{ * Remvoe ffi import * Update changelog * Try other url for dio pubspec doc url * Change doc url of logging pubspec * Remove unnecessary code * Update naming * Rename * chore: update flutter/scripts/update-cocoa.sh to 8.15.2 (#1717) Co-authored-by: GitHub * Parse message field in `PlatformException.message` (#1716) * Parse message field * changelog * Update CHANGELOG.md * Bump natiginfo/action-detekt-all from 1.21.0 to 1.23.1 (#1684) * Bump natiginfo/action-detekt-all from 1.21.0 to 1.23.1 Bumps [natiginfo/action-detekt-all](https://github.com/natiginfo/action-detekt-all) from 1.21.0 to 1.23.1. - [Release notes](https://github.com/natiginfo/action-detekt-all/releases) - [Commits](https://github.com/natiginfo/action-detekt-all/compare/e01de6ff0eef7c24131e8a133bf598cfac6ceeab...be3c18799c7c392b2f41a674beed9ced7ae2f21b) --- updated-dependencies: - dependency-name: natiginfo/action-detekt-all dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * fix braces * Add missing trailing comma --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * build(deps): bump natiginfo/action-detekt-all from 1.23.1 to 1.23.3 (#1722) Bumps [natiginfo/action-detekt-all](https://github.com/natiginfo/action-detekt-all) from 1.23.1 to 1.23.3. - [Release notes](https://github.com/natiginfo/action-detekt-all/releases) - [Commits](https://github.com/natiginfo/action-detekt-all/compare/be3c18799c7c392b2f41a674beed9ced7ae2f21b...68eb02dd9f2c2686d5026f5957756064424261a9) --- updated-dependencies: - dependency-name: natiginfo/action-detekt-all dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Remove renderer on Dart:io platforms (#1723) * Remove renderer on dart:io platforms * Tests + changelog * Update CHANGELOG.md * Fix tests * fix more tests * feat: drift apm (#1709) * draft impl * improve code * Add open span * Refactor to extend lazy database * Update * SentryTransactionExecutor * Implement tracing batch and transactions * Update tests * update changelog * Formatting * Update workflows * Update deps * Fix analyze issues * Format * Add example * Update descriptions * Fix deps * Update run commands * Update workflow * Update example * Update workflow * Format * Fix dart analyze * Try changing deps * Add to craft * Change to flutter test * Revert flutter test mock * change dir manually * download and extract sqlite.dll for windows * Try downloading sqlite3 * set up dart * fix path to file * use pub get * Use flutter pub get * fix * skip windows test * fix analyze * fix drift.yml * format * Remove redundant test * Remove debug print * update trace origin * Improvements * Improvements * Add to flutter example * fix: setting the correct locale to contexts with navigatorKey (#1724) * Add localization with navigatorKey * Update CHANGELOG * Update tests * Update tests * Format * Remove unused import * Apply review improvements * Update CHANGELOG * APM for hive (#1672) * setup sentry hive library * Add SentryBox with first test * test added spans * Add sentry hive impl * introduce base box to avoid duplication * implement lazy box test * expose sentry hive and updata documentation * add hive to flutter example app * test throwing in base_box, cleanup * test lazy box error cases * test sentry hive impl failures * run fix & format * fix test failure race condition * add hive workflow, update other workflows * add changelog entry * remove path+provider from dev_dependencies * add coverage dev dependency * fix deprecation warnings * fix changelog * move span wrapping on own class to avoid duplication * add sentry box collection * test added spans, fix imports * test throwing code * fix changelog * change dbSystem value * change db system * remove unneccessary async & await * Fix analyze * Formatting * Add changelog symlink * Ignore hive coverage * Create symlink for dartdoc_options --------- Co-authored-by: Giancarlo Buenaflor * release: 7.13.0 * Fixes release of drift & hive (#1729) * Add integrations * Readd changelog * Add drift and hive to bump versions * Formatting and analyze * Update CHANGELOG and fix test * Update changelog * fix analyze issue * release: 7.13.1 * Fix formatting and analyze ci issues (#1733) * Fix analysis * Update readme * run format * Add drift and hive as craft registry target (#1731) * Add drift and hive as registry target * build(deps): bump dart-lang/setup-dart from 1.3.0 to 1.6.0 (#1743) Bumps [dart-lang/setup-dart](https://github.com/dart-lang/setup-dart) from 1.3.0 to 1.6.0. - [Release notes](https://github.com/dart-lang/setup-dart/releases) - [Changelog](https://github.com/dart-lang/setup-dart/blob/main/CHANGELOG.md) - [Commits](https://github.com/dart-lang/setup-dart/compare/v1.3...b64355ae6ca0b5d484f0106a033dd1388965d06d) --- updated-dependencies: - dependency-name: dart-lang/setup-dart dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): update Android SDK to v6.34.0 (#1746) * chore: update flutter/scripts/update-android.sh to 6.34.0 * Update CHANGELOG --------- Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor * deps: update `package_info_plus` constraints (#1749) * Update constraints * Update CHANGELOG * release: 7.13.2 * build(deps): bump codecov/codecov-action from 3.1.1 to 3.1.4 (#1742) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 3.1.1 to 3.1.4. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v3.1.1...eaaf4bedf32dbdc6b720b63067d99c4d77d6047d) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * build(deps): bump styfle/cancel-workflow-action from 0.11.0 to 0.12.0 (#1741) Bumps [styfle/cancel-workflow-action](https://github.com/styfle/cancel-workflow-action) from 0.11.0 to 0.12.0. - [Release notes](https://github.com/styfle/cancel-workflow-action/releases) - [Commits](https://github.com/styfle/cancel-workflow-action/compare/0.11.0...01ce38bf961b4e243a6342cbade0dbc8ba3f0432) --- updated-dependencies: - dependency-name: styfle/cancel-workflow-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * build(deps): bump actions/checkout from 3 to 4 (#1740) Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * build(deps): bump VeryGoodOpenSource/very_good_coverage (#1739) Bumps [VeryGoodOpenSource/very_good_coverage](https://github.com/verygoodopensource/very_good_coverage) from 2.1.0 to 2.2.0. - [Release notes](https://github.com/verygoodopensource/very_good_coverage/releases) - [Changelog](https://github.com/VeryGoodOpenSource/very_good_coverage/blob/main/CHANGELOG.md) - [Commits](https://github.com/verygoodopensource/very_good_coverage/compare/e5c91bc7ce9843e87c800b3bcafdfb86fbe28491...3b475421464c564c0714d92ce02742bd81fa9eda) --- updated-dependencies: - dependency-name: VeryGoodOpenSource/very_good_coverage dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * chore: update scripts/update-symbol-collector.sh to 1.13.0 (#1737) Co-authored-by: GitHub * chore: update scripts/update-symbol-collector.sh to 1.13.0 (#1754) Co-authored-by: GitHub * Add option to opt out of fatal level for automatically collected errors (#1738) * build(deps): bump natiginfo/action-detekt-all from 1.23.3 to 1.23.4 (#1758) Bumps [natiginfo/action-detekt-all](https://github.com/natiginfo/action-detekt-all) from 1.23.3 to 1.23.4. - [Release notes](https://github.com/natiginfo/action-detekt-all/releases) - [Commits](https://github.com/natiginfo/action-detekt-all/compare/68eb02dd9f2c2686d5026f5957756064424261a9...1349d3d957cba64d7b6b2752ef874d1e03e402a2) --- updated-dependencies: - dependency-name: natiginfo/action-detekt-all dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): update Cocoa SDK to v8.17.0 (#1761) * chore: update flutter/scripts/update-cocoa.sh to 8.17.0 * Apply format --------- Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor * build(deps): bump subosito/flutter-action from 2.10.0 to 2.12.0 (#1759) Bumps [subosito/flutter-action](https://github.com/subosito/flutter-action) from 2.10.0 to 2.12.0. - [Release notes](https://github.com/subosito/flutter-action/releases) - [Commits](https://github.com/subosito/flutter-action/compare/v2.10.0...2783a3f08e1baf891508463f8c6653c258246225) --- updated-dependencies: - dependency-name: subosito/flutter-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * chore: update metrics/flutter.properties to 3.16.1 (#1760) Co-authored-by: GitHub * fix(example): web obfuscation not working (#1766) * Add debug_meta to all events (#1756) * load_image_list_integration now appends debug_meta info to all non-transaction events with a stacktrace, instead of checking for Exception existence * chore: Update README to include drift and hive (#1735) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor Co-authored-by: Giancarlo Buenaflor Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: getsentry-bot Co-authored-by: Denis Andrašec * chore: update metrics/flutter.properties to 3.16.2 (#1769) Co-authored-by: GitHub * chore(deps): update Cocoa SDK to v8.17.1 (#1771) * chore: update flutter/scripts/update-cocoa.sh to 8.17.1 * Formatting --------- Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor * Add `Hive` breadcrumbs (#1773) * improvements(example): fix router navigation issue and add improvements (#1767) * Change http url and add route navigation observer example * Remove comment * Improve sample * Format * Add padding * Fix analyze issues * build(deps): bump actions/setup-java from 3 to 4 (#1772) Bumps [actions/setup-java](https://github.com/actions/setup-java) from 3 to 4. - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/setup-java dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * docs: add new package release process (#1734) * add docs * Add flutter example step * Add analyze info * Update * Update new-package-release-checklist.md * fix(ci): compile error in example using flutter beta channel (#1783) * fix ci * chore(deps): update Cocoa SDK to v8.17.2 (#1787) * chore: update flutter/scripts/update-cocoa.sh to 8.17.2 --------- Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor * chore: update flutter/scripts/update-android.sh to 7.0.0 (#1768) Co-authored-by: GitHub Co-authored-by: Giancarlo Buenaflor * release: 7.14.0 * Add `ConnectivityIntegration` for web (#1765) * Fix changelog (#1791) * build(deps): bump actions/upload-artifact from 3 to 4 (#1789) Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * APM for isar (#1726) * Bump flutter_lints from 2.0.3 to 3.0.0 in /flutter (#1698) * Bump flutter_lints from 2.0.3 to 3.0.0 in /flutter Bumps [flutter_lints](https://github.com/flutter/packages/tree/main/packages) from 2.0.3 to 3.0.0. - [Release notes](https://github.com/flutter/packages/releases) - [Commits](https://github.com/flutter/packages/commits/pigeon-v3.0.0/packages) --- updated-dependencies: - dependency-name: flutter_lints dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Satisfy analyzer * Satisfy dart analyzer --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * chore: update metrics/flutter.properties to 3.16.5 (#1793) Co-authored-by: GitHub * Bump lints from 2.1.1 to 3.0.0 in /dart (#1695) * Bump lints from 2.1.1 to 3.0.0 in /dart Bumps [lints](https://github.com/dart-lang/lints) from 2.1.1 to 3.0.0. - [Release notes](https://github.com/dart-lang/lints/releases) - [Changelog](https://github.com/dart-lang/lints/blob/main/CHANGELOG.md) - [Commits](https://github.com/dart-lang/lints/compare/v2.1.1...v3.0.0) --- updated-dependencies: - dependency-name: lints dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * update --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: GIancarlo Buenaflor * build(deps): bump reactivecircus/android-emulator-runner (#1779) Bumps [reactivecircus/android-emulator-runner](https://github.com/reactivecircus/android-emulator-runner) from 2.28.0 to 2.29.0. - [Release notes](https://github.com/reactivecircus/android-emulator-runner/releases) - [Changelog](https://github.com/ReactiveCircus/android-emulator-runner/blob/main/CHANGELOG.md) - [Commits](https://github.com/reactivecircus/android-emulator-runner/compare/d94c3fbe4fe6a29e4a5ba47c12fb47677c73656b...99a4aac18b4df9b3af66c4a1f04c1f23fa10c270) --- updated-dependencies: - dependency-name: reactivecircus/android-emulator-runner dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * build(deps): bump subosito/flutter-action from 2.10.0 to 2.12.0 (#1796) Bumps [subosito/flutter-action](https://github.com/subosito/flutter-action) from 2.10.0 to 2.12.0. - [Release notes](https://github.com/subosito/flutter-action/releases) - [Commits](https://github.com/subosito/flutter-action/compare/v2.10.0...2783a3f08e1baf891508463f8c6653c258246225) --- updated-dependencies: - dependency-name: subosito/flutter-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat: spotlight support (#1786) * Implement spotlight support (screenshots are currently disabled and removed from the envelope) * build(deps): bump VeryGoodOpenSource/very_good_coverage (#1795) Bumps [VeryGoodOpenSource/very_good_coverage](https://github.com/verygoodopensource/very_good_coverage) from 2.1.0 to 2.2.0. - [Release notes](https://github.com/verygoodopensource/very_good_coverage/releases) - [Changelog](https://github.com/VeryGoodOpenSource/very_good_coverage/blob/main/CHANGELOG.md) - [Commits](https://github.com/verygoodopensource/very_good_coverage/compare/v2.1.0...3b475421464c564c0714d92ce02742bd81fa9eda) --- updated-dependencies: - dependency-name: VeryGoodOpenSource/very_good_coverage dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump actions/setup-java from 3 to 4 (#1797) Bumps [actions/setup-java](https://github.com/actions/setup-java) from 3 to 4. - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/setup-java dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Update Path Filters (#1763) * Add app flavor to `flutter_context` (#1799) * Add app flavor * fix changelog * chore(deps): update Android SDK to v7.1.0 (#1788) * chore: update flutter/scripts/update-android.sh to 7.1.0 * Fix app start * format --------- Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor * Add isar breadcrumbs (#1800) * chore: update flutter/scripts/update-cocoa.sh to 8.18.0 (#1803) Co-authored-by: GitHub * Add `beforeScreenshotCallback` to `SentryFlutterOptions` (#1805) * fix typo in docs (#1816) * chore: update metrics/flutter.properties to 3.16.7 (#1814) Co-authored-by: GitHub * Add support for `readTransaction` in `sqflite` (#1819) * ci: disable some tests temporarily (#1835) * release: 7.15.0 * Accept `Map` in `Hint` class (#1807) * build(deps): bump actions/cache from 3 to 4 (#1833) Bumps [actions/cache](https://github.com/actions/cache) from 3 to 4. - [Release notes](https://github.com/actions/cache/releases) - [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md) - [Commits](https://github.com/actions/cache/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/cache dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * build(deps): bump dart-lang/setup-dart from 1.6.0 to 1.6.1 (#1817) Bumps [dart-lang/setup-dart](https://github.com/dart-lang/setup-dart) from 1.6.0 to 1.6.1. - [Release notes](https://github.com/dart-lang/setup-dart/releases) - [Changelog](https://github.com/dart-lang/setup-dart/blob/main/CHANGELOG.md) - [Commits](https://github.com/dart-lang/setup-dart/compare/b64355ae6ca0b5d484f0106a033dd1388965d06d...ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b) --- updated-dependencies: - dependency-name: dart-lang/setup-dart dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * chore(deps): update Flutter SDK (metrics) to v3.16.8 (#1825) * chore: update metrics/flutter.properties to 3.16.8 * update path --------- Co-authored-by: GitHub Co-authored-by: Giancarlo Buenaflor * feat: tracing without performance for dio (#1837) * feat: tracing without performance for dio * chore: update CHANGELOG.md * chore: reenable testing sentry-dart on windows (#1838) * enable windows again * test with chrome * test with chrome * reenable windows test * chore: add isar to craft (#1843) * add isar * Update Changelog * chore(deps): update Cocoa SDK to v8.19.0 (#1844) * chore: update flutter/scripts/update-cocoa.sh to 8.19.0 --------- Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor * feat: Add sentry widget that includes other sentry widgets (#1846) * add sentry widget * Update CHANGELOG.md * Update CHANGELOG.md * build(deps): bump styfle/cancel-workflow-action from 0.12.0 to 0.12.1 (#1849) Bumps [styfle/cancel-workflow-action](https://github.com/styfle/cancel-workflow-action) from 0.12.0 to 0.12.1. - [Release notes](https://github.com/styfle/cancel-workflow-action/releases) - [Commits](https://github.com/styfle/cancel-workflow-action/compare/01ce38bf961b4e243a6342cbade0dbc8ba3f0432...85880fa0301c86cca9da44039ee3bb12d3bedbfa) --- updated-dependencies: - dependency-name: styfle/cancel-workflow-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump reactivecircus/android-emulator-runner (#1848) Bumps [reactivecircus/android-emulator-runner](https://github.com/reactivecircus/android-emulator-runner) from 2.29.0 to 2.30.1. - [Release notes](https://github.com/reactivecircus/android-emulator-runner/releases) - [Changelog](https://github.com/ReactiveCircus/android-emulator-runner/blob/main/CHANGELOG.md) - [Commits](https://github.com/reactivecircus/android-emulator-runner/compare/99a4aac18b4df9b3af66c4a1f04c1f23fa10c270...6b0df4b0efb23bb0ec63d881db79aefbc976e4b2) --- updated-dependencies: - dependency-name: reactivecircus/android-emulator-runner dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * build(deps): bump codecov/codecov-action from 3.1.4 to 3.1.5 (#1850) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 3.1.4 to 3.1.5. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/eaaf4bedf32dbdc6b720b63067d99c4d77d6047d...4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * chore(deps): update Android SDK to v7.2.0 (#1815) * chore: update flutter/scripts/update-android.sh to 7.2.0 * Update podfile * Update podfile * Update deployment target * update * update --------- Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor * chore(deps): update Flutter SDK (metrics) to v3.16.9 (#1847) * chore: update metrics/flutter.properties to 3.16.9 * update * update --------- Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor * chore(deps): update Symbol collector CLI to v1.14.0 (#1827) * chore: update scripts/update-symbol-collector.sh to 1.14.0 * update --------- Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor * Update CHANGELOG.md (#1845) * chore: update flutter/scripts/update-android.sh to 7.3.0 (#1852) Co-authored-by: GitHub * release: 7.16.0 * chore(sample): Upgrade SAGP to v4.2.0 in the flutter example app (#1860) * build(deps): bump dart-lang/setup-dart from 1.6.1 to 1.6.2 (#1864) Bumps [dart-lang/setup-dart](https://github.com/dart-lang/setup-dart) from 1.6.1 to 1.6.2. - [Release notes](https://github.com/dart-lang/setup-dart/releases) - [Changelog](https://github.com/dart-lang/setup-dart/blob/main/CHANGELOG.md) - [Commits](https://github.com/dart-lang/setup-dart/compare/ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b...fedb1266e91cf51be2fdb382869461a434b920a3) --- updated-dependencies: - dependency-name: dart-lang/setup-dart dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): update Cocoa SDK to v8.20.0 (#1856) * chore: update flutter/scripts/update-cocoa.sh to 8.20.0 * format --------- Co-authored-by: GitHub Co-authored-by: GIancarlo Buenaflor * build(deps): bump natiginfo/action-detekt-all from 1.23.4 to 1.23.5 (#1862) Bumps [natiginfo/action-detekt-all](https://github.com/natiginfo/action-detekt-all) from 1.23.4 to 1.23.5. - [Release notes](https://github.com/natiginfo/action-detekt-all/releases) - [Commits](https://github.com/natiginfo/action-detekt-all/compare/1349d3d957cba64d7b6b2752ef874d1e03e402a2...60495f27089d3432d83335c1f14e46ba61de5637) --- updated-dependencies: - dependency-name: natiginfo/action-detekt-all dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * build(deps): bump codecov/codecov-action from 3.1.5 to 4.0.1 (#1863) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 3.1.5 to 4.0.1. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0...e0b68c6749509c5f83f984dd99a76a1c1a231044) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * chore(android): Remove dead code, cold start bool is now always present (#1861) * chore(android): Remove dead code, cold start bool is now always present * Update CHANGELOG.md --------- Co-authored-by: Giancarlo Buenaflor * chore: update scripts/update-symbol-collector.sh to 1.15.0 (#1853) Co-authored-by: GitHub * build(deps): bump gradle/gradle-build-action from 2 to 3 (#1851) * build(deps): bump gradle/gradle-build-action from 2 to 3 Bumps [gradle/gradle-build-action](https://github.com/gradle/gradle-build-action) from 2 to 3. - [Release notes](https://github.com/gradle/gradle-build-action/releases) - [Commits](https://github.com/gradle/gradle-build-action/compare/v2...v3) --- updated-dependencies: - dependency-name: gradle/gradle-build-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * Update flutter_test.yml --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Giancarlo Buenaflor * chore: update scripts/update-symbol-collector.sh to 1.15.0 (#1869) Co-authored-by: GitHub Co-authored-by: Giancarlo Buenaflor * merge main into release/8.0.0 * update * update * update * update * fix: remove Flutter dep from Drift integration (#1867) * Remove Flutter dep * Update CHANGELOG * Remove unused import * fix * fix * fix * Update flutter_test.yml * Update CHANGELOG.md --------- Signed-off-by: dependabot[bot] Co-authored-by: Ivan Dlugos <6349682+vaind@users.noreply.github.com> Co-authored-by: Denis Andrašec Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: GitHub Co-authored-by: getsentry-bot Co-authored-by: getsentry-bot Co-authored-by: Jonas Uekötter Co-authored-by: Stefano Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Bruno Garcia Co-authored-by: Stefano Co-authored-by: Oleg Magomedov <69794332+smart7even@users.noreply.github.com> Co-authored-by: Igor Khramtsov Co-authored-by: Kryštof Woldřich <31292499+krystofwoldrich@users.noreply.github.com> --- .github/workflows/analyze.yml | 2 +- .github/workflows/dart.yml | 4 ++-- .github/workflows/diagrams.yml | 2 +- .github/workflows/dio.yml | 4 ++-- .github/workflows/drift.yml | 2 +- .github/workflows/e2e_dart.yml | 2 +- .github/workflows/file.yml | 4 ++-- .github/workflows/flutter-symbols.yml | 4 ++-- .github/workflows/flutter.yml | 4 ++-- .github/workflows/flutter_test.yml | 2 +- .github/workflows/format-and-fix.yml | 2 +- .github/workflows/hive.yml | 4 ++-- .github/workflows/isar.yml | 2 +- .github/workflows/logging.yml | 4 ++-- .github/workflows/sqflite.yml | 2 +- CHANGELOG.md | 13 ++++++++++++- drift/README.md | 2 +- drift/pubspec.yaml | 1 - .../kotlin/io/sentry/flutter/SentryFlutterPlugin.kt | 3 --- flutter/example/android/build.gradle | 2 +- flutter/ios/sentry_flutter.podspec | 2 +- hive/README.md | 2 +- .../lib/src/symbol_collector_cli.dart | 2 +- 23 files changed, 39 insertions(+), 32 deletions(-) diff --git a/.github/workflows/analyze.yml b/.github/workflows/analyze.yml index 2db1a28642..28d192a55a 100644 --- a/.github/workflows/analyze.yml +++ b/.github/workflows/analyze.yml @@ -32,7 +32,7 @@ jobs: working-directory: ${{ inputs.package }} steps: - uses: actions/checkout@v4 - - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 + - uses: dart-lang/setup-dart@fedb1266e91cf51be2fdb382869461a434b920a3 # pin@v1 if: ${{ inputs.sdk == 'dart' }} - uses: subosito/flutter-action@2783a3f08e1baf891508463f8c6653c258246225 # pin@v2.12.0 if: ${{ inputs.sdk == 'flutter' }} diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index a8bccd8d82..776d63826c 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -39,7 +39,7 @@ jobs: - os: macos-latest sdk: beta steps: - - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 + - uses: dart-lang/setup-dart@fedb1266e91cf51be2fdb382869461a434b920a3 # pin@v1 with: sdk: ${{ matrix.sdk }} - uses: actions/checkout@v4 @@ -68,7 +68,7 @@ jobs: dart pub get webdev build - - uses: codecov/codecov-action@4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0 # pin@v3 + - uses: codecov/codecov-action@e0b68c6749509c5f83f984dd99a76a1c1a231044 # pin@v3 if: runner.os == 'Linux' && matrix.sdk == 'stable' with: name: sentry diff --git a/.github/workflows/diagrams.yml b/.github/workflows/diagrams.yml index 8b8cee500e..a7671824cf 100644 --- a/.github/workflows/diagrams.yml +++ b/.github/workflows/diagrams.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest name: "Create class diagrams of all packages" steps: - - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 + - uses: dart-lang/setup-dart@fedb1266e91cf51be2fdb382869461a434b920a3 # pin@v1 with: sdk: stable diff --git a/.github/workflows/dio.yml b/.github/workflows/dio.yml index f92f029d98..29f750381d 100644 --- a/.github/workflows/dio.yml +++ b/.github/workflows/dio.yml @@ -40,7 +40,7 @@ jobs: - os: macos-latest sdk: beta steps: - - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 + - uses: dart-lang/setup-dart@fedb1266e91cf51be2fdb382869461a434b920a3 # pin@v1 with: sdk: ${{ matrix.sdk }} - uses: actions/checkout@v4 @@ -52,7 +52,7 @@ jobs: dart test -p vm --coverage=coverage --test-randomize-ordering-seed=random --chain-stack-traces dart pub run coverage:format_coverage --lcov --in=coverage --out=coverage/lcov.info --packages=.dart_tool/package_config.json --report-on=lib - - uses: codecov/codecov-action@4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0 # pin@v3 + - uses: codecov/codecov-action@e0b68c6749509c5f83f984dd99a76a1c1a231044 # pin@v3 if: runner.os == 'Linux' && matrix.sdk == 'stable' with: name: sentry_dio diff --git a/.github/workflows/drift.yml b/.github/workflows/drift.yml index bbd07f905b..b3c8b1dc91 100644 --- a/.github/workflows/drift.yml +++ b/.github/workflows/drift.yml @@ -93,7 +93,7 @@ jobs: cd drift flutter test --coverage --test-randomize-ordering-seed=random - - uses: codecov/codecov-action@4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0 # pin@v3 + - uses: codecov/codecov-action@e0b68c6749509c5f83f984dd99a76a1c1a231044 # pin@v3 if: runner.os == 'Linux' && matrix.sdk == 'stable' && matrix.target == 'linux' with: name: sentry_drift diff --git a/.github/workflows/e2e_dart.yml b/.github/workflows/e2e_dart.yml index bec5e47c95..64a2644940 100644 --- a/.github/workflows/e2e_dart.yml +++ b/.github/workflows/e2e_dart.yml @@ -37,7 +37,7 @@ jobs: matrix: sdk: [stable, beta] steps: - - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 + - uses: dart-lang/setup-dart@fedb1266e91cf51be2fdb382869461a434b920a3 # pin@v1 with: sdk: ${{ matrix.sdk }} - uses: actions/checkout@v4 diff --git a/.github/workflows/file.yml b/.github/workflows/file.yml index d981a7cac5..41c4623324 100644 --- a/.github/workflows/file.yml +++ b/.github/workflows/file.yml @@ -41,7 +41,7 @@ jobs: - os: macos-latest sdk: beta steps: - - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 + - uses: dart-lang/setup-dart@fedb1266e91cf51be2fdb382869461a434b920a3 # pin@v1 with: sdk: ${{ matrix.sdk }} - uses: actions/checkout@v4 @@ -52,7 +52,7 @@ jobs: dart test -p vm --coverage=coverage --test-randomize-ordering-seed=random --chain-stack-traces dart pub run coverage:format_coverage --lcov --in=coverage --out=coverage/lcov.info --packages=.dart_tool/package_config.json --report-on=lib - - uses: codecov/codecov-action@4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0 # pin@v3 + - uses: codecov/codecov-action@e0b68c6749509c5f83f984dd99a76a1c1a231044 # pin@v3 if: runner.os == 'Linux' && matrix.sdk == 'stable' with: name: sentry_file diff --git a/.github/workflows/flutter-symbols.yml b/.github/workflows/flutter-symbols.yml index 4462ccccc8..e9fccdbbbc 100644 --- a/.github/workflows/flutter-symbols.yml +++ b/.github/workflows/flutter-symbols.yml @@ -21,7 +21,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 + - uses: dart-lang/setup-dart@fedb1266e91cf51be2fdb382869461a434b920a3 # pin@v1 - run: dart pub get @@ -33,7 +33,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 + - uses: dart-lang/setup-dart@fedb1266e91cf51be2fdb382869461a434b920a3 # pin@v1 - run: dart pub get diff --git a/.github/workflows/flutter.yml b/.github/workflows/flutter.yml index 4443f84e05..02d9a1f012 100644 --- a/.github/workflows/flutter.yml +++ b/.github/workflows/flutter.yml @@ -106,7 +106,7 @@ jobs: flutter test --coverage --test-randomize-ordering-seed=random dart run remove_from_coverage -f coverage/lcov.info -r 'binding.dart' - - uses: codecov/codecov-action@4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0 # pin@v3 + - uses: codecov/codecov-action@e0b68c6749509c5f83f984dd99a76a1c1a231044 # pin@v3 if: runner.os == 'Linux' && matrix.sdk == 'stable' && matrix.target == 'linux' with: name: sentry_flutter @@ -201,6 +201,6 @@ jobs: steps: - uses: actions/checkout@v4 # To recreate baseline run: detekt -i flutter/android,flutter/example/android -b flutter/config/detekt-bl.xml -cb - - uses: natiginfo/action-detekt-all@1349d3d957cba64d7b6b2752ef874d1e03e402a2 # pin@1.23.4 + - uses: natiginfo/action-detekt-all@60495f27089d3432d83335c1f14e46ba61de5637 # pin@1.23.5 with: args: -i flutter/android,flutter/example/android --baseline flutter/config/detekt-bl.xml --jvm-target 1.8 --build-upon-default-config --all-rules diff --git a/.github/workflows/flutter_test.yml b/.github/workflows/flutter_test.yml index 4bbe7a5215..987897c92b 100644 --- a/.github/workflows/flutter_test.yml +++ b/.github/workflows/flutter_test.yml @@ -54,7 +54,7 @@ jobs: run: flutter pub get - name: Gradle cache - uses: gradle/gradle-build-action@982da8e78c05368c70dac0351bb82647a9e9a5d2 # pin@v2.11.1 + uses: gradle/gradle-build-action@3b1b3b9a2104c2b47fbae53f3938079c00c9bb87 # pin@v3.0.0 - name: AVD cache uses: actions/cache@v4 diff --git a/.github/workflows/format-and-fix.yml b/.github/workflows/format-and-fix.yml index 4f6d96f106..681514d13d 100644 --- a/.github/workflows/format-and-fix.yml +++ b/.github/workflows/format-and-fix.yml @@ -30,7 +30,7 @@ jobs: working-directory: ${{ matrix.package.name }} steps: - uses: actions/checkout@v4 - - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 + - uses: dart-lang/setup-dart@fedb1266e91cf51be2fdb382869461a434b920a3 # pin@v1 if: ${{ matrix.package.sdk == 'dart' }} - uses: subosito/flutter-action@2783a3f08e1baf891508463f8c6653c258246225 # pin@v2.12.0 if: ${{ matrix.package.sdk == 'flutter' }} diff --git a/.github/workflows/hive.yml b/.github/workflows/hive.yml index 5893673318..f13e8d1522 100644 --- a/.github/workflows/hive.yml +++ b/.github/workflows/hive.yml @@ -40,7 +40,7 @@ jobs: - os: macos-latest sdk: beta steps: - - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 + - uses: dart-lang/setup-dart@fedb1266e91cf51be2fdb382869461a434b920a3 # pin@v1 with: sdk: ${{ matrix.sdk }} - uses: actions/checkout@v4 @@ -51,7 +51,7 @@ jobs: dart test -p vm --coverage=coverage --test-randomize-ordering-seed=random --chain-stack-traces dart pub run coverage:format_coverage --lcov --in=coverage --out=coverage/lcov.info --packages=.dart_tool/package_config.json --report-on=lib - - uses: codecov/codecov-action@4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0 # pin@v3 + - uses: codecov/codecov-action@e0b68c6749509c5f83f984dd99a76a1c1a231044 # pin@v3 if: runner.os == 'Linux' && matrix.sdk == 'stable' with: name: sentry_hive diff --git a/.github/workflows/isar.yml b/.github/workflows/isar.yml index f4038421df..a1e67c3bc8 100644 --- a/.github/workflows/isar.yml +++ b/.github/workflows/isar.yml @@ -93,7 +93,7 @@ jobs: cd isar flutter test -j 1 --coverage --test-randomize-ordering-seed=random - - uses: codecov/codecov-action@4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0 # pin@v3 + - uses: codecov/codecov-action@e0b68c6749509c5f83f984dd99a76a1c1a231044 # pin@v3 if: runner.os == 'Linux' && matrix.sdk == 'stable' && matrix.target == 'linux' with: name: sentry_isar diff --git a/.github/workflows/logging.yml b/.github/workflows/logging.yml index 9a3fead839..6eafdc199a 100644 --- a/.github/workflows/logging.yml +++ b/.github/workflows/logging.yml @@ -40,7 +40,7 @@ jobs: - os: macos-latest sdk: beta steps: - - uses: dart-lang/setup-dart@ca7e6fee45ffbd82b555a7ebfc236d2c86439f5b # pin@v1 + - uses: dart-lang/setup-dart@fedb1266e91cf51be2fdb382869461a434b920a3 # pin@v1 with: sdk: ${{ matrix.sdk }} - uses: actions/checkout@v4 @@ -52,7 +52,7 @@ jobs: dart test -p vm --coverage=coverage --test-randomize-ordering-seed=random --chain-stack-traces dart pub run coverage:format_coverage --lcov --in=coverage --out=coverage/lcov.info --packages=.dart_tool/package_config.json --report-on=lib - - uses: codecov/codecov-action@4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0 # pin@v3 + - uses: codecov/codecov-action@e0b68c6749509c5f83f984dd99a76a1c1a231044 # pin@v3 if: runner.os == 'Linux' && matrix.sdk == 'stable' with: name: sentry_logging diff --git a/.github/workflows/sqflite.yml b/.github/workflows/sqflite.yml index a94c31475f..9d3caa78bd 100644 --- a/.github/workflows/sqflite.yml +++ b/.github/workflows/sqflite.yml @@ -93,7 +93,7 @@ jobs: cd sqflite flutter test --coverage --test-randomize-ordering-seed=random - - uses: codecov/codecov-action@4fe8c5f003fae66aa5ebb77cfd3e7bfbbda0b6b0 # pin@v3 + - uses: codecov/codecov-action@e0b68c6749509c5f83f984dd99a76a1c1a231044 # pin@v3 if: runner.os == 'Linux' && matrix.sdk == 'stable' && matrix.target == 'linux' with: name: sentry_sqflite diff --git a/CHANGELOG.md b/CHANGELOG.md index 262bdd0d7e..875e2beade 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## 8.0.0 +## Unreleased ### Breaking Changes @@ -18,6 +18,17 @@ - Set ip_address to {{auto}} by default, even if sendDefaultPII is disabled ([#1665](https://github.com/getsentry/sentry-dart/pull/1665)) - Instead use the "Prevent Storing of IP Addresses" option in the "Security & Privacy" project settings on sentry.io +### Fixes + +- Remove Flutter dependency from Drift integration ([#1867](https://github.com/getsentry/sentry-dart/pull/1867)) +- Remove dead code, cold start bool is now always present ([#1861](https://github.com/getsentry/sentry-dart/pull/1861)) + +### Dependencies + +- Bump Cocoa SDK from v8.19.0 to v8.20.0 ([#1856](https://github.com/getsentry/sentry-dart/pull/1856)) + - [changelog](https://github.com/getsentry/sentry-cocoa/blob/main/CHANGELOG.md#8200) + - [diff](https://github.com/getsentry/sentry-cocoa/compare/8.19.0...8.20.0) + ## 7.16.0 ### Features diff --git a/drift/README.md b/drift/README.md index 2a572aba02..57b335700a 100644 --- a/drift/README.md +++ b/drift/README.md @@ -79,4 +79,4 @@ Future runApp() async { * [![Discussions](https://img.shields.io/github/discussions/getsentry/sentry-dart.svg)](https://github.com/getsentry/sentry-dart/discussions) * [![Discord Chat](https://img.shields.io/discord/621778831602221064?logo=discord&logoColor=ffffff&color=7389D8)](https://discord.gg/PXa5Apfe7K) * [![Stack Overflow](https://img.shields.io/badge/stack%20overflow-sentry-green.svg)](https://stackoverflow.com/questions/tagged/sentry) -* [![Twitter Follow](https://img.shields.io/twitter/follow/getsentry?label=getsentry&style=social)](https://twitter.com/intent/follow?screen_name=getsentry) \ No newline at end of file +* [![Twitter Follow](https://img.shields.io/twitter/follow/getsentry?label=getsentry&style=social)](https://twitter.com/intent/follow?screen_name=getsentry) diff --git a/drift/pubspec.yaml b/drift/pubspec.yaml index 92323b4f63..93a854043f 100644 --- a/drift/pubspec.yaml +++ b/drift/pubspec.yaml @@ -7,7 +7,6 @@ issue_tracker: https://github.com/getsentry/sentry-dart/issues environment: sdk: '>=2.17.0 <4.0.0' - flutter: '>=3.3.0' dependencies: sentry: 7.16.0 diff --git a/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt b/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt index 602253bbb3..5aad15a0b3 100644 --- a/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt +++ b/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt @@ -134,9 +134,6 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { if (appStartTime == null) { Log.w("Sentry", "App start won't be sent due to missing appStartTime") result.success(null) - } else if (isColdStart == null) { - Log.w("Sentry", "App start won't be sent due to missing isColdStart") - result.success(null) } else { val appStartTimeMillis = DateUtils.nanosToMillis(appStartTime.nanoTimestamp().toDouble()) val item = mapOf( diff --git a/flutter/example/android/build.gradle b/flutter/example/android/build.gradle index e628374358..50bb21eda7 100644 --- a/flutter/example/android/build.gradle +++ b/flutter/example/android/build.gradle @@ -7,7 +7,7 @@ buildscript { } dependencies { - classpath 'io.sentry:sentry-android-gradle-plugin:3.5.0' + classpath 'io.sentry:sentry-android-gradle-plugin:4.2.0' classpath 'com.android.tools.build:gradle:7.2.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'io.github.howardpang:androidNativeBundle:1.1.3' diff --git a/flutter/ios/sentry_flutter.podspec b/flutter/ios/sentry_flutter.podspec index b5cf5dd606..ff0d593ea2 100644 --- a/flutter/ios/sentry_flutter.podspec +++ b/flutter/ios/sentry_flutter.podspec @@ -12,7 +12,7 @@ Sentry SDK for Flutter with support to native through sentry-cocoa. :tag => s.version.to_s } s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' - s.dependency 'Sentry/HybridSDK', '8.19.0' + s.dependency 'Sentry/HybridSDK', '8.20.0' s.ios.dependency 'Flutter' s.osx.dependency 'FlutterMacOS' s.ios.deployment_target = '12.0' diff --git a/hive/README.md b/hive/README.md index 14f26d9ce8..b67e9e4f7b 100644 --- a/hive/README.md +++ b/hive/README.md @@ -83,4 +83,4 @@ class Person { * [![Discussions](https://img.shields.io/github/discussions/getsentry/sentry-dart.svg)](https://github.com/getsentry/sentry-dart/discussions) * [![Discord Chat](https://img.shields.io/discord/621778831602221064?logo=discord&logoColor=ffffff&color=7389D8)](https://discord.gg/PXa5Apfe7K) * [![Stack Overflow](https://img.shields.io/badge/stack%20overflow-sentry-green.svg)](https://stackoverflow.com/questions/tagged/sentry) -* [![Twitter Follow](https://img.shields.io/twitter/follow/getsentry?label=getsentry&style=social)](https://twitter.com/intent/follow?screen_name=getsentry) \ No newline at end of file +* [![Twitter Follow](https://img.shields.io/twitter/follow/getsentry?label=getsentry&style=social)](https://twitter.com/intent/follow?screen_name=getsentry) diff --git a/scripts/flutter_symbol_collector/lib/src/symbol_collector_cli.dart b/scripts/flutter_symbol_collector/lib/src/symbol_collector_cli.dart index 1d4e29a66a..c3ab23ee83 100644 --- a/scripts/flutter_symbol_collector/lib/src/symbol_collector_cli.dart +++ b/scripts/flutter_symbol_collector/lib/src/symbol_collector_cli.dart @@ -19,7 +19,7 @@ class SymbolCollectorCli { // https://github.com/getsentry/symbol-collector/releases @internal - static const version = '1.14.0'; + static const version = '1.15.0'; @internal late final String cli; From 9c32a6bb61e2ea399399ecd3c2f7f1c3f3cae642 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Uek=C3=B6tter?= Date: Thu, 8 Feb 2024 11:26:48 +0100 Subject: [PATCH 14/36] fix json keys in test --- dart/test/protocol/mechanism_test.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dart/test/protocol/mechanism_test.dart b/dart/test/protocol/mechanism_test.dart index 7861f39e43..857a0529a9 100644 --- a/dart/test/protocol/mechanism_test.dart +++ b/dart/test/protocol/mechanism_test.dart @@ -25,10 +25,10 @@ void main() { 'meta': {'key': 'value'}, 'data': {'keyb': 'valueb'}, 'synthetic': true, - 'isExceptionGroup': true, - 'exceptionId': 0, - 'parentId': 0, + 'is_exception_group': false, 'source': 'source', + 'exception_id': 0, + 'parent_id': 0, }; group('json', () { From 90c63b98ccc7615c85cac5cb2f8c1b50ef1e18a2 Mon Sep 17 00:00:00 2001 From: getsentry-bot Date: Thu, 8 Feb 2024 13:27:18 +0000 Subject: [PATCH 15/36] release: 8.0.0-beta.2 --- CHANGELOG.md | 2 +- dart/lib/src/version.dart | 2 +- dart/pubspec.yaml | 2 +- dio/lib/src/version.dart | 2 +- dio/pubspec.yaml | 4 ++-- drift/lib/src/version.dart | 2 +- drift/pubspec.yaml | 4 ++-- file/lib/src/version.dart | 2 +- file/pubspec.yaml | 4 ++-- flutter/example/pubspec.yaml | 2 +- flutter/lib/src/version.dart | 2 +- flutter/pubspec.yaml | 4 ++-- hive/lib/src/version.dart | 2 +- hive/pubspec.yaml | 4 ++-- isar/lib/src/version.dart | 2 +- isar/pubspec.yaml | 4 ++-- logging/lib/src/version.dart | 2 +- logging/pubspec.yaml | 4 ++-- sqflite/lib/src/version.dart | 2 +- sqflite/pubspec.yaml | 4 ++-- 20 files changed, 28 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 875e2beade..1d894c3cc1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## Unreleased +## 8.0.0-beta.2 ### Breaking Changes diff --git a/dart/lib/src/version.dart b/dart/lib/src/version.dart index c29bdd09cb..bdb02727e3 100644 --- a/dart/lib/src/version.dart +++ b/dart/lib/src/version.dart @@ -9,7 +9,7 @@ library version; /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '7.16.0'; +const String sdkVersion = '8.0.0-beta.2'; String sdkName(bool isWeb) => isWeb ? _browserSdkName : _ioSdkName; diff --git a/dart/pubspec.yaml b/dart/pubspec.yaml index 1cc9bf8c75..39d5649e85 100644 --- a/dart/pubspec.yaml +++ b/dart/pubspec.yaml @@ -1,5 +1,5 @@ name: sentry -version: 7.16.0 +version: 8.0.0-beta.2 description: > A crash reporting library for Dart that sends crash reports to Sentry.io. This library supports Dart VM and Web. For Flutter consider sentry_flutter instead. diff --git a/dio/lib/src/version.dart b/dio/lib/src/version.dart index 175e956f04..09f988c99f 100644 --- a/dio/lib/src/version.dart +++ b/dio/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '7.16.0'; +const String sdkVersion = '8.0.0-beta.2'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_dio'; diff --git a/dio/pubspec.yaml b/dio/pubspec.yaml index e1f02a0123..907f5db0d9 100644 --- a/dio/pubspec.yaml +++ b/dio/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_dio description: An integration which adds support for performance tracing for the Dio package. -version: 7.16.0 +version: 8.0.0-beta.2 homepage: https://docs.sentry.io/platforms/dart/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues @@ -11,7 +11,7 @@ environment: dependencies: dio: ^5.0.0 - sentry: 7.16.0 + sentry: 8.0.0-beta.2 dev_dependencies: meta: ^1.3.0 diff --git a/drift/lib/src/version.dart b/drift/lib/src/version.dart index 2795a157be..943581141a 100644 --- a/drift/lib/src/version.dart +++ b/drift/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '7.16.0'; +const String sdkVersion = '8.0.0-beta.2'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_drift'; diff --git a/drift/pubspec.yaml b/drift/pubspec.yaml index 93a854043f..bc6968b930 100644 --- a/drift/pubspec.yaml +++ b/drift/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_drift description: An integration which adds support for performance tracing for the drift package. -version: 7.16.0 +version: 8.0.0-beta.2 homepage: https://docs.sentry.io/platforms/flutter/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues @@ -9,7 +9,7 @@ environment: sdk: '>=2.17.0 <4.0.0' dependencies: - sentry: 7.16.0 + sentry: 8.0.0-beta.2 meta: ^1.3.0 drift: ^2.13.0 diff --git a/file/lib/src/version.dart b/file/lib/src/version.dart index a2a31b3a5e..bb1465efca 100644 --- a/file/lib/src/version.dart +++ b/file/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '7.16.0'; +const String sdkVersion = '8.0.0-beta.2'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_file'; diff --git a/file/pubspec.yaml b/file/pubspec.yaml index 509e596a13..7d7ceca48d 100644 --- a/file/pubspec.yaml +++ b/file/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_file description: An integration which adds support for performance tracing for dart.io.File. -version: 7.16.0 +version: 8.0.0-beta.2 homepage: https://docs.sentry.io/platforms/dart/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues @@ -10,7 +10,7 @@ environment: sdk: '>=2.19.0 <4.0.0' dependencies: - sentry: 7.16.0 + sentry: 8.0.0-beta.2 meta: ^1.3.0 dev_dependencies: diff --git a/flutter/example/pubspec.yaml b/flutter/example/pubspec.yaml index 6530b23e99..0f3c2531d6 100644 --- a/flutter/example/pubspec.yaml +++ b/flutter/example/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_flutter_example description: Demonstrates how to use the sentry_flutter plugin. -version: 7.16.0 +version: 8.0.0-beta.2 publish_to: 'none' # Remove this line if you wish to publish to pub.dev diff --git a/flutter/lib/src/version.dart b/flutter/lib/src/version.dart index 078ad6a08f..9e21e0ddc6 100644 --- a/flutter/lib/src/version.dart +++ b/flutter/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '7.16.0'; +const String sdkVersion = '8.0.0-beta.2'; /// The default SDK name reported to Sentry.io in the submitted events. const String sdkName = 'sentry.dart.flutter'; diff --git a/flutter/pubspec.yaml b/flutter/pubspec.yaml index 9757dbd698..3fbe65a8d9 100644 --- a/flutter/pubspec.yaml +++ b/flutter/pubspec.yaml @@ -1,5 +1,5 @@ name: sentry_flutter -version: 7.16.0 +version: 8.0.0-beta.2 description: Sentry SDK for Flutter. This package aims to support different Flutter targets by relying on the many platforms supported by Sentry with native SDKs. homepage: https://docs.sentry.io/platforms/flutter/ repository: https://github.com/getsentry/sentry-dart @@ -15,7 +15,7 @@ dependencies: sdk: flutter flutter_web_plugins: sdk: flutter - sentry: 7.16.0 + sentry: 8.0.0-beta.2 package_info_plus: '>=1.0.0 <=5.0.1' meta: ^1.3.0 ffi: ^2.0.0 diff --git a/hive/lib/src/version.dart b/hive/lib/src/version.dart index ac6247b5a5..baf09bd22c 100644 --- a/hive/lib/src/version.dart +++ b/hive/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '7.16.0'; +const String sdkVersion = '8.0.0-beta.2'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_hive'; diff --git a/hive/pubspec.yaml b/hive/pubspec.yaml index cbcb5b16e6..a85fbfa6b1 100644 --- a/hive/pubspec.yaml +++ b/hive/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_hive description: An integration which adds support for performance tracing for the hive package. -version: 7.16.0 +version: 8.0.0-beta.2 homepage: https://docs.sentry.io/platforms/flutter/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues @@ -9,7 +9,7 @@ environment: sdk: '>=2.17.0 <4.0.0' dependencies: - sentry: 7.16.0 + sentry: 8.0.0-beta.2 hive: ^2.2.3 meta: ^1.3.0 diff --git a/isar/lib/src/version.dart b/isar/lib/src/version.dart index 0e551e8349..00585644d2 100644 --- a/isar/lib/src/version.dart +++ b/isar/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '7.16.0'; +const String sdkVersion = '8.0.0-beta.2'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_isar'; diff --git a/isar/pubspec.yaml b/isar/pubspec.yaml index 81770c4d52..b02d01d8cd 100644 --- a/isar/pubspec.yaml +++ b/isar/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_isar description: An integration which adds support for performance tracing for the isar package. -version: 7.16.0 +version: 8.0.0-beta.2 homepage: https://docs.sentry.io/platforms/flutter/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues @@ -12,7 +12,7 @@ environment: dependencies: isar: ^3.1.0 isar_flutter_libs: ^3.1.0 # contains Isar Core - sentry: 7.16.0 + sentry: 8.0.0-beta.2 meta: ^1.3.0 path: ^1.8.3 diff --git a/logging/lib/src/version.dart b/logging/lib/src/version.dart index 47dc6b25a2..0a22407553 100644 --- a/logging/lib/src/version.dart +++ b/logging/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '7.16.0'; +const String sdkVersion = '8.0.0-beta.2'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_logging'; diff --git a/logging/pubspec.yaml b/logging/pubspec.yaml index 97e888064b..dbc1a60181 100644 --- a/logging/pubspec.yaml +++ b/logging/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_logging description: An integration which adds support for recording log from the logging package. -version: 7.16.0 +version: 8.0.0-beta.2 homepage: https://docs.sentry.io/platforms/dart/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues @@ -11,7 +11,7 @@ environment: dependencies: logging: ^1.0.0 - sentry: 7.16.0 + sentry: 8.0.0-beta.2 dev_dependencies: lints: ^3.0.0 diff --git a/sqflite/lib/src/version.dart b/sqflite/lib/src/version.dart index 6982ffcf1f..862746f22e 100644 --- a/sqflite/lib/src/version.dart +++ b/sqflite/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '7.16.0'; +const String sdkVersion = '8.0.0-beta.2'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_sqflite'; diff --git a/sqflite/pubspec.yaml b/sqflite/pubspec.yaml index 4fae66faf9..5f8d07ff42 100644 --- a/sqflite/pubspec.yaml +++ b/sqflite/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_sqflite description: An integration which adds support for performance tracing for the sqflite package. -version: 7.16.0 +version: 8.0.0-beta.2 homepage: https://docs.sentry.io/platforms/flutter/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues @@ -10,7 +10,7 @@ environment: flutter: '>=3.3.0' # matching sqflite dependencies: - sentry: 7.16.0 + sentry: 8.0.0-beta.2 sqflite: ^2.0.0 sqflite_common: ^2.0.0 meta: ^1.3.0 From 89c8e41e1e519354f74144d99a0e8290ef58f3d7 Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Thu, 8 Feb 2024 14:59:38 +0100 Subject: [PATCH 16/36] Update CHANGELOG --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d894c3cc1..7980861e01 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,10 @@ - [changelog](https://github.com/getsentry/sentry-cocoa/blob/main/CHANGELOG.md#8200) - [diff](https://github.com/getsentry/sentry-cocoa/compare/8.19.0...8.20.0) +## 8.0.0-beta.1 + +This release is replaced by `8.0.0-beta.2` + ## 7.16.0 ### Features From fafbc8abff67c80c430cb9bcbacaf9cac18b7a36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Uek=C3=B6tter?= Date: Wed, 14 Feb 2024 19:17:21 +0100 Subject: [PATCH 17/36] Update dart/lib/src/protocol/mechanism.dart --- dart/lib/src/protocol/mechanism.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dart/lib/src/protocol/mechanism.dart b/dart/lib/src/protocol/mechanism.dart index 90bfe2cfeb..22a6356800 100644 --- a/dart/lib/src/protocol/mechanism.dart +++ b/dart/lib/src/protocol/mechanism.dart @@ -47,7 +47,7 @@ class Mechanism { /// An optional boolean value, set `true` when the exception is the exception /// group type specific to the platform or language. /// The default is false when omitted. - /// For example, exceptions of type (PlatformException)[https://api.flutter.dev/flutter/services/PlatformException-class.html] + /// For example, exceptions of type [PlatformException](https://api.flutter.dev/flutter/services/PlatformException-class.html) /// have set it to `true`, others are set to `false`. final bool? isExceptionGroup; From b7fef824e2c3f75011c0d31b5fbb6a0978e58875 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Uek=C3=B6tter?= Date: Thu, 8 Feb 2024 11:22:52 +0100 Subject: [PATCH 18/36] wip --- ...id_platform_exception_event_processor.dart | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/flutter/lib/src/event_processor/android_platform_exception_event_processor.dart b/flutter/lib/src/event_processor/android_platform_exception_event_processor.dart index 6570dedd81..51e238ca1f 100644 --- a/flutter/lib/src/event_processor/android_platform_exception_event_processor.dart +++ b/flutter/lib/src/event_processor/android_platform_exception_event_processor.dart @@ -95,9 +95,22 @@ class AndroidPlatformExceptionEventProcessor implements EventProcessor { jvmThreads.add(first); } + final eventExceptions = event.exceptions?.map((e) { + if (event.throwable is! PlatformException) { + return e; + } + return e.copyWith( + mechanism: Mechanism( + type: 'chained', + exceptionId: jvmExceptions.length, + parentId: 0, + ), + ); + }); + return event.copyWith( exceptions: [ - ...?event.exceptions, + ...?eventExceptions, ...jvmExceptions, ], threads: [ @@ -140,15 +153,18 @@ class _JvmExceptionFactory { ...?jvmException.suppressed, ]; - return jvmExceptions.map((exception) { - return exception.toSentryException(nativePackageName); + return jvmExceptions.asMap().entries.map((indexedException) { + return indexedException.value + .toSentryException(nativePackageName, indexedException.key); }).toList(growable: false); } } extension on JvmException { MapEntry toSentryException( - String nativePackageName) { + String nativePackageName, + int index, + ) { String? exceptionType; String? module; final typeParts = type?.split('.'); @@ -170,6 +186,12 @@ extension on JvmException { stackTrace: SentryStackTrace( frames: stackFrames.reversed.toList(growable: false), ), + mechanism: Mechanism( + type: index == 0 ? "sentry-flutter" : "chained", + exceptionId: index, + parentId: index == 0 ? null : index - 1, + isExceptionGroup: index == 0 ? true : null, + ), ); String threadName; From 60750210f600e523521f0ac6a75038ed9fcb919e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denis=20Andra=C5=A1ec?= Date: Wed, 10 Apr 2024 09:34:07 +0000 Subject: [PATCH 19/36] Testflight (#1938) * Setup testflight against v8 branch * enable run on pr * run on push * make executable * fix beta version number * push on main, release and workflow update * bump xcode default version to 15.0.1 * add newline * Add ITSAppUsesNonExemptEncryption to info.plist * select with xcodes * fix file extension * fix warnings * use correct property to remove warning * Update ktlint --------- Co-authored-by: GIancarlo Buenaflor --- .github/workflows/flutter.yml | 2 +- .github/workflows/testflight.yml | 57 +++++++++++ .../ios/Flutter/AppFrameworkInfo.plist | 2 +- flutter/example/ios/Gemfile | 3 + flutter/example/ios/Podfile | 2 +- .../ios/Runner.xcodeproj/project.pbxproj | 21 ++-- flutter/example/ios/Runner/Info.plist | 10 +- flutter/example/ios/fastlane/Appfile | 7 ++ flutter/example/ios/fastlane/Fastfile | 95 +++++++++++++++++++ flutter/example/ios/fastlane/Matchfile | 5 + flutter/example/lib/main.dart | 28 +----- 11 files changed, 192 insertions(+), 40 deletions(-) create mode 100644 .github/workflows/testflight.yml create mode 100644 flutter/example/ios/Gemfile create mode 100644 flutter/example/ios/fastlane/Appfile create mode 100644 flutter/example/ios/fastlane/Fastfile create mode 100644 flutter/example/ios/fastlane/Matchfile diff --git a/.github/workflows/flutter.yml b/.github/workflows/flutter.yml index 02d9a1f012..7a4ee5df84 100644 --- a/.github/workflows/flutter.yml +++ b/.github/workflows/flutter.yml @@ -188,7 +188,7 @@ jobs: - uses: actions/checkout@v4 - name: ktlint - uses: ScaCap/action-ktlint@0ff81efa49425bd0df46caabd8005aafdc8f2cf2 # pin@1.8.0 + uses: ScaCap/action-ktlint@38262d0fb8bff43ddafc8b3c04bce6e6c7263319 # pin@1.8.1 with: github_token: ${{ secrets.github_token }} reporter: github-pr-review diff --git a/.github/workflows/testflight.yml b/.github/workflows/testflight.yml new file mode 100644 index 0000000000..3e05b6afbb --- /dev/null +++ b/.github/workflows/testflight.yml @@ -0,0 +1,57 @@ +name: Upload to Testflight +on: + push: + branches: + - main + - release/** + pull_request: + paths: + - '.github/workflows/testflight.yml' + +jobs: + upload_to_testflight: + name: Build and Upload to Testflight + runs-on: macos-13 + steps: + - uses: actions/checkout@v4 + - uses: subosito/flutter-action@48cafc24713cca54bbe03cdc3a423187d413aafa # pin@v2.10.0 + - run: xcodes select 15.0.1 + - uses: ruby/setup-ruby@250fcd6a742febb1123a77a841497ccaa8b9e939 # pin@v1.152.0 + with: + ruby-version: '2.7.5' + bundler-cache: true + + - name: flutter + working-directory: ./flutter/example + run: | + flutter upgrade + flutter pub get + flutter build ios --no-codesign + + - name: Install Fastlane + working-directory: ./flutter/example/ios + run: bundle install + + - name: Bump, Build & Upload App to TestFlight + working-directory: ./flutter/example/ios + env: + APP_STORE_CONNECT_KEY_ID: ${{ secrets.APP_STORE_CONNECT_KEY_ID }} + APP_STORE_CONNECT_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_ISSUER_ID }} + APP_STORE_CONNECT_KEY: ${{ secrets.APP_STORE_CONNECT_KEY }} + FASTLANE_BUNDLE_VERSION: ${{ github.run_number }} + FASTLANE_KEYCHAIN_PASSWORD: ${{ secrets.FASTLANE_KEYCHAIN_PASSWORD }} + MATCH_GIT_PRIVATE_KEY: ${{ secrets.MATCH_GIT_PRIVATE_KEY }} + MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} + MATCH_USERNAME: ${{ secrets.MATCH_USERNAME }} + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + SENTRY_LOG_LEVEL: DEBUG + run: | + bundle exec fastlane bump_build_number + bundle exec fastlane build_release + bundle exec fastlane upload_testflight + + - name: Upload Symbols to Sentry + working-directory: ./flutter/example + env: + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + run: flutter packages pub run sentry_dart_plugin \ No newline at end of file diff --git a/flutter/example/ios/Flutter/AppFrameworkInfo.plist b/flutter/example/ios/Flutter/AppFrameworkInfo.plist index 1bdf525f9f..b7506dd05b 100644 --- a/flutter/example/ios/Flutter/AppFrameworkInfo.plist +++ b/flutter/example/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 11.0 + 12.0 diff --git a/flutter/example/ios/Gemfile b/flutter/example/ios/Gemfile new file mode 100644 index 0000000000..7a118b49be --- /dev/null +++ b/flutter/example/ios/Gemfile @@ -0,0 +1,3 @@ +source "https://rubygems.org" + +gem "fastlane" diff --git a/flutter/example/ios/Podfile b/flutter/example/ios/Podfile index 55ddd63416..8cb4ddb285 100644 --- a/flutter/example/ios/Podfile +++ b/flutter/example/ios/Podfile @@ -44,7 +44,7 @@ post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) target.build_configurations.each do |config| - config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0' + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0' end end end diff --git a/flutter/example/ios/Runner.xcodeproj/project.pbxproj b/flutter/example/ios/Runner.xcodeproj/project.pbxproj index 29c58327af..ac52d1dcc4 100644 --- a/flutter/example/ios/Runner.xcodeproj/project.pbxproj +++ b/flutter/example/ios/Runner.xcodeproj/project.pbxproj @@ -460,7 +460,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -483,6 +483,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -491,7 +492,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - PRODUCT_BUNDLE_IDENTIFIER = io.sentry.flutter.example; + PRODUCT_BUNDLE_IDENTIFIER = io.sentry.flutter.sample; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -518,7 +519,7 @@ MARKETING_VERSION = 1.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = io.sentry.flutter.example.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = io.sentry.flutter.sample.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_EMIT_LOC_STRINGS = NO; @@ -547,7 +548,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 16.2; MARKETING_VERSION = 1.0; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = io.sentry.flutter.example.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = io.sentry.flutter.sample.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = NO; SWIFT_VERSION = 5.0; @@ -574,7 +575,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 16.2; MARKETING_VERSION = 1.0; MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = io.sentry.flutter.example.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = io.sentry.flutter.sample.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = NO; SWIFT_VERSION = 5.0; @@ -631,7 +632,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -681,7 +682,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -706,6 +707,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -714,7 +716,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - PRODUCT_BUNDLE_IDENTIFIER = io.sentry.flutter.example; + PRODUCT_BUNDLE_IDENTIFIER = io.sentry.flutter.sample; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -737,6 +739,7 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -745,7 +748,7 @@ "$(inherited)", "$(PROJECT_DIR)/Flutter", ); - PRODUCT_BUNDLE_IDENTIFIER = io.sentry.flutter.example; + PRODUCT_BUNDLE_IDENTIFIER = io.sentry.flutter.sample; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/flutter/example/ios/Runner/Info.plist b/flutter/example/ios/Runner/Info.plist index 91d89f84d6..1023c8c85e 100644 --- a/flutter/example/ios/Runner/Info.plist +++ b/flutter/example/ios/Runner/Info.plist @@ -2,6 +2,10 @@ + ITSAppUsesNonExemptEncryption + + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable @@ -22,6 +26,8 @@ $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS + UIApplicationSupportsIndirectInputEvents + UILaunchStoryboardName LaunchScreen UIMainStoryboardFile @@ -41,9 +47,5 @@ UIViewControllerBasedStatusBarAppearance - CADisableMinimumFrameDurationOnPhone - - UIApplicationSupportsIndirectInputEvents - diff --git a/flutter/example/ios/fastlane/Appfile b/flutter/example/ios/fastlane/Appfile new file mode 100644 index 0000000000..1f85333eac --- /dev/null +++ b/flutter/example/ios/fastlane/Appfile @@ -0,0 +1,7 @@ +app_identifier("io.sentry.flutter.sample") # The bundle identifier of your app + +itc_team_id("96157806") # App Store Connect Team ID +team_id("97JCY7859U") # Developer Portal Team ID + +# For more information about the Appfile, see: +# https://docs.fastlane.tools/advanced/#appfile diff --git a/flutter/example/ios/fastlane/Fastfile b/flutter/example/ios/fastlane/Fastfile new file mode 100644 index 0000000000..e14ca13d3c --- /dev/null +++ b/flutter/example/ios/fastlane/Fastfile @@ -0,0 +1,95 @@ +default_platform(:ios) + +platform :ios do + + desc "Bump Build Number" + lane :bump_build_number do + fetch_api_key() + + version_string = get_version_number(xcodeproj: "./Runner.xcodeproj") + version_parts = version_string.split(".") + + # Remove last digit if necessary + if version_parts.length > 3 + version_parts.pop + end + + new_version = version_parts.join(".") + + increment_version_number( + version_number: new_version, + xcodeproj: "./Runner.xcodeproj" + ) + increment_build_number( + build_number: latest_testflight_build_number + 1, + xcodeproj: "./Runner.xcodeproj" + ) + end + + desc "Build Release" + lane :build_release do + + setup_ci + + disable_automatic_code_signing + + sync_code_signing( + type: "development", + readonly: true, + app_identifier: ["io.sentry.flutter.sample"] + ) + + sync_code_signing( + type: "appstore", + readonly: true, + app_identifier: ["io.sentry.flutter.sample"] + ) + + update_project_provisioning( + xcodeproj: "Runner.xcodeproj", + target_filter: "Runner", + profile: ENV["sigh_io.sentry.flutter.sample_appstore_profile-path"], + build_configuration: "Release" + ) + + build_app( + workspace: "Runner.xcworkspace", + scheme: "Runner", + configuration: "Release", + clean: true, + include_symbols: true, + export_method: "app-store", + output_directory:"./build/", + export_options: { + method: "app-store", + provisioningProfiles: { + "io.sentry.flutter.sample" => ENV["sigh_io.sentry.flutter.sample_appstore_profile-name"] + } + }, + codesigning_identity: ENV["sigh_io.sentry.flutter.sample_appstore_certificate-name"], + output_name: "sentry_flutter_sample.ipa" + ) + + delete_keychain( + name: "fastlane_tmp_keychain" + ) unless is_ci + end + + desc "Upload to TestFlight" + lane :upload_testflight do + fetch_api_key() + testflight( + skip_waiting_for_build_processing: true, + ipa: "./build/sentry_flutter_sample.ipa" + ) + end + + desc "Fetch ASC API Key" + lane :fetch_api_key do + app_store_connect_api_key( + key_id: ENV["APP_STORE_CONNECT_KEY_ID"], + issuer_id: ENV["APP_STORE_CONNECT_ISSUER_ID"], + key_content: ENV["APP_STORE_CONNECT_KEY"] + ) + end +end diff --git a/flutter/example/ios/fastlane/Matchfile b/flutter/example/ios/fastlane/Matchfile new file mode 100644 index 0000000000..054fef1c37 --- /dev/null +++ b/flutter/example/ios/fastlane/Matchfile @@ -0,0 +1,5 @@ +git_url("git@github.com:getsentry/codesigning.git") +storage_mode("git") +username("bot@getsentry.com") # Your Apple Developer Portal username + +# The docs are available on https://docs.fastlane.tools/actions/match diff --git a/flutter/example/lib/main.dart b/flutter/example/lib/main.dart index 26bbdce6d8..64bfba90e3 100644 --- a/flutter/example/lib/main.dart +++ b/flutter/example/lib/main.dart @@ -478,12 +478,7 @@ class MainScaffold extends StatelessWidget { TooltipButton( onPressed: () async { final id = await Sentry.captureMessage('UserFeedback'); - // ignore: use_build_context_synchronously - if (!context.isMounted) { - return; - } - - // ignore: use_build_context_synchronously + if (!context.mounted) return; await showDialog( context: context, builder: (context) { @@ -906,12 +901,7 @@ Future makeWebRequest(BuildContext context) async { await transaction.finish(status: const SpanStatus.ok()); - // ignore: use_build_context_synchronously - if (!context.isMounted) { - return; - } - - // ignore: use_build_context_synchronously + if (!context.mounted) return; await showDialog( context: context, builder: (context) { @@ -957,12 +947,7 @@ Future makeWebRequestWithDio(BuildContext context) async { await span.finish(); } - // ignore: use_build_context_synchronously - if (!context.isMounted) { - return; - } - - // ignore: use_build_context_synchronously + if (!context.mounted) return; await showDialog( context: context, builder: (context) { @@ -992,12 +977,7 @@ Future showDialogWithTextAndImage(BuildContext context) async { final text = await DefaultAssetBundle.of(context).loadString('assets/lorem-ipsum.txt'); - // ignore: use_build_context_synchronously - if (!context.isMounted) { - return; - } - - // ignore: use_build_context_synchronously + if (!context.mounted) return; await showDialog( context: context, // gets tracked if using SentryNavigatorObserver From 5539fed6b437385a60fca368e76c5dc6fd4446b9 Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Thu, 18 Apr 2024 13:41:08 +0200 Subject: [PATCH 20/36] Merge branch 'main' into release/8.0.0 --- flutter/example/ios/Runner.xcodeproj/project.pbxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flutter/example/ios/Runner.xcodeproj/project.pbxproj b/flutter/example/ios/Runner.xcodeproj/project.pbxproj index ac52d1dcc4..f8c39c79d5 100644 --- a/flutter/example/ios/Runner.xcodeproj/project.pbxproj +++ b/flutter/example/ios/Runner.xcodeproj/project.pbxproj @@ -221,7 +221,7 @@ attributes = { BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 1430; - LastUpgradeCheck = 1430; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 92B25CE92A80EB3100884BDF = { From 07d34a8115d45eebb6d535dc5441f401f60d7e44 Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Thu, 18 Apr 2024 13:45:06 +0200 Subject: [PATCH 21/36] Fix test compilation --- flutter/test/event_processor/widget_event_processor_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flutter/test/event_processor/widget_event_processor_test.dart b/flutter/test/event_processor/widget_event_processor_test.dart index 5e93e288ff..4744b58ad2 100644 --- a/flutter/test/event_processor/widget_event_processor_test.dart +++ b/flutter/test/event_processor/widget_event_processor_test.dart @@ -30,7 +30,7 @@ void main() { app: SentryApp(), ), ); - event = await sut.apply(event); + event = await sut.apply(event, Hint()); expect(event?.contexts.app?.textScale, 1.0); }); From 4a762dbea7cbf602d04b97bd54b9ded0f9b8e083 Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Thu, 18 Apr 2024 13:50:46 +0200 Subject: [PATCH 22/36] Update CHANGELOG.md --- CHANGELOG.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a4e7f77a47..d11f5f06f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog -## 8.0.0-beta.2 +## Unreleased + ## 7.20.0 ### Build @@ -106,6 +107,21 @@ ## 7.16.1 +### Fixes + +- Remove Flutter dependency from Drift integration ([#1867](https://github.com/getsentry/sentry-dart/pull/1867)) +- Remove dead code, cold start bool is now always present ([#1861](https://github.com/getsentry/sentry-dart/pull/1861)) +- Fix iOS "Arithmetic Overflow" ([#1874](https://github.com/getsentry/sentry-dart/pull/1874)) + +### Dependencies + +- Bump Cocoa SDK from v8.19.0 to v8.20.0 ([#1856](https://github.com/getsentry/sentry-dart/pull/1856)) + - [changelog](https://github.com/getsentry/sentry-cocoa/blob/main/CHANGELOG.md#8200) + - [diff](https://github.com/getsentry/sentry-cocoa/compare/8.19.0...8.20.0) + + +## 8.0.0-beta.2 + ### Breaking Changes - Bump iOS minimum deployment target from **11** to **12** ([#1821](https://github.com/getsentry/sentry-dart/pull/1821)) From e74ea75325a8f4c02ca06d317e94df1cb6cafb5b Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Thu, 18 Apr 2024 13:51:00 +0200 Subject: [PATCH 23/36] Update CHANGELOG.md --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d11f5f06f3..348b905097 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -119,7 +119,6 @@ - [changelog](https://github.com/getsentry/sentry-cocoa/blob/main/CHANGELOG.md#8200) - [diff](https://github.com/getsentry/sentry-cocoa/compare/8.19.0...8.20.0) - ## 8.0.0-beta.2 ### Breaking Changes From 06368d6a2aafd54eabf5f061b7f993ed8195b9e3 Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Thu, 18 Apr 2024 14:11:49 +0200 Subject: [PATCH 24/36] Update CHANGELOG.md --- CHANGELOG.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 348b905097..f45421a245 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,22 @@ # Changelog -## Unreleased +## 8.0.0 + +### Breaking Changes + +- Bump iOS minimum deployment target from **11** to **12** ([#1821](https://github.com/getsentry/sentry-dart/pull/1821)) +- Mark exceptions not handled by the user as `handled: false` ([#1535](https://github.com/getsentry/sentry-dart/pull/1535)) + - This will affect your release health data, and is therefore considered a breaking change. +- Refrain from overwriting the span status for unfinished spans ([#1577](https://github.com/getsentry/sentry-dart/pull/1577)) + - Older self-hosted sentry instances will drop transactions containing unfinished spans. + - This change was introduced in [relay/#1690](https://github.com/getsentry/relay/pull/1690) and released with [22.12.0](https://github.com/getsentry/relay/releases/tag/22.12.0) +- Do not leak extensions of external classes ([#1576](https://github.com/getsentry/sentry-dart/pull/1576)) +- Make `hint` non-nullable in `BeforeSendCallback`, `BeforeBreadcrumbCall` and `EventProcessor` ([#1574](https://github.com/getsentry/sentry-dart/pull/1574)) + - This will affect your callbacks, making this a breaking change. +- Load Device Contexts from Sentry Java ([#1616](https://github.com/getsentry/sentry-dart/pull/1616)) + - Now the device context from Android is available in `BeforeSendCallback` +- Set ip_address to {{auto}} by default, even if sendDefaultPII is disabled ([#1665](https://github.com/getsentry/sentry-dart/pull/1665)) + - Instead use the "Prevent Storing of IP Addresses" option in the "Security & Privacy" project settings on sentry.io ## 7.20.0 From 086d66e6fc2c003a9d4847ace9c2e510a336978e Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Thu, 18 Apr 2024 14:49:03 +0200 Subject: [PATCH 25/36] Fix analyze issues --- dart/example_web/analysis_options.yaml | 5 ++ dart/example_web/pubspec.yaml | 5 +- dart/lib/src/transport/data_category.dart | 47 ------------------- dart/lib/src/transport/rate_limit_parser.dart | 6 ++- 4 files changed, 12 insertions(+), 51 deletions(-) create mode 100644 dart/example_web/analysis_options.yaml diff --git a/dart/example_web/analysis_options.yaml b/dart/example_web/analysis_options.yaml new file mode 100644 index 0000000000..be16ace7d1 --- /dev/null +++ b/dart/example_web/analysis_options.yaml @@ -0,0 +1,5 @@ +include: package:lints/recommended.yaml + +analyzer: + errors: + path_does_not_exist: ignore diff --git a/dart/example_web/pubspec.yaml b/dart/example_web/pubspec.yaml index 2363aa83bb..1cbf728e08 100644 --- a/dart/example_web/pubspec.yaml +++ b/dart/example_web/pubspec.yaml @@ -8,10 +8,11 @@ environment: dependencies: sentry: - path: ../../dart + # ignore: path_does_not_exist + path: ../../dart/ dev_dependencies: - build_runner: ^2.4.2 + build_runner: ^2.4.2cd build_web_compilers: ^4.0.3 lints: ^2.0.0 webdev: ^3.0.4 diff --git a/dart/lib/src/transport/data_category.dart b/dart/lib/src/transport/data_category.dart index f21da18ed7..ecdb1c9500 100644 --- a/dart/lib/src/transport/data_category.dart +++ b/dart/lib/src/transport/data_category.dart @@ -10,50 +10,3 @@ enum DataCategory { metricBucket, unknown } - -extension DataCategoryExtension on DataCategory { - static DataCategory fromStringValue(String stringValue) { - switch (stringValue) { - case '__all__': - return DataCategory.all; - case 'default': - return DataCategory.dataCategoryDefault; - case 'error': - return DataCategory.error; - case 'session': - return DataCategory.session; - case 'transaction': - return DataCategory.transaction; - case 'attachment': - return DataCategory.attachment; - case 'security': - return DataCategory.security; - case 'metric_bucket': - return DataCategory.metricBucket; - } - return DataCategory.unknown; - } - - String toStringValue() { - switch (this) { - case DataCategory.all: - return '__all__'; - case DataCategory.dataCategoryDefault: - return 'default'; - case DataCategory.error: - return 'error'; - case DataCategory.session: - return 'session'; - case DataCategory.transaction: - return 'transaction'; - case DataCategory.attachment: - return 'attachment'; - case DataCategory.security: - return 'security'; - case DataCategory.metricBucket: - return 'metric_bucket'; - case DataCategory.unknown: - return 'unknown'; - } - } -} diff --git a/dart/lib/src/transport/rate_limit_parser.dart b/dart/lib/src/transport/rate_limit_parser.dart index 592be86e15..1cf1a7e3e1 100644 --- a/dart/lib/src/transport/rate_limit_parser.dart +++ b/dart/lib/src/transport/rate_limit_parser.dart @@ -30,8 +30,8 @@ class RateLimitParser { if (allCategories.isNotEmpty) { final categoryValues = allCategories.split(';'); for (final categoryValue in categoryValues) { - final category = DataCategoryExtension.fromStringValue(categoryValue); - // Metric buckets rate limit can have namespaces + final category = _DataCategoryExtension._fromStringValue( + categoryValue); // Metric buckets rate limit can have namespaces if (category == DataCategory.metricBucket) { final namespaces = durationAndCategories.length > 4 ? durationAndCategories[4] @@ -85,6 +85,8 @@ extension _DataCategoryExtension on DataCategory { return DataCategory.attachment; case 'security': return DataCategory.security; + case 'metric_bucket': + return DataCategory.metricBucket; } return DataCategory.unknown; } From 621807f0aa83a141c71b1546e518ee4b98271261 Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Thu, 18 Apr 2024 14:53:53 +0200 Subject: [PATCH 26/36] Apply formatter --- flutter/test/integrations/load_contexts_integration_test.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flutter/test/integrations/load_contexts_integration_test.dart b/flutter/test/integrations/load_contexts_integration_test.dart index 1728d6c899..7b57eb572a 100644 --- a/flutter/test/integrations/load_contexts_integration_test.dart +++ b/flutter/test/integrations/load_contexts_integration_test.dart @@ -121,7 +121,8 @@ void main() { final integration = LoadContextsIntegration(fixture.methodChannel); integration.call(fixture.hub, fixture.options); - event = (await fixture.options.eventProcessors.first.apply(event, Hint()))!; + event = + (await fixture.options.eventProcessors.first.apply(event, Hint()))!; expect(event.breadcrumbs!.length, 1); expect(event.breadcrumbs!.first.message, 'native-mutated-applied'); From 3af8df8eaf6eee17e158c28f581332cc9b699cf5 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 18 Apr 2024 15:25:58 +0200 Subject: [PATCH 27/36] Update versions to 8.0.0 (#1996) --- dart/lib/src/version.dart | 2 +- dart/pubspec.yaml | 2 +- dio/lib/src/version.dart | 2 +- dio/pubspec.yaml | 4 ++-- drift/lib/src/version.dart | 2 +- drift/pubspec.yaml | 4 ++-- file/lib/src/version.dart | 2 +- file/pubspec.yaml | 4 ++-- flutter/example/pubspec.yaml | 2 +- flutter/lib/src/version.dart | 2 +- flutter/pubspec.yaml | 4 ++-- hive/lib/src/version.dart | 2 +- hive/pubspec.yaml | 4 ++-- isar/lib/src/version.dart | 2 +- isar/pubspec.yaml | 4 ++-- logging/lib/src/version.dart | 2 +- logging/pubspec.yaml | 4 ++-- sqflite/lib/src/version.dart | 2 +- sqflite/pubspec.yaml | 4 ++-- 19 files changed, 27 insertions(+), 27 deletions(-) diff --git a/dart/lib/src/version.dart b/dart/lib/src/version.dart index bdb02727e3..a62754b2dc 100644 --- a/dart/lib/src/version.dart +++ b/dart/lib/src/version.dart @@ -9,7 +9,7 @@ library version; /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '8.0.0-beta.2'; +const String sdkVersion = '8.0.0'; String sdkName(bool isWeb) => isWeb ? _browserSdkName : _ioSdkName; diff --git a/dart/pubspec.yaml b/dart/pubspec.yaml index fd81e05939..bc2ef30452 100644 --- a/dart/pubspec.yaml +++ b/dart/pubspec.yaml @@ -1,5 +1,5 @@ name: sentry -version: 8.0.0-beta.2 +version: 8.0.0 description: > A crash reporting library for Dart that sends crash reports to Sentry.io. This library supports Dart VM and Web. For Flutter consider sentry_flutter instead. diff --git a/dio/lib/src/version.dart b/dio/lib/src/version.dart index 09f988c99f..73fa6fc4a4 100644 --- a/dio/lib/src/version.dart +++ b/dio/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '8.0.0-beta.2'; +const String sdkVersion = '8.0.0'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_dio'; diff --git a/dio/pubspec.yaml b/dio/pubspec.yaml index 4ca4eb6db7..9862c54b69 100644 --- a/dio/pubspec.yaml +++ b/dio/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_dio description: An integration which adds support for performance tracing for the Dio package. -version: 8.0.0-beta.2 +version: 8.0.0 homepage: https://docs.sentry.io/platforms/dart/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues @@ -19,7 +19,7 @@ platforms: dependencies: dio: ^5.0.0 - sentry: 8.0.0-beta.2 + sentry: 8.0.0 dev_dependencies: meta: ^1.3.0 diff --git a/drift/lib/src/version.dart b/drift/lib/src/version.dart index 943581141a..d71a56fddd 100644 --- a/drift/lib/src/version.dart +++ b/drift/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '8.0.0-beta.2'; +const String sdkVersion = '8.0.0'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_drift'; diff --git a/drift/pubspec.yaml b/drift/pubspec.yaml index 2dcaaa49e4..d468e90a12 100644 --- a/drift/pubspec.yaml +++ b/drift/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_drift description: An integration which adds support for performance tracing for the drift package. -version: 8.0.0-beta.2 +version: 8.0.0 homepage: https://docs.sentry.io/platforms/flutter/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues @@ -17,7 +17,7 @@ platforms: web: dependencies: - sentry: 8.0.0-beta.2 + sentry: 8.0.0 meta: ^1.3.0 drift: ^2.13.0 diff --git a/file/lib/src/version.dart b/file/lib/src/version.dart index bb1465efca..cead856a2f 100644 --- a/file/lib/src/version.dart +++ b/file/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '8.0.0-beta.2'; +const String sdkVersion = '8.0.0'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_file'; diff --git a/file/pubspec.yaml b/file/pubspec.yaml index 21836d06b3..3871d9ab38 100644 --- a/file/pubspec.yaml +++ b/file/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_file description: An integration which adds support for performance tracing for dart.io.File. -version: 8.0.0-beta.2 +version: 8.0.0 homepage: https://docs.sentry.io/platforms/dart/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues @@ -17,7 +17,7 @@ platforms: windows: dependencies: - sentry: 8.0.0-beta.2 + sentry: 8.0.0 meta: ^1.3.0 dev_dependencies: diff --git a/flutter/example/pubspec.yaml b/flutter/example/pubspec.yaml index 0f3c2531d6..ef571be2a7 100644 --- a/flutter/example/pubspec.yaml +++ b/flutter/example/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_flutter_example description: Demonstrates how to use the sentry_flutter plugin. -version: 8.0.0-beta.2 +version: 8.0.0 publish_to: 'none' # Remove this line if you wish to publish to pub.dev diff --git a/flutter/lib/src/version.dart b/flutter/lib/src/version.dart index 9e21e0ddc6..233de685ed 100644 --- a/flutter/lib/src/version.dart +++ b/flutter/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '8.0.0-beta.2'; +const String sdkVersion = '8.0.0'; /// The default SDK name reported to Sentry.io in the submitted events. const String sdkName = 'sentry.dart.flutter'; diff --git a/flutter/pubspec.yaml b/flutter/pubspec.yaml index 1b4507f964..040bbc47cb 100644 --- a/flutter/pubspec.yaml +++ b/flutter/pubspec.yaml @@ -1,5 +1,5 @@ name: sentry_flutter -version: 8.0.0-beta.2 +version: 8.0.0 description: Sentry SDK for Flutter. This package aims to support different Flutter targets by relying on the many platforms supported by Sentry with native SDKs. homepage: https://docs.sentry.io/platforms/flutter/ repository: https://github.com/getsentry/sentry-dart @@ -23,7 +23,7 @@ dependencies: sdk: flutter flutter_web_plugins: sdk: flutter - sentry: 8.0.0-beta.2 + sentry: 8.0.0 package_info_plus: '>=1.0.0 <8.0.0' meta: ^1.3.0 ffi: ^2.0.0 diff --git a/hive/lib/src/version.dart b/hive/lib/src/version.dart index baf09bd22c..524aa89e7f 100644 --- a/hive/lib/src/version.dart +++ b/hive/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '8.0.0-beta.2'; +const String sdkVersion = '8.0.0'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_hive'; diff --git a/hive/pubspec.yaml b/hive/pubspec.yaml index bd231fb42e..6aeaed7f68 100644 --- a/hive/pubspec.yaml +++ b/hive/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_hive description: An integration which adds support for performance tracing for the hive package. -version: 8.0.0-beta.2 +version: 8.0.0 homepage: https://docs.sentry.io/platforms/flutter/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues @@ -17,7 +17,7 @@ platforms: web: dependencies: - sentry: 8.0.0-beta.2 + sentry: 8.0.0 hive: ^2.2.3 meta: ^1.3.0 diff --git a/isar/lib/src/version.dart b/isar/lib/src/version.dart index 00585644d2..7410567886 100644 --- a/isar/lib/src/version.dart +++ b/isar/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '8.0.0-beta.2'; +const String sdkVersion = '8.0.0'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_isar'; diff --git a/isar/pubspec.yaml b/isar/pubspec.yaml index 4d0d629dff..fb83755493 100644 --- a/isar/pubspec.yaml +++ b/isar/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_isar description: An integration which adds support for performance tracing for the isar package. -version: 8.0.0-beta.2 +version: 8.0.0 homepage: https://docs.sentry.io/platforms/flutter/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues @@ -20,7 +20,7 @@ platforms: dependencies: isar: ^3.1.0 isar_flutter_libs: ^3.1.0 # contains Isar Core - sentry: 8.0.0-beta.2 + sentry: 8.0.0 meta: ^1.3.0 path: ^1.8.3 diff --git a/logging/lib/src/version.dart b/logging/lib/src/version.dart index 0a22407553..21a66180d1 100644 --- a/logging/lib/src/version.dart +++ b/logging/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '8.0.0-beta.2'; +const String sdkVersion = '8.0.0'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_logging'; diff --git a/logging/pubspec.yaml b/logging/pubspec.yaml index 89f7e94b3f..b9855f47de 100644 --- a/logging/pubspec.yaml +++ b/logging/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_logging description: An integration which adds support for recording log from the logging package. -version: 8.0.0-beta.2 +version: 8.0.0 homepage: https://docs.sentry.io/platforms/dart/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues @@ -19,7 +19,7 @@ platforms: dependencies: logging: ^1.0.0 - sentry: 8.0.0-beta.2 + sentry: 8.0.0 dev_dependencies: lints: ^3.0.0 diff --git a/sqflite/lib/src/version.dart b/sqflite/lib/src/version.dart index 862746f22e..d0fae42df4 100644 --- a/sqflite/lib/src/version.dart +++ b/sqflite/lib/src/version.dart @@ -1,5 +1,5 @@ /// The SDK version reported to Sentry.io in the submitted events. -const String sdkVersion = '8.0.0-beta.2'; +const String sdkVersion = '8.0.0'; /// The package name reported to Sentry.io in the submitted events. const String packageName = 'pub:sentry_sqflite'; diff --git a/sqflite/pubspec.yaml b/sqflite/pubspec.yaml index 1c0184c187..32d060abef 100644 --- a/sqflite/pubspec.yaml +++ b/sqflite/pubspec.yaml @@ -1,6 +1,6 @@ name: sentry_sqflite description: An integration which adds support for performance tracing for the sqflite package. -version: 8.0.0-beta.2 +version: 8.0.0 homepage: https://docs.sentry.io/platforms/flutter/ repository: https://github.com/getsentry/sentry-dart issue_tracker: https://github.com/getsentry/sentry-dart/issues @@ -15,7 +15,7 @@ platforms: macos: dependencies: - sentry: 8.0.0-beta.2 + sentry: 8.0.0 sqflite: ^2.0.0 sqflite_common: ^2.0.0 meta: ^1.3.0 From 645aefa9625de2454bc591acbac50fdb11afe31c Mon Sep 17 00:00:00 2001 From: GIancarlo Buenaflor Date: Thu, 18 Apr 2024 15:26:41 +0200 Subject: [PATCH 28/36] Fix compilation --- dart/example_web/pubspec.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dart/example_web/pubspec.yaml b/dart/example_web/pubspec.yaml index 1cbf728e08..7bcb64d06e 100644 --- a/dart/example_web/pubspec.yaml +++ b/dart/example_web/pubspec.yaml @@ -8,11 +8,10 @@ environment: dependencies: sentry: - # ignore: path_does_not_exist path: ../../dart/ dev_dependencies: - build_runner: ^2.4.2cd + build_runner: ^2.4.2 build_web_compilers: ^4.0.3 lints: ^2.0.0 webdev: ^3.0.4 From 9acd049cea92d1f097175fe81d74693ec5cccd6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Uek=C3=B6tter?= Date: Thu, 18 Apr 2024 15:50:18 +0200 Subject: [PATCH 29/36] Exception aggregate mechanism (#1866) * Exception aggregate * changelog * Update CHANGELOG.md * fix json keys in test * Update dart/lib/src/protocol/mechanism.dart * Update CHANGELOG.md --------- Co-authored-by: Giancarlo Buenaflor --- CHANGELOG.md | 4 ++ dart/lib/src/protocol/mechanism.dart | 52 ++++++++++++++++++++++++++ dart/test/protocol/mechanism_test.dart | 17 +++++++++ 3 files changed, 73 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f45421a245..1bd721e7ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,10 @@ - Set ip_address to {{auto}} by default, even if sendDefaultPII is disabled ([#1665](https://github.com/getsentry/sentry-dart/pull/1665)) - Instead use the "Prevent Storing of IP Addresses" option in the "Security & Privacy" project settings on sentry.io +### Features + +- Add support for exception aggregates ([#1866](https://github.com/getsentry/sentry-dart/pull/1866)) + ## 7.20.0 ### Build diff --git a/dart/lib/src/protocol/mechanism.dart b/dart/lib/src/protocol/mechanism.dart index 2c06c954f6..22a6356800 100644 --- a/dart/lib/src/protocol/mechanism.dart +++ b/dart/lib/src/protocol/mechanism.dart @@ -44,6 +44,38 @@ class Mechanism { /// This may be because they are created at a central place (like a crash handler), and are all called the same: Error, Segfault etc. When the flag is set, Sentry will then try to use other information (top in-app frame function) rather than exception type and value in the UI for the primary event display. This flag should be set for all "segfaults" for instance as every single error group would look very similar otherwise. final bool? synthetic; + /// An optional boolean value, set `true` when the exception is the exception + /// group type specific to the platform or language. + /// The default is false when omitted. + /// For example, exceptions of type [PlatformException](https://api.flutter.dev/flutter/services/PlatformException-class.html) + /// have set it to `true`, others are set to `false`. + final bool? isExceptionGroup; + + /// An optional string value describing the source of the exception. + /// + /// The SDK should populate this with the name of the property or attribute of + /// the parent exception that this exception was acquired from. + /// In the case of an array, it should include the zero-based array index as + /// well. + final String? source; + + /// An optional numeric value providing an ID for the exception relative to + /// this specific event. + /// + /// The SDK should assign simple incrementing integers to each exception in + /// the tree, starting with 0 for the root of the tree. + /// In other words, when flattened into the list provided in the exception + /// values on the event, the last exception in the list should have ID 0, + /// the previous one should have ID 1, the next previous should have ID 2, etc. + final int? exceptionId; + + /// An optional numeric value pointing at the [exceptionId] that is the parent + /// of this exception. + /// + /// The SDK should assign this to all exceptions except the root exception + /// (the last to be listed in the exception values). + final int? parentId; + Mechanism({ required this.type, this.description, @@ -52,6 +84,10 @@ class Mechanism { this.synthetic, Map? meta, Map? data, + this.isExceptionGroup, + this.source, + this.exceptionId, + this.parentId, }) : _meta = meta != null ? Map.from(meta) : null, _data = data != null ? Map.from(data) : null; @@ -63,6 +99,10 @@ class Mechanism { Map? meta, Map? data, bool? synthetic, + bool? isExceptionGroup, + String? source, + int? exceptionId, + int? parentId, }) => Mechanism( type: type ?? this.type, @@ -72,6 +112,10 @@ class Mechanism { meta: meta ?? this.meta, data: data ?? this.data, synthetic: synthetic ?? this.synthetic, + isExceptionGroup: isExceptionGroup ?? this.isExceptionGroup, + source: source ?? this.source, + exceptionId: exceptionId ?? this.exceptionId, + parentId: parentId ?? this.parentId, ); /// Deserializes a [Mechanism] from JSON [Map]. @@ -94,6 +138,10 @@ class Mechanism { meta: meta, data: data, synthetic: json['synthetic'], + isExceptionGroup: json['is_exception_group'], + source: json['source'], + exceptionId: json['exception_id'], + parentId: json['parent_id'], ); } @@ -107,6 +155,10 @@ class Mechanism { if (_meta?.isNotEmpty ?? false) 'meta': _meta, if (_data?.isNotEmpty ?? false) 'data': _data, if (synthetic != null) 'synthetic': synthetic, + if (isExceptionGroup != null) 'is_exception_group': isExceptionGroup, + if (source != null) 'source': source, + if (exceptionId != null) 'exception_id': exceptionId, + if (parentId != null) 'parent_id': parentId, }; } } diff --git a/dart/test/protocol/mechanism_test.dart b/dart/test/protocol/mechanism_test.dart index 4b484d2ca3..857a0529a9 100644 --- a/dart/test/protocol/mechanism_test.dart +++ b/dart/test/protocol/mechanism_test.dart @@ -11,6 +11,10 @@ void main() { synthetic: true, meta: {'key': 'value'}, data: {'keyb': 'valueb'}, + isExceptionGroup: false, + exceptionId: 0, + parentId: 0, + source: 'source', ); final mechanismJson = { @@ -21,6 +25,10 @@ void main() { 'meta': {'key': 'value'}, 'data': {'keyb': 'valueb'}, 'synthetic': true, + 'is_exception_group': false, + 'source': 'source', + 'exception_id': 0, + 'parent_id': 0, }; group('json', () { @@ -51,6 +59,7 @@ void main() { expect(data.toJson(), copy.toJson()); }); + test('copyWith takes new values', () { final data = mechanism; @@ -62,6 +71,10 @@ void main() { synthetic: false, meta: {'key1': 'value1'}, data: {'keyb1': 'valueb1'}, + exceptionId: 1, + parentId: 1, + isExceptionGroup: false, + source: 'foo', ); expect('type1', copy.type); @@ -71,6 +84,10 @@ void main() { expect(false, copy.synthetic); expect({'key1': 'value1'}, copy.meta); expect({'keyb1': 'valueb1'}, copy.data); + expect(1, copy.exceptionId); + expect(1, copy.parentId); + expect(false, copy.isExceptionGroup); + expect('foo', copy.source); }); }); } From 5d2ff07b9c077eaf9aa66e272f783a7184a72a35 Mon Sep 17 00:00:00 2001 From: Giancarlo Buenaflor Date: Thu, 18 Apr 2024 16:30:49 +0200 Subject: [PATCH 30/36] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1bd721e7ef..e381de8999 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## 8.0.0 +## Unreleased ### Breaking Changes From 0864a24210b56b9bb7f86125168a14c557ca309d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Uek=C3=B6tter?= Date: Thu, 18 Apr 2024 18:24:10 +0200 Subject: [PATCH 31/36] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ec6d251f0..d4eab3f8d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -160,6 +160,7 @@ ### Features - Add support for exception aggregates ([#1866](https://github.com/getsentry/sentry-dart/pull/1866)) +- Add support for exception aggregates for PlatformExceptions from Android ([#1998](https://github.com/getsentry/sentry-dart/pull/1998)) ### Fixes From c063781e5ba2d69264370efea92572a78d22da09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Uek=C3=B6tter?= Date: Sun, 19 May 2024 09:12:10 +0200 Subject: [PATCH 32/36] Update CHANGELOG.md --- CHANGELOG.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9013f939b..615e23d490 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## [UNRELEASED] + +### Features + +- Add support for exception aggregates for PlatformExceptions from Android ([#1998](https://github.com/getsentry/sentry-dart/pull/1998)) + ## 8.2.0 ### Enhancements @@ -208,11 +214,6 @@ This release contains breaking changes, please read the changelog carefully. - Now the device context from Android is available in `BeforeSendCallback` - Set ip_address to {{auto}} by default, even if sendDefaultPII is disabled ([#1665](https://github.com/getsentry/sentry-dart/pull/1665)) - Instead use the "Prevent Storing of IP Addresses" option in the "Security & Privacy" project settings on sentry.io - -### Features - -- Add support for exception aggregates ([#1866](https://github.com/getsentry/sentry-dart/pull/1866)) -- Add support for exception aggregates for PlatformExceptions from Android ([#1998](https://github.com/getsentry/sentry-dart/pull/1998)) ### Fixes From 8d52deecbb5bcde7631b6572d193d47181e2d972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Uek=C3=B6tter?= Date: Sun, 19 May 2024 09:15:37 +0200 Subject: [PATCH 33/36] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 615e23d490..38690a4ec0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [UNRELEASED] +## Unreleased ### Features From 170b0f150f54832f5863ed9d662ea10845314aeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Uek=C3=B6tter?= Date: Sun, 19 May 2024 09:16:57 +0200 Subject: [PATCH 34/36] Update flutter/lib/src/event_processor/android_platform_exception_event_processor.dart --- .../android_platform_exception_event_processor.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/flutter/lib/src/event_processor/android_platform_exception_event_processor.dart b/flutter/lib/src/event_processor/android_platform_exception_event_processor.dart index 1d543fe90c..1b1624e364 100644 --- a/flutter/lib/src/event_processor/android_platform_exception_event_processor.dart +++ b/flutter/lib/src/event_processor/android_platform_exception_event_processor.dart @@ -96,9 +96,7 @@ class AndroidPlatformExceptionEventProcessor implements EventProcessor { } final eventExceptions = event.exceptions?.map((e) { - if (event.throwable is! PlatformException) { - return e; - } + // TODO: Maybe this shouldn't be applied to all exceptions? return e.copyWith( mechanism: Mechanism( type: 'chained', From c4909469ecc8138758862d76341e2d1167c8d6f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Uek=C3=B6tter?= Date: Sun, 19 May 2024 09:19:33 +0200 Subject: [PATCH 35/36] please danger --- CHANGELOG.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 38690a4ec0..f8a8fa285d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,6 @@ ## Unreleased -### Features - - Add support for exception aggregates for PlatformExceptions from Android ([#1998](https://github.com/getsentry/sentry-dart/pull/1998)) ## 8.2.0 From 610d0065518efc8fb582448bce4b6127546f4e2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20Uek=C3=B6tter?= Date: Sun, 19 May 2024 09:20:55 +0200 Subject: [PATCH 36/36] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8a8fa285d..cb8e260a76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## Unreleased -- Add support for exception aggregates for PlatformExceptions from Android ([#1998](https://github.com/getsentry/sentry-dart/pull/1998)) +- Add support for exception aggregates for PlatformExceptions from Android ([#1999](https://github.com/getsentry/sentry-dart/pull/1999)) ## 8.2.0