From 625ec2f4c428e1d9100c4b29daedc0246e68ae93 Mon Sep 17 00:00:00 2001 From: Kenzie Davisson Date: Fri, 13 Mar 2026 16:31:53 -0700 Subject: [PATCH] Add support for searching within the log details view --- .../lib/src/screens/logging/_log_details.dart | 163 +++++++++++++++++- .../lib/src/screens/logging/_logs_table.dart | 1 + .../logging/log_details_controller.dart | 62 +++++++ .../screens/logging/logging_controller.dart | 6 + .../src/screens/logging/logging_screen.dart | 5 +- .../lib/src/shared/table/_flat_table.dart | 1 + .../lib/src/shared/table/_table_row.dart | 2 +- .../macos/Runner.xcodeproj/project.pbxproj | 128 +++----------- .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/Runner.xcscheme | 18 ++ .../release_notes/NEXT_RELEASE_NOTES.md | 3 +- .../images/log_details_search.png | Bin 0 -> 50315 bytes .../lib/src/ui/theme/theme.dart | 1 + 13 files changed, 285 insertions(+), 112 deletions(-) create mode 100644 packages/devtools_app/lib/src/screens/logging/log_details_controller.dart create mode 100644 packages/devtools_app/macos/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 packages/devtools_app/release_notes/images/log_details_search.png diff --git a/packages/devtools_app/lib/src/screens/logging/_log_details.dart b/packages/devtools_app/lib/src/screens/logging/_log_details.dart index 977af418050..7895b2eed28 100644 --- a/packages/devtools_app/lib/src/screens/logging/_log_details.dart +++ b/packages/devtools_app/lib/src/screens/logging/_log_details.dart @@ -11,12 +11,15 @@ import 'package:flutter/material.dart'; import '../../shared/globals.dart'; import '../../shared/preferences/preferences.dart'; import '../../shared/ui/common_widgets.dart'; +import '../../shared/ui/search.dart'; +import 'log_details_controller.dart'; import 'logging_controller.dart'; class LogDetails extends StatefulWidget { - const LogDetails({super.key, required this.log}); + const LogDetails({super.key, required this.log, required this.controller}); final LogData? log; + final LogDetailsController controller; @override State createState() => _LogDetailsState(); @@ -45,6 +48,10 @@ class _LogDetailsState extends State if (widget.log != oldWidget.log) { unawaited(_computeLogDetails()); } + if (widget.controller != oldWidget.controller) { + cancelListeners(); + addAutoDisposeListener(preferences.logging.detailsFormat); + } } Future _computeLogDetails() async { @@ -81,6 +88,7 @@ class _LogDetailsState extends State header: _LogDetailsHeader( log: log, format: preferences.logging.detailsFormat.value, + controller: widget.controller, ), child: Scrollbar( controller: scrollController, @@ -93,9 +101,9 @@ class _LogDetailsState extends State ? Padding( padding: const EdgeInsets.all(denseSpacing), child: SelectionArea( - child: Text( - log?.prettyPrinted() ?? '', - textAlign: TextAlign.left, + child: _SearchableLogDetailsText( + text: log?.prettyPrinted() ?? '', + controller: widget.controller, ), ), ) @@ -107,10 +115,15 @@ class _LogDetailsState extends State } class _LogDetailsHeader extends StatelessWidget { - const _LogDetailsHeader({required this.log, required this.format}); + const _LogDetailsHeader({ + required this.log, + required this.format, + required this.controller, + }); final LogData? log; final LoggingDetailsFormat format; + final LogDetailsController controller; @override Widget build(BuildContext context) { @@ -122,7 +135,13 @@ class _LogDetailsHeader extends StatelessWidget { title: const Text('Details'), includeTopBorder: false, roundedTopBorder: false, + tall: true, actions: [ + // Only supporting search for the text format now since supporting this + // for the expandable JSON viewer would require a more complicated + // refactor of that shared component. + if (format == LoggingDetailsFormat.text) + _LogDetailsSearchField(controller: controller, log: log), LogDetailsFormatButton(format: format), const SizedBox(width: densePadding), CopyToClipboardControl( @@ -134,6 +153,140 @@ class _LogDetailsHeader extends StatelessWidget { } } +/// An animated search field for the log details view that toggles between an icon +/// and a full [SearchField]. +class _LogDetailsSearchField extends StatefulWidget { + const _LogDetailsSearchField({required this.controller, required this.log}); + + final LogDetailsController controller; + final LogData? log; + + @override + State<_LogDetailsSearchField> createState() => _LogDetailsSearchFieldState(); +} + +class _LogDetailsSearchFieldState extends State<_LogDetailsSearchField> + with AutoDisposeMixin { + late bool _isExpanded; + + @override + void initState() { + super.initState(); + _isExpanded = widget.controller.search.isNotEmpty; + addAutoDisposeListener(widget.controller.searchFieldFocusNode, () { + final hasFocus = + widget.controller.searchFieldFocusNode?.hasFocus ?? false; + if (hasFocus != _isExpanded) { + setState(() { + _isExpanded = hasFocus; + }); + } + }); + } + + @override + Widget build(BuildContext context) { + return AnimatedContainer( + duration: defaultDuration, + curve: defaultCurve, + width: _isExpanded ? mediumSearchFieldWidth : defaultButtonHeight, + child: OverflowBox( + minWidth: 0.0, + maxWidth: mediumSearchFieldWidth, + child: _isExpanded + ? Padding( + padding: const EdgeInsets.symmetric(horizontal: densePadding), + child: SearchField( + searchController: widget.controller, + searchFieldEnabled: + widget.log != null && widget.log!.details != null, + shouldRequestFocus: true, + searchFieldWidth: mediumSearchFieldWidth, + ), + ) + : ToolbarAction( + icon: Icons.search, + tooltip: 'Search details', + size: defaultIconSize, + onPressed: () { + setState(() { + _isExpanded = true; + }); + widget.controller.searchFieldFocusNode?.requestFocus(); + }, + ), + ), + ); + } +} + +/// A text widget for the log details view that highlights search matches. +class _SearchableLogDetailsText extends StatelessWidget { + const _SearchableLogDetailsText({ + required this.text, + required this.controller, + }); + + final String text; + final LogDetailsController controller; + + @override + Widget build(BuildContext context) { + return MultiValueListenableBuilder( + listenables: [controller.searchMatches, controller.activeSearchMatch], + builder: (context, values, _) { + final theme = Theme.of(context); + + final matches = values[0] as List; + final activeMatch = values[1] as LogDetailsMatch?; + if (matches.isEmpty) { + return Text( + text, + textAlign: TextAlign.left, + style: theme.regularTextStyle, + ); + } + + final spans = []; + int previousEnd = 0; + for (final match in matches) { + if (match.range.begin > previousEnd) { + spans.add( + TextSpan( + text: text.substring(previousEnd, match.range.begin as int), + ), + ); + } + final isActive = match == activeMatch; + spans.add( + TextSpan( + text: text.substring( + match.range.begin as int, + match.range.end as int, + ), + style: theme.regularTextStyle.copyWith( + backgroundColor: isActive + ? activeSearchMatchColor + : searchMatchColor, + color: Colors.black, + ), + ), + ); + previousEnd = match.range.end as int; + } + + if (previousEnd < text.length) { + spans.add(TextSpan(text: text.substring(previousEnd))); + } + + return Text.rich( + TextSpan(style: theme.regularTextStyle, children: spans), + ); + }, + ); + } +} + @visibleForTesting class LogDetailsFormatButton extends StatelessWidget { const LogDetailsFormatButton({super.key, required this.format}); diff --git a/packages/devtools_app/lib/src/screens/logging/_logs_table.dart b/packages/devtools_app/lib/src/screens/logging/_logs_table.dart index 0475919955a..c406a428d45 100644 --- a/packages/devtools_app/lib/src/screens/logging/_logs_table.dart +++ b/packages/devtools_app/lib/src/screens/logging/_logs_table.dart @@ -48,6 +48,7 @@ class LogsTable extends StatelessWidget { defaultSortDirection: SortDirection.ascending, secondarySortColumn: messageColumn, rowHeight: _logRowHeight, + tallHeaders: true, ); } } diff --git a/packages/devtools_app/lib/src/screens/logging/log_details_controller.dart b/packages/devtools_app/lib/src/screens/logging/log_details_controller.dart new file mode 100644 index 00000000000..33eec934c63 --- /dev/null +++ b/packages/devtools_app/lib/src/screens/logging/log_details_controller.dart @@ -0,0 +1,62 @@ +// Copyright 2024 The Flutter Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd. + +import 'package:devtools_app_shared/utils.dart'; +import 'package:flutter/foundation.dart'; + +import '../../shared/primitives/utils.dart'; +import '../../shared/ui/search.dart'; +import 'logging_controller.dart'; + +/// A controller for the log details view that provides search functionality. +class LogDetailsController extends DisposableController + with SearchControllerMixin, AutoDisposeControllerMixin { + LogDetailsController({required ValueListenable selectedLog}) { + init(); + addAutoDisposeListener(selectedLog, () { + _selectedLog = selectedLog.value; + refreshSearchMatches(); + }); + } + + LogData? _selectedLog; + + @override + List matchesForSearch( + String search, { + bool searchPreviousMatches = false, + }) { + if (search.isEmpty || _selectedLog == null) return []; + final matches = []; + + final text = _selectedLog!.prettyPrinted(); + if (text == null) return []; + + final regex = RegExp(search, caseSensitive: false); + final allMatches = regex.allMatches(text); + for (final match in allMatches) { + matches.add(LogDetailsMatch(match.start, match.end)); + } + return matches; + } + + @override + void dispose() { + _selectedLog = null; + super.dispose(); + } +} + +/// A search match in the log details view. +class LogDetailsMatch with SearchableDataMixin { + LogDetailsMatch(this.start, this.end); + + final int start; + final int end; + + Range get range => Range(start, end); + + @override + bool matchesSearchToken(RegExp regExpSearch) => false; +} diff --git a/packages/devtools_app/lib/src/screens/logging/logging_controller.dart b/packages/devtools_app/lib/src/screens/logging/logging_controller.dart index 8f9818c584a..fa93986930c 100644 --- a/packages/devtools_app/lib/src/screens/logging/logging_controller.dart +++ b/packages/devtools_app/lib/src/screens/logging/logging_controller.dart @@ -28,6 +28,7 @@ import '../../shared/primitives/utils.dart'; import '../../shared/ui/filter.dart'; import '../../shared/ui/search.dart'; import '../inspector/inspector_tree_controller.dart'; +import 'log_details_controller.dart'; import 'logging_screen.dart'; import 'metadata.dart'; @@ -110,6 +111,8 @@ class LoggingController extends DevToolsScreenController @override void init() { super.init(); + logDetailsController = LogDetailsController(selectedLog: selectedLog) + ..init(); addAutoDisposeListener(serviceConnection.serviceManager.connectedState, () { if (serviceConnection.serviceManager.connectedState.value.connected) { _handleConnectionStart(serviceConnection.serviceManager.service!); @@ -138,6 +141,7 @@ class LoggingController extends DevToolsScreenController @override void dispose() { + logDetailsController.dispose(); selectedLog.dispose(); unawaited(_logStatusController.close()); super.dispose(); @@ -234,6 +238,8 @@ class LoggingController extends DevToolsScreenController final _logStatusController = StreamController.broadcast(); + late final LogDetailsController logDetailsController; + List data = []; final selectedLog = ValueNotifier(null); diff --git a/packages/devtools_app/lib/src/screens/logging/logging_screen.dart b/packages/devtools_app/lib/src/screens/logging/logging_screen.dart index 2b68a9dc1fe..79d2c7cfbe2 100644 --- a/packages/devtools_app/lib/src/screens/logging/logging_screen.dart +++ b/packages/devtools_app/lib/src/screens/logging/logging_screen.dart @@ -87,7 +87,10 @@ class _LoggingScreenState extends State ValueListenableBuilder( valueListenable: controller.selectedLog, builder: (context, selected, _) { - return LogDetails(log: selected); + return LogDetails( + log: selected, + controller: controller.logDetailsController, + ); }, ), ], diff --git a/packages/devtools_app/lib/src/shared/table/_flat_table.dart b/packages/devtools_app/lib/src/shared/table/_flat_table.dart index 79bb3e7d15d..154868a0026 100644 --- a/packages/devtools_app/lib/src/shared/table/_flat_table.dart +++ b/packages/devtools_app/lib/src/shared/table/_flat_table.dart @@ -33,6 +33,7 @@ class SearchableFlatTable extends FlatTable { super.sizeColumnsToFit = true, super.rowHeight, super.selectionNotifier, + super.tallHeaders, }) : super( searchMatchesNotifier: searchController.searchMatches, activeSearchMatchNotifier: searchController.activeSearchMatch, diff --git a/packages/devtools_app/lib/src/shared/table/_table_row.dart b/packages/devtools_app/lib/src/shared/table/_table_row.dart index b7c6a010b92..afecd702bc7 100644 --- a/packages/devtools_app/lib/src/shared/table/_table_row.dart +++ b/packages/devtools_app/lib/src/shared/table/_table_row.dart @@ -263,7 +263,7 @@ class _TableRowState extends State> final box = SizedBox( height: widget._rowType == _TableRowType.data ? defaultRowHeight - : defaultHeaderHeight + (widget.tall ? densePadding : 0.0), + : defaultHeaderHeight + (widget.tall ? 2 * densePadding : 0.0), child: Material( color: _searchAwareBackgroundColor(), child: onPressed != null diff --git a/packages/devtools_app/macos/Runner.xcodeproj/project.pbxproj b/packages/devtools_app/macos/Runner.xcodeproj/project.pbxproj index 59aa8f360ec..ce7a071de3b 100644 --- a/packages/devtools_app/macos/Runner.xcodeproj/project.pbxproj +++ b/packages/devtools_app/macos/Runner.xcodeproj/project.pbxproj @@ -21,14 +21,13 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 11595299B00138FF6A219878 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 46084CB9F244837191E61B73 /* Pods_RunnerTests.framework */; }; 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; - E678665441E5C0F7F629BAD5 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5062035DDDD18FB35E98D5B6 /* Pods_Runner.framework */; }; + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -62,8 +61,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 11BB555C0F1767B9B5CB7CE0 /* 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 = ""; }; - 13053082F27293B7166BCBED /* 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 = ""; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; @@ -80,14 +77,9 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 46084CB9F244837191E61B73 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 5062035DDDD18FB35E98D5B6 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 68C587FFA5A0B8F46A0C5150 /* 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 = ""; }; + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; - A7CE48BF63861DD9F3A9FA2F /* 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 = ""; }; - BDEB23F5F07C7F498EB77EA2 /* 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 = ""; }; - E11974409F5281249C10F0E1 /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -95,7 +87,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 11595299B00138FF6A219878 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -103,7 +94,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - E678665441E5C0F7F629BAD5 /* Pods_Runner.framework in Frameworks */, + 78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -136,8 +127,6 @@ 33CEB47122A05771004F2AC0 /* Flutter */, 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, - D73912EC22F37F3D000D13A0 /* Frameworks */, - 618DD25D42BF0C167E4D5128 /* Pods */, ); sourceTree = ""; }; @@ -164,6 +153,7 @@ 33CEB47122A05771004F2AC0 /* Flutter */ = { isa = PBXGroup; children = ( + 78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */, 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, @@ -185,29 +175,6 @@ path = Runner; sourceTree = ""; }; - 618DD25D42BF0C167E4D5128 /* Pods */ = { - isa = PBXGroup; - children = ( - 11BB555C0F1767B9B5CB7CE0 /* Pods-Runner.debug.xcconfig */, - 68C587FFA5A0B8F46A0C5150 /* Pods-Runner.release.xcconfig */, - A7CE48BF63861DD9F3A9FA2F /* Pods-Runner.profile.xcconfig */, - E11974409F5281249C10F0E1 /* Pods-RunnerTests.debug.xcconfig */, - BDEB23F5F07C7F498EB77EA2 /* Pods-RunnerTests.release.xcconfig */, - 13053082F27293B7166BCBED /* Pods-RunnerTests.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; - D73912EC22F37F3D000D13A0 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 5062035DDDD18FB35E98D5B6 /* Pods_Runner.framework */, - 46084CB9F244837191E61B73 /* Pods_RunnerTests.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -215,7 +182,6 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( - 3E485AF46E5EF6A810E8A04C /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -234,13 +200,11 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - DC1C8B6797A659BE5B59B986 /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, - E765EEB3239836D35A4D4672 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -248,6 +212,9 @@ 33CC11202044C79F0003C045 /* PBXTargetDependency */, ); name = Runner; + packageProductDependencies = ( + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */, + ); productName = Runner; productReference = 33CC10ED2044A3C60003C045 /* devtools_app.app */; productType = "com.apple.product-type.application"; @@ -291,6 +258,9 @@ Base, ); mainGroup = 33CC10E42044A3C60003C045; + packageReferences = ( + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */, + ); productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; projectDirPath = ""; projectRoot = ""; @@ -360,67 +330,6 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; - 3E485AF46E5EF6A810E8A04C /* [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; - }; - DC1C8B6797A659BE5B59B986 /* [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-Runner-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; - }; - E765EEB3239836D35A4D4672 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -472,7 +381,6 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = E11974409F5281249C10F0E1 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -487,7 +395,6 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BDEB23F5F07C7F498EB77EA2 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -502,7 +409,6 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 13053082F27293B7166BCBED /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -786,6 +692,20 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCLocalSwiftPackageReference section */ + 781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; + }; +/* End XCLocalSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = { + isa = XCSwiftPackageProductDependency; + productName = FlutterGeneratedPluginSwiftPackage; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 33CC10E52044A3C60003C045 /* Project object */; } diff --git a/packages/devtools_app/macos/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/packages/devtools_app/macos/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000000..919434a6254 --- /dev/null +++ b/packages/devtools_app/macos/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/packages/devtools_app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/devtools_app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index cadfa603a2e..559bf4e57a2 100644 --- a/packages/devtools_app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/devtools_app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -5,6 +5,24 @@ + + + + + + + + + + xjhHb!v`_L z8DYbpKblu&=Jpiy%zD z#Tvl){~Q4hQn*L*$(L{Z@m~MyW9g1*tpTz`85UrK{p%v#E;b#A9YlwHL5)F1`j1b* zmWqF=A_fQt=Uga+%w z*@Y^}!zMr1#7&!g6WG)l`qCs4ak1~Yk)P%|!H+<%OzR`|jK`s|Rl zAsaUGc|dJp-nQNosWypg9R4qeald zPm~k5)+Y{}r^?0>c+nG8PP2ACz;uhvAN^Z@Ubn+*`IGJqnoO(U_`OZDr0~F+P+(^`wR*7#_8q0;50s!6q}({g z!g|eqjY!{5g?BZ6YqpsTrd6MAb$HRbg)!1^YMbHS*cnmEN5*UKvHo*RSrgA39w>~j zSCK)+aU2Vt#E_#d=(Rdv*e{jmRtHkJoaZF{#9CUB_&cVvF*Z+QsBzuWnH7keby^*Y z3q9Lpwh3`HOuT;CgN4VeE-De;5a=;m;kuP^!8v~=x9)a>f&g)Z@&8SUk(RtCw)lf~ zp;w-*X*e|Bv|Jpr#JWB4TgHqRLSFzDc&|W}v9geqe!W)(EU%!X@pQG$M-DG3m(e~_S z+{|gg>emQF8045<;~0Wg5F&(aO_fg|aZ4<^)i|FpHq-Zi_E$829E-_lGni_^8~}N? zHkkGq_SfTb*`8EdL-Sua(3_f}#s`GG+RQd54plaxjza%c-5v(_4`ZcA&yntq)64u- zP`EW(1UX4DSYf~>vb%Qn_&o@Pk%Z&NE=!7?5CT)Yp%{zl?|}wnTo`ebaYvWsmzc}G z!?w#99tA{WWu!TU|Eo0ACd*N;y3KS`?$_3q;b7RDnpXP8s3xDh9YC)r%Vag25*V!9 z^5EtWpEliOcE#l9=Lhsyrx^?~IexRI#3Q_3fu#dl9!QyRTN_*vuNe5LH>}P1=(nse z@?&O4inH>Z)zcs+2kGHIiadTB@~Jm1396e8-@)_nB4Y_|4vy(CN^VEM{(M!FQ#mdz zad@^l?&x>=@Z$p|)OJHM1hk^J>w3^R}8 z+7Y+wnmE~i+`*N1VYLpWwx%&$C_vxWI>WCRO{T}{I^s60x|MonPS+ zl>y>z7{wr^alO&|u#7`HFRK>!<^p@_2s?)8XG#qv^~$UDx4;T4!D81gc=0<>2xwOT z{+zFi)T(dtkk}kU32%-UCK|gecItePZEc@mujKmmez^BPn6(Cu=UOOi`gGGn`nap_ z=#NCCNx+Rg=WJ)|J*$=CIarc;x$#xs-{XI~L@VM{fkR0B`Q~Mk$WTv8Le<@NS`1({ zt+=oj#Dk-sx#dxTYQ(>tY|qwf7Tl}1#tUSuCsth||G&-ek;e|Z!EJXua~wVEjWULO z%}z9YbM|D<#xAWmI@M0b`R+g7 zC=%CO54?vAE3)Zlh7ci2FE1ig58n0r`r~`;tsXkxOX7F`JiACq7Sseq8E7nCqL9@x z=<|{0US2#*m}E3-Osgki8u4~lO!Fz%3RkWU2;@7I-YAc&Q6%gk21r4|YfL{??9JP4 z(K0Z_N*66+R8u{|KDrWoxG^R;yjS;zH1Pw)uT>XS!49M5HE%@C zm{;0^oqbY={T2gd5GZ7Gr77%UO4xDw=jG~+N)-5IN1j$8B*{Ce%9{Tn>9CGL_LWR5 z^xS?@V#dU&b$7*z?qx6)kCCWyi|w}$0aRR1T9Aq&Blz~lpeln-au}8pL)i?X3 zq%Nek7ukKk{j~u%#bw5|TYrt#sYHRnZ;}DJ9Anx3ibT?E!qhV@o3JVmDw|CoAXY0JoQN5f+e0y0%Rax## zU&^;{1EG?ljS|z!ULSAuXVsKxqBQZ&6-&8L38&^+@fSbMvXv6vhEKft71z=6VCq&q zx9w&yY?ondJo!N={Ct7pXxU!@vCalAr%neu5#H$cBnb{ibn%GjPn9Xq7dbIJsXtA9 z*Jz)}0|`bMrl#wpVr>Kogv*MPw?xoaLdHL|`K&({@t)P2m4zZ-LEl{~EW zJTfe-Ogmp^D(DS`+{l#hK1%IOqU_%|NkJc^L(tV0h zaGwI;7VatkvW2ofo^t!5TGlb+`xqsF@e7Ys(|@6^nw?w3g7*ZprK*~iJNQc0BvYP9 zVz+~0DfsMglh&TIsOikk=VvQ!p<0@FZjoT=+X8eAa?S@4r>UmMC8q5-L8DvfSRlWT}~CLYxV+kGZSp zA*aSNnc@eN#*wXqYc|uiIYK4Ej^cVBA99`dnCqI3^xhJ7c$PC-=p1oNXyBmWiQo6H zg@)DBz?+Gx3P(Ew+9Rz#m|A-dtnd@15B-46OljO*O*uO8$M_l|V$5*%B-7i27?(1T z@xhTwgJs^cOpSO>EP;<{G}68`z?i+ChmsaWG$#@F=xY=zY-h#44$vmyv2)WfrbP?d z3~#aqGV(Ry)w;1ri%Fj>VA*@jdI+C&QfsQdYI@2hbCk=I_4b!%h?d8!w4+CIVSnFl zeO@_maX4|&a8z>p1GZkdcRY0&AvO2=t^{J$Qe1|YEt5}clgdpVRq;X3UZBj698v_V z!ggh;lRvwY^>AP(O$_ife7lu8*Rr?#b?Jdgc%;&dw`rUH(f(?mO?{p1m1(FE%@rHlileZcu4w(euC@-ovJA3@sFL^iCIxD81NeuRa=- zh~+9r69z&t`B-f))3ZlS_eguFu~EHl>FG>y`%gv(P)j7JBe-)c(f;bt@j&Rx`J*~$ zR?#PwOpso~%TlO-N1iGKHiJvT;2?>;6Pj+W_2o(Hp!6n}+ETDQ5$%}}<<{P0o;GJQ z(?h^`EbV;|Ydp)#{~-)DYxL{OFRt?T*z8(qedm&pUk^CSxyEM46yfntj|lViK0YvF zP}_O%!6CLQqE^0F0YJ5*Y|Y$fjQZ%-w+kYtf} z@*_pWxr|=I^JKq6`T>);I7ct>n%v`OP-QNsiK1@^?493Ofbr4K%&2Mm;^ytfUGhFT zI+7ZEa6gS{04C03HU6C^{q4{&8VfX67iAHbVYPib=-BC21!I(SRK z&o6QDu9##F)_ro}Ftbe8J^&WW#dAUfMyx!XM`(3qG#5N2_$uA4xlj>3(DTJFXOy^k z_de;QiOrqQNcI&rDJ@Wmr!1-E1rpanNgzvrY2+@5{3tOr7N3H3608>cU^>|*y_Jcl zMDl}0cO+!DlNxZmLwb$M0bp~>MhG@&K>q=&h=%pyB)!@W3 zwKs#CX=k&r=6KgNbLz8WB+@vey?MREvw5A>B9~F(f#&LBC_|Y7gI5Pn?J~Js^qRBq z#IiZ{PvsdwtUz)rW;wt-yv+`bLn0}O3f3eCJ0GnsHbCnkU99RkX^{6r>a+CI)iPV- z(r2HeYw?!>hk~>}9Gftm3I#(g0pU_CYp-=*t9r+xd~^Q04BBX6pWj);Y1*>+LU_XO zVnvs?CZ+_6f}jAue&NaHnJ#(x*jIuz@toS& zH@VVr;`_#gj1Yr0rN~;kXF#l!fwCzG@6-uEc+tMH{|1U7vn&pKR@JpIo{dPk)?+}&(vVq zAK4WS?y07mEs2XkT_fQ$1FbA<5+>`&g%& z#m&=#Ly{Iq*iHb#jRHd%ikxdS<|!YNM$Lp=r?)#7CEs1Q$(Rz93z-bn{OqzmFZ*p$ z|KR%q^kP6n8nF~5b973!JS2{CkooGns^zCup!Z#`y(h>AGRaqeIBtmO<83}TEWyP{ zA^Tj$Vf70X3c$L(gQzz3u_r0USYD+0$W(^O@Pt-GY672{#klFFVKv0qa?f0X_eseI z>d2oUD33#S*6$%NHrPfflX3g$MKRI(s zf`XxCB(L)6OaCl~o4xcNafkJ2zkKcdgi_ZVH_E&ZH>Qj|XKk&N5{b)CEwYv3&so() zjyF~&tf_f*`s>HG1tm_n&PW3u;_q;sjl-R%-qHwa7OSZ-zEM{da@%?(4CdGy z3Z@$@I;-*o&>#x72D_1_lhL6VgUTooNv?$fxVgzK!QO%HtoWx*?^JeL{amSq>{rn| zTm}_ACQwAB)^Qk%W%*ivsganw!BxQQz&4*<=Q7@#v@vIGhXcx72ywOiw8z{XBQso^ z26^%I9gFZJK6>P{dUc|S_gCize~F%4HHjej=-x_SL`swUnsnhfvKj3(@>#X~Q8=|` zw&_0lEC}Dv7)_dUlhJW`e~9)Jh*8>t3Fu4Ueq(vs(AnoHJ0^N`@NUIqqGqm}V%IQ%&^LcQwj*^J9j0z~`M!`aGEBR8-lb%8Cq-}Ip~q8=JSrY* z-@l8UyFFysVuq6hwu~1V+E|!+buzr%xlhaQmW7yZln@9Xd;~x*5}sX?pB|yoWsa3q zNCT>$2b`ZewzfUO*Eljx;Lz?>b4l2XRTKZpV+V=(h-X35vL#l2Y}NBD=rPiFgtYc@$`{&-+PPW8EELoj-6!UeO#riHx#CVagWV)A;>u^3sZ))b#AmdtlDAf2T{e#0)&ea zktAkYMO#H0Q zH*9tlXrmUu*a25AZbi!>sLX9e$p_hZd|iY*fpVd4K3|uY6Ujxedihty6FNin7KvDG`~S4S^NgEU5^z03qrPKdD;}o!=Gc_ zXETtT!wqOkr4zihm)>|zSHH&PX*&z$N?nxbTd?GZABWvow`f5Y+_P0spFHmlIqr0b z%*8>hBZOp4&}N{_V{-ykW|8V@_D1ve2VdCXnC?Zp7>WSr{=&%aAoE zL^m>RDb5HG=gKdPy_X(0)(SW#Q(d0X+m94w#&hZS>StC@@2rK~d~mQ?98s>@-Tb4G zQBA5az+-*9T`7?#_U60m5r%b^r4cuG3xGhoja`>eug|`yy6?T|x|Dz)3PIg`9&1++ivC6KpFMOtvbYh6QP59Y-4Ihsn7l;wgnyvBVT z9lAJa5hdiur&!?I&rhduz2WxGcKvplGH-3i zd<fS znx4m`LK7#n)1Ms`B=!sB*N3+k^MY)!us!2&4=}9S2I(als5`=_IA8B!^bI-L@2U2PMX)~mapvz>7@ST#98B?lRPXX}2F4lZq9yCP^E58n%=-gwLQYE9G$^#eS)GOL7Oleq}XfE54L>dig7I%D(t=h{1co z#AheKXDgf9w4@nrut9|_@?zT#2w6T-1i6DBhU=H#C5gUCOuFH^6m?zFp7AGh(8I{c zP;`%dTDYt?c}sZZi(HM6=rRv@)x&)GCnk#pLjcxasxF;uhipIWk1N!+1GxNr1?h-F7MPec(>ZUoe={Wu3 zWJJ9S%U}I*JFW?~Zsl|HgC&IL+^!Ghb-H^!_5$DAKC-CDRdW2sT5(ktGGLbwl0oOG zr0+xU6z7I*utsS#uij3Ml*krMiVQ6MIMo8`2&nfPAIEJBk+?^M4leRI>C`)vEg({w zYhtfJ6F{;w@F`QXy8Jdqy3bS00)xul`u0$ZyH6Wx(x6BBI`uk^yj!8WbksaXKQjdP zR|f38_Lo^WlySy;qg<7~%3LO;Ja0Z7xFzFM(71n;^5!#mum_gNTmDh*+VnS@Yt|f# z&5vU~L5w#c5c6{7hT{%4uzD#|QIv$|_Ri*|f*1=(iHb5cA|=(HUSjrnr$wS3SS>x* zQKI*2*j;DM-Yc*1NWst>?Xy`}?XcVvGxsfJ&LgL=35zq{mJ-C4;TBeEovw@AQJ~h9 zgbdh-HeVd2lr}}V$6*wd&zHLA%o8OE5DiJg4JVu%E2DPvn!? z*mVxMplsZi$h)@Sr(!?Fl4$g7>-tQ-jk-mSc}8>yi6nu6C{BxG^_-n*%02!#VjwjT zU}ZPpG;vM}vD1F|3lkrX2PyeeD?}ZnV667Uv==#iAHF4Q_ai909rgT4i7bXidD9De z2lDvR7odF7Uazlm$?8yl`h7s!yqQIC4GfxrsSLEv#i+?c~^XFR52&Bg6ZBnrqk8oUz~8 z!I0y*=#j=Gjqa^%0;NUv*!lh5Oz%Ura`}iOZi?4^aro+xu8tFv#n~2e9#~92u5*ak zG)?^1wqd@=bu#Orbi^^anc@TQQO|E4bY?iA$Hl%6ZK5~~$5lrKw<<=|_Q%mctpzpU z>vwr-Lkqwu^Iv%T2h|$E4d^CU<|v76(arCfp&p3g&R%+LpqyxE1Hg{`_VqvZBoI=x z1W#@D0qBcWjgQT7=45xSGfd`O58>R55Vo+uA6I{u{%o?|vzZI5lD@T>Raj(PFYX8z zguKywyz>Zkmg0PUrPD8%@^{IaM#Udj*GM;1d~+->p0iOK&wSDW-Rwv+CUmJo&22Dx zg$m?rWQQ@ufqSdG;&;INtNNwSItx-zDFd4y^D`klyYgNN~2;$>b;Kq#r zQOx_KHyJ=!AI%+qV*zl_ExtJivcv_o@fxol`C%62gbHhFVZk|Z?awc0&}Y4UDI&*# zb7ingen~51$c0QBzVGFf7HXr9=4iIs6#ivRLA3qn_{HlTAN0lvdWzcA*UsG<=8SAY zjr(~C7-AC`P+D+NIJ>UIn>Z=wMLB%-(hld0(Cv7)b}Vzb5Y62lK)g}H0Xm5}+sTY_ zXzO^h+a849< zx~PHu1At67Q5P}!u=caVhf_fP`+6dJ!o+8QRl=$Tcn|Zf8|S@flhU;emMn z7TXd;oK4`R(E3s?7V~w_Iq1X_1EzB$*VC2pIuHB$FZzNxcl#XYVdz)p&)a+$&Bctt zUf4V04E*Q%w30vZb7p2^?)WDqr5&~PtT`-RH4YG1%sHAOpDnD}F z8K|BIP_NtS@J#uLy_6#;zvFwR6N*p`MlDc(x?uO~b`&F5{~SgKf5;)N@X2!qE*IR7 zyu4BL_PjOTUX|ZaNZ10{&X*PXyF$o%y99{+Q-th8V6)?kTQ^`5NaO_Ir%%j_znNA! z=o@*S)!|CT9W2gUk(16Lfjl<_KqidN{NoSSb26&xx0~RmpSAp~v?Jjjs$&k4>7;PD{ zPj(3MJ8S*O@e?20F-zk!|KzolC=m(sXi!a&9`G6bTq(nmc!9?#*V(b9uY2xP$()VK?ox{&oeoY*fTt&#T*ct>OJ=9S$(&3#j6ci$mFOk4 zeb*rn(G6d;vH_fiFCu&QnahmR{-PzED}WXm7SFoDuzOs>=Z++ryCrf=q^BbB)mvOZ z{C_)`g@H7Y$9O|(udR&k6s1ldw}_N>HD7R)t?1+Yw6lSlWvA3BGFZtVX_KV0%@F^| zHbHPZS_jj9ykM81D8{|P@~g(2!Rf?2j7=XANiX3D#1d7{cW*CI`G?QO5Mg;SsFg*N zKV+mOla227mpB|zCwgR{A%~iw3F9CBAyn=(TbETv|3Y$aPU?7W6TMnu$(7yW39Az1 zQup30eB}h!jSh+8Dh54nPx{Ma{nAk)jHCLydS5=^+&9}_y@;_r%Z>!(CQAiGav*Vb zR7qR^LXm$b@8k+A+xe+jyBg=7#S%&hvi z^Xc!A2?HDrMWz*EL#Awy(isUqIGBH-?D}CX)7t3CpfzM=v2;dK_F0;~gb&}vJIn>M zpScCUGrgFW@qtamtSi=5sUdHPe#YBs?LKOFf~q}LhphX54o1WNfC1Wx>AmL5lBoGx z)^caY7V|1TBM@5z>{iCDA5;=w2-!iz1Q`UsG_|FbOs{I$)5oJD?dZvnJj5n6_J2pK z7f*M%a2A`NyO;+VmhTn6LRsVvlVKBYYZ3UrTFM#zACdkg*!8ouu5@U+jXv zorEUHijVrWT=CgH0gQlDf@dGZ{(pzd>owUI2hycd^vf`bh4)u=@@(ZqjlWnz|K=VB z$VuW7P~P?5%HUb_rvhzG6j#S{>axEMSoQz^94$=gSO8^$zx+iEnq&qG;9(>pW@M!kMa0L3prqo_B&L>i1y>sj{UQ_c7 z{45(|z_zfdj{S+VwXVQuZ2u0E(bzRl;19EV%!|2h7)1$M@6)XO1Bp}ijP&uE0boCD zKIEzW=F$9(Q#t%f)_Z~pN7kD{8~P_P*})!eyn1!|Tn@^=ugR}hf5j4gxdNC~*yp^b ze;A!OvW4j`H%<$ae;&sl2$>6JcywW9fDjVo_1EnaAcvM zQz=2AA^CPxf0$eandrl80V9lPAWY*l&WnrZ*6aeL&gFGTw%s3Q!)Q+~s?``Nu0_SB z;|$R03LW89!e%WX9{^cJ0I;?qSIUn+?BBv;7MGr`w2uV-K!w;~Nj}11C|&BPE5&)b zKUt7uszs~x4>DmXg&A7ZO_L82-4+c8sGUzU72q8}H6MWJLY*x0^#8CJWw!$4Cg-nf zgD5$SCJoW(v&~{T(L37Qf6#sX*p`o59w8i{n|Rx3pX2Qnt^0o%@Zo|CX6ONz92H3H zQzpr}nO5zeCTffsTD3;=3DlD&Q60}?Jk6o?#SEYyl}Oclf~TM6LjE938{%J2O@#p|d|25_ZyRkf-N+l{ofGIeTD%1xM zEWN*UXP^CP!#K%Am!SgyJyr(|hMj*8qhx=^ZBSA2=}|btUO?`@B?6!xi(?Z*)q$z) ztR$LF%aO=9TtPgUeevbKr+f5gF}Z)_D|28Ae8>RS0I$3B*^1KDelg;;-Tf2Ac;Pi$ zG#N-h>xx&A{`O|<^q)w|1rHhJ&fb?2_|Mh@M73TwAn0OxrOEuKRXN4CR3Q=6!e}7} z0RiT%dppV)0@knX{$j-aO_K%q1Fmlv0GqzrpKJjnlw|e zm(iWP=ZlHe7fiG7pB@SOoxe1!arx*tTc_=e)$^sk0P^o!1ULh(Z|VY1xuW+vH}6ME z?X+MCFT7!M03J&t{6y$CgYNHdlN=@6b$AyLw8fGq*j%PfGd>tWuHyful)r8vQ((lx z_0^*U(TGY5{mB|8C&yAX-Vy_B_ zAhPfGB3T>5DIMS>5^B;Bw?Ugb45R?>*eX1A&_1d0;FchxI{|M zZ!BO>k?oW}o?Vl5z}TXI+T`WOF`$qdReS%{HF?@vx0SH`a)2-cSJ#FY%(p-k_@DM`t)3K(K8Q z(^ZvuYO?C~^H1)y1lN7~^l57&zo?8jQaMZ3_h`z-FlD?j_WBjp2!sl1_SD0TMyGo# zh5JMzllnGkR$^|;uXSZ?-v;vowHs7vRo#&Rr(TI!gKynG6)K=We!=BHM3VyqaA@rT z1ih3VUQN3OFiS7RnHaeihz6f8V7Fo7#|m@;1*&?kE}X71N4T)ejV^b-w9F!U3CKwu zWP4`4_Kwb40dI4Kp>w@s^Ue-))FhC&L-~v!Pn6yD85CW*E^#zzLBu3ewl|O>eAc`3rdXuRt=|lZtXR_Qw%`*k-+3Z?s0a2Q|&Aoe<)$^d$}%j%5bk zMcy*0aUp}HNq9OnTY|!UVs1Y=qPSbi7aL+PcH_lHyN`cE%?EeCe*SJfpvv2zi_u5Y z6U%4zraSD4m^IIHV?C&i(~5N5^J9Yx)P~Cl>Do&)+(wFh|I;?o+Qui6vuglji+}IBVXOY0R#p-hnt7|-V)TK|e4w2|Dl}@wM*NEtzV==&H z(tUs6(@H*%HZ6}LrA=6SO^8l|qRx&O{C+ack3)~=>~p$``q;(b;{k$m>~-QTVZ-Zwr19Go(+zWZvzEYAIQ%q66;y9Kd5Z_OMaq% zX5QG=_cxoHK6L-mhwkvlIEq`kmZMW>Ktm8;g2{Cnb%;csRyxARLx^dfksNHUMIFz3 zW{ef+kJx0ZWJp5`QtGK6x;UGuF%;p?pnH~zl8mb;g2R>+8v_5dY`G)J8bCirgWrX> zVWV{f0@5}&U1{$aAwfa|JzYr@?!ZsLdwmxd0H#0Cw!bs}z?;Jp zhyG)@b2H6W>4r%C&I399Ry|g=)aTffX`b7)U0p$UiN0XVN}CZ|JB9+ z_((=ha#17bAfS;mqs|+1vt3bOXT5q{aeK+lDY?hWi9D4wf;Q8UX%Y?-+r~%jTVRLP z0)3#LMTvKz`A5)WqdohvA_R_CulZLV&8mXM%ge(FQTngdy*&z2Qm#6BhFJ)Rq}kg5h;0 zG4mMrG_%XRC7`6>J|yL;|1{|Xo)}{E%vFh){AmcIC9hG%x2x`y)4kQoa5~(eooy-a z$^7C*>*B`Cx>>}=1N?7a%;h+>^C%xJJs`z4X#q<>3IITC_KG@_pVo%S0!n^z=X^P7 z1h*(r0tf$iClu_rFpOJM;W#lUoh&{!&pYi?0Yi(fL=0t-{4)&fF~BA^bQa78a&Oyn zKA)=Uw;3wNi22Ril7Dseg|I1s~Z{6#;#)4NYwh7gv<2(nz^Nq&a22~F0nVVyUo85cIrZAfH z8xPB_2QqJ>oDm~zPBVOW^*;rz^vAUCBrvMq)aweUe)N(^os!r{q5hoiU*f;;n%U(h zE}h3sxOA54lF1->Kp#)z=wu7AGYI=h0`VP(B%$s5q#fbJfi1{EFu~egyl0T@1Fw>C z0LbGeY)^4+vgN`ufBsd!rCFu7ZA)1YBcg^Ei7!Ov^XC238}ls^5PD9Inn??vRV7T11Mc zM&u~K8wkE}HSIWUgC8IQWvKOl9OCT&%Ei%!TRgBqIr12s4+YphOP#x6;wH+WeUfcl zv?ttX&)T6^q!%{`{1syz-Vtum@#<93mX{R$6FoAQIF~;M>e>x z4eHcG9FdnMfYaTa%#EFw-B~mB+oj!JY-{qJa?2cW9~A2b#C{FO6H@OyUXZ+N*WzSc z-<29#vxr@P@+16$0b}%OjvD<{N_MzD(miR(-w$K#25{?>E$!4#A=S6BTQ7U* zGMHL%m3anjr$?KU8SlU2`DZ-K7)vhNFxxv!;9uK3P|1k*_HdI#ddEM_dn4ENUa1~h z)FyI1m1GkQv@%A}A1?_!Ol2HRl-RhtIaZz{b^c8bf^w{$QdFzyg!=U^e|1G+`2vN8 z0fpU5WfL|3oOHtd6 z6AYX4^WHCz+f>xyH+Um`gv>2#M^kwrRu&M1fUsdhtuF7Tdmnc$`|7df^NFG~W1yy! z+gq&i*Ovb}ahb%YTP3!%#c4UwH5D?M?+$U_dKd+w{korM3KJ4Ok)x57HtD8LW=OXP zW;oj_zl?tcblDvyK#i8X(iSjtMDg}_>l)e8U$%W#OS1#;t*U1{yePr~qtdo?-wpO~ z-(X`s)>>wQkmk!vI47&9I*+s6h+c7&gf#6=E3>(oT*uv>K~p7Jpi@5L)`}_hW18(wU;&}VMxg;dEsYlS>VX%%euag%44F108@1u5c2W zwX7EH<9}dh3Dui)rLwuW1n%BW#CrHyAw84vCqQKzKOU5T{#-BkUI2~ir%2!LZAou* zs**?xz8Hr)l}lI8ZA|ntFNb((xIZNI`}r}n!1Fd#UG=nMuR+>8aQ0iR`@4W$Zj&<0 z=1%~1dAaY3n&6|lmDu`7<>EloqQT|amT|pDIRK<|_mQl@fyR!y?Az{Z73GZvpf~2y&u9Ab1 zbtro0maIEpqsn%XiJo&?5#q=` zc#C&&mE_TD)|M5{m&{!wVsOZ%;-VPO-t1TWaQ){?61;~1&w9i&)_ggDW#g(VNtIYlyYb&J|$8dYb{X;FO ze+)&6QQqIeXvhKdv|U+tVV@%h^mNm*ERao1CU6>`nUu; z%XEhP-!+NfHeP`*K!yLnAs5s`X(?DjVZ)FzaSNQt3lHMRcC%)b`ggV;`d)VRiz$JB zzblwHkJ|V>WmTz2!r+a?ul7oMb4KqIaD|w(^!^vuVg#BQ?li_^#Va}m)%~v2|5s_F zrSL5io&rd%{&vvWA1>45TfXN9F55Z&*E8r0top8 z{y-;+KF|U#NOsi!Jzf?6-zjoj3 zD&JKe0x*G9GdiNQ{}G9n7&%74hiuhGkmsGGX*fT;)>rm1~j_> z`G|R$jEVPp_R+@4?p4DAENxWbV;~M9o8Mw9!0)2q#rm+Km9nO9CBSS2J2hWG0RBlv zF*DF_2V{R~ZoTYR9p#(`6<@}30Y0+$#$Dx2nU{31^Ie_&nk8Q(-{tF~dX~Z63_b-!Gy)yRr)KrN#~-}*S0Op|p}r(QPl}^LJhxBD7{lJ4@BB$b zZK=Br&>DZtZug9=~9hjYV#+x_{yo$zA96xMj?fqC~Z^w4;> zgI8xW!CCXVGpv4^I=R|6f8{HU)n;|aWL1)sG>;(EWqwEoDM>5#EXV^fJ@y1oNc7^x z5LN3f9K4xzcT#MfTlZ~|bFVZip6J>=08ndg)64TY_y@h+AFhv{=u|jN4L`YF2qbQP z7l*p=3fow9UY&xZjL?-djXnj-cTqs6%e1!I8=X$}soV8I-4BXV#Ud;$&jV63&mT-G zV0d15Oz5XksPj=0CYrdt0T9TZq>&Zk2mBC5sG{p?7Z@23< zdF04kUYzcQv}KJ|PJFJa+50=vW~qdkoUi#+c_=iu*e8v#8t6WQms*4(@2jZ1Ma(tA zGr&J_A51>Bc>@I?u&Zh`uEDwgK60+I4^nrj;R4vw!MdhyLO*!5GaHAhInZ)j)y*G3 zc=+ua72@@m{UT0|>2GRdzBea}^3ptv%*$@BnM-zS=2PwM(x)U;uGMQ*n+!x&o!4eU zjjYdFKF#N9vdQ4id9BgYu5Zup54OqJk8>4cw+_RM3KX#2tpKK6mlW&JM~16-3{g2@ zvX6iQ*|qBc6_?((JUaKc8Tqd=yt=N5GkF5Rs5CT4(~^(GW+-{7Sg=n4=u)|!-KjXZ zmzoZJKo&BF{$xEMNg^8Idx--B&%azE0%$*l--VBBv~o4pr(Pr!h9ia3=2!gWfUK=I z*D?Gg5{37hOYwiM!IB#@xu6|HqJEJgOe95HX~=N z+$S#QFjA^1z(=?5e|+7?U36ZRhDwa;A@}Uv(Q$lRnly{r%kb@Gmv#imKf+GuFHr|0 z>WEl%=~D9{DVy*c++`1f326Fm`?4MbFd{+9#$NO)&oL_MSm6yh%Tc&G&!@*Rx8Hb2 zxR6}Yy-<^fxXLg+g+V&8^O=?nG(h_CZWU2MtxT9A0B(!A8}Sd;s1=d^jF}j*$Ct}{ zLAH83yLx6rfqXp7kzDg)IkuWerhOnupGrzJ5s147uwIi@lSIGIYf}0GO^X#*Y#JZU ztV+`>2G)(YLX{p1R&mkhq}U;S&~!;J4MWwueSoaM5=MQzeW6J80HbB*wv^UO^6tvN zLpZYIccQ1fuaHwoY~~tgc+~*m5Z>q_ma7Kn6=O+nJjaxOH@JEt%>!V4RJrQwccZ?^ zk?6Y~gVZd!*h!xlcAgS>jiHG!R7_#)(z3rh( zknT_mgErKBap`cHwLV%=c`1wp{XChGl}2D7zv_efLtpwK!`itb&YvA{yUacjQC z`+_y3`wH=dFXR|JeLsvR6*|$?xLKFXMW~SLlM+ zeKomY*bJ0&e? z=(mD{uM_)+aW}vK;Hd*(w;AIA?$YeU&6$KAi0XNchChJ!C--1? zb^EcLL#~6RXO822cklxl1@eQNJr|EtmRfzgm$Zur|Ay=YwBKhOsicWt_g)qcBIIh@ zuRGjqB&~5>l82X=zfx8_lewXQoeB`$r%_=hL8Ob1vG$Ndu=Qg=4Jf?FEkQFN3 z$t$!HTq6K*%cH6}s%=MDxi+Fy(^$$?H^=2qr__FS+=`%XSxFQ*UdNYt0%F{8a3%0Z zz^hMjQ9}8;-F@=VM(?8o6kUh%<7LcNP%Aa-9cOsm*caG-0=Lm;c891b3wzqfy|GImpgfB6*^*5`g+1=2HHn&@gK8A-GZE7l71~_MaCyIm{ZGKb@Ft6T=S@MIT~p*L-}s1mQ{7DxEX!qfd*{z-1~m2ye^Wt$HG$~I@4L15sEbcClZ=XBlXOCLKY z0|};AB)X=qMkLPaI$fr7z_R`6{q%|vx`|I`ezpvb^rk7g=N*WNHO-OhztqJ zx7c9Gj}NrdsmB1Y*R+}Z6rhxXMO;v#Kq$cjO4fa#yKHE-QGa8VEcr|5JO-u1ydSEt zl`yyus52?LHGm|xE!tEuGL0?{*lmgc_T^Wf-AB|k&u~Nu)BV+=-WYyM{q8vJG_E4?cf&xP<56p(e@S|AYIpWDCV^ z5rue$htA;lmzXsIDZ);-z5gFuXB`&hw)cHNVkqhE5|Bov8xa)+69(y4=>};SK*9ienfqS%THpBm>JJu!S*B{?vla{~OG_Zx zR}{?R-f~NNQBZVwUVYN{S*hvaQpd*q{>kcvpCAR9`NvvRxDJ6hl{WRDAK^*pf8d;J zq@iojs=w);Le-nz>`HeSPh1|M4J4^Biv)V%`#miDNuwmYst>>4z zU2rHqUZlAD>p~XNc9yqEMUW+j9Jf2>wxu1D3~WyA<(ukY$en&^{cGZo>Im`euum$S z&x?!Os?2h{Z-SD1KP)%ZjDfGZKdz~LwC`8<3ry^0#Q;2nhm73-D`Jw@Gv+ouwjWwU zLq{Xe0BK=*_y!*RFTD1uz~mX_PQ9= z5}P>P=Ne~5n!00-t*Z&vO<1%`siTtAJ4yRS*_4B)#^*gvAX(ul7<+dfc(PK;%NhEH z)5}ij)86aiYyA<>iy~cm!~(bvWp;z?2Jb=Vr>-9yTY~G=cW$W39a?ojwE6;A4{W6x z-h>yKs^z^1af-Xy$-DRLE!)b{VRSRE$+;XlQc3z@GKI7;RSXh7OPlreYuGBb?y+7y z>lrZ-$AgFy4?-dqktT`$RPM+{OvSnmU*l*br(sVFHlp&>h)V3~r z#pg@Hlf~$oFvm2o*|Ecm`nJ^QTm;&G^-LY{su#3B4!#$8Z?-}_mfHwgY#uHEEodO5 zg4~a5{mPU?!iM@{nSU?tX7u5w)ZucjK6YezF)9YNA3{~<4U_mYEba9E&DdkAu6L4- z*qU|sZKSgv81Wg%l;8WM-9oVPsVrsCFV*3RVs`@H)Bz{7-g#cs7o2=2^W?=QR!`NS zrA6*x;e`0ynmx8O=`Uv11m@pcrZlij&cDs!e>?vzj7lhR*kL`a=q>lNm_De-$<8|i z$;CwbcwU{cdIIuH?-Gi))1}sykdl?B{Hzm;HY7eWVx&up9b{}#9*I!Nr3t&Jr(4D@ zyGKp5aLF$GbO7|=lpJi3QTf3^)<{MuJ)T05AbcR^OV0I}7U?m{E3H{A*(_1n4*~U_ z)3~SUBF!`=dozRO`91?tEUP^2PFXoR=3f zu%kIim*XBaNN9a#E}X!p^=BtRid3spdtX~aLms-U!HBt-TJ|nr`y19{=7~2uUhNeA z`)npF#Po5>osA4a&tQSfggXJx03gmJjkN<$aUp?Fz<~gUnM?7ZzOAFX^(+#JO=hL!TmJ~>UWGXabDh1PUtG`Dx$3km)|}#sL|W0P!mghh82RK+E+#OYKPhAZ zM+`VY;6%3@9)Am@$;+m8v>*l4ToH30`eo(7?jRhP*)^hzI9Os>)Cg`?t3V*Gg#8RS zhWWX{hC0sCeMz7MTDWYrk^2IkY6Wv!YqU^`A6N9WG-4Lyk%uH z_fiUv@Al9zKj&l}2_9dpc`$L)za=TqJyv?DlN?)dW)AanDwZ!75%iiYuem6UP~}F5 zudraD3CP7DnMoF1{q{MWqZ6`;6-m#ZVmYpMnK`B?s52;%y14-9=I+^JT3|v4`qj!k zn|fXcQqhb{SjX>rr%LU|Q(*2FHd#Duf~G z**2g57cup(%u>e*wx}6iaSaxR;tfmYra3At-9>QJhubeh0~Vn zMt4$p6pxIH=8>KJ=Z@V*My12MtLbVE#wUNONV ztHfZ#poP$bps39|T<3-tI0R{ogM)}(e3&{cA6wFtI3pFg0W zNRLn{FvZ9uUqk^X=nz4{DHi;b&+|3s`X(KHk_H=uL;4n9b5uNOl{mY+HQ~*ep)zn#r4=Zp}PDgkt<-f+* zpIS6H-=-?4OVBE){_}&DX3x3ldR9xb&44q&*sC^tpeP{~S^o?bYC1`($$n_1V8g+-9buD~{I$ zf|T_*E#gk|9D;s7819!xR6a@zBjA@e%Bo{m37O#SYq~i-YN^SPe5`V21e|$P5fI?i z+sO=sZ-HZ9^<;S9@%;5U$K0)S{$c1!ovYhf3NT#SL|NilJg=KcOyMSTRc4`ZMukCN z*N3Kt_!SMJB2M8~lGiu#Yp1_u@o`h8!Aug@C&50}1XedRZDrzGWh zJ3%W_CkgicN`4C>Ab?$*Phd3zuRnfD{kh{?8~S4 z`ktbZk}e=Fa9P?96$9mhcR4AZ4quWRt2)=LtsD~89*b%>DqT37&t7R`9V~zCMLorE zvR@5KJ!^oqx^%1gT$*9DaM6(R6dn{GGFKOKSjDiIVfYJIFLJ<)@D1v{Wgj7MhU~Mr z{j?;Om>ibyxuHNkxEjJ7`yA_1fz?e;`riF?7974V$2-6g-3m3n9Q(M~GpsIXsChvYJLqq9rgEIu*9$%V;s zO_G*}z&WslA}W1M`Cn8Nlv)qBMM$pEUI!74wPz8r2@na@p2YZcH(so#u2Zq?$dXnv zGrP=q#MxC`W^wu%g_2zHpqEh<7tu^%Tb|%X^dMH~NEMt3HTb@#}a(N<2@vTd9R<8gQ)- zY*2tggT}>$?;$!Y6{?-L%`MXGgM_+={5wQHrQY$@SN+)ZNtUWgqAu08qH$cc8ozs? zQc*#>DVI*VLb6l#-DFYrZp7>}5&q^}s>!&Lx6$lvmhzk2UMu>=KNrWWr-{^!P%9CT zYb%#7*~fzELw^^XMREL|On>4Be3Rz7hrisg3Wg;GOQGEp0%@sD%`y%au3pz}5!^4MK+>PiDBh{;kwGBer(zvpdOqJyBA*O$@)r z%l~Pra3e9P2pi z`E_SsPF<*-&u+R6<9{QOJBb2ba*s{{(rdcfHd`ESJg?nE-+R_Z;1cb~-lI}^AX8}q zRW)Vc5q4AI^uLWIkzZ=!SrZajSUlq=RTyaI)?h(O zbU;hV)LTCn4!U`l<77p!pr=B-%5qri_%{SEeOl|HjptZ=&}Ul;^Fw&}y*)Qk;hWe{ zG3yovfHP7*+N`0D)Y|8o@r>+xo4n7oUXozf{50>tw*EA}b~BC#Jj64v{g3<030AwO z0b7G?f0uqlMV1jiMHM%mjP1vIXKXutig(q$_ahzkseW3|VVI&iLqvx8+hMj%u+Ha*ZnXfCzS!(P|{jDimY6!XJl_=a>G*jlcGmrwqac?dt|)R(a!@Q> zwmUxD%8~ie)ZXIGDo*%)H>gy1yHBxFb+{Sk&(P!4fPi3m|Nen%|t3gn*f~C9)r4HQu;`>G|Kvw+9Vx{yb zd4*)!)8^c+x=@YAa{3R`vJ>WDylo{w_f5_@)Co@o_&E?}KGpJeiRxmVz zU}(nd+z=CW9;<;4ej{o_L@GljrF~1UQ&WrZ;CtpY`ftZ2*itO>YAd2u2|_wYoq2|z z35z_yR-LYpHVtQWk> zAVGHfRo>g0N#oOBukZ8z-A*+%#!9NR1TpTl>a02@NT=^AH|oi8j+_Z@7u9 z=+sCTS^j7mH5kyAy9lg!>n6~!E(#8_G1&dPd&UUy>q*rDj<}c4NVOAdL&T|7)!9;_ zNZXrBSbmCH@U4i%+is4S(nl6S*%Yb-PVtRBc3ttxrA8akP0zup@-LywkBBX*lOY<5 zHFloWS>vA;I=Yc$N!qbf8;8YOJfHdMB)^%EFK=o$v{*%Ad9i+{+{fjc@krNy_}@t( z3g7p`C^3>y)Y&tQsnuswWvP=KK#c{N?C&z>tN#(F>rr7nhCcxRj8Ei<@?U@1|NV(Q z>a2t(8U()lcCjNW|K;0HS@}*t4TuP#AS=zuWU21)8XN!%0CQ~mPxYP@%hq_lEsye${_> kw63F!M_*-v%U; ziqQ0SpnT>5LXk_sH35yF6?#JkpY_Ohemjpc%zf$p@BhX`x&rm5&Nu?!tVp@3e&-=#kPdkG6r$V@+X zJo$-HQ0rk0T2W<=?KfSk#*K}QubeqY651n50jjM>&e;e^_tB4%wix+b5H7nrYx=c$ zppJt#T8>Lh4~6f|66c=TI<8NRXvmkMQ39aYVy07WT?_;_^GAGekm|pZ#qHB{6@piJ z)Q|W20keSO^V&0Dwd|`DSxt&EfaKNKz8~I@ZUVvIpS9?9L4h2*=!p~X{db(tl`x|? z(4`#L>WOO<5Fq-+dbFF?dynX5J_0T1G8<%rA%#Zu~tE zxAWkRdhqbqPGbvtm*L^asfh=70j{>(yY8{yWzw%ODh|&(?s_v)R9me851}-_?y`$7 zb_n`8b$hsBbD% z?W%)}qsH>eEJ2T2h=c|*qgU;8=&mZEc-cCbg_N?-Yx|Z%N!sFZvSEX^8wr<6#N7@u z+%!=@oF7heTf#SabYoX`AU{3a-pgED5h@=N;sN^l4)h>dnMb(_6ut#`VP%^}=>Tlg8x zZmP##rP#q{j@K-|9_>-j9mMXs!gXbP+-#9q=&pSi^Bw{iuOCAQdB`Rhu*~hFJ5yEw zpOg^U!x2Z+Y5F?m-xrB*;R@8ZsXo&oLJlJDc>rwO+^J7)F#$IvE}?{_q>|gWR(iHl zt$cmWJg5i)Y)`E^hq8kfyms%6LkYPtif^SHvX>MEFuOU8a=&yl7 zWjxE7AJK)un4ec&n(iV*1}y$GW4v54B5$)_p>I{)-p+?7Uy6v)78fof;q&$BZJIex>{PebcE&)7dhkq(k=IA3a zh!GMFfR@t<1MZ7P@E+SL2i+|FtiI6Jh4e2zl0RPv2r>pda%D`vA`BIriw!)>Q5ry4 z1*gl1)RoIevd|i`hMy+8RnGUh=zq9YzLaPX5>*Cq`h#`^#wx}WF^NDteGE5MRyXSA@*zW(Q);7U| z@O1)s#6i~5y-=0C$@250>e}n_CT(GqjmF`(DB>-w>Y?k;*<}`BduX(Z&h~RkMvxBl zF84emJqM9KYjCtF1Ce=;^;uV9HRs3O7-N6*ERm^PAEI8;vkn*|uR#G~7o;anHJ$V3 zPjDJ3)Wnjf28H_YQ%vsVJM@UmHAVPd0hHzhuEn9bZ9r!%cWmo^P(S|Zpe-c^bpI1a z#=r(}(p?MNd*z5~jv`Jvgq^ouDT_3nFNCss0kMbHxgIg+As1ftoV5mdHr-ay6)&(o z%&{#QVn{bA$AQHo5O8)8Z94C43yG^p_F5giM1td}so-yP|AdzR%WA zmuoLLT?ob*L&e$`OV2Xa+h%!rhpLe84ZXD=E>2H(^c3C#dfvXHbIuP|rdEumyN_{Z zE_Fhh|(_W5h{NuDDSlg07;EETALCKypwcY{_`%J zf|wS*;8pvj{Z^r3rkD>EMxl2|cElGG`f<)*5?lICE1MGg2JGm%>=x*8b5J(8E zVZVy_gu_2xKKmiJ(4ax2FQosAGbJ9Z<%pX)fkR5lCS2a;D0&eX&1DAO$Waf4M8rCx z)GHZI&BMGH6X`3vcsgFYEw_iLAtx2W)Lqppbi0PPRZqD#P7{*$;UkPuh?x@i;(DG} z6$SFQPW^HMCBJ{l9!^LV5kYV*;zV<(maz1Df7&E%M3Lo==N-;*2rEg(+#LNy@b7!7 zkE*P>dZv6h82T7Bd%LYP1}B!6+ODWW?sPY`J82kD7#ZLl>TT(rx|iy&5O>E)moJ`0 zDD+&SI!Zc@!FGg}8H=AKBi!!>-V_=ZG(PVg+7rJcnLNAbpz&P^Ht_v?@eittlrezr6gV{HEPE zfrz~Ab=sf}5OT64ZQkzSu)Lxed+NdOGg0xbcs_tl)aOHLanB-X#FT?y{suIykS}~s ze(9Y4{gCsoOPAk|-}PgcgRJ`3=AFd(vZoBy;NAgYma(GZ2(OVJ&w~aGDjpiy+P8m3 zfn^U~dLSj^QVEcI)iYYZbSEcRe6uk!xqZ2gB71Q^q1FK8?Vy+bxL2nPI{Q+cO-f(E z?iTC$QZyKeqhU~Q6i|4^fkbId)RSm5vlKN z`jX>`8TrKWW!?SvYd}I6OIygb>^a85tw{2WwBqxdc4PCPq@xostWmD>0eS+nV#ip((!JKmn!SyXN6S*Rr?A@{5PnrF-23jDWncGo&VHkF02|4QI-KKJw)8kM^o!8P>&Wzt&yOFfJ@y)7 zC%pa_Q|3`Ed|n)TLDZ}Z3Yr^XOw0C|?W0Iy?vdazEB)g3+yf}VGca>td#19Orl#C_ z+GgjYJYWbd+i(%w5cISxv}V8S19;y03pV3rzd;anbYf)Bkw#UYTNZJH1(I3AWC*Tr z&Fsfi+n&wD@qDf}F`fphwZdKXU-v<*>s}s;hw33(Z59*Ai-gd~A+8)5kV~O}|0CL5 z6tUnl43f86xK*YmS2cZ+$HM2{!8G_0d65>C*vV`~Cz)Upk_*Ume$c?Lfy~)?HEd~! zP|^vn0B`(heu1G6j@YSkl2RJXua~eMu_rCP2&1?{O3d@}Pr#zfi3;v=m?jtKz8Ie| z>EbNQS9oFek;LCO;O|ku|9Qt4{PLjB<6mQhd96|bGH&ft07jD7gS2UoFm5dG+f!e7 z>{s_oN#)vKqmaZ2b}&^@$NRi?kPIfAb&Dm<+5##_KqIK-f|bhI3k1QXfUm4 zSH7ou9`vloJV0EcwXr!;#@KbvIbn8>|A=4w?KW%!oeS`QocHVnXpy}Tx1JfP^#B2x z3mhPCF12C^(P zw%6ir?szFA!{OT&cBV7-pWD(ht`vANO)epPTWP}fUwvc^tjb=oJcwkr7WM&^@RzTH zxQM`^3gvlmg&Xzr_P772+eC@_@h5R~gK*9#RZ>-+2u_x^<+c7dK4ZtlYCfjSePnOl znV9m4Q-IqrM-bW2@xcFEu%9Qi>(R1ISdN|yf!(qNh1?No0yNz&Fh`~fduD@Udojfu z6dTS`B!ljy*5D(^${3P-j^cRFrnd7L{3Um}HF4QeCJ$|qD zPnCwXn!MxdGN8hQ&QmlojFYT_qL0sShnQ@PGxn#{rc z2lY$upUa_No+4}R*$begd{`HCuLmRoE2|LTe>6|Nj^|&%Z+H-9Md~hr_*(XFHLxNa zKYnQlFGkVM@0acW_C4Tph^8rwSw9EA)nk9e@t>~Kh%3BKv-7-+V1xoUX*=XAl2hgjNG0^p@jc3-almzR!E7_)f8WN>4Hm0v1fyn^(>s<5I`mvV0O`;Mp`ywja^S|I3ldDu zBhTyVL44`dWMPA2=m0YTc%WbyjG5OaIHH|PfsDXv{>#gc02VT`0z`wRs;sX!cb#s7 zR5qGI42YR@@!F`>zSQXmfUUHgsVKbneq!L)tDiC1Yx>5FNug$4afiztvD}gA;vkr+ z#-IC7_{_pX_NdkN4{y23h#Fqjf*3#OtGTG{&jmHifP-B1`d;;KkVCNl4YDOv*pT;0 z&qboZNTBV3y4qP#7uMg9Ta9~pMJrgh@wGyPapMtS4CDc1NgZ>AuJ^?%ss@zDxwT(| z|NJ+oMxPxtlT62I$QYq3_bh1MxHRf~SwI9+KA(bAr=((N{OJWJpGGh?C5D!+ePF8l zTGG2;0uZdM$bv^!{CICRMcNrnkbCv>{q?{tgtkX8f%1qgd`4aRbmYcw!QqvCuj5|y zQ|^Q2(-h-?{b6))c>~#hH&s*h@1EKHg(!-SOJcMU9sfQL1?J0@1Af9AFcyPIQ6#w7 zFt{8Kvm(2gQT}8h0CX&Og{6iWLFyU{C~v$Li{?a-oG`X~)aT!D6`530M_Gh?0sR45 zSK|)1?~FF7XXjykCWa0cyF3WM)hxP?e`h=gh(QeT^Kb51PSvVQ4uT;{V6LMQ^@Wg~ zCa5_ zw+2!YDltA1Jn!gae#Bn7wmVE#S?knnp*2Xo)X{qI4fM{`1NaBqtFUqK;yUR%wxwyc zA10&Nly^WmwGae5wdbYxgyRSfZ$DZD?{||a!KA0C;5v`cRV$`9w%^Nd5;)J^bO-l7 zPm{w_TnY(7YnIP=z-g@h`Y>4b9MnFyLG5!l;;Dg!*KQ$!?~yvRx>SQDS1&hSqYkJe`*S@*nCvz#Sc04Q0@IL(-wJCm_;@rO zV0G2|RozgQ**ZPx>S9|1A<|`0FHntpp;zPEFyEj(Vo$igeKfa--Qr?B{f3O&N!9#* z0ic76htQfIzW82AnJ)l{dUM`u7AnU2a- zwjRsV#+9zQ{ZKXfVApki(k_Sg97I9G?8WMLie70iq8|~}y}V?!(s}4+>Ub;yb>Fk$ z41iHj+&f*{cguCA#jLO9u*fE3WCD+=5)7DK<@cPFB=*ju;U}P4LWF|UWAE|7%K<>i z{#0~r?03HSo(NI_-{0cCF0Ly%wjUZt5owbA^1BQ;x|W%Ck`wOFf+FbdsFpz~$kg^0 zd_{Nk|A1KoG`e0wwi?&j0 zmq7W9vG}Z0>^@7<;aY=ZRwUwP96)VVRo~q*^8^=Hc(>}Dup3T8+N{kJ4=cwV#+hBp z$3|8Etbf~KlXp-n_gxZTSV%@vIw`9t@N7^!G`R?HUvb>EZwGR`738~$uFN<;oy2a* zaG2YlX5RsTBq?AVLz(2hK5i1-&PtZ_BUdZ{*J|5$C&+I|ypemv%06fvkLK!(6ZU~v z?x0}ZxiOmOb@j&Qh;-wQ5{>E~vRnAc;?_%|f-|6IA@+8FwHoZpmzQFs6fu1dZZaG_ z6L+==e}+NnGg6rhi3zZPU-v4Y_B4`F3ixqELm}@M1y6yJ)i4hDd#O(chV0U zc1i+&_D7Om`7&9y1G=5@`MNkYa49r+vZ443cpmVLS|{CjFQh;CoEL*0qfqyb9YMLJ%&Rnc#tJN00yTC z?0+rrMxrc%4#AYcDmB|nD8n%&nf;V>Cl?JBa)~kV8(M58kuRwS8~u8lM%sLg8ceWL zKCU^=QrD@?Pn{tdYWReHyG z?}{H4*C5(cWbdQ2s#E^=#gQN@%ypW|{0Ox>;xH?~sJZmj^SN5To-Y1;v z?3RT)3NSOSPQh@1-(JBt&r*xsC=NTpiCxQGEMZxS$c=!N)@N~xIB-LlIMaSe$JQNw zjzS`)LD67oyp1Cx*xl_;Bbb_E2I;Y_tdUJ&Um)ZD0WR%v0&0F!XtQ$WO|agi`;=*X zS3hml)<8{ynK47yOW2y%eU=Q)!HN*PjxOM8A6Lg*Gl)8+0#*;q* zm<>B#TTl|!6~TTn)|C%5*9QO^;_OJhm6P_N3(Rm@ki{UUc(zPXO~HQ-ol214yAsYR z*cd3xDhyi$^z}mq`84`!x_L;>z=r2?I6%>wHy2}dOT)4I@wCG4**6IbB0}|KZ{Xd$ zJEU(PLIQKY{OI8CnHRV|=O718+>)I1w9+O}03u-D^b_IUb2?r|Tj85L{9o?cSP7$( z)MKsM>*-F6X!Hu-GC!Q>rDxk+?}b+X7jJtKMaF7XNt&kv3co_$0b%v{u!=+| zjXAc%ALUH%Bnm4O5^i9dee?HsC_=*}{uN9dX1A5`N7xhO%f&$UzW#7}N7B*i>iiJJ zXhgY+aY0Id2vKP81jJ+I1{KLedG1&2AK4U^%@p)ut?$&|9fD=l?j5>vhOVAL3gy_( z0wiF%u=a@`oFtIS6ZUwen*`0#_S%e7naKxcTf5LFg~O&7F#x*ol;rSn#tew8@zT>k*_(7I*>5a| zc9VJ>6~8>Ixty}p?`)g_6V$p1z&IPgQJI+oG%KIB;1?K?p>}mGnvM;4YitCJ zGO~#zV4lNwtspRH=B~aTnt2hGJ)9Nw=r$SSM&G zO1=@rricP(iUhl^;}ia<2TT?51|Gfl&UzLa$9lC(LID9#9(59HJxcz#nVtri7 zQUd;|VVm?hHdv_5BBi==?ucCm!f_w_cBtP2qOo*4{%|x~;kY2`a@uxoo0C6ORpo~S z2&V10y_-2M1lQ9KvSY{;Qynv1_(0(F6~6_ zQXYek(p~n;|88eQMJb$B$}Lf0%sif%0>Ro1R~?HRVq>}-D}5>VLRXMVN^1OAjDBH+ z)PgGu;v>oxZ92a9cB2>3H1WoMnPvFRgCvq+yfO2cNyqihWe?IfyUBWPnKVP&fVMKb zPbTLc&L-U@ZaviU%#dHFZYJT;-VJeY{!LK*D8Z-TzMMU>WOhwCoKoy+WXz0{gC&cS zv*60$PTXM?Syf0}2M?(-lL*N+p=8?QA+@w^&~)8|2SSd&IkmJhD<-?3ab3~y5XZf7 zOMqcI3G@W)$-~!0hlZqA+;+$GDszbn5P>b9?@gdfNey-laA#3!A96(F(GC6+o?lJG zc#_<7tq)1B#^vmJ3M6h3@w_1yWXp)eUgOp0$M4>F^N$W^)GU&5cQsUxr7zs`O0`F8ucnNH?ZbzSfqNzr+STP2id94jRZaWxSTj8+PRt~H1ayv{Aqf)^RW*SS+3_a zsNynT3%_JqDr|}k)|!|FcoO|bqSlvAS$RTn9eBwr&Km=bf|cjS&AAJ}8Y&T=b8G$% z)*bkdAJD?DLV*jNqBkfpYV=77t2OLcth$0v=kt{firZQ_QT1SCX)k5~gaC)s z%cr9i_Rw)?-O4bgh2|1iJ34-npC)^idxPPg)m!j>WC29c ze8H9R;H~SNbT4zO3>N?~&<5Fna8al$dT2%U!WCiOhj99!1Wfmr3=?XGfTIxqWgO%C zcQ9C@xLYRwZi`e6C=Z!%D8b&s1}eeWGZOiukG1eQ4}H7#Bbh<%qe+>F<8M>G;?h%K z%I|60G$p`CnyG@JbA{^|nwC>U-Kc);8KbssvV6Ju#Su7zb0BuOBzU+{wO(Tg_~Y4T~G&g0`{6KOCVz>+ozjMKXonR(b(7WINTy;pdSeWFU9_9shFw&aGp`dbd~{Mz_-i zFtXQOe_fKR>2zFg-C#I4p{s0n+DqUh)?UjYgmMiF9{MTbQS@~1Mqx|6j=n`@~OR%OI}r^>{+6b z$^-lcsZ)?-u;F2`qf%XHsbXH!=oN7qZ&PNwck!|-U^F3h@i{j7(X&6z(${r0&`g3D zKa>T-cD-XIbhq6<8}IAbh`3~H{L;tP9wJpY@IX3W<6_p}qv?XcXpKunv($9R+$?Wg zKx(L?%WoQ%s*;I-*u(EEiiPJ2o6z(1EbYlRsb*+xH037PqVHZOj19WM+#Ku}V&Asiz*@hAD5=MT$ zv<41_91F_`;%K7qtPzjpd|U=p9wi^t;{h0>mVxtUnhE#Mb2_%QW;>?}NgWCo9hQ9- zm6AB?r`zK?%WdJ|;S|rYGcpXdP!_?&96GwbLhjEsiO_tsC4Nv1quu;VkFdgcRN2gCouWp=np+X`O=ARb8zRTqtraEPsJ?^6m#=RL#l z1c6cSEV(HYTdX*|k-$*dcO%M@`T_0RIF$x&ycr{`2DH!SSPQZ^-P?F2FF(5~Gz~&hD82v&gnq7*(*k{Dci2tIBBqAdG~?9o_z?WLqTTXC>y#@c`3T z=Q7<#umBxW`mT|_CosKOOXS~>Z*4JL?c9geZ8_Cc(h^bee)*QX`;lq$`<@3r6$tL0 z(2N#ycL)OdOWy9H9)a>exVDDCv|l>+^5NG5)~rIe9^|$S@>M>8Iu&P(ylgG zqtP`7qeni2y!-`LuG?e1>XH{L*j#YEB1*%>uPSXQOgGt`&{=q;-J%kr?UY7MBHmnr z)0`}aWF`A1CElHsQl?hy_)D*Qy9m?YQtk)8CTNQHDfWq{+}nAX3gVYr3xGf}&z-p2 zUAiADS7d;JAQz@7_`0tq(#(Msh@nq_h9A>xpeNd~u&jNOVUH_*Vhm`RK@IXJlNRBU zA{Kp&S*aa0DOn8}*KX2wsZc{J^oZ=nFu5i_Z?2wh#&7vOX7Q#A_853m0Ctj&tU|%e z4r~<2f|}Nu#O010`a!F6kG_>O4R_@8zvpEXTv(%K+w59+Fk-6gA$Mz(Y!WHv3Siz# z{FOkLQoHR@7OrZz>#?5tpdkd=xIz-X&%sxL%oVyStAP+4S!x6Pu(@q&uJgHNb>{;KD-(~vkxV|rT!u4 zqLu#ou?Qdzb$#ZuK0jD&yJZP^6fL+IUC!Wo5-EStLjFfBvL_30ovg4E`}xUe#cgz} zoOUJQdKaJta=q2+^z+&0e|X;t=3G(42m4$~ zbgVUjIi}4)p)=+N%UiNrFPQ#uPK`>!H*K$DIwbJjaeI01);}azbcoe2fIUipPz^Im zz&026KM~bYE?ASr-zYIAkL%vQ`o}N+S2pJzSJcyPz>s=sn-}z7epn1^vNR6-@M+(B z-T(5#Y*E(T4>6;xZGYqbJ-GcpsUN!q>>}GwXnh!rhX-lX%LZ$3uu7*A)SdX6l~s9? z8KowF+;itQm?4Xj%8mqY`1B+0R8s(N4DWs{jn0(QC;py>c zJ}tp{gEmDZ^av7fk%f8+R$pvlf7hl?ajK%HE>+9$=n?%nU$ zAM}yz@xcqB5wZb8R0}~N1F;{NeZ+DsyW?Se8a%%!tg#|eC=%4W2GWv=?LBl`kYx&K zT*ZZYkCXI^)*6j>HjUe~;v}6uaR_UOKXOu~tQDEH9~T-HDZ{M+LNa;Ats!;ticy}a z2e$zy7bP7{318WhM6wOoOpx?_QsX~JzMpI~*J0wua>0cDsejRuI9|`n@Gh>YnZ9xB zgQt{jirWVgP>Jq2K86R>5d7cAWcLtay8Jk+=yJl%Zf_zp0OWe-+(!HmQ)Fyw99VL9CBRZ%-%enr#eoP97jRPI!G0?((ALCX0EQ*k*aROoE?z?UIm z6GLNT{3+n;Jxvw^*sk0uV)2;;Wz&1W8b9`uzleLuo;8e2k(-$;&)4$&mhAw80b$P# zM~ReEsO8&t)XNmnuK+nYhFDA9Ed#2)oYy6k#MJ;yt>2!0_>@Uomc%hs1imrIVZ%eC zZ|9fp+H(lYEKZiUr!&z2q4*=tV*{_#QOy?K*T%(dOyHwkt>+st$Tjb+I6wIIwYuMW zszl_{Ik#G<)&pJ!T3fVmen?C`*ceU#JOkZ$4w&-^8*O6}ia^>7dN(z=a)Qqt-+vih znnTz*=IeX+IRWGUPwg7L+G8@ish>G-T;a1>*FE`Z5r<$^Ob7Giy=yZRI6Kul zAAIj;tgf;Lyz)=>`XuH5Zs#zXTZtH9lFln_SRV%nsMbnssRJWHGjU~N*6lH zdes>-)_95&l%V(FooS5xI((tVvHuiKr|&i6nt0*hXA;)bXc2;x0Gl>1xjnY}-&gA8 zj`PP4ajdK~nf`B$V^xNju0H^NqA%V7KsZmMk!^sPaTagP{~gTN3$L~X0Ln5D1e^x) z20cx}%p)}a!|uVGjDn@X2dSXFG&*V_sOh@(<5l5TDuEX*>Jlio zT*swPhap!$hX9euTROn9tT{iaYapP(_QQFXN6QRo)E2v`?6{Wt^tpw=klHEkJ8Gi# zCwd&nDCr1o#KO6feSqP;vKU1PL?lE+etmH;JI*A3M@G&btvq(+Brk5#-! zfR5fj+;a4i21_duM97ujs#M4ySI*Xuwgh{0 z#6@-fhg~=b*?7s6lpw;g9*1T0!MMHSDy7^hgosl47DC7K%h8aX7K^ETPrQE1_5YVg!H zFJt}R438*Zg|fP^uC1)l$;x53w=>nQ`MXm9a#kJe-d2Kk^yJWNlquH@L!mJG)qDzX zY{i0kWzQy=lEQ9YT9?+A^D{7jVX@fCsi{)_Q8S+Ni?F&O*FVpVNoj)6AQCAFz8T}3 z7RWMtWaa`hUBZaFk^x6D!CzW{BG*sPPp#kpTk;u7Z~tvkFs$_+1m#h|Eg))0$7yS- zyCSJ64|^5|Axv2aT`f=!juj6zuUAMGXo{8SV zs#D>w7`a~4xWCxK)8}8g*xJtbx>upH-km<5xGeyz6Y?N2>*-6+XqFj@wLW5XQuV}o z+xfaO&kKk2)T+XPC8QD(1gVY>0rsbhwF8|){vc)PA)Rwj*@yqZpjz$)9@bqfgC+-E z8t2E7GM2_Ou5ZC+=l(9uh7kO-9OsVEIDY#_jL6lr{k{cY6^sIO-L{zZ4p4v2>hbt3 z8?EK7K2{Ze&3b#j604C{U3}&0NPQ?GRJ#)B#D4(YZ@vo429p$mqN)Hw1YM-s-pM-y z0{Y1XS|rNEz&}n00~^GwCWKka!K`JU{HBtFkK~zv^oNEfCIh@Ts{Chd@^Y3*IN#yD~5Y1`u>K5M(?`z$Iy#X@O@?!8ST|? z2a;&UW#-$nI8B`XPmRYO>3Zb5G*ObEv~;~IjWVC~{L)~kPW8uJ3_Lziy!Q&b!u-ky z#tNhLiEe6V9@o08ot5>>(#_D{isWw#kSCdi5Jw+ENW*@<&ea@i(q`|sCz%PmBTBLk z`DP&*D&?%Z597%D3O#Tm<(AF%ZGibYe>SJV-ztU34) zGsrFRSwARuzsa@CFE#J;*9Czvq5ILyLErm+eKey`^l1P%eo&4Ge1!Hi(NrGmnTkO^ z%mVM2kHWJ*o^znF!9+$xgvZVigrIMst`K$WIy*uCeb^1ZpPAc^-wIUaYGmx5x3hOT z({=>gg*MQ%0oC`QVJeJ@rfnqL5-IsK`Bs%+ngK@((yG-IyMLE z{E#u6yGbuI5ifvf_wj+o#})`K|@I*u~&0SK-mBf%4Wde?XcdwMD@KOw+ zhi*M@f3r9iy~)G#f$0|f7Dz}m^&RY2m%WL0ciM2OysBNi!Dv6yGSJ~Vtz4xx*~i*a z5LP|kTgpr9O)X#qxSfxN7?B_oK>wKhOe>?ePuxkYkE{k#;Un&hC3MPK^HO{l{AK)S z)~ROHY;#$UvqDM&P1jiHMoj>w2n z)vY0}P}sa;KodXV3#3xNyLEt^5{M;B_~8Db07&l#e2Y5w*4ra ziy4PZ$=S5B!|~|1UiH|y{s3;16|;qVL{GD%nkjlj0?3J$qKAE-wS5?hqNY0-$Uv6% zT{6)1&*&AI{?yt?d6lCMwnsVE6Guq*)6#K%##oK8bA?XD>y7_c)_KRX-L~&PB8VAE zjasp_)NE~H(}gah6sgtPd+%9$l&ab-)nRKZYHy_|ZEa$Y+M#0mUAceX=eeKfe*W`H zypo9PbA7J!JdfjjAm&uL(kGbdBrYaID5YEtRp>@Gd=S@h(c*xf*z|F$^K8*;1xxNk z*JyFf!he1}Hmr1i7jZ-Useu39!II|bgHLvDE3H|wZpFDr)ZRAmPU;h2_lMEP<_y{kcxwk}mPAijKHr&pdnY$&2S&j-%P>rnaX5Sg*hC+My9VTMcLLLnM9w}=Jn?W?qzJBw7Q|Aj@CT}j!vRDEsh2+UgO@BY|Ql* z2HcxuKa?2hC3M2!>r6k>(UeE~F6ZQ|rEN>r{X88QTge3(>wIa6nJmUHSP%1xnKL zY4b7=@8XAo0Ix)I%eUDmj!a=YTvX?5RFE)ZKb3<+8;#hYNT?!|{}0l#a_10mD-(@3 z*(iC)^zr2(ba6+qk_?xYIc{k@aj4Ba|K+vRw@9V6oZ%G-hZ=r|bw= z^Fp+qGJG_l3>1_&x)(gaaeX|ICN_u9Dxc`5^&aM@HzkKaGJ zG7^TjNilQj-Dcbj#rUne8hBoRJ5l4ts`^Awd(mYmDBNOS0U#19mY@_l z6@3@{fL3O+T9(^Q9u5urs^@jKQNP4dyVEDXzL0KO8O6pq`0(y2O5_CO-r9bkhwmwg z&xREe!B@)Tp62lP!Ih0_1lc+y<=DDGrpf~K>} z+EuWSI~Lg$w6k6vh(9|`RI>f{L-ioC*b*U`Zu=yqaj7(jZn9u)bV zNzhPi&z=$Ag1T{*^f>z8(^-*9l`M-zj6zO;I$hP180I9fyXNXuLBtD{h5s3 zHyuPUnJ%aCyw*%i5Q>#n2FKM+5{d$J0#_!Z(mqJv3Y?JHjA-$X6-w$NKRUlP`BK3r z278xRf)XDgeg_Lo8?0FD5-=ChwMO}sf{y)~por4Znxrv9^A7>u{ifFuf((poJj5{! zrFIysc0%}lU<^ZTNGC0jo9q}j9AkqVRzEwKT>87qqO5tYYtP|CfX-$hpF2rmmg88B zXgBTbq`xeA0j*TS#l^ezJ+^13Ybh6Bx(GaTJE2@2{KBz?+tC8KS4?s%JaKvbFL%5A z363PD(}a|%ULzEwMdRA2oQog zjys?|G#e9~xHnQ_OZ!vP?ZFbnrQTX%=>#%yS)>*6ly@)e7W=lo@<8N~kG=b=CCoxuS2fEtq^pnSt7h`BVf7ytJf$qVf-_hs0-X$iVx~l=M@wOK& zEcz1Heu5ifnHV3V8kanW>Ur++lnJv5T)5H=iQDJyxHRJ_oEZ1#TwK%de#?8?(%t8k z=66BA)hlO*v?$k6a6a&b;`oamVJ2YB-{P0utlQ~Ic^u4lBYgkV4ROvol$@2ak}6s@ z^p0)xUC+ujk_E~Idf-WT*?T;VkxCBW)$`ptVlfi1(BSIW2w*3_^-3V z9NhBk`K!t^T6#_{{ZmltCi?8m*8Jv9wt$9B6;#sr<(CkxwmO(`B}PF6hvz z1gpVUN2`jqzf@6*V49q0BFDEY7mlPnT0e2vT|~?puD3k*-nVwRf*6Kx8cm4IGTX?U(5(~0Tu+NHOm0K4( zEAQTslY5Rr)=4zN(GLN-Xv>Ka<#LsQ+y}x(yo8!-Z4I1epSxr&}ZHzTXgvCgW1=cz@ zIp#c$7HCr5zHLf*AcDSjJm=RrNY7y5j~LaRUiX^X-Z=RfCJjIG3~x6=^vk-jv=fxz0>VLL)y#M<0t?92#n{bPTTBS#A@UrOw$3-SAHD;*v zzEB?zH~J*{p`=zAQoHgd@MIEY7#g+z?K^Ek^Etz=1ge8*g9nj}O2V7T_>8Et660!h zO{@2A;o6=oHuRFuS<4;66Lct8Anlf}s+LYj3hzZgz@odU-*?bdb!f`%2U&!3|x zUI5xksc>azizh8?k(Vm=xU>GXza?8Y zz%h=jrTf3AuFWzc#c*)gaQru>L{L7;r2NXh~kyh+f|(;n-{M(=x3 z&*+*LPymZ5JivIhgEiLQfeL9 zRuw)gUZe+ar3c#ktj2Tb46_Q?2m=%KFK`Q^j>@A7dUH5D1AYJyYpOKLe5vDJF(n-k!zf%SYX5kPd7=G#^OSSrQIzHeJLGNSY!M>iJmUu9btwGfe zTEDnL?RwNUsZ$Mf6%Pt#8g#K+BIr1Hvx!zDI1G*CDAvw7=ye`?FDf~3&$qm2It~_J z5`%{ZSXiP+Qm?M5_T!Su!R}rRihZ3ThLJb%tgVmBsF0}VTgVXutrt&mun^CcltT2q zm`<=yoX87yW>R7rcaxRn?X$?tWDGv&_YOy$3v~~yW=>CxJISN6n3XWO)Fex^3E$&W z$?x!zx|5+U7b4E)HQ^Fj&H>x*j3R^hj09hqIp$Y-ryO)mzEqQ%W*d6+nl|KI%6fQutO-{T5cW$fFAxw_< zjv(bkX098!IL_uUS6DcWsas@ugvJp_|EUuDt`ur!c?!gW!}tt7X!J!JX6YPa@2lbZ z4rA9Y*}E~C38w(}E=5Y0Km2C#v!Wnxjiipc>8{m1ZV*uvt*rZ?MOo2)jEN;N?Io_x zG2W+xx#Dm~P8yfr)g;mX#@ktC;2i7-CdL4rx3T!B9fA;zXaJFm)rxvr%w5JC%dbx~ z{gcaDEP7=!Pb9`g+oKT9&V>s9vK4&zcth*G5W+uGK4 z%Q{~xK!q%nzqXkWoW68YPNTDv$E^w`Q2}r779~usbaXuk8f=9exoV}kU4QY|g4&-s zaf=mp6mHvbzQc`blbnNmf_RqJ_O{@FSsl|;p7OGmieCwT+?)nx+tm+f>FMW$k5`X1 z6UohZVnT)C(AJ|S8=VC*k(1pbZD5qn(O^{L3d6vnYM7&7*WjT=T*~Mk|-y zY)cb9d|1j6TQS+ufVxr%zyADqvpN-P zq;L;2d@NG%Mr7e{v}Z^hkF(`RcW}eOe6r7L4-;ICHcE_5qq>0x4L|(&t?c7>seO=)i6X+{`!c)G0cM!j;Y(D8^m z;sZ|$vaDI{MHBm^jm~@++36>p5aq%4bdyJh6h1G4rbEc6_+Z<~AyI*)i2!dy>rNL~ z({b2fe;^SiT1KSsmE3!mh3I1@JufBr{ZM2Gr*h-`ygHyj0z0tqd}ldu}KK*J;fDm(qMy-bD5 z88d>dwr;`?_DPeP^}+%Q++f9OZ{{gYrttiPbs^ z%hc^swo!BB7?fz!dpM|Cc-h^9qq(IG=Sv_T^viJi-p@&=*@@Jo z2GlT%IT{l4@>{>s%^tYlOAX5AH$4wLjJ2N~sO_YvS~uBFu3h{dl**q!7&Uo(V0xQ| zgg6GVC=l}&n3w3+73Ev1y|x%3ss7-S#M6=>{3xbxO-pL|my1HM<9O^@(2g=kK z4+4RP2*45`L#<$8bK-AGS!KO86Gpv9`&)0noa=(eB$x%64z#i|ceL-N**d3L%R)kV zAKI4COqm``BPw+T1U*)Lx2vH@V+D6 zA`>?XOOT@_tx4ZayL#5(yw*7ZX!`GRb*`qe2)dju6@Qrs>QHBM;?6rAS?iExy>rI^ zINTgsfPvJ)1`B`Q_{>(&iNNg-jtAy22$~q~V|IiNC{Qc_TVQ`v~ zg!$;yity@uKIc4_=rFue@XcFdC*qDS6WbY>e@EA%`@Dc?h=Ee2IC@${k6+wiUuj>O zd%oMM%DPvAL8IKmsBWqGhc4m@11Eg2HP^4t)TNPl?S@Ldu$3~BUo^z;6qqUk!;}_z zD3lJvf^TAdh>6^C>)uhLFtXx6kkhChC2hV{|564W%H+Cz1#JZBu~6mTWfvuWE{nXm zBd3KyiJJ#kgp)+DU^BY*ww=v$i5B^HP!gAMSyCfxDHYNHkjTucFeXc)MGM>87T`2) ziNDIz12}FE?c1K>5Q&!pjcY^&f9dURk)Fr#>Pw;7V$_){jQAQalmGDek0ARMjcM(7 zOHV=ggFkYO*Pn!OsC7WJ;W4J)f@JZRg925RvBCkJCXFRG(!TCsF>~)dz4MbD5zlp1`368~` z(Y@mEdg9ENqvYm4P_gtU9xkI~u|@{%C4lecbE;NYx-YLG@~WVQOcA@#FdRpvLgh70xH=|U~2F9z-{Jb(fXcah?V2E zqnOi_>ySN;Cn>?}I?0&oW9pp&El+2Goa{4{mp{7iO~NiYjiEgqv?517Gp}CE%)20QBB;TsU}rH& zbYjFOfT!$}r2-IK%$eOd!}+;?7uaxkL2AYzIpKBqtzPSz%87rO54&Ih)sCC`3+vaq z7|Bk(JNYtxlfBnE`tDHTB4*xJT2Ygh&*VgGN3-7!t!O0MftS%YIQd7_AS^l?X4Cki z(~Q4ZMmI+73ZUiiRMy9z!I2UlEi-oG1?rt$Y9weyl00fTdU22CKj<&Y7vOB-8VPU` zh`v>E9ekO5Qy4Ko!2MR#DnNgOj)|Q@(hl;}Vy$$9yoc8#zG?4$6|==mi`!*K*e+k<;4O}|n?<>R83BV6gZWLkY|q(A`n)$0rC6w}s^FX^T}W`G z^6_(e^*O7AdSxS+1@5)EN^?_P?5zZOWcZPi%mUc~hO>AaAzMCkL1axVL5RU66#4Ze zj1wxPD!x95>R?X(mFs#&_q4`K@ToU7^59w3Z|?7XpqRsSMwk53q*cRMrh5zHc0*iv z?=kMv@Zy@8N9uD9w->cvM7XC43i`E(r!etz6?I7nvzVI>k}b-p^5fGD#BmR!zp>`L zejCiS6I0Ku_kN2#ZyktzT()Q1I|5mEZMLSHJ4Wc%W>_;sasJyW?HyT`jZtmC+h6I* z#lRS3cF7iQwrt)v6zFce=6JgOocQpjZ0gEh{8*msB!57`ur328G_e;%t~^Gpjj_poiB=ZCup^xyU0 ziq>@3yA`lA6}Zd$bWK)zd@!R)x-*qJ=wrxNkSeM;=;N%luL99|*C6Kf;82rg?Ap!! z>mwpQD~NTzn{zKe5~F+TRgm1yI_zZh%h)}3`MP1{>wl0k;*Q+~sp;;x{H#1S04BmE zlWC~6C=|Ez)AUGm7C_mC%gi?MzIhD=xQOlfC@$4|ckuk*GRJuA^+@xwu9wO2jKAq$ zMVQB>7V1uf{S-qhHHVAydWyakl@QZBR0|x7zA690EftPwyBlQtJKur9_T7q`?QhDR zrnrMnj`gE|^#Yoi(VQKe-^49%2DMsolHD;&dw>7r1LbXz!A9bXAL{=7HE<`{LbdcX zFG3RXGE4H`pooOe49)Kf)fN6EhKUvzz|j{M?tg(>dO?k)oTQ#3jt_f8M+4qo$o`W!;7gVg@}TI@6?&Mm=Oh8xEN(m-mQ*Ir^5iP(}xw@ z@-(^@|4ydtVuK~THPt3^R-bgFmZ~S8rsaB=&Wk5Or@LyGE>!&MoA?V7Lg=hF z(P=A#H{E(;*Y(dgbuOTnIoFvBhD_jO37B|@#ZwIpje{K|eB%DzA*bwTBz({+3!M!f z&Z+I8I_nP*HhvQans{BI)8DbEj!Yov15IDE$i%B~XwVsRRZY-t#12wsch0kSrSZQ$ z3EK)Rp=(>q>d$RJK^iNqo2B4%1**PyR_V_K0S@6cf2)m`oe^S5Kh+)Dg81-Mg1iCM z2iTT{MuxyuSxtaR_9t`zQ0vmFuu&y%Itxc1>dc=NP?09V85NN7D%7Tw*f;~1x%_4h zmJrvB;k$rk^ch$J)(lV%otf1jMQCr-Wokp(TjTGc1K~SD3piVPB7tMHTPAkfN5@&+ zyDi4o_T3*dF^{gJCVv%e0k)V9pqzBdmh-60^!qbb=8JLyMv)dD zW0dEVe(Aj@jdd}9j{yI&dT84~wH|vAIP6t!MeC#W<9i#EcJh-4B3^wUF)u(q%Kp43 zW;?=SaxL7F6p(PFP@a8=D^0@u{2i*+KQ-6^*LyZ;W`BlU4qunwG{lUi;kBPCKx5XwcL1gkH(#v|ddaQISn%0TRkkx}d8;SknKpRfq4&!2i`bs;O;!x; zt(OKGL}*at7v4yd7-0wTih)KNAaU}eWS>mymO>ZEM70S`qU^t`Bio+f5@7Qrgm2#f zAa(j*h0M_u&Ds9kI*I#6YWDk)5!sN>;0OW|nZ|B5u~=ghf8i=FU^X!FpexhFJR9XO z%jF8})Sc{JSs=3w^_3eemyZu78+{YY6zcF^N33O`B`j9c8XgKbuqShw~iKRV- zZgsuwfQ==P(-W96SXiP3G^hQOc*A}U#W?=}K(PAo;G-DK9;>%T)`FH9k`W3hZsC!N zeYku$RbpqL_MIja8K<)g7h-_RTX-JsekTt027SRkMZ5`0(|dBPs9(ub8f)(*%kh`9 z=EBi4=fwkD5lRI_o3t>ML6K+5NTk<|CcwhcdwaYMjN#=Cu#z zpGUQSrP}=tKZ~aW)T&otwf>j}J>Mz< z@{#fK1Isn%ez{Y<@=mpBet~bZAa3RBIltfUitN`$Dk9UE`PvFgIX}`z1_5mja5Y_s z3I4M>bZ}ZFjJ&D!*m3ORJFccj$+~?lw^(4`f$C~BCdhzU^^DMXUJZDAlM4|*4w%@f zqE2AJl`*}-o=p>P<~tYCyRu5zKgI^`!~>5`Kgf!<2Jz%q_nRYeTPoLrnc6vb7JV22 zaPw7(m%|LX^T9&;v)(9-M5!WJ7=oOz5cGP{2D&wJR1KkM*~3N|eg;_Vt~DvA;3@p9 zvUrQ3((y8n-=NEB$Df+MXo161&F60r@Lg|if{!~gW%<*v8QzToLA`eqzO(c+VXtVS z5sdAA4V!|BE$V`s%f$Y+l<)3i3#AnD!XII!*l)6>8P!>3p2s!(xw+Mjr~h*WIzNT8 zHUF~qA!)J|*vHNY_ZvR0NhH`ef%4E7ownN5^kp?Oo5VMgez4J_WpcgG_J%Jw<6L$( z?&Lc?;tT{}PJs(8i$HZ!hr|O8fX|03BFm}KR4B|bFj3d_xi%K?hkHc8ssNlim_Y9=_2W-Y+COO>0wkpc-}Tg|JFd#);$9mjerG56 z^$eSwZDBoRoSTWBa=9h7X&JTR zkDtnrbXz)olj*kjO_rK^3KP0b%tMR4X>jU<%90u2zm@atb->(d(4!NqFVV?=ogoO0 z>zA+%A7W(*Y|!qqc;hqHT{J#(ayN?8w`<9=h$DiLucEGQ;t)(R)|?US5^X{*A5o`m z^d{USg-O{isY;hdM>T5ZPVw3DHT$6^C!c)%@&f$MzUg{;3aCYEx(H}0>*yrh_T62c zS&F_5wYo5>PDvW&H5D+dS4qGA?5Roo-L;trVfkMwNevdAiCQCh6OX=`4|B*;)K2gf z780lzoI&XCO(Bu#s+%^xteP|mLP@a(wsv;w_P1`SQ(5!@V<=A!YjWgU*8Ow%5D(K0 z&xO`rW`(ziVf3-#?m{|%K`;VGb9%kR<0R^@y;u8o=U75ixPjt| zxykkY4HX2O`RqIDXY|#cJv3+NI6n42+6qHZ;r;vE6G5j!sH9h}mV)63>7C=Z+wJU} zBkxOgs^5B9-G7EzS$~M>~# zE;Vzy6Jhd<0xvebkRFf)dBh&aD&5y1m(va*fv z;Sco>#&1FqP?OEqtdZ30zb)A6PKJy-{EdR3oD%vUh5MPQ#R8o<@9zr!^T^GjmUoK< z;#kzASq4+t)LdLRn6&k*b9o3fw$UX31M_&`W6teV;)MguxQ3|6#fm&(A(6d}Q%oMG zg11-+eqy~(eO$ns!|0qIraIlJdT{U#$QjSx&RRY`XH+{LACV7n3IRkbDLc)4#3K|e zUj3MmQqk`nOhh&u)Q5AL`~pm`FxTjZeE;M1$@uG|&7y4#a#9_$2F^-ewaC1#_iv{d zH#K$4qD~w}Wq2|?V7Td-F#450cnav^<69I<|6qQ&6(BQQk{#A-B&^>rtQ6(olK05R zw02LddScdxDf&lU| zHO+DH%sw0vzJLF|Qc6&nK<-Cr)1XNJ!I{5%HWQ)TEpM_o{^^F!3h#TRcdMibj)|9d zZ}|v&9>~gLn_bohs)`aneJ|4G>|qse39{=Z?p!w1OL8jrD-8+~Z5};Vi$WZ|W-Kt` zWhEjFCB*!KjdNjXj)XM`S{ApqX1_@iD*m*Xf|!izG5`1o-y%t?PHS)G>12(p>@{{D zW+i`2Jcr`g;odr{oB!4S*#snDmJs+r%jI17pSo}%^pk3RTa{ z{JG0(p9$&h-ehxhA*g|d3ScQiZ8p*|qBHVNRV_ID#`a5p|F#uPJa>zI1D|^{;}PcP zGsZ+0Z5D0oU=%QZxM?J~mNZP^`Q{)Nw++k;maKGgWST7sl1w+lKUidkUZ;{iFYn3x z?r3jgoGDs-E76#9aBUsih~-qAmT3X@*SN=LwQQn8mzcvo@%(yZWmWhK^Jjnj;x-^B zf96aVl|HPB3|UJPGC1~^<)HO<`fhDKRU7t=*k9g-gIS*LHCYalSyblKW!C%0CQV}5 z|L_F0Bb777AbB5Oho9C321rV|DV_WzfJiB|!j{-hforkuYJMooqvdGQdpZx(OHU2+s{5_(-F z*3`+aJ0sJ((!4-YNNaADuDVhVmCDu|8AieZj{7>OglWr=kEi$BV$y_8s(0#D6xqyW ze^ksyNNAKENbIR};{e z*W}MqltGkt`**qI6*0y$fnpbK&5Vu7TGmm)E`Mj-&#xWH?thO#|Eid2Lw4aG$%&OO zJ=I$V_qNM*vANwcUw2hxEe&MPx1)|Z7`C_E_$ONF3$s&wynK}|2cR~K#B!f6s`x#8 z_>jI;?*?wbVW6K`{lQBE!<;!zSb>7^Lw51-@No~(f8GY((SrT!yzOru=w*8C4{3&^ z%sDc?DMQM?|EEX81(kq=n=k9b9z-eozRueRl_GY}K>v+&lJ9@9s|crvr@>SZF6J-i zL-e_l7Lk@T$RzX^EtSEn$S?o+)d?H0)nNJ=@8!DT$sd#cb9+sS22Xdj-5u!6p< z{jYuu*tINqiC7>Ku0~hh`K1S2|3@$K|G!SgwP`a51afvp5z9^uejp`WyTlOTHZ%&7 SCs76-fn3wjQ7=_B5B-065`hH( literal 0 HcmV?d00001 diff --git a/packages/devtools_app_shared/lib/src/ui/theme/theme.dart b/packages/devtools_app_shared/lib/src/ui/theme/theme.dart index 3513a229922..07c1bf1e6a4 100644 --- a/packages/devtools_app_shared/lib/src/ui/theme/theme.dart +++ b/packages/devtools_app_shared/lib/src/ui/theme/theme.dart @@ -278,6 +278,7 @@ const defaultDialogWidth = 700.0; const extraWideSearchFieldWidth = 600.0; const wideSearchFieldWidth = 400.0; +const mediumSearchFieldWidth = 300.0; const defaultSearchFieldWidth = 200.0; const defaultTextFieldHeight = 26.0;