From 4c5f48421def463837d1474bd7d954e97745af84 Mon Sep 17 00:00:00 2001 From: Yassine Ghazouan Date: Wed, 21 Sep 2022 12:06:19 +0200 Subject: [PATCH 01/16] Update minimum OS & Swift version --- ADUtils.podspec | 8 ++++---- CHANGELOG.md | 4 ++++ Package.swift | 4 ++-- Podfile | 2 +- Podfile.lock | 16 ++++++++-------- 5 files changed, 19 insertions(+), 15 deletions(-) diff --git a/ADUtils.podspec b/ADUtils.podspec index 4e403cc..0f12dc4 100644 --- a/ADUtils.podspec +++ b/ADUtils.podspec @@ -1,17 +1,17 @@ Pod::Spec.new do |spec| spec.name = 'ADUtils' - spec.version = '11.5.0' + spec.version = '12.0.0' spec.authors = 'Fabernovel' spec.homepage = 'https://github.com/faberNovel/ADUtils' spec.summary = 'Fabernovel\'s toolbox for iOS' - spec.ios.deployment_target = '10.0' - spec.tvos.deployment_target = '10.0' + spec.ios.deployment_target = '13.0' + spec.tvos.deployment_target = '13.0' spec.license = { :type => 'MIT', :text => 'Created and licensed by Fabernovel Technologies. Copyright 2014-2018 Fabernovel Technologies. All rights reserved.' } spec.source = { :git => 'https://github.com/faberNovel/ADUtils.git', :tag => "v#{spec.version}" } spec.framework = 'Foundation', 'UIKit' spec.requires_arc = true spec.default_subspec = 'objc' - spec.swift_versions = ['5.0', '5.1'] + spec.swift_versions = ['5.7'] spec.subspec 'Swift' do |subspec| # Subspec compliant with App extensions diff --git a/CHANGELOG.md b/CHANGELOG.md index b29abb9..ec3ce20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Removed +- Drop support for iOS 11 and iOS 12 +- Drop support for Swift below 5.7 + ## [11.5.0] - 2023-09-19 ### Updated diff --git a/Package.swift b/Package.swift index ff820b3..01b4f98 100644 --- a/Package.swift +++ b/Package.swift @@ -5,8 +5,8 @@ import PackageDescription let package = Package( name: "ADUtils", platforms: [ - .iOS(.v10), - .tvOS(.v10) + .iOS(.v13), + .tvOS(.v13) ], products: [ .library( diff --git a/Podfile b/Podfile index 6760170..d264314 100644 --- a/Podfile +++ b/Podfile @@ -2,7 +2,7 @@ platform :ios, '13.0' use_frameworks! target 'ADUtilsApp' do - pod 'SwiftLint', '~> 0.42.0' + pod 'SwiftLint', '~> 0.36' end target 'ADUtilsTests' do diff --git a/Podfile.lock b/Podfile.lock index 2f84964..ff4e10a 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,10 +1,10 @@ PODS: - - ADUtils (11.5.0): - - ADUtils/objc (= 11.5.0) - - ADUtils/objc (11.5.0): + - ADUtils (12.0.0): + - ADUtils/objc (= 12.0.0) + - ADUtils/objc (12.0.0): - ADUtils/Swift - - ADUtils/Security (11.5.0) - - ADUtils/Swift (11.5.0) + - ADUtils/Security (12.0.0) + - ADUtils/Swift (12.0.0) - Nimble (12.0.1) - OCMock (3.9.1) - Quick (7.0.2) @@ -16,7 +16,7 @@ DEPENDENCIES: - Nimble (~> 12.0) - OCMock (~> 3.9) - Quick (~> 7.0) - - SwiftLint (~> 0.42.0) + - SwiftLint (~> 0.36) SPEC REPOS: trunk: @@ -30,12 +30,12 @@ EXTERNAL SOURCES: :path: "./" SPEC CHECKSUMS: - ADUtils: 8b9f64a118d331268d20e67617c7f037f6c59000 + ADUtils: 12fd5ba501a61bddfbf8ae68b335b1cfdbece393 Nimble: b279b3ca9e094508778aab5c76417be158d3ad04 OCMock: 9491e4bec59e0b267d52a9184ff5605995e74be8 Quick: efab97aca76d60be86c15daa533b2cdfbe1a74d3 SwiftLint: 4fa9579c63416865179bc416f0a92d55f009600d -PODFILE CHECKSUM: a085ff0ceae15032eb100393c6df98696f11d7af +PODFILE CHECKSUM: d2eadde26b54f44a945891dabd38f394771ca00f COCOAPODS: 1.12.1 From 166cfddde39b4b934b6a7b0e29465b65fc604fd1 Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Fri, 23 Jun 2023 17:29:11 +0200 Subject: [PATCH 02/16] Enable complete concurrency check for tests --- Podfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Podfile b/Podfile index d264314..ec93699 100644 --- a/Podfile +++ b/Podfile @@ -26,6 +26,9 @@ post_install do |installer| config.build_settings['EXPANDED_CODE_SIGN_IDENTITY'] = "" config.build_settings['CODE_SIGNING_REQUIRED'] = "NO" config.build_settings['CODE_SIGNING_ALLOWED'] = "NO" + + # Enable complete concurrency checks + config.build_settings['SWIFT_STRICT_CONCURRENCY'] = "complete" end end end From 15789c039f1f1a0b7f6426202e919134cb9e3b3a Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Fri, 23 Jun 2023 17:35:15 +0200 Subject: [PATCH 03/16] Add support for Swift Concurrency --- CHANGELOG.md | 3 +++ Modules/ADUtils/DeselectableView.swift | 1 + Modules/ADUtils/DynamicFont.swift | 3 +++ .../ADUtils/NSLayoutConstraint+Utils.swift | 2 ++ Modules/ADUtils/ProxyDetector.swift | 20 +++++++++++-------- Modules/ADUtils/RegisterableView.swift | 2 ++ Modules/ADUtils/StackViewBuilder.swift | 5 +++-- 7 files changed, 26 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec3ce20..4a227fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Added +- Add Swift Concurrency support + ### Removed - Drop support for iOS 11 and iOS 12 - Drop support for Swift below 5.7 diff --git a/Modules/ADUtils/DeselectableView.swift b/Modules/ADUtils/DeselectableView.swift index 74a6b3d..cdd6943 100644 --- a/Modules/ADUtils/DeselectableView.swift +++ b/Modules/ADUtils/DeselectableView.swift @@ -15,6 +15,7 @@ import UIKit * This is a protocol to factorize table and collection view selection methods */ +@MainActor protocol DeselectableView: AnyObject { var selectedIndexPaths: [IndexPath]? { get } func deselect(atIndexPath indexPath: IndexPath, animated: Bool) diff --git a/Modules/ADUtils/DynamicFont.swift b/Modules/ADUtils/DynamicFont.swift index 1abe19f..eb5ddc3 100644 --- a/Modules/ADUtils/DynamicFont.swift +++ b/Modules/ADUtils/DynamicFont.swift @@ -12,6 +12,7 @@ import SwiftUI /** The DynamicFontProvider protocol provides a font depending on parameters */ +@MainActor public protocol DynamicFontProvider { /** @@ -34,6 +35,7 @@ public protocol DynamicFontProvider { The DynamicFont provides an implemementation of DynamicFontProvider depending on a plist resource and/or a default implementation, meaning providing the system preferred font for each font */ +@MainActor public struct DynamicFont: DynamicFontProvider { private let provider: DynamicFontProvider @@ -85,6 +87,7 @@ private struct DefaultDynamicFontProvider: DynamicFontProvider { } } +@MainActor private struct CustomFontDynamicFontProvider: DynamicFontProvider { let fontDescription: FontDescription diff --git a/Modules/ADUtils/NSLayoutConstraint+Utils.swift b/Modules/ADUtils/NSLayoutConstraint+Utils.swift index 4c92345..3baae47 100644 --- a/Modules/ADUtils/NSLayoutConstraint+Utils.swift +++ b/Modules/ADUtils/NSLayoutConstraint+Utils.swift @@ -20,6 +20,7 @@ public extension NSLayoutConstraint { } public extension Collection where Element == NSLayoutConstraint { + @MainActor func activate() { guard let array = self as? [NSLayoutConstraint] else { NSLayoutConstraint.activate(self.map { $0 }) @@ -28,6 +29,7 @@ public extension Collection where Element == NSLayoutConstraint { NSLayoutConstraint.activate(array) } + @MainActor func deactivate() { guard let array = self as? [NSLayoutConstraint] else { NSLayoutConstraint.deactivate(self.map { $0 }) diff --git a/Modules/ADUtils/ProxyDetector.swift b/Modules/ADUtils/ProxyDetector.swift index b955022..71ca4ee 100644 --- a/Modules/ADUtils/ProxyDetector.swift +++ b/Modules/ADUtils/ProxyDetector.swift @@ -8,12 +8,12 @@ import Foundation import UIKit -public typealias ProxyDetectorWindowProvider = () -> UIWindow? +public typealias ProxyDetectorWindowProvider = @MainActor @Sendable () -> UIWindow? /// ProxyDetector check on proxy use and display notification if in use -public class ProxyDetector { +public final class ProxyDetector: Sendable { - private var windowProvider: ProxyDetectorWindowProvider + private let windowProvider: ProxyDetectorWindowProvider /** Check on proxy use and display an alert view if activated @@ -41,11 +41,13 @@ public class ProxyDetector { // (Benjamin Lavialle) 2018-01-18 Do not notify proxy on simulator return } - DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: { - // (Benjamin Lavialle) 2017-10-03 Do not weak self, we need to keep self to complete action - guard let topMostViewController = self.topMostViewController else { return } - self.notifyIfProxyActivated(in: topMostViewController) - }) + Task { [weak self] in + do { + try await Task.sleep(nanoseconds: UInt64(delay * 1_000_000_000)) + guard let topMostViewController = await self?.topMostViewController else { return } + await self?.notifyIfProxyActivated(in: topMostViewController) + } catch {} + } } /** @@ -53,6 +55,7 @@ public class ProxyDetector { - parameter viewController: the view controller presenting the alert view - note: The alert view is dismissed on its own after one second */ + @MainActor public func notifyIfProxyActivated(in viewController: UIViewController) { guard isProxyActivated else { return } let alertController = UIAlertController( @@ -78,6 +81,7 @@ public class ProxyDetector { return httpProxy ?? httpsProxy } + @MainActor private var topMostViewController: UIViewController? { var viewController = windowProvider()?.rootViewController while let presentedViewController = viewController?.presentedViewController { diff --git a/Modules/ADUtils/RegisterableView.swift b/Modules/ADUtils/RegisterableView.swift index 7808300..3e49ebb 100644 --- a/Modules/ADUtils/RegisterableView.swift +++ b/Modules/ADUtils/RegisterableView.swift @@ -45,6 +45,7 @@ public enum RegisterableView { } public extension RegisterableView { + @MainActor var nib: UINib? { switch self { case let .nib(cellClass): @@ -73,6 +74,7 @@ public extension RegisterableView { } } +@MainActor public protocol CollectionView { func register(cell: RegisterableView) func register(header: RegisterableView) diff --git a/Modules/ADUtils/StackViewBuilder.swift b/Modules/ADUtils/StackViewBuilder.swift index 0681dd4..428995e 100644 --- a/Modules/ADUtils/StackViewBuilder.swift +++ b/Modules/ADUtils/StackViewBuilder.swift @@ -7,8 +7,7 @@ import UIKit -// Update with @resultBuilder once Swift 5.4 is available -@_functionBuilder +@resultBuilder public struct UIViewBuilder { // swiftlint:disable:this convenience_type public static func buildBlock(_ views: UIView...) -> [UIView] { @@ -23,6 +22,7 @@ public struct UIViewBuilder { // swiftlint:disable:this convenience_type * - parameter distribution: The distribution of the arranged views along the stack view’s axis. * - parameter arrangedSubviews: The view builder for arranged subviews */ +@MainActor public func HStackView(spacing: CGFloat = 0, alignment: UIStackView.Alignment = .fill, distribution: UIStackView.Distribution = .fill, @@ -42,6 +42,7 @@ public func HStackView(spacing: CGFloat = 0, * - parameter distribution: The distribution of the arranged views along the stack view’s axis. * - parameter arrangedSubviews: The view builder for arranged subviews */ +@MainActor public func VStackView(spacing: CGFloat = 0, alignment: UIStackView.Alignment = .fill, distribution: UIStackView.Distribution = .fill, From 36ab1978db070fae64c437a611fffc49de349f01 Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Mon, 26 Jun 2023 13:07:21 +0200 Subject: [PATCH 04/16] Fix typo in ProxyDetector --- Modules/ADUtils/ProxyDetector.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/ADUtils/ProxyDetector.swift b/Modules/ADUtils/ProxyDetector.swift index 71ca4ee..1629f03 100644 --- a/Modules/ADUtils/ProxyDetector.swift +++ b/Modules/ADUtils/ProxyDetector.swift @@ -60,7 +60,7 @@ public final class ProxyDetector: Sendable { guard isProxyActivated else { return } let alertController = UIAlertController( title: "Proxy", - message: "HTTP PRoxy is activated (\(proxyName ?? "unknown"))", + message: "HTTP Proxy is activated (\(proxyName ?? "unknown"))", preferredStyle: .alert ) alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) From dae37e0c5463c44761920e8318e18c8ec0ff917e Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Tue, 4 Jul 2023 17:42:53 +0200 Subject: [PATCH 05/16] Enable concurrency check on tests --- ADUtils.xcodeproj/project.pbxproj | 4 ++++ Podfile | 6 ++++-- Podfile.lock | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ADUtils.xcodeproj/project.pbxproj b/ADUtils.xcodeproj/project.pbxproj index 56da6fd..cd91ab6 100644 --- a/ADUtils.xcodeproj/project.pbxproj +++ b/ADUtils.xcodeproj/project.pbxproj @@ -914,6 +914,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 13.0; PROVISIONING_PROFILE_SPECIFIER = "$(PROFILE_UDID)"; SDKROOT = iphoneos; + SWIFT_STRICT_CONCURRENCY = complete; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; @@ -990,6 +991,7 @@ OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; PROVISIONING_PROFILE_SPECIFIER = "$(PROFILE_UDID)"; SDKROOT = iphoneos; + SWIFT_STRICT_CONCURRENCY = complete; SWIFT_VERSION = 5.0; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -1068,6 +1070,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 13.0; PROVISIONING_PROFILE_SPECIFIER = "$(PROFILE_UDID)"; SDKROOT = iphoneos; + SWIFT_STRICT_CONCURRENCY = complete; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; @@ -1146,6 +1149,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 13.0; PROVISIONING_PROFILE_SPECIFIER = "$(PROFILE_UDID)"; SDKROOT = iphoneos; + SWIFT_STRICT_CONCURRENCY = complete; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; }; diff --git a/Podfile b/Podfile index ec93699..09f2363 100644 --- a/Podfile +++ b/Podfile @@ -27,8 +27,10 @@ post_install do |installer| config.build_settings['CODE_SIGNING_REQUIRED'] = "NO" config.build_settings['CODE_SIGNING_ALLOWED'] = "NO" - # Enable complete concurrency checks - config.build_settings['SWIFT_STRICT_CONCURRENCY'] = "complete" + if target.name.include?("ADUtils") + # Enable complete concurrency checks + config.build_settings['SWIFT_STRICT_CONCURRENCY'] = "complete" + end end end end diff --git a/Podfile.lock b/Podfile.lock index ff4e10a..db7f9d9 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -36,6 +36,6 @@ SPEC CHECKSUMS: Quick: efab97aca76d60be86c15daa533b2cdfbe1a74d3 SwiftLint: 4fa9579c63416865179bc416f0a92d55f009600d -PODFILE CHECKSUM: d2eadde26b54f44a945891dabd38f394771ca00f +PODFILE CHECKSUM: 6914b9ce5e1410eb72fa1a28f44d2a94b4424fca COCOAPODS: 1.12.1 From 137fed39e04b4b29abf29d1eee043b652fcf715d Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Fri, 23 Jun 2023 17:36:12 +0200 Subject: [PATCH 06/16] Make all test compile without Concurrency errors --- ADUtilsTests/AttributedStringTest.swift | 1 + ADUtilsTests/ChildInsertionTest.swift | 1 + ADUtilsTests/DebouncedTests.swift | 2 ++ ADUtilsTests/DeselectableViewTests.swift | 1 + ADUtilsTests/DynamicFontTest.swift | 33 +++++++++++-------- .../LayoutGuideConstraintsTests.swift | 1 + ADUtilsTests/LayoutTests/ViewLayoutTest.swift | 1 + ADUtilsTests/MKMapViewDequeuingTest.swift | 1 + .../NSLayoutConstraintUtilsTests.swift | 1 + .../NavigationControllerObserverTest.swift | 1 + ...vigationControllerPopCompletionTests.swift | 8 ++--- ADUtilsTests/OptionalUnwrapTest.swift | 14 ++++++-- ADUtilsTests/RegisterableViewTest.swift | 1 + ADUtilsTests/StackViewBuilderTests.swift | 1 + ADUtilsTests/StackViewUtilsTests.swift | 1 + .../UIButtonBackgroundColorTests.swift | 1 + ADUtilsTests/UIImageColorTests.swift | 1 + .../UINavigationItemBackItemTests.swift | 1 + .../UIScreenPixelDimensionTests.swift | 1 + .../UITableViewDefaultFooterCellsTests.swift | 1 + ...TableViewHeaderFooterViewLayoutTests.swift | 6 ++-- .../ViewInsertionWithMarginTest.swift | 11 +++---- 22 files changed, 60 insertions(+), 30 deletions(-) diff --git a/ADUtilsTests/AttributedStringTest.swift b/ADUtilsTests/AttributedStringTest.swift index cca0a90..94584e5 100644 --- a/ADUtilsTests/AttributedStringTest.swift +++ b/ADUtilsTests/AttributedStringTest.swift @@ -13,6 +13,7 @@ import Quick import ADUtils @testable import ADUtilsApp +@MainActor class AttributedStringTest: QuickSpec { override class func spec() { diff --git a/ADUtilsTests/ChildInsertionTest.swift b/ADUtilsTests/ChildInsertionTest.swift index e0e5771..dd9e2be 100644 --- a/ADUtilsTests/ChildInsertionTest.swift +++ b/ADUtilsTests/ChildInsertionTest.swift @@ -12,6 +12,7 @@ import Quick import ADUtils @testable import ADUtilsApp +@MainActor class ChildInsertionTest: QuickSpec { override class func spec() { diff --git a/ADUtilsTests/DebouncedTests.swift b/ADUtilsTests/DebouncedTests.swift index 3b16497..b67cdcb 100644 --- a/ADUtilsTests/DebouncedTests.swift +++ b/ADUtilsTests/DebouncedTests.swift @@ -16,6 +16,7 @@ private enum Constants { } /// Test for regular Debouncer class +@MainActor class DebouncerTests: QuickSpec { override class func spec() { @@ -82,6 +83,7 @@ class DebouncerTests: QuickSpec { } /// Test for property wrapper +@MainActor class DebouncedTests: QuickSpec { @Debounced(delay: Constants.delay, queue: .main) diff --git a/ADUtilsTests/DeselectableViewTests.swift b/ADUtilsTests/DeselectableViewTests.swift index 51a325a..78b27b8 100644 --- a/ADUtilsTests/DeselectableViewTests.swift +++ b/ADUtilsTests/DeselectableViewTests.swift @@ -65,6 +65,7 @@ private class TransitionCoordinator: NSObject, UIViewControllerTransitionCoordin } } +@MainActor class DeselectableViewTests: QuickSpec { override class func spec() { diff --git a/ADUtilsTests/DynamicFontTest.swift b/ADUtilsTests/DynamicFontTest.swift index df61bf4..cb946e2 100644 --- a/ADUtilsTests/DynamicFontTest.swift +++ b/ADUtilsTests/DynamicFontTest.swift @@ -14,6 +14,7 @@ import SnapshotTesting private extension UIFont { + @MainActor class func ad_mainFont(forTextStyle textStyle: UIFont.TextStyle) -> UIFont { return FontHelper.shared.helveticaNeueDynamicFont.font(forTextStyle: textStyle) } @@ -21,11 +22,13 @@ private extension UIFont { private extension Font { + @MainActor static func ad_mainFont(forTextStyle textStyle: Font.TextStyle) -> Font { return FontHelper.shared.helveticaNeueDynamicFont.font(forTextStyle: textStyle) } } +@MainActor private class FontHelper { static let shared = FontHelper() @@ -40,6 +43,7 @@ private class FontHelper { }() } +@MainActor class DynamicFontTest: QuickSpec { override class func spec() { @@ -58,23 +62,24 @@ class DynamicFontTest: QuickSpec { .caption1, .caption2 ] - let labels = types.map { (type) -> UILabel in - let label = UILabel() - label.font = UIFont.ad_mainFont(forTextStyle: type) - if #available(iOS 11.0, *) { - label.adjustsFontForContentSizeCategory = true + + it("should layout labels properly") { + let labels = types.map { (type) -> UILabel in + let label = UILabel() + label.font = UIFont.ad_mainFont(forTextStyle: type) + if #available(iOS 11.0, *) { + label.adjustsFontForContentSizeCategory = true + } + label.text = "Lorem sizzle pimpin' sit amizzle" + label.numberOfLines = 0 + return label } - label.text = "Lorem sizzle pimpin' sit amizzle" - label.numberOfLines = 0 - return label - } - let stackView = UIStackView(arrangedSubviews: labels) - stackView.frame = CGRect(x: 0.0, y: 0.0, width: 200.0, height: 1000.0) - stackView.axis = .vertical - stackView.distribution = .fillEqually + let stackView = UIStackView(arrangedSubviews: labels) + stackView.frame = CGRect(x: 0.0, y: 0.0, width: 200.0, height: 1000.0) + stackView.axis = .vertical + stackView.distribution = .fillEqually - it("should layout labels properly") { stackView.layoutIfNeeded() assertSnapshot(matching: stackView, as: .image, named: "DynamicFontLayoutTest") assertSnapshot( diff --git a/ADUtilsTests/LayoutGuideConstraintsTests.swift b/ADUtilsTests/LayoutGuideConstraintsTests.swift index e0f4f80..aa17e48 100644 --- a/ADUtilsTests/LayoutGuideConstraintsTests.swift +++ b/ADUtilsTests/LayoutGuideConstraintsTests.swift @@ -11,6 +11,7 @@ import SnapshotTesting import Quick import ADUtils +@MainActor class LayoutGuideConstraintsTests: QuickSpec { override class func spec() { diff --git a/ADUtilsTests/LayoutTests/ViewLayoutTest.swift b/ADUtilsTests/LayoutTests/ViewLayoutTest.swift index c67f44d..d4d2986 100644 --- a/ADUtilsTests/LayoutTests/ViewLayoutTest.swift +++ b/ADUtilsTests/LayoutTests/ViewLayoutTest.swift @@ -12,6 +12,7 @@ import ADUtils import Nimble import UIKit +@MainActor class ViewLayout: QuickSpec { override class func spec() { diff --git a/ADUtilsTests/MKMapViewDequeuingTest.swift b/ADUtilsTests/MKMapViewDequeuingTest.swift index 5ffb096..f1b081a 100644 --- a/ADUtilsTests/MKMapViewDequeuingTest.swift +++ b/ADUtilsTests/MKMapViewDequeuingTest.swift @@ -22,6 +22,7 @@ class MapViewAnnotationView: MKAnnotationView { } +@MainActor class MKMapViewDequeuingTest: QuickSpec { override class func spec() { describe("Dequeuing") { diff --git a/ADUtilsTests/NSLayoutConstraintUtilsTests.swift b/ADUtilsTests/NSLayoutConstraintUtilsTests.swift index 7665a80..184d4ab 100644 --- a/ADUtilsTests/NSLayoutConstraintUtilsTests.swift +++ b/ADUtilsTests/NSLayoutConstraintUtilsTests.swift @@ -11,6 +11,7 @@ import Nimble import ADUtils import UIKit +@MainActor class NSLayoutConstraintUtilsTests: QuickSpec { override class func spec() { diff --git a/ADUtilsTests/NavigationControllerObserverTest.swift b/ADUtilsTests/NavigationControllerObserverTest.swift index 266935c..711df95 100644 --- a/ADUtilsTests/NavigationControllerObserverTest.swift +++ b/ADUtilsTests/NavigationControllerObserverTest.swift @@ -39,6 +39,7 @@ private class NavigationControllerDelegate: NSObject, UINavigationControllerDele } } +@MainActor class NavigationControllerObserverTest : QuickSpec { override class func spec() { diff --git a/ADUtilsTests/NavigationControllerPopCompletionTests.swift b/ADUtilsTests/NavigationControllerPopCompletionTests.swift index 58947f1..f661368 100644 --- a/ADUtilsTests/NavigationControllerPopCompletionTests.swift +++ b/ADUtilsTests/NavigationControllerPopCompletionTests.swift @@ -11,7 +11,7 @@ import Nimble import Quick import ADUtils -class CompletionBehavior: Behavior { +class CompletionBehavior: AsyncBehavior { override class func spec(_ context: @escaping () -> Bool) { var isAnimated: Bool! @@ -20,7 +20,7 @@ class CompletionBehavior: Behavior { isAnimated = context() } - it("should call completion once pop is done") { + it("should call completion once pop is done") { @MainActor in // Given let rootViewController = UIViewController() let navigationController = UINavigationController(rootViewController: rootViewController) @@ -34,12 +34,12 @@ class CompletionBehavior: Behavior { } // Then - expect(completionCalled).toEventually(beTrue()) + await expect(completionCalled).toEventually(beTrue()) } } } -class NavigationControllerPopCompletionTests: QuickSpec { +class NavigationControllerPopCompletionTests: AsyncSpec { override class func spec() { let isAnimated = true diff --git a/ADUtilsTests/OptionalUnwrapTest.swift b/ADUtilsTests/OptionalUnwrapTest.swift index 0bc931d..2033ca1 100644 --- a/ADUtilsTests/OptionalUnwrapTest.swift +++ b/ADUtilsTests/OptionalUnwrapTest.swift @@ -11,15 +11,23 @@ import Quick import ADUtils import Nimble -private class Test { - var testValue = 0.0 +private class Test: @unchecked Sendable { + private var _testValue = 0.0 + var testValue: Double { + get { + return synchronize(self) { _testValue } + } + set { + synchronize(self) { _testValue = newValue } + } + } func increaseValue(in test: Test) { test.testValue += 1.0 } } -private func delay(_ duration: TimeInterval, block: @escaping () -> ()) { +private func delay(_ duration: TimeInterval, block: @Sendable @escaping () -> ()) { let time = DispatchTime.now() + duration DispatchQueue.main.asyncAfter(deadline: time, execute: block) } diff --git a/ADUtilsTests/RegisterableViewTest.swift b/ADUtilsTests/RegisterableViewTest.swift index 49d4c3c..ea295c2 100644 --- a/ADUtilsTests/RegisterableViewTest.swift +++ b/ADUtilsTests/RegisterableViewTest.swift @@ -97,6 +97,7 @@ private enum Constants { static let supplementaryKind = "supplementaryKind" } +@MainActor class RegisterableViewTest: QuickSpec { override class func spec() { diff --git a/ADUtilsTests/StackViewBuilderTests.swift b/ADUtilsTests/StackViewBuilderTests.swift index 296a4a1..505184f 100644 --- a/ADUtilsTests/StackViewBuilderTests.swift +++ b/ADUtilsTests/StackViewBuilderTests.swift @@ -18,6 +18,7 @@ private extension UIView { } } +@MainActor class StackViewBuilderTests: QuickSpec { override class func spec() { diff --git a/ADUtilsTests/StackViewUtilsTests.swift b/ADUtilsTests/StackViewUtilsTests.swift index 33636e0..8207d0d 100644 --- a/ADUtilsTests/StackViewUtilsTests.swift +++ b/ADUtilsTests/StackViewUtilsTests.swift @@ -11,6 +11,7 @@ import Nimble import ADUtils import UIKit +@MainActor class StackViewUtilsTests: QuickSpec { override class func spec() { diff --git a/ADUtilsTests/UIButtonBackgroundColorTests.swift b/ADUtilsTests/UIButtonBackgroundColorTests.swift index e0e633b..5b60adf 100644 --- a/ADUtilsTests/UIButtonBackgroundColorTests.swift +++ b/ADUtilsTests/UIButtonBackgroundColorTests.swift @@ -11,6 +11,7 @@ import Quick import ADUtils import SnapshotTesting +@MainActor class UIButtonBackgroundColorTests: QuickSpec { override class func spec() { diff --git a/ADUtilsTests/UIImageColorTests.swift b/ADUtilsTests/UIImageColorTests.swift index f98296b..cd231c5 100644 --- a/ADUtilsTests/UIImageColorTests.swift +++ b/ADUtilsTests/UIImageColorTests.swift @@ -11,6 +11,7 @@ import Quick import ADUtils import SnapshotTesting +@MainActor class UIImageColorTests: QuickSpec { override class func spec() { diff --git a/ADUtilsTests/UINavigationItemBackItemTests.swift b/ADUtilsTests/UINavigationItemBackItemTests.swift index abcbe4c..0c38a7c 100644 --- a/ADUtilsTests/UINavigationItemBackItemTests.swift +++ b/ADUtilsTests/UINavigationItemBackItemTests.swift @@ -10,6 +10,7 @@ import Nimble import Quick import ADUtils +@MainActor class UINavigationItemBackItemTests: QuickSpec { override class func spec() { diff --git a/ADUtilsTests/UIScreenPixelDimensionTests.swift b/ADUtilsTests/UIScreenPixelDimensionTests.swift index 679cb87..b2edfee 100644 --- a/ADUtilsTests/UIScreenPixelDimensionTests.swift +++ b/ADUtilsTests/UIScreenPixelDimensionTests.swift @@ -17,6 +17,7 @@ private class TestScreen: UIScreen { } } +@MainActor class UIScreenPixelDimensionTests: QuickSpec { override class func spec() { diff --git a/ADUtilsTests/UITableViewDefaultFooterCellsTests.swift b/ADUtilsTests/UITableViewDefaultFooterCellsTests.swift index b426f63..f9524e6 100644 --- a/ADUtilsTests/UITableViewDefaultFooterCellsTests.swift +++ b/ADUtilsTests/UITableViewDefaultFooterCellsTests.swift @@ -10,6 +10,7 @@ import Nimble import Quick import ADUtils +@MainActor class UITableViewDefaultFooterCellsTests: QuickSpec { override class func spec() { diff --git a/ADUtilsTests/UITableViewHeaderFooterViewLayoutTests.swift b/ADUtilsTests/UITableViewHeaderFooterViewLayoutTests.swift index cc85de0..d6c0cf8 100644 --- a/ADUtilsTests/UITableViewHeaderFooterViewLayoutTests.swift +++ b/ADUtilsTests/UITableViewHeaderFooterViewLayoutTests.swift @@ -59,7 +59,7 @@ extension UITableView { } } -class HeaderFooterBehavior: Behavior { +class HeaderFooterBehavior: AsyncBehavior { override class func spec(_ context: @escaping () -> ExtremityViewType) { var viewType: ExtremityViewType! @@ -68,7 +68,7 @@ class HeaderFooterBehavior: Behavior { viewType = context() } - it("should set and layout the extremity view") { + it("should set and layout the extremity view") { @MainActor in // Given let tableView = UITableView( frame: CGRect(origin: .zero, size: CGSize(width: 320.0, height: 528.0)), @@ -93,7 +93,7 @@ class HeaderFooterBehavior: Behavior { } -class UITableViewHeaderFooterViewLayoutTests: QuickSpec { +class UITableViewHeaderFooterViewLayoutTests: AsyncSpec { override class func spec() { itBehavesLike(HeaderFooterBehavior.self) { .header } diff --git a/ADUtilsTests/ViewInsertionWithMarginTest.swift b/ADUtilsTests/ViewInsertionWithMarginTest.swift index cda90b5..2d44e63 100644 --- a/ADUtilsTests/ViewInsertionWithMarginTest.swift +++ b/ADUtilsTests/ViewInsertionWithMarginTest.swift @@ -29,6 +29,7 @@ class IntrinsicContentSizeView : UIView { } } +@MainActor class ViewInsertionWithMargin: QuickSpec { override class func spec() { @@ -215,9 +216,7 @@ class ViewInsertionWithMargin: QuickSpec { if #available(iOS 11.0, *) { describe("Constrain in superview's safe area layout guide") { var viewController: UIViewController! - var view: UIView { - return viewController.view - } + var view: UIView! var subview: UIView! let insets = UIEdgeInsets(top: 10.0, left: 20.0, bottom: 30.0, right: 40.0) @@ -225,6 +224,7 @@ class ViewInsertionWithMargin: QuickSpec { viewController = UIViewController() viewController.additionalSafeAreaInsets = UIEdgeInsets(top: 40, left: 30, bottom: 20, right: 10) viewController.view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 200.0, height: 200.0)) + view = viewController.view view.backgroundColor = UIColor.white subview = IntrinsicContentSizeView(contentSize: CGSize(width: 500, height: 500)) subview.backgroundColor = UIColor.red @@ -497,9 +497,7 @@ class ViewInsertionWithMargin: QuickSpec { describe("Constrain in superview's safe area layout guide with directional edges") { var viewController: UIViewController! - var view: UIView { - return viewController.view - } + var view: UIView! var subview: UIView! let insets = NSDirectionalEdgeInsets(top: 10.0, leading: 20.0, bottom: 30.0, trailing: 40.0) @@ -507,6 +505,7 @@ class ViewInsertionWithMargin: QuickSpec { viewController = UIViewController() viewController.additionalSafeAreaInsets = UIEdgeInsets(top: 40, left: 30, bottom: 20, right: 10) viewController.view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 200.0, height: 200.0)) + view = viewController.view view.backgroundColor = UIColor.white subview = IntrinsicContentSizeView(contentSize: CGSize(width: 500, height: 500)) subview.backgroundColor = UIColor.red From 898f0f52edb9f9a9e2d51a3dbe2f16120bec7034 Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Mon, 25 Sep 2023 18:48:50 +0200 Subject: [PATCH 07/16] Update some snapshots to make tests pass --- .../spec.DynamicFontLayoutTest.png | Bin 71498 -> 71642 bytes .../spec.DynamicFontLayoutXXLTest.png | Bin 86451 -> 86463 bytes .../spec.SwiftUIDynamicFontLayoutTest.png | Bin 85183 -> 85199 bytes .../spec.SwiftUIDynamicFontLayoutXXLTest.png | Bin 106059 -> 106073 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/ADUtilsTests/__Snapshots__/DynamicFontTest/spec.DynamicFontLayoutTest.png b/ADUtilsTests/__Snapshots__/DynamicFontTest/spec.DynamicFontLayoutTest.png index e6eb57b50bfb89ea9a580418646d3fc68b9ea32b..e51e40a2fbf8c98fb3ce397672d25cd6dc90ad8f 100644 GIT binary patch delta 158 zcmX@Lj^);RmI;RSEvXTnX}-P;S_}*f91N_CLJZ7679$WcFiJ77g4qlVUX0Rkb`YZm zR1FgYLwhCz3sg-MkOqMXKn&CkrI{BnB1~Ms1XIm8VF5FU%?DD-egUMfeX%KTquy3M HMj3Gc-CPku delta 15 Xcmcb$p5@d!mI;Q92e%$%loSU5Ju?Qh diff --git a/ADUtilsTests/__Snapshots__/DynamicFontTest/spec.DynamicFontLayoutXXLTest.png b/ADUtilsTests/__Snapshots__/DynamicFontTest/spec.DynamicFontLayoutXXLTest.png index bc7624e42b93f18feffc1d7cf24eba8f23844a4c..606e23734a8d54103d139f99d25aba6f1a5a1369 100644 GIT binary patch delta 99 zcmdnIn05bR)(M8*EvXTnX}-P;S_}*f91N_CLJZ7679$WcFiJ77g4qlVUX0Rkb`YZm gR1FgYLwhCz3sgi0O4#7p#T5? delta 87 zcmdnLn051F)(M986{!)PX}-P;S_}*f91JXsQVgs>79$YbF-pVPZj2fX%wTaQ28Q-b Z1{SCqzlk+=Ebd}CmW}(i?qg&O1OR(<4h8@K diff --git a/ADUtilsTests/__Snapshots__/DynamicFontTest/spec.SwiftUIDynamicFontLayoutTest.png b/ADUtilsTests/__Snapshots__/DynamicFontTest/spec.SwiftUIDynamicFontLayoutTest.png index 45e1a7f9996f93651df2a2f0892441fea0b33b7d..3c9ce9ad81a136cb99468fe5374a4c5f0b971493 100644 GIT binary patch delta 36253 zcmce;bx@U2_cp9FNP~1Yf^>ICm!PDCv~)?wE#2MSAc8a^NJ%$R5+dCq-TCd~^LyXt zo%v?IneU%>9A{9@Is3l%z4ltyx~^-T_H@Ltbi_DLr66-11q&6GN6#KTdW7-_@iFcr zc<|F>@aNHEl1GUDetz^w@iFQD{#oNO)Bn5%?$M)At49d`^BTQ)M=^xZLSBrT+Q~!+ zbwTshMV|}_Q$$p9K1zO+xiyE9IYpvpPO@joutFG3f+r@mB8oXdIyY7;H5ZG_9JF-T z_UHCO^djnFaZ7Bg$^G-#mYC(NcU9|8hl9GGIk~~gkL$<8ZqkAY^q969huFU1cMPOa z8BUg{M6UB%Pkqd4iQkyFscNuVgdXmomg>J>ez7GinM6KMN$ssNS~zi?G1%JRbl+bP z@gueWnoqdDIGigk&TiiqL;jmd@WM}UzR@8UFK5$ub2xo-n0t(e<#WA84*I>1hy8d# zu+tDjbWZ8bM^(ObCMC&Es0(%OltCO-QS*!jdfjqN2VMOfAtsZ$x}FqxN&zD2a+5@Ll0v^ zYVb0bcviO7(}@-yJO<@zs|hV!T;m0U!0>!BL1(j1OH*a9MAL0f)=q=uJp)aN#C*Qa zIkevmN3c|;1%^gO|5=#W7W6*1g(jO^wj|n0bN#$%tRgq!Uo2|O1k*(zPS3$(iEwc3 zM6$P~g>Hm1=4=;-Px7)Yn4TV}2$IRG{D~Bk6ex#xQWCoJ{VW_eUMRQai(+phCSNS( zd%a$Kb^go2ZmK>x=mj#FqXcIA_1T|H&y!6=^XzQ{JHM=OgsAY-G4Y2qZOF)X`UjI^ zcId)b2Jeuw{3k}FkM0MH{wx6Q}%m29`fmRf(Pj$wkS}X38D*PKOJLjvbVBb=G zzNU2fPt~_=;{??SVaG9NS^xI`as0H4ZYG*6DhkNtuGvv5EpXoPd%G- ze|ThudzCDKaYdy+E|Jf_^xqI6VNqn2jx0eBcIO}hTfUa&czq(|x1*x#vs>$0kcO3#1r09T=~Rv5TOO-Q{8gIPDv&SiLxIFpREo>PI*PGVhnc- z>`{)?>0=f#oXO-;Wlj5krO&=^GsEn5pjyoVhsRcJ9!u=9gXi53s)NGqUyW5wcjv!G zl-OI%wsYM7&hxU5ek!lbFx{Ti!o^t~WT_fn8(HVNnjj?>_iKR!cZw2~Gx_X}R|jq* z4?m5>zA_7IMk3BLZ1qZKZ@-;T3aO*uGzl^m7<)d%X3*^6w0fGwWv-~Imx|SjHORl~ zetXoHsd0$yzqX$2QC#t)lY5uswIyP?>rdT2bP}F^cL`n|XnlXx&NF&r@N+ z;O?0`u({Xf zs9qK*l?LD3Je%2S`)SU7OI5Scy8`@%VTbLc10KtRb?vk$b!RJnGkxIp|8;3QJM=vf zi|r5-hw98%M@W0oSs*UsC!ueEqZaaN%KPh^VFB!r+RFBOugQ9=$rqHEqFB&Sdz|8` z)cMJnIH^`3-JPSA=!w%+8K1anJFD>+x5Y4ufd*+2)arFM4B{)Ri%oS*gXjUQoDbU+ zeI-po{T$;9;}E-!507hH;{~7TPAwnD!XE1eq=|_fKwYH((h0hyw)TZ#>QVDMgeA*f z|1b|D=&m8#RL3No9!@-GBh_f}^k7Nca#nG|S>=twLcR0DtZ6K9@Ah36zllzIM-hG7 z+wX7+2`-;UV!7qw(n2Yr+i{MW7f-a_pBRzyTAQVwt7h;p$G*wRDdxB@UZxJ{8(=wt z7Hn!_hdRR>E7|WCPMzqGpDER~t}=!h+(IxN2!e#S;Z|(!?7cy-O#f)Ux^0&qL-< z8NEx$<+Bb+Dp6j;!6~3y({D2iz0PbaaHlt%_J3_s_DR(h&EJ~)<8+Bb_NOT3U`^x% zT#o2Ulq8b>`QNfXN-39R@B=l6xj@>KdVwfFYS;Tz+!mG z)e_Xx{`e?a46hIrgCDW92;hz0)u@$fz%FIV`31WxRkD8br%akW6ec*{un$6UBnaBN zEN~GYXkHGWe1tDspV0h`|5!!>=c6RTl>Zdf*Fim;mk9X&in0>q^7N^dyCvX_5fT_Q zd6-2=-!*@NH|Bxc;(|-e&18k9GT>KoIgg;;-;@uK6f-fLD@J=WgF~&x51j}JSK600 zm~+8(u`U6b6~QLs{BS3S!$?lN~jucCl|U$of>&axMhh~T#@LA7b+A0LqoH5pf@o*ZaR!};(Wrk!RQu<;mo6ikDx7!GG6X z0GMR+axIoW)1j@&c;6;ohJcf$@@v5y`2P_Q_v-^6`C(Dxhk)ixRgZuretSp;6~?SQ zxyg3yMD=`rC=ggXE=wAGe6q#;w&TN8zwgNiKZ6Rz?`BtS@LFkAF-f5;r(WVskdFAv zKY!8tcq@>kZRpu^+ch&vLorom6O!ZunrGi>G;Gbu~+EWK#&^E2~WSbF?n zS^rBTPLRwGVX~2nC5XMJKpXb)cyMLp{h)-NMA5q7H!k^o^IVID_|c^W&}|y5r=PJe zB2)S-mp!$7M7*2tIuM)xWX6#rirQFTE|%i&k&1KOR*v`PVIaS^lH&{ZmcxK_9;<{_ zhaY*8h9V&?K>_a_H_T9?a&Or7+FbwqbjyuI&%avx?YWhm@VOOf!vGa?9iSu*P~mkb zESA4sEP7{VyDthtKP0)ki(yf@Aw$&w-vrh;7Tdo$Xct$r4xzg3jawnfr$c(Vn&OP> zyV&9xa)mJ?VVVUnCGDK&Ox{W{fDc|Pl0qG+O;MIPp1qM5e;b!F8h+}rFscne0L1VE zIQNB+5V^IN#Adxm6hw8azyiX?Uw10#{;CwD!BitD=VKrTt|5f&rSPYsPIdGE9IwO*=Snq^qZc`qp%h*p2^ssD0+8|A{YW5w zdwmM_)xn}~q?Ccovg(zhUZ;+QMV;)7D-RU*ZC9HuBK}YDxAVuWF6rVgPAApI;=}VRKGIL$5BPeu+&{I?@3etsRs3kMF~?^! zMwtvM8S6gVCLg{Y<8bS{^izitF-UijDdGmw%umaD3dHx1z zmuO2O?Hv{kS#TuYMR{ej^~={bJaWz;2=rs^KjpprSIU&oxs6v>>D)X<2lRRxkS+dPGr!fr1RNjB)S#|Lv8!b ze~!(562h_vHwylqguas_dRHh`qYKg=F6K?YL121!o;*eIdn$BIMB-;&n5=8Q>+y1X zB9BCo_-?LT%OWv@1k*>eg|~JB?1zQvicK!*m>nMC@S`y|7bb2?RI@W)lSh|=Qy@e0 z5*K-Oup?cqs_pvIoO!AN97YN>98Sl{)Y+JX8T8cDue9T(7IqEm6lG(jAU2utOEt7s z9lE&Fs7jM7I_3j-OaUrnhY*550%C;Z(6KSu?w`W z1|2bl!OXgr7h+9ZO9Zm$r5MCqbX$b=xs0r>ZQ5Y5Ragk#iaucwHeu-zbVQ3@=kiS)X;R~gMQh+WFZZb1u?+tqjE#Y!{Q;UKFriV_v@^Fv^R(U zY<~&D%!&W^`^grO)Hn8m(hl1Iobv3&s40?#u8@%L6aRD$RkRpRGd>4RMvF)HUjW?` ze78SC@Y;`gcN+4wfSdjOU%e)CAgFC z+zXTjgyYrA_-Ot`fkSk5es(WSDXaGoQzQHekAe1n{RL~te^%!a(^<^YS_JK)e9g8d zEcXO~BNm`v|D!7<2+8--mhF^MA$}?^Zpr(gm2f+Wu8IdUNWnCwC9d9B+stBN3CdeV zBDMV>pE9wXhiPU{v1#mW;dg&!`Ku0{h4jJOOJlkGKiM~r3KLm_D8?%Nb_QUUbr}S_9 z{&0MCIYbOUtWaId5F&87gta~p8~A``=SxF58eO<87foUgLr^UciKg{cvXK`;TJCE1 zs__2Tt`xj3Yp+dBFEZX>nwQoHimMWe&y$Wp;KMLszZl%EM6HqRv;2SfG5rO=gba}~ z!5Xk%Q{4dkIN(QI7W5AjnnAdaU8&Mp37#tc1CV>Pd6;xJ=0&(LxJMJG0MMmbtvJ651oG|PL9({tKvBT6DG28h5GAd(09eIZW2Aucrzg1Iax$uyn4cC^7huXM zBtH*&oT-!^a`y%5Dn&O~?qxk-Z@Vlo6G>J-$7UMzM<)~b!CL=A>fHV2Z=!|zy*X6^WX<5efvl~7byoZC`Qg4YG@m>s>oNjOA5EdFqt=xbN5(>bXs zJaW1_J(LBYX+uaS_n62U@n^;ykAk1;OblzR%Q{iF32wVnWnaWzGJ<~2+|!`8TqrI< zGTllRQ8*6t6Z70iZ|s}QOOju&)cSW6ryA}~r|Z^Pm`gJy7sz72MAo3KwurI%j=2ul zv(u>WJEgffkYLa2yglmbU-sYTga8wmxrbVcn~V<*1${7g-7uOPl>kP%L|;0-G<)l5 zg5dq-n##rg?-4zl&*oL3lzv~Et~N7AZm&+Hb=5L>2C}^On>G`a*p6030PM0jXuaSA zxxH-;&_pd43(DzSJ?Io7vwHv>S^RdLY0y6X0IA^{fW6?$9Y|#S^)A=%x~yp>gj6|K z%-2>-j?5_th7O(0%v&h+V+1#e>K48Jq(A>M+nEKRSjns=Gwgv=i+{JywEI%ir9tU) zDESdB08i)csE?9w5j1G#uB!$KOQ5^3o-}Zs)(l_mIsuCh#g_rR`ehUpNJvcZU}I$~ z7vjSbIs7nfSs2a7WzhVdGnCvdjhM?UjIps>#l_s?46u%k&UGK&eh)z0Y`fX#zPmo- zhBXN=B2;iYFK`&NLpA`T;tdL+$c3XDy|*w%<#AXPkv0$kE!W6qrh`4;t%TpGm8xVi zDD0g9?t&)}34;p);IG=%c`MtU55RUv)gS?(cmm!J9tpkr_?oeacr@X+v*QSN#fqTXNbKHS}|6O*fo9Cb^437DKvV*eYQ3pgl$ zAr$e4Gk~TVdR;*yrjS)>GgE2k#|k~o5pWV;S5__dBLP}qkv zwONxXe5wlARVRxJV}u4nYNY;v{o_wGtzduvcoll2mw76yW#sG1j&4e3wlJe>NluC^ zx8fJ|S+9W$6n}oAC%y9qmW`m9(zA3L;hmW!U=pQ>f6TaAdbHN}%MtxFUXH@*fY8Xt zY4V%9gA3?`(+u2yPXpqwV~x{xmg5iIvI4um*5v?WuC127lMK7+ROr^2QI1tU6p;mL zRN)9I`MVmL*dRn=%kSX?MLz_$vP>`gyZkEQ^}YW#U|{a8#foD_V^NZY^nXvLuaepm zjN^b}V@0W>N%_C52v~+RvwdBL`^8mC$c*_-y->C!t`|*dcz|?E&LPm-<8O5r<|g15 z>!0rfSUsPJC8yN&T@CCUnG-~mGy;BO>#08TF%_`6Uv%vnrbX_z8*lc%{j%H@J9o3U)0Wvz*bRoJ8$+Xi!1Hq=!C`zww zYUwV?GG`p7e*cz-`Q&?opAy#-img)ze-I*$f+swU%R<>?qfzAhYGVi^boUHEekH-JH?|@FQ zQ8w}rbO_CoH5USJCXQS}|In>~{AS(#)%c^nvy;g?8dOd)X|?d%&*$)HmM6qhUF?vCRr|P3wF?w<3!9$esg-+%X@n*}Gf+ zkiAP=a2|S&yJtWg@sylsP~(#!j9}Qe_$2i+4&pAQdit_ADlp;$8;>a2stJ{W*Ge#< z2t^Qg&R<6K{5|2fh%bpo(m1<>ur4p7Sw%78pCUi44_yUG>tgk-2vH0wjg{-fH$~~; zsxb8XpWhDi5m}u4E?1B}?ew#@5xa4^9O@%hdg3%D2*gjg62#Xw{0cS{1wQMhzWZ>P zLjhr_@Wn`o_-z#=@^E`1Xtm+* zNgm$VN8!DWp^k%fOFs(YoL=E?1HM;>d`RlH-Pdj_+ywr!*(IXHuYg@@B8+v=E%Snf zL4TjJxze|shdxS(XC#BS?rEI8Gg&xfToAmq&ujcq_L*=Ol6~5t8A`YSx@8YeEp}?S zQ);)rlPg9YY3P7o{KnKPHP=Arec}Qt3cOENVOYAC+*YGzb-8I<-&c-Zyj|E-LF8nM z>yC0uzpiZzWf@cGx8vp3Cw#G*l!i~3A>dR{N|-pW{z4QFJz)@0oS|+`L}4BR9TcB) zLe`}+o03@j-8pF$tIUc#i~ht5-Y_CPdWx?0d&7$LE*jL8o>km@jh*lAwd)B=^CD>n zj^S6>1HYC6->)^%V!NKnlW0@6vXl7-kcIt9K;!;oOvBkno&5fEd)#=u&7nU}C~UI>o#n{~hxsS6CQ3qhaH^O}U59o_wq zM;gNM0iWM+brX86SR5*h6I;nP5I{g;bDz)4Pcdr9p`xd@aO!0w2y2^NwnonwqIHQA zQ!qtOU%t80tA7_ise!phyVg)o^E<^AkWtSmvvjeI&59CAo49J&yAw1NNcmVL^_@Q2 z>#b00>y31>gs&w*@14y#KL}?bv4<#e*zP^Ur2QVgQpZui%Nj|Lc7x*FFKLzj3OAcW zOtMvCqDk7ZvSL3j>QKRXBd@K9E(W;Ch$%PwygpXzKr{Oa8vbmyq!x2Ympgj}GsUD5zSHAe>$M{5wj{Fv|;K zT;kPZQnK`q^n_vxRmLvLG@0J!5VFs&2Ai!m%vM79eS0@>@TjGAhn*HZw-TxA#NnO$ zsS{1>)F6K2P6Q~a!}1irFr3@eM=WBtG|;EwEuP5=+`;8|v#Oq$J^O198H4l(npire z((%Bj&fV_Xgt9A_3oc`xUP03`>xt&G_nOX?d#p6r%8ozSlBKXN2b@jYk08)%wYD^2 z(PqW4l44~ZpedCfuweO5VZP{9DBJcCu~O)rgAz{-7qlvc-TcO72tAWUZ82q2l4>6c zusdJ!T1|9sx-2;L1=l)~KYO60k23T1#g!)LrQH^FAw+i%TXEWYi@@l`a?fcOV#z^M zWa?oF_+H7qlSR&3DW8dP-01lx6%+Ir0YUd-GM(^Y`?*bXo$e2p~^Qz$8E+q~L2lrponvp>7s$r~pCk91zYpm;=)W69O?dr zfKK|>_K$q&QJ*(NF^74U=oIR%M}Uwy;dpyuNi?wYh{&_CEmaX~=5om!I%pL%={IC* zJ799w&hiD#wYoZQ1sb;ehQxxC1_S03>R#=u!t`nF!ModI$Qg%S5AGS zfCby_$4$aYhz-GlmwUv{!0Dt|%aeGh!Z$}}si8iKU=3Jd)qDGpO6lkf30DjWjV_j} zel~A2GnBB60jbkR9Y*NF$nt1S0-VE0oUDw}-iM|{IC7+CH)GJfDaR_;%1AZEkU-(Y z*S8MtkvB^cR5P-icwYn_X=;r!SPmG8OM z>DO237yus)zwC- zi%l&8^-vFT%XwVJVoHWmk;(A8kJ5Z%8>9*N*h94cG8aPjVm_6yV1B}IYG87&TDW+(Lc z#ZItnPZNz%20~dFV04Mz@@0$>MUI&rHS$yB{(tU9P=DXiua=)4dG6bMbk=r^1CE_F9A=2-<=c1PU83MAl~r(Lb2ci7o`hH|PwgN7gnM_!v?BBmM z0fAQZDbgqz5W|3vcSNx6@ptTG>iZ~nS3cXR`AL|$?gKpIk_N&4!=ox;lut!4VlWeB zDguIEd2l=wr}R4CBmO8X*L-3$A<)*6z>FE{yv_EIz+b^SNFBJD4;FF7^RE?-1A3y@ zLsAH2`G=7|3qpKTw!TXoBrSOA_CW7oH}Dculotz-b{~lm2KOZZ*>3H1wrdVaJ|LaK zP&OI*Ls_N9zt0{KpGkPQzvzbW)RJhGMx?mAh37oo=L=ek97{z69Phmu1JYx z(CVI%^;hWDMJyL7!1M+Zoc=8Mo$O$|a zz8SjBne#nJO@u9fe$)6x=Kz$e<7ZpfFe}D=E|PgOP)gH*VvyE_DLjl$%+(E)SV}>s zGfA*#pRfQ-?gvcT2oQYmph9i+f=H_w_27FT@{rAekoh2f-Gm~GrxRVJ zzP5p@=Bojh*A&=Zg&>IXQSjF#%+gRzYk}sM0VHFnQ{QET*8)bw0MYWR<@?)^aIIz{ zDtEZ-_b|y{*Y|9?^>Bpm*Kpg~U6Def)Kf?J?WcRqe<~@kq87?ZbF5)DmS5J3rm>N2BpZ2fl_38faU%My=NEjp@x1kuM7LK^vFW93DzyF6pfB=Os zsw(_<-NN`F(D4#z+M>SWa}Qm{C~o?&n|&ouf)gUj)HxQ*?kz>aZ*SY>l!xwW0Q4;j zpvPJO=Hxibx==P6ee@+vul$4uAYPC$F{enXzOw>__1^Ed{b2$y1zYtJFg^Rk#ejC? zW{e6=R23QsF-^ONuK!fE9DXGP5_vV_ubMsz8v<6HxKsp7n&X?$UL;Ji?O+^BAdd6b zPZY)v?@X8%Aljtu;odtCGpNyajthLC0NE|-4^z;0ogDYX^{MM;xQq(+9T(0> z$7*Z?X6nLA3Q$r`%Z_xSu{{KDhD*ekKfu$K8A7n*Gze3Yh#m;xcO9D0+@gk*vH;yG zY4}Tv_ke%)E&M^YcO5Wo&A-pItqs2sIuaE{=bYas3m)ol{cxJ0Ur%f!#>L#g>@m&^WJ^;A9J!YLrG|&PSr6{F+?9)K~e7t zyP{ZK`4HfUrc`JU;o(tR-4kv(}_?3GKcYn1-SqEzy>*dH@ zlf=V$r6#N`C%#~tIN!EjEOG-ok!xajJ2l-eyG8@mBmpvKnunVo?GVH+9@3ZaGJ!|w zc|+31P|?>P-QjqNqwN$>AJ-78Dbe-S{~*n z=>em2wz~U=lIOB##emX$yq-u1c<}n>$lytjd5&uh2Ef zwIXcNjS~CUADQCa68AwD$Mh5S7VK-&dr&!!O(b*1ke=#Vm+R4>`@DXDi_I)eJa->s9D%;QA64zG@=%RhV-R~UD0%{UN zG*v(`qnAA7{ZKh*Dib$5I3cIQ@5sLnf$xKnD}^RdALgx?Z1cSlftU9az|+DVuZyQ| ztp8#l^tXP}R&SGcb2R%8lIKNBs-_Mg7g{bBAs0a6dpiSSSd>u!6Pc#&-~~FrGxADu z7mqm!@u~^U!p3u!LAryYnQBj}_NeO$aK@8^CDburcbBgpVXinrF{wRm#d_p*SCn`AN z6O=!d-zqJkFteBs3a)e7*gQDH>Dned>80{Y`_&EL}_I7GejF~cdtV}k<_P?&J zyDqwd&LPJh$RY}cUt8WL6C=&HBhz6br%-d_%g@{YZk~${=;YqZ;KLBbbUFo8^vP@i z*444gmP`xEzw8$A0n5J|GssZ3Ty5Mx1BEBNx#G+MQ2AOy;oFEv! z%b!c6S0AB#cJ*T%56o>*%Hl#Tg)SJeaKBjC9na!zl_tGK$tC~nsO zhjX%FcYY`Z2^!wFu^ytKXN-FF$NQkTj42JNx}o-^mD10-)Ep18AT!9gG5n;DC3l;p zW?X#UxUd>5lbuM9*`K>;-aAM?fDC`2L4;WpZ}|9zOF)A@22BB8&7JrdoQ;%3j8+OW zOVGSfcLCvHUr^|QB7w}}Iu8Qj@HAG!1Q`w&r~(a^WW@KEt4jtuQuS#LEl09r*v^M} zKUP91?I*{Nv1sP}V~$MNHh=?)r#>mrtsJ>{>#Y>${4f+pV1kK2J6a-vy44KqEL+t$ zTe!Ub2lpq%AM2U~qSTL%g#)O_IQqFfM>t4s*k@yL&e!7lKtY8%onJf|in?1D68Fk< z|LvM8$`ijxinl>FO%sVdE3v&Kx3*O}2E#&guwIGC?c6uae_gQ(p>Mge+k`2cnw>fe z)hQhxlZK(*Ag6Q2fEqtZb@6UX{Go>HtB9F~!D7v>BEujlpY1z=4)u_5v(bRxbH=9t z5O{NONm9x}&IH;&Fi)w-z)RPozPWAx_>P|-yZ)58(@R~zG(A>|U~oE?ex-uv6;Mh2 zcVz*nfBbAz(S%K+_m4qfpQ=krV>9yJcw}77S#^r=+QD8}Z}pRQAbA%*OHVcQ8lZ@$ z+3C4Fg8BsY5DP--7#9a0IwZsdo%of-CY<+E525p_eH#6+WbN*?OZU_O$G68h=DnT# z15fv!CHg_SI$A7S^a)7l=#IPfcB zH$zer-3FYF0+fEn-khr*)svaVEce=|T-V{A#AY!Ia4c`d;eb^3V43e8@u9A{C*X17t6p;GWgI-r_W|?hdIFI038yaN=M_xHFuwsY zU?w}pI{2DZAo(L+T9Q%~fFYwlC&5jZ%@+JPm7xM}-dSpI*L{~Ctenbb5YexfXo2Go zbI_#xWvOaOAU>*PdR4RhxooTo`sUg=HZgdV@PWq?M?ebW`$wge_)0}Bex)!rLf>6 zs1K$}hK+$bmds>W6F-=&R^uE}%s%CxR3Or2hUR4yb8B7bm#kDprQEex29GLT(sIDP zCZUt!4z!ds;E5iq0ByVl%#R0CTad}$#{us~+7S4Y_Ql zTV}xg{V=PY=T50|x(Qp`rO9NuHhUcmW&{%&&Q^f*3qv_vc#NvUk?icZo~=N7)Y=C! zfgVLP2`?8+XoQK#!!4dCbm^^Pw})L8pl0xoWb!wb%flp^$yRT7m``@Sn`P5~V;Uy$ z!Hk?%p#7^!hADy;Kt|*=?TrdI^92l@E?N8aE(`l&e?0A9;X{?{Z)ZQ>D5Z#jjjR_D zl{B@#-4L_+$?5_OJH%RWFrI9x%4o^9`a9C*$HEvcnAtAe8Ub;Ib?)Y*Z0CAotg7Tx z=xpkh-Q5*PG!>sEB;7c`o>6@ZnOWKE~;eRA3yS z1*R8&mNfS~1k)H6K*ScE1iJHq0Vv8NAfG*rK(~?~k{dcmGmWVUNp!z;1B6{xJBY+K73;?5xHyW%=zt{E88A)pob(!$PL{CB!&56=niFDQvTM!ZLa6X zu_tI)THn{k22=C_h0_e!fmVXYuR9^4ctQ~Xy?NM`?dhsOULQNBbDOtfJQ zzk-z@K>{zq`h^vK$7Km_mrZ43^T`E|wP=f@9>T^I{sqTC!j$t(V0~#2aqQjx^W{TR zX)0}u*TdZfmKmkl>>}U{febv>eg96gkXH6R;2S6&OeT>B);S+8N}$=}_ntDpm73a5 zMuorF0!WJbX4J^%C^&TwI1BzYg)>Aj5f5F|SX^d@?kcI=Pr;A(bE*LLF7?Iff}!u3 z<{D-^tQs7(x$okV;w9HcN_-Z=cB`M9$ScSK06d?`_%=ph6@@f5A8zK663rFLe$y5O zsRL*TxN;$2zd-Pwfr0suHL6(^N?A}7L&$$h@r7jTC$ta|2!RF$1CusvRQ$mwlTZ{d zY8QBOpW=_SeFF&CRzIX3jXJARApc_yN!ObRQy>p@0}X_JF4DIbQHS!DmpjovuCOrxF=TS2s`d zJ1QicrAZL*b~S~K6-fpN*3DhD*d~=9uo707#Rud%JU&5R2crSou00gk z6fe+xfBgr@W${W0gk4hVE-*yipb|SQfYd0re7u(9WW0J5xw@mqIEF3?#ie+r3G9L{ zKH3|&m$zi1xokb-A1(r@g+d1U#VaiFQc^CQb_&g&$#}{RY=$T_6*7v}3S0w+u3gvT zE*NCrd=WdLaLlZImvC#X$L>V6&hLADN+xoPW!e|ha2Bo(M;w3HH@-D52MpaP&wZZR z{^)y(Gz6mGZt{l>w6gYIK`ekiRe$0K1}4qu2(=o+Fa&Z}9+Tj~wqB#vWN(Ql2&Gnz zfk@O2CKKM2`g7vW2-=Vraagt!xS~%c_<$;X3lewy0Hx%8 zBi~+?s+L{E(kW0fyeb>ymaocl*Vt#>msbqHI5A=iPGlbyMG(4N4oq|$RfiWj3QFuA z6@p}=9F4XXfb5&kr3!r;;Bd|T#fdMl@;Mq_Aj@)VOeP^@xW^lP1F^pM` z0RTO@Dk~%zyKGpRCo9i0+Nl#{h$)w7B$u*iPqij_XCzCaLxF=6h6HFR!8CFt9@~4w5b6W#r1jZ0tZ?xtsD|s&j+j|!UF*x)$M8+=$5*75douIhM4cz zQU+a#g&BUcsz56Rao~;oHAlLlW{#vYQfs2~#aKIH50va~ONYSXx8L$QO|>Y|r(n1C zkX`0K@$E{bVV&&qnHQNxTAfTYAw&QvD0aMkMfKkm@MY2Kc9PP+0vF)REateP8NpKi z#_M9=j?--Q7f1}zU&$sP-z%eq{;fSfd7t~_KS4Q}%)Vi>#g zg6Bk+`>~m|MN$1fNr5~pNpC~nX2gF1SRc>3Op+(E1YK~cVXkOzNQ*wRj zdOpLjfq+b&$sB7hiS+YfmN1pt2H2&%a>W;k-SS=m|p=={PE34kOXo@<2gjwFsWWlxe(}BRh=t>czA~kE{NNbl;G{aHc46JBmSAvak*9Nl>cqx@UtBU5Fip}*}};w`AK=E za{75!Z#N_)e*U}xspf0!em9<4z30Sy#Gfk;@jxFk<`toeB2Q{l@Wk3HCC4U6AWKB8 z1zD+45h?b=_hZxn4sph&XK`e&65K}7a(YUz5>VS-G7p}#XRSUcHU*NhbaY}C;j7lF z1)Hkfek&^knS6DZ>nf?>Kb1-dyNnn_j3%B7J% zzS$O#lJv0qGH2nxc3ELUSkTkYq4vYfWuhgn4xiE^uI=6(=2T6Ln&f~eMLeo|ssOhT z(#0PrA5z(o9>{x#U!1s(r=7Z@`@f&cZA0F^IN^rGM{HXfr5hKusf|;ObDhKdnmKFW z2jRGd0>14x57~3A(b+O?*W5IH0U*l9AJI zNeP&bc|4)yRd_YM5dkuFRh$yufff`|yqLDlh^{zCM>lOm1q#0|H=yBp>r{ZL1UGTi zAliSGHd3$3t|rgAKFC_(13&I_3hCzY>oWUP!)fT-bPT?xu7AY&~Cc90&IR z^sxJ>@1hb(yd)EMLY2#uz2LJ73ecVNNx4E|^ArJm^X{j_$*BkgFgU1DXFRR<7+LJ5 z0<?Zf;oJk~$YY0T zMO~hsx=Ceve?oUZqnIK3>p4+@fwmf$-aY~xAL*fiLfEDShXe2x%CHUq_1%ap&PQoL z+QWx;%8|?C3pEgyU>2QM&tyIIub_FUfqV=B;PUjdr65^9@CIVEo9rC4KkxzOO^t@H zxPw7mmKVS5B{H0>BCO+0N5S9t$FsT28i%I4{hd$mjVAqv`C&tywsj+X0H|^1hXG*e zxta7zl@m4u7wrP3mVQ|-Hh|(d>Tlb$k+LYf$jCb-nLe7yKehk?Y*qq;rm#7RNY>i0 zWLMZ^2w>x~n}ByoCCy(P^dJ>v2@fDoSi#IgU>Hwns1W$9EMVhMGY0P2)Rd_d!0cHE zni<%@(wpr6vxoRPe!PEoiERuxIzf*Q3JV7?XQ>BaCTI`Rxy&P=rpwhx3=DtZ!JId# z2d0~}*7NxxWia!aDCYnZM)qkz->6&t)?aWvPP#%}A9RoCz2-3YA-T}|f2`Z0X*Gb} z*`WzbM0Pbj1coG+heorT-wa@=cihuVF?ojAs|S0)3fcq1*1)1z94Y&VS8-NHKvR>BT{!IPLsx*5ucqbZmX9frw!q_2R-H+Np z>zALw-9rD_l`Kd}z4v313l)rZ<<$}1s}2m`{oZnWJj6$VG%9WZP)B|fEfg!ll{5yL zT?fw}+}}NnfcLa=Q1Ak9@!`=!aa!0iD|q-ui@uHPd;**m;vr_~C;o;LRtQ1!UToj(>p2f2r|u>gU{<`eD3>BHt#cmQ+w9!`NCvMY&+ zWhWg!h^52UDX0Fp6d*137RM%(0p}*)5^x}MCkp%`gTU#fD7&ML6)}ks+GT=Kv0L4d zT(ZT^RPFcI<+?zS+B*OZ@6dqwc0RzGT2;VK{G3sTtRI9_>dE3m$6?axSE9~{Li!Y) z&P}=U1vPb`a2zWy!r3sB^64K<;N#LuhS7to073lnQNw#*0~>W<&RlNo%H9x!D{PQ#^QKh ztU{?}!9x`158&qOlB;oVbr^Zq90^$O?yB>JCYKSQQw9qT+ft$R{S^ITrZUsrSe0=eQd z8JMm~OblFv5xTroAjz-7^d!AQQ}FJO~2p#n;>g?u<@`1O}N{%`lh z?oMBM+Qo{k{08mgYHMPqh9EYv9`Mk*1i5azj%Eoi;*c4;Q0WqPn#l3b*02}HnO6sw zV7X9rg<#Yj+kz>&{L5?jS+jv~cx`>BU~&0eSOh_sFkjdnAi#gViDCVt#5&&QI{%_KV=07&~=4l9E3E zo{{YRuYkGZ0HLU;X8^6@YjhA8?2h5ZuTS|+E7ci=!vSQ6wS=NAY{VP3Z+j-tRhHLo znfmxJa8+9pnItCb>bg?xbJ7OyWj;?^>`Zs=?=&@>&Ij*rhUTjJb;qQux!%7h1hwDm!62izgbPf|dJ`%k+CdmSW4CMJD3tP_;>H zxLXKMAc0m`g_kBQngU_7N7iI9OpN6d-`*Mq zrdWxvt8zp1e6~yYj*q$CmcY!4(`VZN)}~v40m;qEZ~I(ZP>y%yoj7?=%_+fF2Wn>m zJKh1;X)+?RGYl@(eulxNDhwA91wWY2l$lR7O)i;u1*ZGDzd&`;&F&$72QWbCZ{~L3 z>-83LRIK@TT76*!=;KKICfR)7rX**}{!`lF@m0w#ef8e3lwFwG8D0KlOe#c}2+A?3 zdVGS^DOXt^knRu=ySRW###YCr9TC@Cy=Byz`PY-kN7sAf1?B2H5iR+g zMBhV3iY9vs)@;g7u zs!#d9HYzKJFU#T@3xf9qC26F?A08v|WaxQgmepiQG~nHR|IK~_$b9m$p3-}d6A)Ni zX=-9u-I3hB(Di#4!0}~(p~nt%QodpDu@OL31Jah*6h`4qf;a@iL~3^nM6~p$S~}lZ0c@}UoIf8(z?Cp!7DgQdx~l|WFAHG$ zufO^XO57%Fm@wD(TvxRPlA>t4zqWA!0&pe_fe8Y9Wujw%=myh~sD{9Ix#${n$ZrEG z{>#A+&Yc6$nl=tZDm)3K`_D8qu;cOqZio}OE>vkZa&o7Ac zNOws{hjcfG?m9Hj+Wzl6^UO1M=DxcxobfPccC5YD+TZV|&faW>->!`eoid|#8tRqs ztow`0XNMNdMD3Jo^y1|X(__Z_XZYZr?S_Q_Xw@z!l15Sw%Nbx|q>JI?1Yk)=hx!2S zRt18NK7hzuCK!0?s%L@$m5z1#%LHx2t4nX>Jg#JFg0bMaKi}RxPDAqnDpyrd@fJJ> zw05!3`c`38MxMmUGEkWI3=4EUsM7x)3C!ZTc@q6*K*UfLW3>MzP3HP|SP~2=VHaY+ zO?8ZNv9AiS)U*={WUk{swf_+qxuBYvt3rtZg&P(FLNke55b9k}G)M(Vvv$>YBnZ&J z1xgw|JQ)gQf3(LTM0&R0b9&?G<=(tGF`#||gMEc1uy5>@=p&+gT@H)Drth`7`Ljs) zWNW<2#oFew>)P5nTC3Rw8!jgc(}2<=LG=*OH>p7F*cLkc739CX--*U-f^9hV<%0^s zkUvaPfGRr-ee$OrCQy@@r{8J61@4H$B_L7JzSkOx4cruAJJEC!L}UKWPi7(qzf~bN zIbD`uH+o1jrm-a8h!)c_h#K-?anVu`C%~`eaO>#Mg0aEvMqlrMJ^NKt47J46m{3%t zvWjmrgEjdcm|u?3G_}k_f6qWZijpao6tApt6k}dqV#18;I~ngC@Kz0-`#epV4qK?_ z*B+4oK$7S2oX~U9@nHD1SE>Kk2E4fAY1hfnKmYfNFJ5Au9`|%FE`DB2$=sI>HbTYQ zt_woGo9vWf^umcP*ddgx>luc0WUyF%6)LA!0o8ig$>Aw0VWaR-59w+2Jy zkAZfI|Jbz4P2WdZR1VVkhV_~mk*J!HqpzIU#`Y1HDrvdJrw8AHEVreJ>O`UOouJ%T zf1>q%=PZpR?j_mvMJD>t)Wtq6qnvK}FR!S=qZT0$hZ6DO58VrTU1mmby(6x&t%S>*t&_QUFWGofBtO!b;)>QQ{R;Pq>0 z$Xc7LOt~Vf^OdvqTSGg}!Ox1A-K^*bNJp`+Pv=XAKMR%% zzWXQ|7kGU!>8{y8yx8%%flBl{aPj&U_1Iw6KbLb%+HL@ET*4DMYuD#7{Vs55o7*sphnG%$#Kahg6*&M(UqBpSM^D0Q|JX7ap?Db zo;)-YS|zQe6;yYxHHKDqO^lDkqnq!wIdDVL7qBULpMEs&3|=IEB))cTtRM1G6kp61 zfEZ)@EK+1c{w_j^_#%NNu-#T$Gv-q0=RV6e*T)ElL6OZzi1+&h2$Ip}=TE#Ptd?A?{}gTF)eSw>@!uQsxFyblbjQ=Wg!M6ueBSdynNF`hP3M3m%1D-o!F|M_WweIy5mAEs*cA z6r8Mye(e4|E%bMv$hM*H{qht8xz%vSt_W|k&1@>d^V^aeKgFVC8eSh}p;~T8 zM&{P70w*Sb{XzT$d^P<|lYPjP%GVgm$oAY{+J=s=mPNMO45 z?rZ|`p-{K*Gd8iocr*gt;J3{ZKnJknLKot4pZnp2`r#l`^1QJPJ1q&9Y62O5S8tnm z&)Y8TSKK964_jBXz__P6O-QwRM}ZQkP_G|yHl5^^3(#+lp}D_EMyyTS6#UzzY&)@9 zlqzOK{V==2==tkGuHIn$8(>594l`bwiIqH5YRwh#y>I{IvkCX9`8VB04xc&%oH8@j z7ksRs(-LiF+8ABdEt;dtYx-YmQ^|6NV0csggSv$7;C(KAAH?U%47W5~Ru1P~Dn+Q^ zg(ZK-A98mfvhvIjg_m5{+h;~saEp(g9e>(!gOLbwlq_U4_`JDgaQ&Cx;!L+CvWn{+oBX}nREd36uf{@Ny9 za`=*+rLglMLN>e=pG8e0W_BOyY5%}rb4sM#sDF)k=CljS;A7u*N5gFcS3g%^?#v}z zUE|q%`|HmbH^{SN;xpfq0{opy*#h98pPOUk=?QeN_oK zLPZC{46&qWaIcmH=W3OX71p~--iMFzU!YfTZhdtOOco=J1nw(aUq}xGzU?b2pHNvY z*o+jvO}TfsA&%E9^-&o`%(fTZM{31^;hsiBf}VZDJ~D$T!|-A76a3C7H1?<7s@a&t zZ)KCv*h8%xa&X+}Dwtze^{9bX{dBzAdWPd*1!Q2b^TmYe_U z>ZGKnEkH*Xo0K8tN8zgl6s%Cy&Bd>0O&?^97 z*A5q^LoDF!21#4?lDSRU1W?jn{sO?fFf<37xp6oT{#RqwEIIg=We}E=syEU}zL|@rk(xT>W^vG%tVTV8 zSO5aZqh9&{>)=Y9hc_C)oO{U)63X!TF36&s8qZlUs9$Noh5lH6x!pLom9k^phYNrh z^ny^;9Vd_jSF*tya_9&FU|;NNna27q62R1lSt9#@&O$I{DF!zi*q8jVr+PiYU4v^5 zbn9bS##gr&TRc1z;!A>jtN+uuEQspT@p|p*^Uxrdm;l-@b~NqO2c(D&i7vhPy@yJw%hFf(3M%V{7ckahN+8a0^dz6!vvl9wld5Y=d4Itp> zAmI-i7YX++5f87#IUQb3^6H2E!d`wShEYt?K|NCTAVC4n7L+wm0PtS3hUxQD0Dvep zfWfw;bOKWlxg-x?Q%f+MlP7HCi>G-E5UnY1Y~>mzTy$zY@pU>8w!I8`iKPn1S@DtN zkJkGOP_yuyGHd#$)@*!?H*#jbF!Mfp2C_YJ(3$-E)1>-6%@|No#xXYC1}{pcaeMzA z{wMnEhA#l_qYL@;0Xpp(YIntZ4QvRZW4i!KZ1}><$V>nd1<4e|5uaXw)Y3|bY? zcct!J>58BIQhy2e7Kfssw>W}YW=Q`v7gZqAq^1Zhtk{*|j3&-u^gr#2dRS!sAUZHg zh4Phf8txr6M>)DjdH*^Uyp*GeXL%+tCy0c#_o9{|2mVp_Ib6u{)SsCsJR3@E3C1j{ z-U98XqlYYBqCN(p$ZgAgo*|fC;f}2Ld!mrs?h2TH6+O{FefXM#Q2_#7c9jBdHqELm+4~4a7dimCSecJ#iN=}5h_!cj&wSLA z$f8X?xJCVURv;c5TJ6y?^_6mw@ijB<{vr6k&I&+F*_Q4!K(-AOl(bWf8He+&)`EQ8 z$p-A3{}jRf(s6%Adn}Aie)&SbM(2Hx@^2V7iq|}+Km&@tc*k=wdEiGP$L3Oq`R^H= zM*=pMqS@XxZmFDyJfRwgYbin)Elf$Bu)bj+1c}lHITX1k<{xp2NAqFX+s5BEw#L^Moc?^b(tgw9O*_d^^gHHU}4M)dE zWA~~F(+7}7Kb+CykYMP$(JLMYq=Y(?WH*r%p*@+OauE)j~`v z=}bk0^H!G3&08{;bwh0Z2n}K=bO9t3C2IJAYxni@sr=H#ZC+jr{#yWt-zP@P>+Py< zYmH!MhrkYifDO%eusB?KiLWMDf6oQMSuEVq76tlLC`7+^b+t4V?l-y~?f}`D6KnHi zR6G7N3c`+eZ_SW`{oz;(K(E=)J&)Laltyv+pC_1-Kha#fi?toZ@nde|7(OgKW6I>ht=TUW}8 z3VP0EAH@OE7VTj&KL(yW0*zJJl(b`^knUfQ^zU#C8s%u;pQGu#k19D3Fjih#G@yqS9zWv2kGt*H+X9r`g@XDO_ z1CY)m3fo!P&xMk>4zy$ZD%t4=c1|Na0b1PXOZ!6F#gCRf0YXKj-#+Y z?|^`)oh=LvtF;o~@kx$Yi#%*8;&FE-+%Y-se7f)Z*#krCu|}R&4izrb^Dobw=}c-z zSNuHaP}WJdWI@)tx*JH~NCuGWB&@Np1hy`LaecSwa{y7Jx(cjDl5#~HV+@;MaC;`d<`kh20 z<(mY6hU8co=teZQ4`7#e9=8DEu_rSdG$ue&0*lMz17*-B#w`Plh7cT0`v;{41e`hq z-d=m98V$+Z@CN{p$X@pZ81&$D@l~+GME=3~5;81LUC#%HsDLw|kQTN97FtQxJ*|P0 zvqPN^v->rQu2#kfe2Eu)Td-Imomrrt_I3jY3*8I^d`1!gbp^u^Ao0%{M!Mz$0ESI*ihxblA&UAAcR91Fd6g~obK0pFCwFX%9zK2|=85v~rqVwV& z8GAP%*t=8*WKqfZY#7X_oH$%;;heVzC=#ma=0wLrTHi3Lip6>bPaolZi>hba!XE?m zttIRPeXt23iJ;4;_mClXPwZ; zk9xWA=JdG+*wx_lu}Y$|PZ<6nxok)>A@F%P-4)y{pH7(J4cGg)!NQ*DcQl_Ela#1` z#|4{IInMS1_}{+PeZ#aBF7biv=tF$w$Oll1wZl@RF`}j6xG!qIz2MGb#7^e!qLNhJ z4R7M#0$qVJu)?9~P;`$w_KRUx4@fxo%LITdBEi9aO$CKI^Fxx0DMv068h z@`F#dKY#0+s<8i;_f<-ZLmSg{qW0ijY9x&9f^gUedndB?v6H{jRt>gC?a-WebXF9NdSk>IUu`fHW%c z`7p=4iFslLiZemjRk_&ewE-H(a*veIZs7Bs{UWOvg|d5EwEUH(m~))j_x{jO9>VDU zqyGXp+%Y5XkwGzud#3=1>D7!N2>_HD*KS~d-O@Dn4-qlca~c{zB-)`}d9;xB`C-4O zO|YUr?e1YS6R~ikE8peozIo5&y|8HW`RGFpZ8aGNRR_>bd|0MaQh9(O=LW*kuzuEa z+%x~4lfdt`+I!HF|Lt3A_+0`U%=wGkDG5Alz4woBpr2%#d~XT(z9tboj9NDC*L9ET z%n#R<)ubZsKo1W$Ax3*|dgtNuFX#l=NsReXn5#i3ZomI7kK3IZfbuQka%O+-#uH3{u1LV;|)KCwMBTV&8nV!9cr6!4`@@v0`v>|jQ zmhNwEW)XHEeLm84(l7ieqec1L!_U?2tUL}TZtG2_(xHUe{=a}gU{@}2{1U>|WRjsq z=9hy%2+s~qXrNJ*TKI&PmSnO-_ss8|d5hv>BxtlVE8Kvcd~~S5S${5^y+>@BP~g9- zDcC(&io+LisBo?x#U5r6uNhGrmnY#D5fdeq;u6t}<4{~jIO>cd)dWEvFh-)u`K;69~+uHHnC6##Bj+AF95R zL#9Huf)c|s%Iu9Sgl&*Be}64Jtb z2l0p$7j{c?xl5FQx^Q;NzIei|HTz$R6sClT=;;v4JFS){`EA&!GIf4pS;+8 z@G0?T-5@Z1wG3WuUA)J{?BN&uWFty>oH)G|i!}}3h%2B}znRz@^dgSqy}BZ_ zC$S2X4=DoI&`0u#QHP9q)HF7~8iFDL;`5V90f0_^#J+GXOiU>olq7@xU|H zc}Dpe9}e)e89{hr-IuvU9om}-y>G0JI}Jo_t{bkIjHK&HEPb`6H6Gu;wBdmp)psK ziB~S&oc3u!Ux%QKc-Zbbx4kI6d<~~6Z*AIfk%Zot51xvZnwI{dLDT@4X^Hb`GY!BPfsSsP;IH_ zL>JwBWc%0F13wM>a_~s`e?^Bt)Tk{RnVRgDbh8!@rZA;dpKbrdZw0NjIlCRW!B?+k zzw%F>3Ks?OKC#;GY{W%lvAm*sW?cFHOL6%h`UH9u-QzN`5yv-pnZ2PAi{&aq!z+99 z0>efgTeS&+h6E^!>rBn$6~S|NTPFS09?7SSh!y8bI>rlhZ$Q6tgWR{E7IylC({(nJ zHk(YP>w9GLWiS6^pnYwPC{eaaxVnx3Aoi)JLTz*d$M+-_q;b_(=pV5K$hV z;K#E$S;rBC9^J=e9bn1P`MT5SG_Q;x?E}m` z8|N=?TOY_N=GUDd)@+U-yoynu%b$VNWAM|UbB}Y6saF!>9;_zU^ir2r-K3fjNG|{N z9HYBI%$C$9=Wd9CR~vz1+s^pqw?+PLMPk!ap^-a$u#879BU>%*ZFXeRHob2uqyigmBR^bfTH}<-9UV|@P3_S$8d=cw{C1dOknj3D5Ew`1H zXZJh*?Tjr7$DppPYx{PKwv%?+n1b5U(@7<_=8Y8OU@BXowf%W?svY2Ihd@3gz#m&< zR9Ys^sA~4XKaUdp?iLZW6qbm^nDKX_ks4dg|XPzKW?&-s^%atAL!!)21 z*{OiC?uBE1$g88OGJKrQW7!9`JRM8p^b{{k1!lDlz84F38+Qq3@~;S9>^?LV`-B9= zq;0^?E*CafAqjG_#!{PiFg)6g)Cdn4Y?1hKnT$T#TCyagbNNU~RKkw%%Z^lb9zp@( zvtJ28&f>9B!WVCBZZuX3&cmiQ>#zUg)r0IZ!LW-`FBJo750`%-pNTZ#asnvYuMfInXRlvW^2_mHvtTUJag>G?V) zK7oRUefP&qq@SpLP*7{e+q=Wx!r38}_men0j}B3pkS65e-a|HJP+FJPa}kf^Hl*g9 zD<)=YO}KQ&?+v9I3_c0aQYX$OSVa`_ypf{1&3~= zE}F_Z$_APY-DCDbsZCv(c18v`P11#R>gdf2zz@| zI5i(8`l~$1d`fSe{VG&cS!6gPp#7p{KiAM zJZDGQq?5=2YfSA4#fd=Kitf>}(rt!;blIu4!F0v(Q7>v~e)ll_;rO%3x+Ke4|EbGE zWD*2AmFiXC!L>nB*7leTCzQ;b~Z zub?(${XrlQ2UMkZ3htGM%(@1iO7L6Ku%^3fN$91lrspCGra3Kmel*Z4Nmk9ua0#eN zk?HgHSSI6r(BU{p&)w}ww~|{gYUk5|giy$}*^3-z&_mJ9xqN3x<0^C%x0r%QnZ5)S zuv~vdzLI@^&#+2F9QA&u0_jl2UL0!ashK$rGcOLxU2}?OtGa9`hC${&`IooSy6ZS3 zFUdNhI)+S@&u9AIp9uQDcBcRRi6C%Kt0ZwUx90u0Xv7f_{OEMdccIRTr zFOi?CrK^IdJSR;0&ilO@ErEv3D8e_PrUQ*;KPX`2v?~V!Wx*a*O1K^O2g&<>bI?BP6gWv-vJ&W_#aks6)1a2a!gC&{-=jN#Fp2+gbC9 zb<~YZhBbb(k#KyCB#u?)yvw1rX-#UchVX>bE%vA3$q%k^C;w&2p3Nh0uG3R#JpTo> z#1rWw;+tF%sKKUhjO$AGW!kGJvI+rqJQ+d#^aF<61+(|V?54oVuP04m~+6KG2&oj!V#D;B)9-q{j?wiBJrWyXTZtX_? z#A{bdE`Bu*db(`yxvNzXr|I7yMxb=2ljQXc!#Sk>W8!t78p~(^^REGBIxyBosge3C z3=Yeeor=<>geS)|4_Jyp*I#vTdDbD*xbTt7kpvYSOzz~o$LMBAfBgxmt?;CIJdP`t zU1uKRtbfg1aDqMO>{AYnJDBC*!S!+ zko9X79s!FFj3(ls1ot_}XRQMHwI9!?Q!XV>=6a(KLwY~ha(&_P83m)$Sl;)oZxHya zdMY3hJxv?&0@mdmM!yfsgLAKu{yw_^# zqU2b~{vdIZ+93@w7aOo`X0FH6$3b^{*>pR7p&mtZl++=}_&zxEm6*ur>$`)~F70WIisROl37Cv}AI zp1ZiRvbii*Qwd^p3PKIwUKI8aX{SgXmTL1vd=G@a@IP1Z}Mle5&F&i?e+XPN371E zZUchL$%fmz`N1!*fGR+5=hgdcDbiny9#HQ@Tnx5n|02jd^Y61WlpFIHl0-e6S(C1M zc*`atovi6xos)VY36W#V-`uPTzHJ7^_J*2Op&~JzduShT7GwWEqkNLqJGJJ%TvBo^ znHa=dntd?%SUq)uLk#Sc^B{Z4JStQjxVLng^JW?ov(^CO?p00tm(Cw+LHV|%p`8TTLI`3VL|cDcIzAP6_ZP;HxsI7 z&u)?syhPs1l=IbdGL|}=QgI?`dw*SU5jX_(L!W<*&{;DnY)=q&C`CQWHVf^8K=C%^ z4neTTr7rBA@hP?_{C-)C z($N^+WnkLb?tATeQ@>2ePJfxg;To=!D+6h7_QO*3<}b!}Dz*%fwdMw_e0nB=J+GxN&k6ps6q7UxSLz*OFB*s^7upFyAw%#Uts)!uu}9xc49679F|h-iWWVjS z@B!jd#b8rwtAK^G<7jM6MrAsadGD_qzj~%Xo2%KmBR2}xLuej!c)3ga=L1mScNc*t zTdcXGe74`Rqn|E+(=45L-B2;A-63A0=uwd@kQ8)Rx^A-%=HRbebPTW7*)v5!?t?~IOpRVP1w@C;ZYx?x zC!dz&b}tiS31t4%5LeN;zASUyx>~x>yHsB>uA_BRw!>2~b2*1JtevZ9&0rpmG}t!XIl;GV%&ZEObNM=xPis2pBvNkkYdEHi{hm{R z40|Gib9dO_hH^=H&d%s^%E9m+`!Gv_5PK$L`E}bi4|Gq*07dWkNVu)Zh%}IP^wg?r z8d6)`aSPq8De)I63;Ihw%>Fk{CoF?yb`jUh`sfx3-6A`;sW5VTca`$%LWbwJEzq9@ zjzNk!)lS-7+nmFB~&1l*%Mgse`H;gsWtBNjIFk6 zi??b*Sf`u;iz3urf2E&IG%i!`SueMR5abRE?LG%+3Y76H(=2|e*oY>Sj#k6F^ z|7HbXZuXvJH9sA(no_qc`{V((Hji}jho}5AVZwhFn1}Gy@6msPQN~}bO!f)^r2}to zXAc>9RQ~W0UG+Hy5*dj^2F`_^@yu@DCJIrY@X!MMu5f2|FA#as>*yMvT0Wj}5M_nU zJYfA)uG&i`UK(~$LnX|M(_h2>Lu z1{uDua5jup(o6M(%usYTf5hT0tGKT??QWm6 zYL(m08loI;=}zWuL}{lYtBM%sfATFxjj5|fkefvJdSL0Uy6*LLv?EPmj8vp(7I7KX zsY7i<08cmN>l<^T3_JH9a{4+)tKur`A65%#Pa!#%Dd6Uu_H%BrVjFDM3Uetdp|8`N zFA?#Wo}R1Zig%3=5s1IZlq3Hmu-Up`m+*9YQOuI1Ghmta?dPOH59CS0vJd4Ft@Lx- z%MY;w%08C^UG)KK$PCKm0f7ffS6Cb0=bOgnsC8I_p#>wya zbs@qeckt68E^S9JY_U_Du3SY^QquW$Tzycp?-I%)$P^5ZCYo1zn9kg$@`hvggwe> z+e?ilBFz~TO>TsogaVa1dbEU&F-~T3AfWM+sm5O^YC)&#(50u>U*!;c0ysIMX?%jt zWZg15UQ`a2B%~^ey-J|Opyf=)J6Kt2*!3t%AkV|kQ|*01a9>Bj?J>5Pb+e0wWpX+7 zFAp)E3wS_IGIMtZK33hP^-iy~Nr{YsUlnIkYsIEkrh3zs%YhSV5w6LeJ7N!=w%ZU3 z2b7qN%&WTyeqcv%MhuHxE6|+UQym2rha6tc-%2+cUPO5~T0T2sp}8ZBTtffPUO2P} z-c8TV%-liT66EVA`*mln`k>A}X%cc5zyMxC);qyMt z@59{JO&HZVW!l08{SoOAj_;fPYcuSxzGl42iZ?CF*>b8XI1}sN2T0+c_U(Lfv}_4+ z=gsCQYpwTY3A2bO=od~|!Iu7-IG1{inc{nkI7imD(Di)JAZo>?8k(L@nk1Pe7{3o+ zRn7g|D(OS0Fle9A2e}s~x0NZTnqs-LmFQ!I?HUf?s|)|`>bQJ9oLjtDef^ilkn@E= z_IB>Sarjq=?#Qqnor)RIzzYKl6Hg*Kmfg+%H>CCk)jMXvR1s~RML5(fAhn&Q4DYaw z)^4T#M&o^jhMI}Tc%#k2wuG~cc+9%@@(NauX;jk1#^)k`3p;_$aBiLkP0L$BohGV4 zD^CT(+>3x$tE9A8 zxoq<6Wv`x0H|6^mR5$DGG4&sw7>fpdP^I_h+h0%UFf#c)E^5vD-iq^_uWZkCH(~Tv z440Z$cB2aKl+g5hjf9eZ%v#|9lu#+7GN%cm_6q{kGMC%WE}x?k_T1$>`kT~oZT5+p z-H_#L@R1ZA^;U7g_z^Xuo|=dIaG|5e&(o>DT@;5UH$4wRCj?#_8@(m)FZem^<3U@l z!$RrNa$m1|Gb1bZqS#Q~;GphOO<8{rVn`_&>F}eDYST3}@u45<@hM`^I_u7~rt|QD z4t_n@lg7UG11)oXxlfnErbfnDOxPP$Lx1z(s?4Pjaus8$$eiU|!;+bMRar>63q<|p z?4ILZ^M}_-CIbVXI{5VqvWaeYwM<3|r?E6WIs33H&@3OF4F_cA>d~G#r}qmD)t|IB z(&p`Y1!P5Cy6{Je7w2ZEx=aMeqX{6@-3xc3;>znQTatYZhOQ^`v2kxPOGQAN`&9jMM!fE2T7-tk8*BkArCt(i zrTCi@k;zyXvhoFQaB)wn^JOQl6A2beV!`_qR>+-2X(w@fg}W;|V`09hu~1Qa7g3Bp zZcdV82TPy`UN(2Pl`yY^X8IbvN9q^p%p-wOWD^T^RXex`-|Q{VIrmKE zo==FRTC%ig>0`>50<}~j$q}7FeH`etmw{fx@{fQ zmBwo#7fzca{j$B6^o0m%E9Uc}>Y##eZgX}PSaiaidVF>ZD0+4_h2u_z2c^=4Nl#@_ zlAm^Ny&y6kYt}-w8+~oZS9o$!C~rBYjJk};Mz_4~?ZARsZyy>IbrDY^@URj)dEECp zq1htx)9+G%rX@UdDr^x`==CGdo_k~DKmo4rXJ5yqit#Ie{uQ+K@}R)@92d&nw$Mad zCKUTbMkW+z$k-9(yp2_Q&>!^cpBL@~7X|Ftais!@qSM0Wl@S0BAlshnv8qNPh+eq| zap;g>dwmcKJ$E_V)NY#c2L*l#BEjs)a!a6c-=ex&|HR}Wi*GG@6^yx2U?KT*7@T;Wy5qR2 zMo@iwy*IDF|Ay55=4wqQulu`Wy)_E?5_o(1RStBDG@bWl^-vBd9f@M6Wp4_P-qTl_Q>$Bz@J zr4?H{kpP0S(!2Nd#OU_Ks1Hb|=B`ewnhZ*#Y5PT&qbj53LArgPI&?9-n!e|6byUA5 zRV22VpPkZlh2U|h1m&k!ABN0XGn}ny3mG1~*A@h*pL&b`Hmk?iz_WdD3r$={Fajbj zyx0m?z^9i$+Fx7I{OcC(W9LVFI=x4K8dlW6rTSDGl#3uduglC!_k69#iXI__lF)8^ z7~@r+9c(0X60m#$>Xe(+vdn9Hv@rOh{xvkK@Js4w#|eV`x~?ea&lHY+XgB=u>37Q* z_FrM7wK1!4KQNL3SH5S{xc`nvuWj>amwMb~0#lO! z$~z3b#Ldw~54p|-Ht{b$V`Ukm36~9f0Zt7Jbtj;^ZXDtVNR87J_tDS|L;n`JXCvLc zl^laXXw?W5CL-{*DlV2{sp(LsH(xO$J?=7RG{ywasg&`0OSj+$`d-?{ z^pMJ)>~UEP1Vb<;edVeD8vP~GCht~-9RwIK;rVDs_iTVUoU7JZMpNH%yMBl)&(yA) z8ci7p*mav_Nco4elDj|s1U*Ey#$X(68QuC$6M*Ns=EUuu^`HXbTts`dfU)&y_!a@T z<4AutE084TaJ^#H{jO?JYOKPxWlO|+!Na^7l)8x^Rx%y zih?kpnhNabO($Uih536zzg(hE#20=!P27TuwcZNho!NmLz3d>|+{D_EoD>*9=o0{) z*y&|BxipOPwb!cx54EM=b@G6}rCTfIT=BJ-se-|JbzOw0W;+Z{o!Z^QI*@4jJwOVc z)3kb^LhpqQxE#BE3#}=bR;4M|Ggb59HN8Xp-H7(|RpV=cx^7)6hNWWL z#jO;=B;+Q#S@fBOxhdtG=5ljc$BM5l>C;Q-P_H;4NEW6e0o;#>|g}0X%2I#}62<5Q@=Z-Rv z_O$k=kP?jTr@}C6Ay@XP(iwi(gQODPH#;}ka$mR;8;^5R;kB~!{HI@f=A{qYB^vFS ztX~nl`gaPAc^@R^8zJ3bB}B3YsU`KkEE`bS&cA{*DnV?Khvfr!#}cWAC67T{VmrI*uAj0A*X^p+HLB_Ilgf z9vIgRB})f}LI*!OHB5r^1<43<0%R8T&>;Tp(g zmjV%v0irce{io=3#*Fy+B7LjKqqjp2SMy>%tO6jES&%!YRjs*Q(u*NG@Y*%n-X~078 zQcVn0klhI3afwhVPahn5*N>Nd$V(B5lP+jO!kxa982FTvEP#LN8cgi!d26_Hvr$htrJL%jw81|Cnwf7oC@v+jGO2@tSG=;;@;Na2*y?Sw>Xx>Q@-a|gf_soQBF(9vnjc-0ga7*I{) zU@_C1ZKQV9A3%mLuL!OW02t-@l~ON_9C?53$j`PTbloqb{4Q!Lv3fb_IEns3V#kVS z0V0!v%=7vE{0iRi9;7!cIyp*RF=)(gHY6j?N%&R4(DLDIo9n}QygqE0JgF2&Xe@T$ zIZxhF57>N>I5w`^Vm4fs+7h;Vk7ryr_Y0A^CGm~tPHtDLp}hOIGS`jy$ay(B9R{jr zoITB)zwpl6vEP!*%lz3cm4F_x;-&Lj@V{oJ$LEBkR_O6;puJm+Rm_+AR-w(V(@odY zOT>3n!;(x?%f<onE_BKti9S_Ur`R2*V*d0%_8pw8lAtM$JflvYW*gySfYe} z=2tggNgML78*Vd`{_t-xyWEesq6($^bI;$|rs?W7@c|EtJ^JjHp;w|G4~iJNNOdz# zRW%O^CJM@BVlyv_7#ff*CSLQRd_)8BCW#;Uz<1z)mBax)6i#%26F4N^@}cyi$KIaB zRt@l@yhXv>^X?cec!Nx+auGriC9Mh)Mj=HZxuSied*g{S_=^!lDc(_*S9|*FiSe8N E2S==X!2kdN delta 36168 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 VkCeNB__=jULFSe8pBILo{vXEsiM9X$ diff --git a/ADUtilsTests/__Snapshots__/DynamicFontTest/spec.SwiftUIDynamicFontLayoutXXLTest.png b/ADUtilsTests/__Snapshots__/DynamicFontTest/spec.SwiftUIDynamicFontLayoutXXLTest.png index 3cb4cb9d7374da7197741715d7b58eb6e0e7ab34..337cf14d41471d5b35f9789d8e73fb508b3c7e38 100644 GIT binary patch delta 37089 zcmc$`WmHvB7xydD4N4puq`O19K~h2q4=o_lrSzdeTDm)>LrU_{ASDP$cZ#$$ybGV_ zxnsPa?x#EM@XK*<*n91@*P3hofAc>XYC-wcf)c~69B8il!a`N`5zC`TkI)_=BRqM8 z2tFZze~%DIA0hwy{OFMq0@?rbSrdWjzu$TM=uwE(Bc%U+NB^^fI8sO+KX!EuLM`mG zc7GxrT}`}=IkD0&nZMGX+QkUnq*g{$6Tt zpM4vr`m8|j+Xq{IuZzR`WXPY{27CK;*r%vy_3!1pT`?R~I94>d@I!;}+? z1#D-Fzq~3%dF{pLMIr2hW=q}4YlrwaGg~SErR3^t4|Py4M;iI(mshO(AAZlko+00i zeyvulMacO*lFF}a;J%UYMLv?$&n;)A;#Fzl?(EmnRFRJya)O2ihe|b{)nf(CXXv8| zrd%T5D5zTX^GZ<<`4W)E{w&og)yRX%mxNGyD7x-Vsk-j`kUQHRml3<#&U+6JM1Q|O z`!$GYTpiZwkNkeQ!|#iFmiTU}b;Z%T_ijniWHPteSaHkDlc;rnDc&Vv3a;_+yF86@U{RXX)dykef{-w+LbF3o@D%E7|R z+Lbw5`6`Z?61;vyyx}H`fjT7MD-OJ>h7K03=Z7=Wb5kEJGeN@${7eO?nVuh-hB%sTwGsT$?`rce_Wxc;T-C6Xf2~Ij_zi-p8d#52iCU5r5 zVMUtX;yZ-j?a=t_&$ojwP0m}vJi4%2i%9?T@79&Ao44M7e_8IHFTrpliTNc{9p6+L z`;qd$kM~#!BAz6(Z^4f_3$*9Enkmq{;=S)LW^+6CFHrPBl z5GJ@D`$dhU367S+I9pF+JvI__CL0~sCi|#hWj>c1NzfWXQpVvkR_zM{R9NVoZ?p&mmwN2NMb76@AS|9 zEWDALR`L9_{VVZ}T}egDu~N{8B;?m=_?}r3hXIdEy=hNa@9D=S@AC+U@;41Q%Hlt+ zsbDwbb5%`CKG!4@MK>~S463P2+a2l8ogYtBZAh@64KYx0QVmiI*T4$v>8CBXq5iR} z%1(VIlE&1_hHVpSA|$SPAfRTdiGpAhb}YBE_5)*6l+Y^LSEmgnPMq~Q%PjBoRSK6eDVBbZBEkmhrbITq zTpW?#Ttzq2C0YudFi9kh7ZAL7=O7Hi^tTKK-DmMyYUpKL0=KJVZ_)(qDW4nUx8DAp zL+#wW!O5WF!`Z8B_j&vLi*`wFChX4LTEG6LsKDpf`r3v}%JuOOC+%97t6aO$*Y^p1 z!pv=SALB(e$$ff$f3m)g5Y7FA`gJ`0<5+7PLT9mQ?XW<&HW%z{_or5^#V}7H1tHrT zxBj5a9K&s?_HkB&dYcq!b#A8gyFZg!>inC?xVG4?IgYgh{O`u738w;no*0#A(w~82 zOP5=5*4J3)8;4f>QXjc&!cZDI3(L6$Q;7GR@*;1A|8sc`2cMll(-`ZAp74JHt7;tl4EC=9*ny;6}A*_5dyG3k0y8iP`eE|fc zUGRg~QrPApI21L3{}x3O=3vyNMgMDX@LRqteN|eBBXQ$kUjb`a_<))I>^bbP1F`nl zAGJO>bw~$o9=iTTuePv(3bhr2Wo;YY)jxznW|Q4^{YQir7E@i`$$K z$}cE56{=LLIp)M9au}r2 zC}>yNtdw+cw%<4f^#)9UaBhp7wAwkdohg6FRLh?W(SW5emE~{{*hx9%OoNTD6SRY` zc36X+y4dxuL)OUaC`kD4j2Z8p|K@_KsLE)Sh1^Dg(F*!I+6aNu!wXxdu&SM;62IJ2 z8{sGCYA$>ig1OA+TwaClaw8PNM~8c@0v|L zL|HZl1!31#GekZLtjZ*3IQEiEeULLtIO5f5(>QsT zHr29~>B+M`4(oXNlJb(!BN6jC8Q$sluKxNlROJC?7Tx;8N6UH9;;Uu6f3D9D?2#~! zu3)D-arlY%Xz%N)8f1&IgPUU-kp~Dj7cr(SD~w&DpT1L$U6!^vX@Nh>E)mTgw4A8S zM){JDg;t2d&0ciBljk8e%9!bvTYZyD8pAhP2_01E3%Czj!D?;2$$S|qOF04)T^q-rK(ze;vdQX;1z zIiZXySkRB@${8k0+K6{tJ$Zed_F9$GQ!j~01=FA$6$OkLF0tJAMHwGbvFp1tL-sG< zO%{J{2D!&1NKVSD8W>rAow8!1(7iXTYC2pAp?aM>$hBinfEb&2m7sh%;}Ad_Q4X_1 z3I!xkgX7wgiU^wT*?Zy20?$4oOEe0`}yb$?EBV;pv zrInE>>$N*Nsn}?0{2d%#zuWqz#kgUv{@!XPfBtGnqByvd--RzBQ( z)8bam{C>Gs=t6!V&(`BflyGt??sZoiht@(TmZr875A|Wa6a5^AB00M>0Ww?nC(_Ix zoy`&GOrn^3<~B70484uux*%wi#KftKr%=}zR<{1tH@m|$k))<;NwYC0Ifb=2Z46>y zj?Z-3L)Sb6NlJo0 zNu?tsMtaSHmm20qDR0F~eQ4+YySmS5u?tb=7@QU)wHe_)3Hb<}?mCC-n5iD)WT8TZ zRma@aj#FTXg%I<}6G9BOA>;OqZ=*?ggB2W`qvP!3MeA*T{YWJq)Z)-d|Bj!Kj-?oH z|7MQpotqgcGTU3G_im4K#va~P0t2G7IYxt7#AEJfu#z_ocKKmQ5*H1N9^tx|(+`t? zg%&l|sjaCS;9DZHJPvdZ^3pw}mu)7FnzwU}IewS#ixM@ydLoB_>6jZ_v#J7!nTv%hw#&wqKxzsTm8!z zyZJ$Xgq)f}RsmwT!`vyJa0yjJ3Yg(Q1XyP#tzpQ87&)eYaapwF@{3Qcy znwsDy)E3UCEz5#x3`|yFxj{CADA2JxZAk(~c_hSzFm#v6_(fNJ|NBH-)DFWvpRup9 ztYo$%3hqW>Uen#$1BVgO!T7?&w>2bqZazJ7LdbLRsBYtdpUackEk8;5VDFYs{rD)B@-H-nHC*xX z-WgOLk^SlS8l^ZYVjW@cM)=|ZwdoxWdPagrhw%}PO6B!(#hAlO{G@))uGVK9XGLS& zH4NkRuj;jAqb2U#g5+E>jHzw%Ohl)diElAxDWZG4T#6miLx(cS z3@EQ`_n4(&SiF=E6 z6*=7T;%H-IIaPtO?}I+l)cxTOvR8pCfFFy35?sw4cld7%q-UT^H3-~%hr1reT2TcPz<9^DQsz78mr<9@fxYXO`qzIw z*Qhw##60wzqpx>n@Nq@1)W{e3}MBQt&dT zh5m5QDu;1$qE3q*3kj(rX65w@W?j%JRODGOBKjYg%U<@P@F4XxH1+>`caNL$3Fg63 z0(&@1dMqTDFJt#~rrkFDDN~q;Z~bXjTWrrSA$a|y8xUfSfO5vDgZaI9<-5+j{N1Ed zuNVBM|CY^}z{1>B{VzzpbqR$xQ>v=yFQ!b}gB1pB_GVUF_ zT!@J?@R`7oSYJDqAs__Aele;zllYgQ<|{NdZ+`B}@$@1?(kg(WLjN44Y-ZaJ;@xML z)*>K0C8v#0vJnYEB_vd!=^ADW&3$+!1qPZJln>93(ZJP&#yG)mixT)Yo!>eU-oWMH z0M(^00VwBuybP#RO_w!(o!iH}zfF7fBg*@-z>r7}nYw0!_tT%l5wgyDUbMVBl&p_N z-C2t0=f9_a)ehZI{*t2}R;i69gke>(A`&vDHb6I$>gg; zKI{w3oZ)wcV}N>+8rf`5(yk#KJt1`q(&dE;`UL^wNPTXC6i5t2l7I+cqL(gcp$MOH`n!F*ALUlzAtCwY%1B}-rF{MK7o_F@NFX&HtY1CzF!I!DDJgdkcyA zk)}G3LQNefG4QgMtDg=5Mm^>`4|L`(&~)c_6^*MHUq9^6@;nZI%S(kMetW8AWS=du z1iSYZ|E)y#=l8GLaJ9`wKjvPia5BVI9Yr?ry9+ZTVxZb(o-ilqlp^Rg*kyb%Y;9)I zsYpN9sWfcWwvY@|qI&#s(Y>fr@Kxz+_OPfvL|oCAE#NJS?*zn;#unNNuHjM|}(;^Reg+vR4O zLMXEovfl+hlLsP?`|;a$=^TX*cb8jz(NEUUqANkVuEwrkr+9ldZS-5Ur9nB7O@r5R zL>qQ@S@fBET{79e{dVd?JSxN?NM1aN{Y_y^Cgv?jh7HqWo$};K*bG~AX%=cEi_)E7 zVU-68RNi&YiOSMO&>*Q4sY)d!1r?_PxrPZ}Wau<82lSn-waUeKZLT0SuGndeQI4@> ztONZ6G}`@DTLj;>0E0N6m@^K**6s?%CTyVw@`fGGcj~d3V)-RbO?cq?`giT<%^|IP z#LGjZSs-3p`IcV~V)p~J{pucecl*;Mgd&j!6`FiLXD{)y-u4ZlIpuwBILGluvbc9M zV;_+0g!8gwf_7zG6lf|(I_3KOKij-L`7KAtjSQPf0J#!gi{SNY!l!gR|7A(VZ`|=H zNW(N8smpzsf4Ue2o0KUYA<6N92hBVU^a{l14AC+2=BIVr8p-gsffbiQD~X{Fexs}$ z;@u8Fpr4(1o(v04n62^Kd2=)5ipd7J%~};*&Wsbx0Tiqa6!)YbDrIr@G!t*UL7sf% zQ|-Z>|v5)#TtnIdv#V5(Bpk_6v-22p3Foa7$DCctt-@)F18p7NtN6yz~kwgBn{ldP33ri0Dr5lM({EdT=f%t+i_ zbTMPUneC(WEb9X^LpK8uIB%7FNSD0hUN}3&?Q?;z_#9k#tgp)s(+Rdy_QP-#8tfK$ zgjIy?Z*W)yF|vpjIQWQ?GnU=dGlX9O=;j&bd31DsLrI~y=uU5QW<3rhqcrmx3=}aO z2kUVBcLY6#iH*FfN7H_ExR#dJYo^&XmmE<*cl|xuIomFBsq6vCIEn4;_d6-_Jgt#h z>x(`owewKZfner`u!`ledVG+I6p+Uz_;9}P@mzHJ{bccqM3=}qe(Mtq1)Wo_aT&kP ze9K1o*skdI?ZU^U{SEpo7#Ah1JGufwV%vWE_kB2feZL2)cQTiWKlckm9IkAM+tWBI z9Ky(pEvNmTrAhyp2S890X^0DnRO18Nl7DcEc^(fidXtPJ2!mCAyVUVS_W?X(pezQm z3zJC^XxkBRvNs#NV;k$Fj?fUykw{>9b)2=b0QlqjFvm+FpEo^Ivy#-#OPKLx)}OH$?P4?OGE;OC)O%N)|b2sTHIMpd`fikck$*D%L?0W%Jk&XujGl z^=?bv?chV|>6!d_e|Ihslu_``LE>`#X`I0*84Qp@2{uyW)YLhf+Tls|hWT9at8H5Q zNYqGzLi8pYDcwJpA0{;vnB7o2jZL&47YN^;PI%wN6qpYs3TUKfwx5iMklb+Hy1;%GT4_RqG)E5U&JxEyAoxX*HP(8Y;O3L9RHBjLy`Sx^?R~Ji|tZuudJ5G zSJv!P2?Lplf$_Kf`jfTn&-XVcqmiAkGy&V)5E)!-iUuTA!V4foUKY0KkV~&sWt}oAFMz26mc+lU%elh$;_@8^p+y%!r*N z7Gs~YSMiRCaIsx%X?lg*iE6F?#;&P=s?z87YAOXO$w~R&b8BVv3?S=rHQ)VPz%NwJHo^t2XkSMOxKSC?yHkNhH?u6kACmSY zQ%kZfeV^Qnd@c)^>2-T+Nq8;Z9#ZkVRqXY=LRgb_?VrpK*@*UZ&gXr`KI7x-ylDeO1A)QkjN)9g^hVl3JQ>D2Gt_G~!Zw$Vu&y zh_W*YN@#YtbR!XEl{h#A<&cWHaapb{<-v617g^9A&Wfu8xSg9BCT;1{!q<)D{YAFo z8LO*q5K7e67B2WsJpp6bP{}9G!huj?hfS?dg@?(5ek&bWZ8*6}G6bXi`DeXk_7_?{ zF;)OVXiD7Q)V_%5u++HdNc(ggy*E>B#_Psd!byUTeDi1oDqp7F9MxZSIJ^djRqd{8 z+F6b7OPl$nAVo12ie3t5MX}!oH!%0qs>W%~n0~V$!Ta+g^tre=Ri^T$d=&Xk04kp6 z={Ei+?DqH>Ims>`84R-ji!_aG*=*2Vp{h+a+~W3v zPdr$mV9f4QUg&q*lU&9KV?CxPeD3tUH$`d`A|FmKX(?tsb3y`W)?pKb5RYcIZOvqh z;nd3=V+^UH3WIM~2i140HR_0-#%N?u)y1&a{XDK?948 z6E%VoiXQ&g>phnE$@YsJPiTb1VA-WQ)k1tt5@ERjDcwzC6Hr|<09t~49HDjljP(0davQstFA+{z*yIN2uZk|`A=Oqc3~D*G_6#6JFk z+OLrej8rC1`9nGOUbT=zhe(PZJJ{3YZ}DJEoW!wG!QyE*&Rb4KhK$qd+TPL;9U^9i z(V0y?t>#AlE*J#=ros5XEn2}j!>}yP#j_sy$;pM{YvZAsOfnXt6JU8)gJIuiiNf>H zMu;1$$wXL=C<)frkfzlPrIzj9(>5+?%6&ioLdJ9Y`m(R#p>~-DxpV%_y6m)kk<0~y zA{JC8A*Lh3(MB-m$#AUYo5~tC22t}^ojPR= z&u-{TI8A28Jj)Oqx1L7SJK&sLS&! zN>5EiN{H0#R)_i2LG@p0$7MB$pcIOmp9!79&LOM(Yli1%PQKIncsWmwz6z)enGoP7 z9Ixa>bDe(8qC4y1&$<$)U<*^AnG`hi0U3swyvzTl)UC=9#%7?twR}cSQTRi?4Pkt1 zx|&ziX!V;8g3ly#Qj(zubKcl#t@kpvY!GR^!_XEd_b4T!$*5l`dA!};RQat?MH+u~ zQQ!}BQd%F8S)P4WYAF?90nWO4!Yj zJ7#6puJxPcdirhyOYWW=PW>Z;Od$)pP`3czpfw@%NEVX@koSmG2jk}nISgadx}hEQ z-hhl9H~h(vC*Pm>1X7;0d<}4N_=}^4*TOohOg zbgfIe@%fTl6GN-GWBUerh6%0A#>quacQ|bhP*+<(^@+p^mr9&G+Iw}wc(ydaSIE`( z;8`zxHO;h@Lthx_ z{uD$?y)ZrPB6jBfs+gaIIAZYwodP{Vg=v&Yuu(ywpz*?(j;yX8r70HngLqnWZ!e?+ z2lc#ZtjeT|$K?m#!p?t>gq%I)87q8k`7y^I?vq*Bd1*{))dt>(xl}HphEC+&x8D&M zBv$9TsX{nRX-N>GOG`ScCQ?GGGvef|B+)M%vAAqZki&vr`?&a76$#;}hd)DI-&t(^ zM%DK-4dbLJ9%u6v?1ZK*2}z6JBoO7(4|%y|EnSc2+e-pcl_~Zg$f7M#9Iik=PaFTpNx>=6IHNh2}s=AfyNc>oqZNwn>yUHox-M^D8XD_^Bt=_a- z-iSrSEiO_17z@qg+>4QmXrAj;+)$R!A`YpQ_)YgS){z%5|LA75r;KXfXJ>)~`l~uB zpSrzV>3B6mARpbO@H8}>nJ})8ps;)_Zj%gm+>HNh>e5}N!s&3rVn>9yx$Mfm3_-(3 z)ly(*CBVmQ;@J_L5M_9>-xpQXy|J^i4i#*|nTbwxq2ng&{Ggz@Vgh0+rKE#*@{2aj zae-|ySSC6!pG^`f_ME&BE5(fE99N*k%vDIbRDb>Tj>~qUUHtFkV6HsPO}F>7n!a;brg-#Y}|G!sKEY;T+Lj zFqs|KYG9D54@We+cqZaSRgifbD*1RMZBnD-C-StE#8mK*%F17-3Gm)> z&Thf&Fns(a-|#cYZ{tmCTd77ELS@yOvHxJ?Tjc<|A_U9|&gQ76udiMm#HXd(p9=L{ z%<)nS_0lNPZSOXI)yo6hcu)u`64xQC+%EOVT@@-2>Z{k{-Z!~8Os$LJXsD% zW8nCNqI3ghq#TFPBjP_jma~@mW;$i8DJ+TUFw29kPYBePDVnFN36~(@!m=;nwHs3SX%cWDohE%&)D6b#P_raQh?1Bxmm$cpX=^AOd5; zM?Bss%K9?I**<^YRb(5qDwPeX?$NoGrCMc%tvo{`c;fejoBBeHmjX`*Sp69tV=d}+UVufpfKkz)^G5V0cN0}4&YQ=IoTCU69vr7IYf*P-95F&Uia-S)a8;@39T zLheVnk2R`PF)jYb?2JYpm|gh0XCV(am8Et>T!pcW0*LquXsnyy4Pbq6j$~O0L-PY= z(QEUF@y!)3}Dyo(?MTCz`RW1HsfU z1@Ij}o%!}GNgtF`uRtC6iA)LX{?4aMvqZC?n|SPj!x6FRX1}h0l6YovrNV$^>$5Z| zNM4**ac%HX9hG@kc+2ZXTu;XpM9c{x9C|gf-hcwAt3YBBv20%LbsIC2GPubO#4Nb&Srs@;dXk8coO3Nr@V-jz2ztE-KFH zw9AvNQZ-nHu=^zfObJux#%??}$OC{3!p-fj?SJSk4WKt-a@`IwLc_OvFzC$-^0_#3~;c8}T$?Y?=5*J`dv?ppG$@G!`xP z|3TQgz2C58Xj|Pwq<8S(n6lX;{D-V4Blp!MZr8UkTGdynKI}i7_nd>+q=`UanHL1W zf{R|4>wi(p5GKiEjWq-4w@xj`WKweF!;<&MGobHEfh+G~^w4fXRgj;w44B1+*E|6i zvBm&6Q{sSsXGNR!keVdbnHl_Jr^p&RSQR_XjbHXY@u>RT|s4 z>SmgfAt9I}^!N#cd#`e7j+kBA(+)mHni0Rsz<(-ovP#Sr&{#v3tAIyZ%{$@@R<$YYN3F=c&5rxH?r0JlU8O zTg>{|JitO}7{?ku4ivl=SjYp7i$2%;K0=UJsfND*hZ2SQ5?8?_*DfCHo{%Sj3$Xj! z+Y1E>*LZ)OC-Nkaga|T0wG5xDojcF|ao}2xINedes|Q<66~!m8cE@AhvClj|WE^$n zDKS;-C9r!PPxv2Aq08g%8ENArk8~+w2S(4J)iT^tdGb+d*uPNl@0mlvW(G zZh+!B%z_VtZV}jO)==AqT ze*Z9Mn{<@v(`c%^qB>oawjDH-=pFnRj=QvX||cq&j1ih+R92cGYa0Ho0&J8ri4E-&&1<7UPz+B{G}2F*+o z8--}Ww%c>z0k*K~=5ImhHD;4NFyF+WIJZSPJ~+50WMt&L9OY<<)(3u88o}Bl4nt2K zToCRPGUAb;Ry-NG#-)7)OAj`x-tBE)L>vdFuu(KU-aFkWk^?(y4*yFli^alvVby|siz!gpme)AP?jXaK$n zM9NO7Z+({(`Hhyoealg>#96S*-&t!QC`KjH{87Zi;izON%<7F%6e3ewk>gb75uTv< zef!Zwuw^13fIjGg6vhMpi&T0&n##<;G4$8W2zlN7C`2p+0F+>xNqsAF^Hb`cp&7KIxh4IJyNW!7>9 z#a@PPE65V6DukwkVQ2~qF`^D9U)?h`+0lSd_Bk5UJ`9PkRK-}(Xrl@eWWZ(#Ag ztpX($yF|z~v$M~~1y`NdkXwYme1~<*&E)bkerk?Y7nNEBHq0DE`As2Dr|gW2b2Tfx zxSV=IBaeGrL%{tHV9u?ku*iRbf&8&NqVzysHT?0Z6e`8Kj*nr}IA)O;A_3|&=!h^6 z3~7k?G{$sdSZ%d3OTf8J64lWW8Zz|a9HM8Og(zAE$~pV{xeA=nEP3vI<}u=mYCo=s zD)g8i!BYGt1t%S%;yr$tRcaM8nxg6FJ<+(Grx1C34Hz?(_!Uz?WvR);vkhX;aA=f% zbx`MQ%zsDZhY}d>7hDQD7D%*siZ4LJ#Byhgr<=J(-lGH3xmom)kX(mGQ(Ch&BzK|F z@`gqI9Gz%aT(SpqH;JQ4tMhMH>NY7g1X1i|IY%7PL&>{Ak7zM^0@R9r;U?2?w|-vO zho4U+%3#K~&sa8wLPVIhgX5`o{P{^}q$Kf}D3Q{!(ah1Y@is?GG~j2zu2?j^Na(4! z?LEe*yi)OE#bI&)#EIBW#$8=reu*HZy!@_>H zfm_jJf;39kX5oJVcX8?=vUD-wWr7vpjP@*KxgOyMm%D#2OJ%4sAZZ%{ELkAdDuOqt#Gl%#* zGoty(4oKMkZUhD(7E&9a?YSIgchxc8fwJD}6IJ-baUX#e-!(75&)2w1_E^;_r|7$c z@)f`umz`Bhh+3lEC%{yEzO*AapH>Wxk*mG__LW5Coz*aT(TJ*n3&3Tq`_COakvWbNFsMhpi9;f{fxzB8ch&Pm8hf+qbr@JUGnHx^Mu?-Aw1?R0_;M|rm z1!BXAw1lsAx^x}DvN_6ed8pP)sBaf{tf?}Jr%K*&-&!0y1=v8wk0V1M3yl$}XM7tC zAbDPo_O+B8dv{#9n)9T~6C;v3Dy0Lqoo(>#14gUN`(-99i3zmTbk`|8A0USt@JSJU z?(i>65Xet9X5v08uZ7f&={l1*;;PfFBW7uBT#Fq>RoX5KMp1TZL+(GIAFGL0r;G(P zaywjRq6=VYk~XFiwFFf4d}b8&;W&3_hziFw3FJhLWrI+ppzXc%vJHWE=^?;o)=EQl z(^miVqs8r=roTXOX8`R$6O+m>FW)~FVZ$kFN>_e$=56S>F~J@*?rXx zBbix*%|l}Vt5GJUXlYeuSF~fF=Wm5&Pk|306lPJ8Y-be!}$#IM>GBfqf; zTD^$CNt*wOA2Xi{mEEvqW-dK6V}lDKq&j`N!kQl>PbreJLfuhRxf&zmCadts!?#jF z`uwF2WM5k0>9QBiLj%^1WXC(nA2g|oG-zl^RQL!J4U~8Y^a!wi9%`T&H6Kh5=jXsu zUZD5kbGah^1xSXyD1bil7~ja9*-(G%(AgdFUf%&Ey!JQ3f{v@QwN=kWhk2;6N%>xa z_PmojknSfSDt~&0hD3V^6wHP2RFQhtatE{5o8QNb2qng*^8Di3bOsBOA2Y2> zi<|m6lP`nDu?#hP0?Ra%;M+~prU+9e_$niNV<-Z5QnV<$G|~^v5~rYwxa0#~7|^-O z<%X@Z*Ka`1IKDy69x0vb%lel`6=SGw`56jb$rGYBe@R)SZeLj>6@OxK;59<#e2g!N zcYz8%=A!omOO^;w16h^!(23&#JRLtlyHY-g;bQ!-yBq(caerjY$%~^kv6Mx(HSC9e zjN$}Vo!)2Dpyj4?85VsD3`C{C<)bj1Au|1m^QOrU*8%jjL{C0A7YH~jBq6at8&B_c z;Yysoh45NLJg8szNsaU+X$;*NOA^lo2up;2StBUL^dI`aFwBKPd&XD0g=Xl?1_5K_ z84Y%0wvT!Wj~q4$k1S|cRAYZr&&KGbT!7$yy$@^n32YX{50;v1rU^;{=*M5?#I8f^ z4aFc674k#rkpObNrQQ8x)4W@+*`=g;C75gyNRlETO+|ukIT%1IV?r|!m96JcqUOri z<*C94Ehm%TQ+QR!Z!HD%L10t za}IR4SNek>(}y+Kl}~|?TUPT6)ZKqR^j|QjBrk{Heq(-xf`nN#Z3Jrt)+H|@Awm}I zevjbZMRTpS4nM@(M##AD7;hW!VNYJ|RUWhlaL<53el1sstHiP|A`hIV?8OM^+5GaE zR>9&Z8?~A3-B`2B&T9AdcivHLPy`9-!=R;PdIBTiN)vVS0d_1_$YA3Rm{nd=V-{9O zEU09mgyBs-GLr>fls&P?(ACY52;>3#LAP`d^Hr+9D${a-Fi>d!3CL%1(AO8!d()Mb zAaQ(}tO8+Z#Y@1}mMUCLkq=*HRwD)%g1<1ywI>>#P2 z*EgGo-+pl()fPB84&_m{$2pDKpq-7`s9bJ`%MqEv@f4%}iaKamQsa=lNIZFb01j+W zN=GH`p#bhp<9-7PC9tk}xObQ#1u`=baLH3K2_2Scm&87}X?ZWka19biGDJKbV{i$C zJr?^Jv5-9Mxr(7y?;4n3>$3V^t*2iLF1W;b0Q*p@6)TqQxN;M?{6+&w;7MNMgV7($6vG#s_}C*j=t83`<&S<`6&Xe%e+6>lBg{%;|e5`Rfz{H`vkO zK`3q1A-7y5u~xYNMwe_74fdH-QVCw;HcCE7 zL-zt06>(njw4vv4nrY4s_A27q%T^Cp37hM``-tVj7!N&QC-A&#(4Q<(eOw78I_<~D ziG+?#5_<$qPRzKiMYh&j$5=uHzH7{(MG9eI!Jmn5s;p%LelnDvth{IUkYDqHd%~+R$$#SLV`5%nlA$efYZ{sBPfL(F~@+S@p zF3pFBJb#-Zk%SycCa=$dY0S4uoo=kirHP*R(D5_c)kADVPBg!BYw&Sl<0LR3027pm z2j^r>A|sij_DRy&ec2D;`ug$iCQsFg|MNr)DP5V42KlvrxK@9PXbOn8sGNNk=|S%b z9EwT2>M&;^-~b>Lc13JW35L$yN$MsB8l-NnK1F??DeeXhG|=MC9)cgZ5;u6v?HR(Z z$DPt$7SAg1APdypPu&W#7HvHBs11igJ8Z%RD(k4WjHq4?yz~1L7|NGEjAr|a&pBKbM|`zL`5lco!N>urjzq(;6JR2}s%eby51j@=;*TmiJbdIo zQ+|ilY6)S2Ke%6~17xo#g0jMIUhKTeSGgri-g|cFUu2{$y+B+T8dboF=^Dq$q!q*si& z+OrhIFCbdBpQ&D2_ih~i=H_dVt2^a?hM1sic*+GO=5Eg%GGuW33NyKaTm>~FH@sE* zzeb6tvZp}rbmMmulnqG!OMzo9;oagqrx8X0VU0ClJZZ2vTEX!9ECo60C0*2S8hdcz zru1XudNr~ER_|;P`I&ITF@)lSLsW=w2)R=zRnojJE%(^tuD#&5onOuRqCOW<@+U5i z!m4_E2|^^g_^4E;P3jU3LPm3sG2oZa%kl^ ztf0^(eH{W`;IYcQD`7Uyto%R9-M+>ep`^J?&R!mc+>z2=%d3S?bwYtb>=i8IjEs`L z8y7hRvvVTYZ61^e#4$O-_u!(>oDrS$#-va$Z=iOo0@R9e>SE8bAQpKD9Z}}LDMy0f zq-oTd$*TcaG02OI4vybLoK}b#V6h%x3Y$3Oty<3N{lWF{$Kb zqXXhGC{#Gbaa-i7DynIjrd6V;O``f*(bO^sdz1#M$6RY@Q>(|0d(958KtbD^AcZbVi zSA3BnXZki~t;)Xt`{juTtmw;|!+o!jXg$>&g^3_jvNYYTK*@58YhJd{v0@c`J~;b!(53}| z+R2B>H5JNZBpNoy9(cX2BE{59^7^;+Smm3V2eYB7)HAW6|BfbK` zLbiGwF+iYO))f5oG4?-!yW98W3sk71HYzjahx$z=T{e30a(&p>LDMcmxZDfyq71T@ zWN^jedpNUDHOzDBV#~PV<>z(W&Ww{JaDwuVJHLY7+}?aRDVf-l%D0~TUv<c(x6{<(*D+SUBgvM;_@rN=cM*4V5LFX*?I?68u5d(bq9=P)d(`=to~0w ze^TcV?m`Za`xk);N8|Ryrsb9|I}mXj<}B#-KVi7s@~M^ z9|)GkR0PEE5CstjMFVX@CD4ikMONZ966WIN|6%Maqq6GSFr`}%=@3vrx?4(8QjqR0 zQM&68(kUSgl8SUl3rcsV(v668O3XgK@Au8jS~Iiek88>Ez}aV?*!O+aR++nMBU9)} zOEg>$M4FaP#NwNknYZr44e9u({((cW9=pu-z74I;-*rG5JFH9&p%rrEpyp*!y(+8R zfwjwrK(2_ZNdC_tavh(>Vmd9Cu=;!(N^;0$Tt{2vUrLN*3ClJQUOo(-ME))Y`8dNgS@vvfLc< z_(`+>84q;-knX<&Dki$2ysJjeac4r{efO~UF1@CT;maO8-00fqdI>4j7a92qTqb!B zTl(+GoU>t2ey9Y_b%y#{r#_8$;K5BEUVo5XL8s4=xyI!l)2Wg6Qc8b(bmD0=PD}`m zzM~%*-=B3!$D<&Yr-#lu2_wuyizit-(8Hmt+`)2zv@UaO0i%+g10gI!dicr3E3l*g zXJ7^DX7z=V2SKCd>2ht)!Qf2BN2(RZ zARi&$fqS<@ot*DeYD`A=DBTr-c9gE-;U<$pJYg4R#yU#W6PY{aQcHKBfY0|5?jskL zR{Y8KHlB@{ujAzdrf%sjE6sxd%KFHSLw=hvT0(xYz+QT>FCT32y`-D-^j!_s7T3S= z)A=VUpWhV{)%vc=qudki-L) zlZhfGJWCf?FbFbeIF!PXIDAgc3T&$fbC(@2291-6{g;h($8uWb)1j=*jX3 z2o?}EPC>&6GBG!sYE}e7c;LG?gvb$i0p%^1@;Q|qi+~fr|r9vSJ!c%bwuZIdiGZ$tI6yVPSNIn7B!59-d*;0w%<4{8Y%lZF4 zs`v^j^5&rM@rdNYBDnDVv^{j0+os*kGwbZzhwqM&10-nT>Jb1duBG1KwBFn*>U#+h zFlAdX&HwWywLbb()^YUwE`MRrZ+^0!E?Zax?S^V07Tw|iu{V@+44%_Xuyz|JSp!vvyfic`8V8nO^17FGq@{;d;aC-iOk^TA) zM#kVcz<`rRdfB`N_*Mt5 z*AM7*-No>MAB<&;3j!pKdtn}Y?AI({2auijy0x#0m^41Eeds;X1ff}b*C5R3Q{dEV zYAkG~b^C>8&lV5Za0N6E+=q*x?U-1N6)OW7Ih&y$(&4zR{~}la09SeE_1`(VpO7fT z^Jg>nKHwMYNr55}bp8d!Gyo17H3Q6hO29-1qMjbEeo^j!$Et=#;UKQrqIj-Rs;d!AA^5_IrWHIy)M&_6*ge4XvZB=i{(S*Q zrzF2bL7;>dyvv2aa&y%RfWM2YA)y_XTfw#^hD09>oCnFI+w(wpf*CD}jpa1~ClaLz zxqfQgNVDaVG1Ss`4CeKm_jma{H{0J0P^*t+AnPDlmAJ6in3{tNwtsU+5%N6`j1f82 zW``9|lS=&a`3pe1VE-LcO)KH?bIr3k$T{{q;O~8+{3D}Zr92Y$ps|~16>|M~ZnFof zX1_7VBcxU8i|aSHUoL=+MFa4izO$!u&d-5(h8+%M`3!ICTkbK zI`Ok)4W>JQz^UDTAceENJPgj=!6IhEHV<8Rd~yhDZH)C@oS@g(=RMTn7cY4x%=eW6 z^&QL@OWo$FsQ3DF5*6AGF+F%+JmOpm=pwRZdhoT#pyb0o9-c+s3nXW#Zsl~|}SS2vl&rV`$}tCxWsqqDir*HtFbwlD&8umkex zSU(B_u>gdCh75G*UTf;4AgIALbW0xaoP)7JhE>XC(NE)1k#|U}KfdKB=>nf>5Rade zo5P-2o|3hR9Yh4Csz-UPf*zxo5FAx8#AbJhBj z+4+%&{oX7v@CE{tq`c;x=`LzHq(B?S_xfyKebqr7dR^Ce9z{;6umKUn+<+&p_SZqCm?}`8bnal zWtYQfTk_y~NMV!%?>&C%e*us$jM`J&ijJy}LTnSWM7)N=szH-zdC-ZZH4y#w);Elo z#s&RZSHA{(t1yGdRucn&X}TK;dM)*!Y7CTalqjitU@p(tjB5dsvrHs)t>-~S&&)@-c%EkMzP~^ttdISy$!#~|zP~%+!2)P_GFEApXhJDgy6N0? zhrSXzKL}kk^NKF)<>>2mH?vUpGdXl##nRf+w+698q9F`cFhvy>0|xih<#*{D)Vt&r zBOIn5_}nyP3o5$&&k4W#e`Vf*fUfa)&T5&@=W_dlw}{WnH3RIh9SOF>0h}Jd@=I|D z7=X!4(UnYnwCF&71D>7?^D30SV55{FV=K|5evn}EQbA~6P`Ey<8@%^ONi+>HL7E+D z01Hy!16E<*p82;-qz0pUq5u&fWMW(Nd~LZWN@Wy}x(0~w<0%XXJkR+s^FC~l>@}D8 zT)%RvqL)7111CBX!4n|muQ|*`Hc{7L$&eS-F*V5J$N~g}{oXpUhm?Wdh{aHnQ3`@5 zxNWbysJiZ25S+v|-JF%SD(2@3u^w9zet>&SHG&vJh9ay!6Dz+EfEC;#TVy_ zV|gqj7QzR-vAU%qO$1E+7uN`{oMuJt(YUW6c_Iox4m5~`0^!#iGk1e9 zSmUX{`F2rd=(Sz2&|oT{$1*LJ*b0juq-4ML`ft6eRHOJ^ArKWy9$)+V$Iqvk2J+x? z5gWL?Wq*7(phJ~Tprs=i#EpD&p-oyf^xjQ6>-~Ijh{a6}nEx_%dx~you6`@v%{@?q zy+Q_=A{m3AQofSb;*q#~OJx#`a3J6357v6wQPO8KbPrtA(R%4Ocnc6YALVC>?esEh#iAUhXjEh?+fm2sl!f*)*~6Ur^WbglDXouc#y_H| z-r@S#7XXHRA$wsPBa(R!zPwb(K1glD+Hfe}!{uu8Ui{V^5dhtBt%UHR5(qFNIe{hW zqAJIoB6uI6bnK64vd-3y8GVPQoiRKSkd`M$oyxm)KzHWajdlT&LcjawE7O>SFVf^h0RYZDrBtn21 z8tI)MPm^nfzd7SPnYl-m%>q+(ub-|rfQdk+ULwciLA0h-EppH;+O~Ehry96cv*rX3_J@>GDJT<* zxGNi*x!faKKC|~Mf+PtKETpvB_;o(Ma`kmxr&)&UVCU7&$FGV^O}yIIr3`%%0*TV@ zoq^hB=<8$wr#NzkjDpQ0Wqsr`{gp_lIPRDQ? zQ;4(+#q!g1`h$7=U#`8N%|_GFcSU`?{bF{7T7jaKO6J_0V;xF=U90M#N(^gK=J57q zsl#G&guU|B84nJqOQK5*zX(M>DJKr;)7-ihA z@15pGUmScdY=XumdX>M4QPxXR%JXVw1PjaEh@z?+cOHpPo7uk|L6ws<4iuph%L?Id zP+IuHAH8(CNawMMk4UF7`T2=kfH#2Z4rX2~PTYA_zB0+=;dn6T%Wx;es-fq9Q$_g@ z5vb2e@OORRhoFkMQ$W!tP&6Q(J)4G$h-FRoqfzcR@S%P@J|2C%A~)^BU%Q<5v}Q|Q zcr?y*`T}s5+mwsnj)EA4Gv=@Y@8t-%tS{(ynu{+{JoW53izvVC9E?5g*05r@0u63L zWdq@31~cU7=v;v^1F?5#-C4qCbIt??Ww1)|5hCd$yp;eO3Ux@HLJfan#Q6JCMr&(% zw7u^S26?kPq9DNG-~$Q6t`82ndAk<+=#zr-(R=oO(&aUv1kkba$*KH?`ecnb#OltU zig=PZrvRb01DwXtrw=1?xe3r7J&e*18uKr9qIj&RmIiceeL}Ey>;2cbC0joStKIpg zx}PICL4kTKcTI6Ro_d!xHH2sH5RNOPIDJ(g1rZXaB9u^N6`AO;@dKn z%b0%M9Hc96Oy_Qpm@f)im-wNzw&628KP* zV~#opQG$#I-Fk-{U63EWUA-=}E921kxbWM7(Rg08=Vr z;5Nw{kv*(2O+HG1ZF;r zH+wptfD+y^pK?0(V70p#taD8Hk|ZO9Yzwf6cbXx%fZwzOyF^cdC!i{i+ZwO# zBekhWtn>3m)!e=zW7Y@FuQM#=ubP>y6Y)Mh#w-FI)Qy5V^b=$=TM#~wAri{5s+hG* zw+QC#bp|f3?NM&OohrBqe;F%s+OuQ;ZttkYp2y~J@@Ka#P{@1&iaAmfMMu!j=2v`U zVABOzwXktSrZEmDBwr#JQ)hToB`0^LX9`aYG{QQ~9;r=p!>Qce&-v{9_!_Q}XO%J< zq4t@Og`Zv_P6ELAU+oaQuw{WJc?h%?p@sL}1ZDZroaiUh*@2V469$VRVxP!t!}$&` zzt|}i0210K5TYaw z+RRBTv?cq7b)ub`cV*&RsZgHPF!@7m-zYZ@y3TFj!caA5Q0V~?ikdJ5Lgvi#k;H2O zRP(UHK(rNzm32S7t!LSKyIa2+V<^0K1h;Zy-FQ?oF6aBpF9GGYfAPR|LN&`8P9Hog z0j1JU5Idrx_Cfiiuu-!_ds*qk0I(MeW$J6VGm6=wP^J~*2k*7dAh)4~g=868hQgG0a7{Gx7t|8Gx_>gPQ273^Ms_KI zo~bf(3sfn6B)Vr?qmS@H0i?oUCch2DEW9C`m^CjanKXb?z5I@e|H#s4#f#V|#)n*7 zDUD=L+)5sF+(w5SgZlZP-N*^*rMr3J*KW}O{434-S_ZC3ljk{S2$D~o=77Fn;Tixo zlr!AlT*x|~+CMfTb*bBO@g(BD6^B|hyAeRi%Gt6;}OuH=meoHL;slwcpm(_0k?g( zB3Si&J=v&aMmd$Mb8ij!a}0d}@G(_k1F4##zA2O)v6Zo(3m(}CrjyNiRlgi^!-E^! zPl&E2g#M#Mhui*bTIlN8R?#n@rZLo3XHfJEz9(}R^cKy;XnBO^p*vDlDk#Ac!K3~N zNWxhVffewHoOs_nb*vS%q*%-}QfB<)5V_Y{tL#{BuEy^W!8B<^O`D*H7ymF7Xz z+nUg=29p+&ZE<@;(1Wu|)nu~)7ED>*J$LQRF}4?ad%y{=Xen_A)_6Vn>zcQrj8mwu z3Em(TJipX>Ch}M(z73qIF*wsG1ety|=*=j`vO7?@)Jw@(qyVxx#hI>RNMJSUnfUuq z1xKZbK0)3gYW?=pPC!t;6YFWNoZarj5fZsn`|`3cC>oJ`)(F!lx( zzjnzxTE+~s$?yp)+#1nt!sq=3^z&ah<+VGxWyT)ln%?6B36Pu$!4jzd3 zten6elw@jh1Y(l&)mUG_!_0+mxeq+IsO{loDz81D$xD7tj=%tcoU&TufZ@^oga;5f zH64>6hox;|-QflnIpce8ki=I}J1kCvkmhqF(OR+f=R7^i7(xikN9*pljkqK z@TlB2$fHT5I}-@R;*{Z6y|p$9v8$+OacFR+Y{^vq zx^`A36R?Pw(71*JN~cRMbFhZ+{cISSLO{yL)lvN8rg-pb7^n(p-Qye0`h&Iwr>hxo z1U7>`)Q1X{s-6n$A7hnn>c69{KyO3va6(#HiE8h^W4Eu4YAP5! zgT4-@-PfX~2*;OkpemH;Ka1!}x}UrbWCW|_hP)0xZ9i!Ct6 zswEMGB3fgXe(r$cq`J}l0P-G4e!Qq;LyKgP*C%lh|53Z+NeuJQ^R{E0IpY&EqosNC z+=__qRb$o&7vw*B`Xb*1aQ(7zTd5loCMemU8IkE~z}g71)E|hXOGtoDNyjmiwTh1C8aR9`?ydcEYuJ3LDixrw&*hP>tJ4twrM;D z`hs&gb(R&%GeWi|hmiNz94WuKC|{6j9y}`pI~M%GIv4m(x7e`cbMf~v!h67`Rc6J9 z^q?zr?@^nhpb-4@xEDEhJi++SJE|v{1dnMRDt9EuqhOQ4sokL$RHEJ6=U+Jh6*FYn zyn(rvJ1~R&tl5SA6LuGZScRs)m@k@#x(-7)Efdkf-6qr0JKcRv6s*IZ2Zo|Cwxf(C zD>TAG$a#!h89Ymk7z)oL{kp&Xy(dBsmz>tUP>Fx(qmRE)$K4v>9(s(9merz=`KU#1 z>)(4ryanhjfD14Bhrd57RM`H$WM&H~2tTREh)nqS$gdu;fr0y~v^TH6Hk|31XiKpn zzc`o_m%o?hmpl%J&uHH9jfqFa#~7|}Aq<&qOb<>Uj5HFB`2nWMh3Ktccjv$Nr)5J{ zj&iUd&sMXeB}I(*)7fQiw7>7~y%(Ed5Wd%tg&ZO<3{%9hb5g4}-WnzVKUZU5)k--K zGwMcs6RT8yN`9|0&){*Hcv)Z6xUpQ;dr5+mntgJt&9KPK=F6wi4Lyii;9~8&(hQK_ zCsHMMjQ7s=J?)ieDp>)})`jQ9i&DMGD=WnG?k^he)7|P1tGKCtuv@wkx3K$>PWT4t z`J(LSAsQ&3-O-EONhcnD-L1)CqpKJvzCrkw%Mi0HgOE4)I=-H9Q)sby9vExD^F0gq1= zmzh%lJ)!n7=&C}wxjW>Uz*FS6MOO^XS)z~#ZWDdZW+RKE8F;TAGNVc{pXB49#|J&3 z6-}3qTrHGAmUKE+X@92mzGA=dO#4lKbOgQ5J~koOFNRCNa_5?+9+IA7kGlv6iu3Oa z(eF35JvLB!ge%{!ez0PL>~#05j}B9APi-91=~z`6W$q@G}(D17Z&7; zXVw*^3hJHK4+J3O@AH|G*{cW62FK4O$|UyR=rPF9GLU;bGnohudOUibQdo;gW0p3? zVl&UloAw4R>Jm;d+2-uSp%g&;mB}UeUM0h{1(PV4^-IaP2NrWoJ{zEpP0*2f(@Y!{ zet3V&t)OE<&969D_!%f}j+{Swh0B#pLyPbjijz4K+eePPtzhWL1o_kN*=#ToJ*laq zH=rd9qFWQyuqT|ZMh5yp)(eNbzBk&2xv=S=G1^P=*)QyjM zG4i-f(huc0`P;x3-hK=XV??KofdC}YL8HtTU~2a!Qs;C{UR?kSu`^ga7u6iFy)OYT zwy+2SGA*TKWT<7dGafW9?R0#+69CTrj*Hw2yfD%LDV(s#5>s(~6((Pk4*$d!t|W>i z5imK4U$~x2$8`GV=aNXFKc!|zmcZ!&bwB|OUGRcr0A8(9o}H^g8oM^zdb>NsdL zR~kTp2fz)Wy5L>_0VblkI^PUsxC*GnLk_QjPnd8ngQmYN7;Cc8bw^^Az}sIRrzab_ zDcTs$E*CvtLOKB`kB3Da07*!X#)!(mU&5(>hQ;_tl{CfIVhh zw{k))I}tVp)A_X=9Pd87-$DT00DNVrEupXN1b78rn0^2nrb+*SbpGdn$FhL;aMJNG zDIW!F_6Imbt)H161`dT0bx_R#Uk%&_nmS1Y(Yj!#lB%pc&P#yqM#ZO*VW_)sNtsO7 zpN1#`69`O%GS7qWdZkmi3W9d-J&=M}nPqvM{@R8PihzOR>;~8-G{FWkvZ#A~Nz7JP zsJGzA7pRW^3*unB1+1H|6OnM0&R;BnVv{GRHA^;m(RpKl#*N9&?`hSa@EdP#fEYyNL5%m%7?zN z{hvSsj>A-d%QXV;v~N3Vo`~)DG;f>;M$5T!6olIKIOobeIJW`9TBmFSM4?C;>A?w0$F5+Feh=t~G> zuCDP@gUl`)W4ew+MF4Ew33T19(uI6$RmxsdH_~671XZ#H_nyMEHV%gK)V7J^zo7BYB+*L7?u6 z8{wJ{GNwfh)v5kwG`jNisON239U(oKN~5AT zIcEKL<$gB0wO7@VmeP%7?rr2f89VMJU&?i%R}~aki<7JpJN*-XAK~7!9F zs;+;${_)b>l0P-i)ifA8c_0$uHRNg%JZ`I#YOn!|1dK*1Qbs6v)tGs)D()N*1u&`WL3*T`QN2?wObNody#h;ftm+6EN1XUYn01val)9VaRYub&K zZcOdfn0Cc~Cy>HuX%nKirL98td#|&kj*Hl@H}0L{q(na#X(JorLk<^o$Q+e6!$eAp zAboYzRbntPO=xrZMxjQc?RjR%^_olG8YQm{^Lv3RB_ZzAtp`Ql$wb+^{hkZ1CmKHZ z!%7M8v)M~rROoH*OXro!Dg4b>*m8A*-e$`){k>xy@;gl3r;j)4W`EjG$uA|dHC1#5 zU2!QZKECUk>m4`wbMPi51sajl9v95ubptspKP({ZXx7F`ym%cwVJa4Mix*M?wUWg8 z+=Yhq%2MLUAuIs{{wiwNS~PklIxhJ}qKkEdH>&3rQ!1k+!uP~5@#SeM69yF>6w@wT&)5Mz3qDR-w}z{FtyuTr$IFWA5px?oj9*Xm-tLJckW zJoHwgDWReeOJ+v9g4Jh%(-KaKA>J?%&E#PFKEcJV)+!A~AqqzEKEzjwiN&G4Eg&#p zw~q?6aj2!7B$gBm)cq7#2ZvR&OkWJ#!G?Z3*l~KgoaiKy=^CAeinaZ0e%e0T{Db+s zunz>)x*Z4NFHy9sw|v-&rmm6E^ZB^WDW7msPCKzkUdwP6n6aN&md(Z>ndqiw)`C5- z1c{>h!u`>sNRXQmI9-cgSFN(`-2GTO&e}135%IE+s4(e~nv~AT6;MpoP5KgcNuMRV zR=(A2RGP^W+2f#(YESe^A{DrEb zSD1e?g+0P$a=AT%75onw^nSu$7-ZZ122mh=H!w_Zju6!o0ej&^V*!4!&>{}-0;6Mt zv__0Vs#JG1G4m7oZs6*e5o7LPoc2a6KsC?u+;Dsp&GX{a9W2skq81UHLIJHeC*`8C z&|yNhRBX92GT2XSuZd?;&fP%lx~JLh`_AP~QVamKQy@q)3mmMmH=&gcpMi&3`&3ni zw9{$`2$yC$8R$M4p;P!CkAlB+`)Bb?y6Rb|hQ8lf)8dJAT4QRMpZS8)b=)K~rGT&B$}XbU@A~N1C`KcHXWMFtgnDk**r>3gT(5AV0YldHh^t@hSIw7;#~JY z&Bd60>?K-4ef};_Hg%J=ti@sZ(JelEWe0w#f<_q4Q<#Zz278a#o}K|r@>Dv_D%IlM zuh~D}aQ&7*&ii=FGd2GEqp<@`MO0N@1$o%d>YU45J%drrL9FE|syPT>wl(-95hhNK z3{Y%?+qpp?=z9H3CGK9hKXwnawCR?EkZKY_dKKvd?kj9RCfmX#pkylER$I7yd#C#5 z)s-30h3s_GGAa2=iKCkDbDQ}icmf;QwZcIE)i88Zy{aw>v|qm~+V48Mgeq|l^4I}3 z#dYBDJ4hCvQBixoTUv#aeye}no_CAQ zu{Hf#0YWb}ey{;v6AF>`*XzUNR+j-`3`)mrpnbDT($MU6p$C6C>&Gsb(K2#wnUt-s zkpB@_vwm8p*?=8GfRN<(l(rd;`=~TAFJ&F3Czl1e>;n0!W(*J@zK}JE{sANF*5=uh)O7*F>b~ zO#~g3xax_y6pbCg21wy-FAx{5cmgWvp-iVfMmu18b*UZ_vORrpq}si@FtTHiSuH$e>cn^r^nX3@Ow%%c3!d_k5pYmz4% zQ}mGIl>%FXd65|Q)*{HI_Hp?P!3kb=x#9FoNx1i4@+LOixx-`!yBx6#zvN2?MnCq; z1|h-&{otY*Fmju}-W-@}PjSVc8iT`9FVCqw*X}jVIsB4o;X^MuuLQdUT5hMhjLC85 zL1MtIdwHCCv+VeJQqx&;lmTC_W9|y4t9t77^+-$f{KU_ z*kK|fLGBdB;((4*$5~pW zNI7z(w{2K|*N@qii#QR5&}9Jt{WC|%?2dH--X6FbyWp3(pjemdb#{nxA|XxW%yZP* zb*5dZKWJ+Fg#zpPvpR!p^LRN5+|M}3YV~ZbSBG|hbaVshPNip|(95#jdawoKXf)q< zYeOQ%x*1cfI`FjDSM0nMcqUdF@z6@xh7=A3OC{E|FpJ`pSvMl#cN~Eb+g$Pa?(biV zVGD5;(fWWJ-EEetDXHAhxD(?bmU~D*$IDt!FDqV@iC$P?faDQXJL4XZX9JOM)^cKH?A+#^6N$3lP1((YgZbT$( zbOY*lzbLdh{l5DSG z^T8hOEf8dR0e?ElHeaZZAz6Z4G4`V$pQ<$p8%H6Ox9(e1wSFEAhiq#NZJ5k!_Q^Lg zp|BrwM|}ALn}BXXWCX>$?s8N2pW7Xy+wXr00%@mPkx@zT zUP7bqMqQF>R+R;ok=cVJ&Hz)#K-k_d$vU%=kHxyjz_2Td!V|nlm#iOu_U^hc*u+mx zHYsn)%nz934^hiuLb5fKs_PZlYViV9>@1| zKBMwUHH+$8c`p&?PBRSFoX1epF+b#cOP|d7UUO`bg(YOx9L!f1(%49;4<&W|8loBH zy9Y7OLxLZwE9-KpYqAE#hJ6+^IH{tnN`GAD*eAu9+_c$%>@sIKZ{>m7X?i8SZrk}P z12{J_>}T3R)JI?s)Ae_1$~0CoVQJn;2OP`5%i0QEL}*gMYwL~ZHng(L?gW;I^s~BA z8FE5ToBFP=bcg3pKt?m!Z_X|IGi%LcQe4DQB?~{&eDsd+M2OE8_&KU88fKq2CeJgPk`x*#SQ5@6#{H3X6YU5x1TP zPbVMbSCxHLK@HC3g!+z(OhrkCb?Z)oB$HyIo|BPh8R%wc#2jc{jT5r|Jri{HGK)h3 zHN{cQPwj!mfO0CK3rZy?+5&8#D);c{G0$YF5vAl^cN2WMp|800tUCL8U?&c``zZzY?@P*GrQlKZyWM3Dg6?vS#p9A{L&*l|QlWl8ycL^Go6{D+&a3Hk+ zB~)IDF7mW%O0Xx2D0Z;=R!MOt`uVRteDZOCp`g){>_V) zrD;rpBv`tLMCFv*y18yzpWStO5*&k>+~Ey51h%Hj$3Jm?SlYZTz!Z9+!;0l@C1_*evJ7jD?@`FVK`@?+H7Cy?Dy?*JHVU zYs?}|1MPN8|Hd*i&YVtfAiU&9UPY+#W@%$~e!~szQly63v;FEb%P~z_ZRv!mPIXV$ z8lizbNnA)oeYLJ4Y zQ>`3kUApn=Ous=SdSh>IpaGS&CORLjJd?9`CkA~=i)DN8+Eu!PQLI}gbvu1H zvOe4Gpk*^rwqIF%_e(Mh3=zRnEQ#B(M_ll)SQ_GrAza(7cWbQBwt0C_<sSRLbywz6hR$B^rmLCxK9`HJJ+N~rq*kwNJrq!SYJ zn-p84b!!wIVV9ye{|vE!zxWhmn40TH!i4K?h(&V<5vgNUyy#wIQn_b?MQb}{fSj6N zY;~?f2`(q)$7dslyjuT`H#AE_DCFV^cqNd%8#Akaw+7shEGHkxub+M;k8|Jz^)cnN z=1&jpR}i6q0TqFdMvR}D?dkY>yuGhVUTvELDB;TSCo95iN${K#BL5;uE5qJG$}cSHbcw8HBCXH$>2Xq zl+FX31q#xK7t`&-QiUKhe0i(`@`bb+xY1!y3 zmT-6@W%V@_WZYxg$fy@FLiqLO2|>*(DeF~)^PE#d9zVQOsG6)H70c+^T2)0jDfL8P zN}~tpOZkr{#|#pZ!6LD~x4vriyImijQ!PBJJ4e#d-di;Xq1{O`@L*a7RC9ByO-Jk{izpL?zH`sRZF!KuVv0GK+-vMR^Y_yCVGW&6{;rpj$?!Ar*=p!`n5w;ugGtfp z`Z+Z>^(!h<6q6^iZb3Md)ovwS`gE}xvl>6@tA7XWH-EKYP316*8Uev2^CM|YkyNXY zs(Q6KbG(q_p%Uf}Q`RD^Bq3Br5fsgNWzcVNfBO^Tejw1-zTTg z;5s@Z;n}4vDd??z_Bi&)AZ6nN`NhksG)f(o@Ur~KGQs}U=9^{vTE`E}#XW?a{Lp{f z9?k(H?+wM|&d?x$c~nHpo=ent8BSbF1w1c}&h$7sByq?`)%wg49Xi-J z=^?J?2>N&T0Xqz>3OzECHS^@<+~@<{@FN)O@Z$YZMW^2%x9D6<_=UmvA}q0#pCj{E zn5y~CdG6$;MdMpHti`^!-<=tV!7m+Iq2l9@jmgt*7oqcZs;g@4iA)^=nQ7EyaZ7R2#{o*DI?m#y zDajzLQ7nqmf;|~8Q29AQw5&Ew@Hns+^ zokUVEHE`lXnNdJrBSES^_A~RZ_+l>TGi8V_nOxkQyvdDzMeEZlBeJOG3~TXYB$;>S z1Nkhcex~Rhcev67PMqu@J`A@G0>4N;LO?5m2xdU>Eu=hHP-gV-_cEdnW%V1bJa z-B;y4z8h7ZVvd(&TjcmX*Q05SM~eFpu%KK#FaMje3wd#0*($7dxncYmx$U>q|) z7JVnZz<3*Rq@)GFv>QqAo#ms?wXDcg#qrGaBjp+A4he_l0>dsE$WlwU_rpxZ&r3=O zA#tCl?0e_+1V)~#dw{|kUVLEU$G^&>P2I!YFDB~F@)$lTY2;jzIH1oQCKjKtJhB6F z%j2`+mhddxdQ=lm-)YCnrk>Drd&wAs9od(2(V0s*?G>7I-| zBNO7o5upGHq(e}uJVAW{v~?Q%p*yK6WE%YZQK(OdCs8!u6zQ(#Cae$nqD#z1JLdmEeF6&{sk`%gTn|~nSr#mhXBd`)C;RqN58zQ%o$}Xp< z*$fz|`3sh~!(fRM2uOZi2MjXrE?3Eaz&Ih+D$B~7ZeZ(dR5#2@y?$Vks7fKzno#i$ z4#l4Cz6BAoGZv5!nC-b-D3a~xwKiGXs=AuedRfB;8I{aqaQoQcTXRqY_QXu`sbaAi zaFRNJO~9hl0Zd1RiK9zD@$SeD>`pgyrF#DsXppLZ0K-%>h!*6mYOQ!*X-i>4SMw95 zqUyjs%b#xx#QCo2ud2df-`X4;YDJ%F9v||Dq^DUDA|Cq;!!f0I6&|t1!W^Ys7Lsu;H;U9UR`5*4u?3(aner+?nEfEF z&c%NU-i=l=I=zj}1zgw+c5zK@li+<#w;K>wCt!K1Qh&7{Dn{YZI*H{{sU5((ouAMM z9uZG}^hP}nh7EfFX4vl^0qN<5HwogEYW?l@bI1wsyPwaz!JqSh&PhRUSiM+7JMx1< z=7_)bBKj<{Ws9=W63UQhy>MQ$2e*%*DC$oD`}TM5hk9?&;lPJO zw9VgpEAF}US92KuXu-dCIo^OCCQb$b^BlaYHeZ1Fu}#MK`7%?J45L%ZbpM7!^p{J2 zWssH3f57`S5j-AH+$E3&q*he+hIN48Tv&Yc`e*>+j)nUbtc0$V=z?q*IoPsBS*O%X zG#(jXH!#St?P5Gm7wf*0rr%|CSao#MzBt%s%A>?*>nb6O)&4uvp$%iX6k*dxYwil} z^^tz>1pYfJ&)v_{R|?OG2SJZ+_=(2sE~#mH|^I~u(QZh^mVV_Yg(BlX~`*u1(X2bXom-U??b1!;3PJ8M$& zTbnM%#QRyHSRC7;-k@S_|BPP)9*-s zbZk{nxySjDV=b*)sX*z0b%dbz?7s+Hg%h^$5_N<$D>%4|wb&>+tlZSMru3bavI{ML ze0ppx)8 zZV>^{v&HE74$EEM+wWL|W~1Tgw6dTz=a8OktYo;e1?^aB-sP3Y>}2ZpwWPck6Ik1$ z1k~lTzLo-`gX2oFw*HLuQ5qE@nB#HoKVI|m1LyH&TU1Rj5OLO((I5K(%cVj>2agUj z0VzYd6Lv-VBCu@NezT=i#zAPgy;nO|m|}`~1{RjhFNrs0Ko>G^r$5FY7h$e1FT908Tj11qVH-WFz_Ju-O|R z`&ZW}#QGdiQ|Y1$KU`|Z*s)k5>s)EbqDBk`2hA#WmpZxhrs`W3Xfyysx&O~#-ODt` zzJ3w#7&o(^p6%4!QIugeNrm3Mz6>_gi(;KUaf=zO*VT0;K)6TZ1!H6C##1A5k2BXS zft3m&7%f;V*mwar4KY)$ez9Bu+urA!8-T#X;VvBRiQOE;wse{ue1FT>k?#zn*osQE zX}oH0C1q_p+I|5#0lrD+_*=pB4f+3BM$x6*I0I3KnD$VEWroBs9JH7%I&iKyn-FplUab^Y-gKWaNUNoZ!JAAj4BjvcoCt3gLEO5Z=ngv^_ju1PhAq zQ#GDjv0qaHz|zSYQ5&=DwwfRM?KSE;qw$fNLQ$n&z}a~AO%08xX6uhHxhFI^R)uuw zMtal`=>qPsPI$~BXE#N)2@{83nj@FsKv>mpsVQ?fsmiT*yE3yP3MbVMFc+Dzs~}o^ ze|k1}3D`<)w%NskXR)Tj(ZjyRJyx+1m)K>N0C?7l5Q1YZjr5?Wb_i`YUp<4Y{RFt|o)(83kK=zN!!;GEVHINe z*;4tLuZL+x%BLpnRVD@&#%%VdGFyI@Ma#-74C1gc1FPv-6CGt_u+Bw&eTIFv+A^p$ zw=-zt?IT`$W<|>^PfI9rSBzn+zFV=ZIgiflM;^zBp~juf_6=y9&fMmGWN9D7SpfrA zUboBV2$9IIwTw>(J~=Jdcgi!Ds;~3fR_a`)ToX20X6*Otl9CUbR3ZG^3)^$+D&#*| z9F%p>-%jBFD!rZS4Ap-fR7N###r>tyu7q58Oq2YxDWd4(H5f?^q2m;%iCIa@ajhR!%Z&Wlc~>e!i9F zX!`ZLu24xtD@Yh^UrO4{eB%q8xV~wrFDV-xM$M|{6H+S)W71)WI)@<>yk=-+sCU{h zKTKC~H4S8fRleoD31^Pr%R)`-F^fd^DE1lOMtLDeXxWYYmv^u#vy-CH=Q7%rA@VW@ za)QDFO~KR2s$+g;0!H(}J(%yIu8p|Q>;8i((uF&rxNL`(#gRj8U<|u%r1Cw_++w7T zy#?D(1MGlg7yFI@ErhY#sb2TL|Y*@3u_u zlb2(VrnsYdx{D>(sK|@Yygr68*IA&v_#%9&2gkitols%lJWQC}=rAj#8=57Fw_`r- zYO736CIza%GD2T;kiq|!M9xd-t=wCy745}wO~Sij-yHCdBa(~L7IH<4z{_+{f7Qqu~l z?Mo>%roM_vSWQ0<^$PLIqSVfD?kd=3J_>ewY@$RQRZ(fIciwC^@DoJLvJF7(K0+q? zHANPNg?{kb;0s3a6z5Nvy7p2?FcJ#Vk0dd$XAO?78OMNtiugN0qLp=vY7MWZ-yo*X znuNNp#uSeugs(W_OUkQcgR6@33cEBp5CyxigEImW9<)>E90sNQa6f($cx$_Dzy6H* zQ$huUT2fha)!&X%zZ#-MYpdaU0+V*mEF?)lRYAgu?tx_b^TiMIZi6XG6}=C7VdY1J zlZvd0%(8`HRX;%`Z)8{ehbb!ZH~Wt1qf(dj3K8!G6Gf6x#y{wq3$1=y_ut#bSiL!* zE+lb&VCQQ@sp}42=`UzNA)23?a{NCg0PGhr3U+uqu&L<9dv52Q$f(Y{{lg?ib0)DL Y^(E=|`kbuArZND5r>mdKI;Vst0Nbq{@Bjb+ delta 37537 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 From 3d2d2f07e84eeaa7590e43a1df58b89c26ea066f Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Tue, 3 Oct 2023 16:17:23 +0200 Subject: [PATCH 08/16] Mark some build phase script to always run as there is no way to use dependency analysis --- ADUtils.xcodeproj/project.pbxproj | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/ADUtils.xcodeproj/project.pbxproj b/ADUtils.xcodeproj/project.pbxproj index cd91ab6..e418613 100644 --- a/ADUtils.xcodeproj/project.pbxproj +++ b/ADUtils.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 52; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -520,6 +520,7 @@ /* Begin PBXShellScriptBuildPhase section */ 490133B11C1EFC11000CC04B /* Turn TODO into Warning */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -530,10 +531,12 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "KEYWORDS=\"TODO:|FIXME:|\\?\\?\\?:|\\!\\!\\!:\"\nfind \"${SRCROOT}/Classes\" -name \"*.h\" -or -name \"*.m\" -print0 | xargs -0 egrep --with-filename --line-number --only-matching \"($KEYWORDS).*\\$\" | perl -p -e \"s/($KEYWORDS)/ warning: \\$1/\""; + shellScript = "KEYWORDS=\"TODO:|FIXME:|\\?\\?\\?:|\\!\\!\\!:\"\nfind \"${SRCROOT}/Classes\" -name \"*.h\" -or -name \"*.m\" -print0 | xargs -0 egrep --with-filename --line-number --only-matching \"($KEYWORDS).*\\$\" | perl -p -e \"s/($KEYWORDS)/ warning: \\$1/\"\n"; + showEnvVarsInLog = 0; }; 490133B21C1EFC25000CC04B /* Warning if file > 250 lines */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -544,10 +547,12 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "find \"${SRCROOT}/Classes\" \\( -name \"*.h\" -or -name \"*.m\" \\) -and \\( -path \"${SRCROOT}/Pods/*\" -prune -o -print0 \\) | xargs -0 wc -l | awk '$1 > 250 && $2 != \"total\" {for(i=2;i 250 && $2 != \"total\" {for(i=2;i/dev/null 2>&1\n/usr/libexec/PlistBuddy -c \"Delete :CFBundleGitBranch\" \"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\" >/dev/null 2>&1\n/usr/libexec/PlistBuddy -c \"Delete :CFBundleGitStatus\" \"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\" >/dev/null 2>&1\nif [ -n \"$GIT_COMMIT\" ]; then\n /usr/libexec/PlistBuddy -c \"Add :CFBundleGitCommit string \\\"${GIT_COMMIT}\\\"\" \"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\nfi\nif [ -n \"$GIT_BRANCH\" ]; then\n /usr/libexec/PlistBuddy -c \"Add :CFBundleGitBranch string \\\"${GIT_BRANCH}\\\"\" \"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\nfi\nif [ -n \"$GIT_STATUS\" ]; then\n /usr/libexec/PlistBuddy -c \"Add :CFBundleGitStatus string \\\"${GIT_STATUS}\\\"\" \"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\nfi"; + shellScript = "GIT_COMMIT=`git rev-parse --short HEAD`\nGIT_BRANCH=`git symbolic-ref HEAD`\nGIT_STATUS=`git status --porcelain -z`\n/usr/libexec/PlistBuddy -c \"Delete :CFBundleGitCommit\" \"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\" >/dev/null 2>&1\n/usr/libexec/PlistBuddy -c \"Delete :CFBundleGitBranch\" \"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\" >/dev/null 2>&1\n/usr/libexec/PlistBuddy -c \"Delete :CFBundleGitStatus\" \"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\" >/dev/null 2>&1\nif [ -n \"$GIT_COMMIT\" ]; then\n /usr/libexec/PlistBuddy -c \"Add :CFBundleGitCommit string \\\"${GIT_COMMIT}\\\"\" \"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\nfi\nif [ -n \"$GIT_BRANCH\" ]; then\n /usr/libexec/PlistBuddy -c \"Add :CFBundleGitBranch string \\\"${GIT_BRANCH}\\\"\" \"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\nfi\nif [ -n \"$GIT_STATUS\" ]; then\n /usr/libexec/PlistBuddy -c \"Add :CFBundleGitStatus string \\\"${GIT_STATUS}\\\"\" \"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\nfi\n"; showEnvVarsInLog = 0; }; A6A85E92266DAE1D134ACEEA /* [CP] Check Pods Manifest.lock */ = { From 315dd8e55a71413ea23fa4ab42b09357256bb588 Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Tue, 3 Oct 2023 16:20:51 +0200 Subject: [PATCH 09/16] Apply Xcode recommended settings to Sample project --- ADUtils.xcodeproj/project.pbxproj | 11 ++++++++--- .../xcshareddata/xcschemes/ADUtilsApp.xcscheme | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/ADUtils.xcodeproj/project.pbxproj b/ADUtils.xcodeproj/project.pbxproj index e418613..732706c 100644 --- a/ADUtils.xcodeproj/project.pbxproj +++ b/ADUtils.xcodeproj/project.pbxproj @@ -452,9 +452,10 @@ 7A0EC6461535D8ED00E5F54A /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; CLASSPREFIX = AD; LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 1120; + LastUpgradeCheck = 1500; TargetAttributes = { 49B1F77D1CE4B3DB00A29BFE = { CreatedOnToolsVersion = 7.3; @@ -471,11 +472,11 @@ }; buildConfigurationList = 7A0EC6491535D8ED00E5F54A /* Build configuration list for PBXProject "ADUtils" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( - English, en, + Base, ); mainGroup = 7A0EC6441535D8ED00E5F54A; packageReferences = ( @@ -894,6 +895,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -974,6 +976,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -1051,6 +1054,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -1130,6 +1134,7 @@ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; diff --git a/ADUtils.xcodeproj/xcshareddata/xcschemes/ADUtilsApp.xcscheme b/ADUtils.xcodeproj/xcshareddata/xcschemes/ADUtilsApp.xcscheme index 00b6f52..0c44abb 100644 --- a/ADUtils.xcodeproj/xcshareddata/xcschemes/ADUtilsApp.xcscheme +++ b/ADUtils.xcodeproj/xcshareddata/xcschemes/ADUtilsApp.xcscheme @@ -1,6 +1,6 @@ Date: Tue, 3 Oct 2023 16:27:14 +0200 Subject: [PATCH 10/16] Update CI scripts to use macOS 13 and Xcode 15 --- .github/workflows/cd.yml | 5 ++++- .github/workflows/ci.yml | 5 ++++- .github/workflows/prepare_release.yml | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 313b3db..4ce00d7 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -5,10 +5,13 @@ on: branches: - master +env: + DEVELOPER_DIR: /Applications/Xcode_15.0.app/Contents/Developer + jobs: build: - runs-on: macOS-latest + runs-on: macos-13 steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3139421..baf165d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,10 +2,13 @@ name: CI on: [pull_request] +env: + DEVELOPER_DIR: /Applications/Xcode_15.0.app/Contents/Developer + jobs: build: - runs-on: macos-12 + runs-on: macos-13 steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/prepare_release.yml b/.github/workflows/prepare_release.yml index 96812af..f99e17a 100644 --- a/.github/workflows/prepare_release.yml +++ b/.github/workflows/prepare_release.yml @@ -3,10 +3,13 @@ name: Create release PRs on: create +env: + DEVELOPER_DIR: /Applications/Xcode_15.0.app/Contents/Developer + jobs: build: - runs-on: macOS-latest + runs-on: macos-13 if: contains(github.ref, 'release') # allow to filter on release branches only steps: From ad6112e2bfe9d6b444d4eabea49a8ee0aaf622c5 Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Tue, 3 Oct 2023 16:28:22 +0200 Subject: [PATCH 11/16] Update gems --- Gemfile.lock | 61 ++++++++++++++++++++++++++-------------------------- Podfile.lock | 2 +- 2 files changed, 31 insertions(+), 32 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index d75279e..b7ccec1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -3,12 +3,12 @@ GEM specs: CFPropertyList (3.0.6) rexml - activesupport (7.0.6) + activesupport (7.0.8) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) tzinfo (~> 2.0) - addressable (2.8.4) + addressable (2.8.5) public_suffix (>= 2.0.2, < 6.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) @@ -16,17 +16,17 @@ GEM artifactory (3.0.15) atomos (0.1.3) aws-eventstream (1.2.0) - aws-partitions (1.782.0) - aws-sdk-core (3.176.1) + aws-partitions (1.831.0) + aws-sdk-core (3.185.0) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.651.0) aws-sigv4 (~> 1.5) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.68.0) - aws-sdk-core (~> 3, >= 3.176.0) + aws-sdk-kms (1.72.0) + aws-sdk-core (~> 3, >= 3.184.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.127.0) - aws-sdk-core (~> 3, >= 3.176.0) + aws-sdk-s3 (1.136.0) + aws-sdk-core (~> 3, >= 3.181.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.6) aws-sigv4 (1.6.0) @@ -37,10 +37,10 @@ GEM cork nap open4 (~> 1.3) - cocoapods (1.12.1) + cocoapods (1.13.0) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.12.1) + cocoapods-core (= 1.13.0) cocoapods-deintegrate (>= 1.0.3, < 2.0) cocoapods-downloader (>= 1.6.0, < 2.0) cocoapods-plugins (>= 1.0.0, < 2.0) @@ -54,8 +54,8 @@ GEM molinillo (~> 0.8.0) nap (~> 1.0) ruby-macho (>= 2.3.0, < 3.0) - xcodeproj (>= 1.21.0, < 2.0) - cocoapods-core (1.12.1) + xcodeproj (>= 1.23.0, < 2.0) + cocoapods-core (1.13.0) activesupport (>= 5.0, < 8) addressable (~> 2.8) algoliasearch (~> 1.0) @@ -81,7 +81,7 @@ GEM concurrent-ruby (1.2.2) cork (0.3.0) colored2 (~> 3.1) - danger (9.3.1) + danger (9.3.2) claide (~> 1.0) claide-plugins (>= 0.9.2) colored2 (~> 3.1) @@ -99,7 +99,7 @@ GEM rake (> 10) thor (~> 0.19) declarative (0.0.20) - digest-crc (0.6.4) + digest-crc (0.6.5) rake (>= 12.0.0, < 14.0.0) domain_name (0.5.20190701) unf (>= 0.0.5, < 1.0.0) @@ -108,7 +108,7 @@ GEM escape (0.0.4) ethon (0.16.0) ffi (>= 1.15.0) - excon (0.100.0) + excon (0.104.0) faraday (1.10.3) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) @@ -140,7 +140,7 @@ GEM faraday_middleware (1.2.0) faraday (~> 1.0) fastimage (2.2.7) - fastlane (2.213.0) + fastlane (2.216.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -161,6 +161,7 @@ GEM google-apis-playcustomapp_v1 (~> 0.1) google-cloud-storage (~> 1.31) highline (~> 2.0) + http-cookie (~> 1.0.5) json (< 3.0.0) jwt (>= 2.1.0, < 3) mini_magick (>= 4.9.4, < 5.0.0) @@ -172,7 +173,7 @@ GEM security (= 0.1.3) simctl (~> 1.6.3) terminal-notifier (>= 2.0.0, < 3.0.0) - terminal-table (>= 1.4.5, < 2.0.0) + terminal-table (~> 3) tty-screen (>= 0.6.3, < 1.0.0) tty-spinner (>= 0.8.0, < 1.0.0) word_wrap (~> 1.0.0) @@ -180,16 +181,16 @@ GEM xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3) fastlane-plugin-changelog (0.16.0) - ffi (1.15.5) + ffi (1.16.2) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) git (1.18.0) addressable (~> 2.8) rchardet (~> 1.8) - google-apis-androidpublisher_v3 (0.45.0) + google-apis-androidpublisher_v3 (0.50.0) google-apis-core (>= 0.11.0, < 2.a) - google-apis-core (0.11.0) + google-apis-core (0.11.1) addressable (~> 2.5, >= 2.5.1) googleauth (>= 0.16.2, < 2.a) httpclient (>= 2.8.1, < 3.a) @@ -218,10 +219,9 @@ GEM google-cloud-core (~> 1.6) googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) - googleauth (1.6.0) + googleauth (1.8.1) faraday (>= 0.17.3, < 3.a) jwt (>= 1.4, < 3.0) - memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) @@ -238,10 +238,9 @@ GEM rexml kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) - memoist (0.16.2) mini_magick (4.12.0) - mini_mime (1.1.2) - minitest (5.18.1) + mini_mime (1.1.5) + minitest (5.20.0) molinillo (0.8.0) multi_json (1.15.0) multipart-post (2.3.0) @@ -265,7 +264,7 @@ GEM trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.2.5) + rexml (3.2.6) rouge (2.0.7) ruby-macho (2.5.1) ruby2_keywords (0.0.5) @@ -274,7 +273,7 @@ GEM addressable (>= 2.3.5) faraday (>= 0.17.3, < 3) security (0.1.3) - signet (0.17.0) + signet (0.18.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 3.0) @@ -283,8 +282,8 @@ GEM CFPropertyList naturally terminal-notifier (2.0.0) - terminal-table (1.8.0) - unicode-display_width (~> 1.1, >= 1.1.1) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) thor (0.20.3) trailblazer-option (0.1.2) tty-cursor (0.7.1) @@ -299,10 +298,10 @@ GEM unf (0.1.4) unf_ext unf_ext (0.0.8.2) - unicode-display_width (1.8.0) + unicode-display_width (2.5.0) webrick (1.8.1) word_wrap (1.0.0) - xcodeproj (1.22.0) + xcodeproj (1.23.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) diff --git a/Podfile.lock b/Podfile.lock index db7f9d9..97c81f4 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -38,4 +38,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 6914b9ce5e1410eb72fa1a28f44d2a94b4424fca -COCOAPODS: 1.12.1 +COCOAPODS: 1.13.0 From a11ec608008918b55e91e4032635a39e76a288ec Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Mon, 9 Oct 2023 12:18:05 +0200 Subject: [PATCH 12/16] Try make CI pass with Xcode 14.3.1 --- .github/workflows/cd.yml | 3 --- .github/workflows/ci.yml | 3 --- .github/workflows/prepare_release.yml | 3 --- 3 files changed, 9 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 4ce00d7..2ca84e4 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -5,9 +5,6 @@ on: branches: - master -env: - DEVELOPER_DIR: /Applications/Xcode_15.0.app/Contents/Developer - jobs: build: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index baf165d..8b3f7ed 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,9 +2,6 @@ name: CI on: [pull_request] -env: - DEVELOPER_DIR: /Applications/Xcode_15.0.app/Contents/Developer - jobs: build: diff --git a/.github/workflows/prepare_release.yml b/.github/workflows/prepare_release.yml index f99e17a..5161fdf 100644 --- a/.github/workflows/prepare_release.yml +++ b/.github/workflows/prepare_release.yml @@ -3,9 +3,6 @@ name: Create release PRs on: create -env: - DEVELOPER_DIR: /Applications/Xcode_15.0.app/Contents/Developer - jobs: build: From 9ac782a32d9f5661cbf6df3cfbfe5163466904cc Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Tue, 10 Oct 2023 15:28:01 +0200 Subject: [PATCH 13/16] Force Xcode version in workflows --- .github/workflows/cd.yml | 5 +++++ .github/workflows/ci.yml | 5 +++++ .github/workflows/prepare_release.yml | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 2ca84e4..932f3f6 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -5,6 +5,11 @@ on: branches: - master +# See this page for available Xcode versions: +# https://github.com/actions/runner-images/blob/main/images/macos/macos-13-Readme.md +env: + DEVELOPER_DIR: /Applications/Xcode_14.3.1.app/Contents/Developer + jobs: build: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8b3f7ed..956a701 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,6 +2,11 @@ name: CI on: [pull_request] +# See this page for available Xcode versions: +# https://github.com/actions/runner-images/blob/main/images/macos/macos-13-Readme.md +env: + DEVELOPER_DIR: /Applications/Xcode_14.3.1.app/Contents/Developer + jobs: build: diff --git a/.github/workflows/prepare_release.yml b/.github/workflows/prepare_release.yml index 5161fdf..06433c7 100644 --- a/.github/workflows/prepare_release.yml +++ b/.github/workflows/prepare_release.yml @@ -3,6 +3,11 @@ name: Create release PRs on: create +# See this page for available Xcode versions: +# https://github.com/actions/runner-images/blob/main/images/macos/macos-13-Readme.md +env: + DEVELOPER_DIR: /Applications/Xcode_14.3.1.app/Contents/Developer + jobs: build: From f5581fc57f0d4bf7ae4885c9406999b7fab10ab1 Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Tue, 10 Oct 2023 15:36:11 +0200 Subject: [PATCH 14/16] Add comment about tests failing on CI when using Xcode 15.0 --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 956a701..4e1a8d6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,6 +2,9 @@ name: CI on: [pull_request] +# ???: (Alexandre Podlewski) 10/10/2023 Tests about NavigationObserver are failing when using Xcode 15.0 on CI, +# but pass locally, so we force Xcode 14.3.1 for now. + # See this page for available Xcode versions: # https://github.com/actions/runner-images/blob/main/images/macos/macos-13-Readme.md env: From 211b1a28630238896afefe21b7879f8ca4c4c1b1 Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Tue, 10 Oct 2023 17:40:27 +0200 Subject: [PATCH 15/16] Make NavigationControllerObserverTest more reliable --- .../NavigationControllerObserverTest.swift | 67 +++++++++++-------- 1 file changed, 38 insertions(+), 29 deletions(-) diff --git a/ADUtilsTests/NavigationControllerObserverTest.swift b/ADUtilsTests/NavigationControllerObserverTest.swift index 711df95..7c0efe8 100644 --- a/ADUtilsTests/NavigationControllerObserverTest.swift +++ b/ADUtilsTests/NavigationControllerObserverTest.swift @@ -52,7 +52,12 @@ class NavigationControllerObserverTest : QuickSpec { beforeSuite { UIApplication.shared.keyWindow?.rootViewController = navigationController UIApplication.shared.keyWindow?.makeKeyAndVisible() - UIApplication.shared.keyWindow?.layer.speed = 100 // speed up animations + navigationController.view.window?.layer.speed = 100 // speed up animations + // ???: (Alexandre Podlewski) 10/10/2023 setting the layer speed of the ViewController's view is more + // reliable than setting it on the window because it does not involve global state. + // When setting the key window speed, there can be some race condition with the afterSuite {} where + // the speed is reseted to 1. + navigationController.view.layer.speed = 100 let viewController = UIViewController() navigationController.pushViewController(viewController, animated: false) waitUntil(timeout: .seconds(1)) { done in @@ -64,10 +69,6 @@ class NavigationControllerObserverTest : QuickSpec { } } - afterSuite { - UIApplication.shared.keyWindow?.layer.speed = 1 // reset default animations speed - } - beforeEach { navigationController.popToRootViewController(animated: false) @@ -87,9 +88,8 @@ class NavigationControllerObserverTest : QuickSpec { waitUntil(timeout: .seconds(1)) { done in // When navigationController.popViewController(animated: true) - - // We need to wait the end of the animation - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + navigationController.executeAfterTransition { + // We need to wait the end of the animation // Then expect(navigationController.viewControllers.count).to(equal(1)) expect(observerDelegate.observedViewControllers).to(contain(viewControllerToObserve)) @@ -120,16 +120,15 @@ class NavigationControllerObserverTest : QuickSpec { waitUntil(timeout: .seconds(1)) { done in // When navigationController.popViewController(animated: true) - - // We need to wait the end of the animation - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + navigationController.executeAfterTransition { + // We need to wait the end of the animation // Then expect(navigationController.viewControllers.count).to(equal(2)) expect(observerDelegate2.observedViewControllers).to(contain(viewControllerToObserve2)) // When navigationController.popViewController(animated: true) - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + navigationController.executeAfterTransition { // Then expect(navigationController.viewControllers.count).to(equal(1)) expect(observerDelegate.observedViewControllers).to(contain(viewControllerToObserve1)) @@ -152,9 +151,8 @@ class NavigationControllerObserverTest : QuickSpec { // When removeObserverAction(viewControllerToObserve) navigationController.popViewController(animated: true) - - // We need to wait the end of the animation - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + navigationController.executeAfterTransition { + // We need to wait the end of the animation // Then expect(navigationController.viewControllers.count).to(equal(1)) expect(observerDelegate.observedViewControllers).to(beEmpty()) @@ -181,6 +179,7 @@ class NavigationControllerObserverTest : QuickSpec { } } + // Passed 100 times it("should forward navigation controller delegate methods") { // Given let viewControllerToObserve = UIViewController() @@ -196,9 +195,8 @@ class NavigationControllerObserverTest : QuickSpec { waitUntil(timeout: .seconds(1)) { done in // When navigationController.popViewController(animated: true) - - // We need to wait the end of the animation - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + navigationController.executeAfterTransition { + // We need to wait the end of the animation // Then expect(navigationControllerDelegate.willShowViewControllers).toNot(beEmpty()) expect(navigationControllerDelegate.didShowViewControllers).toNot(beEmpty()) @@ -207,6 +205,7 @@ class NavigationControllerObserverTest : QuickSpec { } } + // Passed 100 times it("should clean observer of view controllers not in the stack") { // Given let viewControllerToObserve = UIViewController() @@ -225,27 +224,37 @@ class NavigationControllerObserverTest : QuickSpec { waitUntil(timeout: .seconds(1)) { done in // When navigationController.popViewController(animated: true) - + XCTAssertNotNil(navigationController.transitionCoordinator) // We need to wait the end of the animation - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + navigationController.executeAfterTransition { // Then - expect(navigationController.viewControllers.count).to(equal(1)) expect(observerDelegate.observedViewControllers).to(equal([viewControllerToObserve])) // We now try to push/pop the viewControllerNotInTheStack navigationController.pushViewController(viewControllerNotInTheStack, animated: false) - navigationController.popViewController(animated: true) - - // We need to wait the end of the animation - DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - // The viewControllerNotInTheStack should not be observed anymore - expect(navigationController.viewControllers.count).to(equal(1)) - expect(observerDelegate.observedViewControllers).to(equal([viewControllerToObserve])) - done() + DispatchQueue.main.async { + navigationController.popViewController(animated: true) + XCTAssertNotNil(navigationController.transitionCoordinator) + navigationController.executeAfterTransition { + // We need to wait the end of the animation + // The viewControllerNotInTheStack should not be observed anymore + expect(navigationController.viewControllers.count).to(equal(1)) + expect(observerDelegate.observedViewControllers).to(equal([viewControllerToObserve])) + done() + } } } } } } } + +extension UINavigationController { + func executeAfterTransition(_ block: @escaping () -> Void, file: StaticString = #file, line: UInt = #line) { + XCTAssertNotNil(transitionCoordinator, "no transition is in progress", file: file, line: line) + transitionCoordinator?.animate(alongsideTransition: nil, completion: { _ in + block() + }) + } +} From 18ca07ca32a08d2dd9bfe0ef56927c640274534b Mon Sep 17 00:00:00 2001 From: Alexandre Podlewski Date: Tue, 10 Oct 2023 17:59:21 +0200 Subject: [PATCH 16/16] Use Xcode 15.0 now that the tests are more reliable --- .github/workflows/cd.yml | 2 +- .github/workflows/ci.yml | 5 +---- .github/workflows/prepare_release.yml | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 932f3f6..6e4d785 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -8,7 +8,7 @@ on: # See this page for available Xcode versions: # https://github.com/actions/runner-images/blob/main/images/macos/macos-13-Readme.md env: - DEVELOPER_DIR: /Applications/Xcode_14.3.1.app/Contents/Developer + DEVELOPER_DIR: /Applications/Xcode_15.0.app/Contents/Developer jobs: build: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4e1a8d6..6b02e7e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,13 +2,10 @@ name: CI on: [pull_request] -# ???: (Alexandre Podlewski) 10/10/2023 Tests about NavigationObserver are failing when using Xcode 15.0 on CI, -# but pass locally, so we force Xcode 14.3.1 for now. - # See this page for available Xcode versions: # https://github.com/actions/runner-images/blob/main/images/macos/macos-13-Readme.md env: - DEVELOPER_DIR: /Applications/Xcode_14.3.1.app/Contents/Developer + DEVELOPER_DIR: /Applications/Xcode_15.0.app/Contents/Developer jobs: build: diff --git a/.github/workflows/prepare_release.yml b/.github/workflows/prepare_release.yml index 06433c7..5691caa 100644 --- a/.github/workflows/prepare_release.yml +++ b/.github/workflows/prepare_release.yml @@ -6,7 +6,7 @@ on: # See this page for available Xcode versions: # https://github.com/actions/runner-images/blob/main/images/macos/macos-13-Readme.md env: - DEVELOPER_DIR: /Applications/Xcode_14.3.1.app/Contents/Developer + DEVELOPER_DIR: /Applications/Xcode_15.0.app/Contents/Developer jobs: build: