From 719c8d3f80321f301133bbbc71a19ec167647f63 Mon Sep 17 00:00:00 2001 From: Jon Allured Date: Fri, 24 Jan 2025 14:28:17 -0600 Subject: [PATCH 1/9] Drop featured artworks widget --- ios/Artsy.xcodeproj/project.pbxproj | 48 +------ ios/ArtsyWidget/ArtsyWidgets.swift | 1 - .../FeaturedArtworks+Entry.swift | 22 --- .../FeaturedArtworks+LargeView.swift | 134 ------------------ .../FeaturedArtworks+MediumView.swift | 129 ----------------- .../FeaturedArtworks+Provider.swift | 20 --- .../FeaturedArtworks+SmallView.swift | 64 --------- .../FeaturedArtworks+Timeline.swift | 29 ---- .../FeaturedArtworks+View.swift | 38 ----- .../FeaturedArtworks+Widget.swift | 22 --- .../FeaturedArtworks/FeaturedArtworks.swift | 3 - 11 files changed, 2 insertions(+), 508 deletions(-) delete mode 100644 ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+Entry.swift delete mode 100644 ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+LargeView.swift delete mode 100644 ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+MediumView.swift delete mode 100644 ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+Provider.swift delete mode 100644 ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+SmallView.swift delete mode 100644 ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+Timeline.swift delete mode 100644 ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+View.swift delete mode 100644 ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+Widget.swift delete mode 100644 ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks.swift diff --git a/ios/Artsy.xcodeproj/project.pbxproj b/ios/Artsy.xcodeproj/project.pbxproj index 20943471be8..4d5dedadd3b 100644 --- a/ios/Artsy.xcodeproj/project.pbxproj +++ b/ios/Artsy.xcodeproj/project.pbxproj @@ -66,15 +66,6 @@ CB43268C27E8FA6B00B29DD6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CB43268B27E8FA6B00B29DD6 /* Assets.xcassets */; }; CB43269227E8FA6B00B29DD6 /* ArtsyWidgetExtension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = CB43268227E8FA6900B29DD6 /* ArtsyWidgetExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; CB4326EF27E8FBEF00B29DD6 /* ArtsyWidgets.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB4326B927E8FAD900B29DD6 /* ArtsyWidgets.swift */; }; - CB4326F027E8FC0200B29DD6 /* FeaturedArtworks+View.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB4326A327E8FAD900B29DD6 /* FeaturedArtworks+View.swift */; }; - CB4326F127E8FC0200B29DD6 /* FeaturedArtworks+Provider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB4326A227E8FAD900B29DD6 /* FeaturedArtworks+Provider.swift */; }; - CB4326F227E8FC0200B29DD6 /* FeaturedArtworks.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB4326A427E8FAD900B29DD6 /* FeaturedArtworks.swift */; }; - CB4326F327E8FC0200B29DD6 /* FeaturedArtworks+Widget.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB4326A127E8FAD900B29DD6 /* FeaturedArtworks+Widget.swift */; }; - CB4326F427E8FC0200B29DD6 /* FeaturedArtworks+Entry.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB43269E27E8FAD900B29DD6 /* FeaturedArtworks+Entry.swift */; }; - CB4326F527E8FC0200B29DD6 /* FeaturedArtworks+SmallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB43269F27E8FAD900B29DD6 /* FeaturedArtworks+SmallView.swift */; }; - CB4326F627E8FC0200B29DD6 /* FeaturedArtworks+Timeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB4326A027E8FAD900B29DD6 /* FeaturedArtworks+Timeline.swift */; }; - CB4326F727E8FC0200B29DD6 /* FeaturedArtworks+LargeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB4326A527E8FAD900B29DD6 /* FeaturedArtworks+LargeView.swift */; }; - CB4326F827E8FC0200B29DD6 /* FeaturedArtworks+MediumView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB4326A627E8FAD900B29DD6 /* FeaturedArtworks+MediumView.swift */; }; CB4326F927E8FC0600B29DD6 /* Fixtures.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB4326AE27E8FAD900B29DD6 /* Fixtures.swift */; }; CB4326FA27E8FC0D00B29DD6 /* FullBleed+Entry.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB43269727E8FAD900B29DD6 /* FullBleed+Entry.swift */; }; CB4326FB27E8FC0D00B29DD6 /* FullBleed+Widget.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB43269C27E8FAD900B29DD6 /* FullBleed+Widget.swift */; }; @@ -505,7 +496,7 @@ CBE327A027E275A400395A93 /* Bidder.m in Sources */ = {isa = PBXBuildFile; fileRef = CBE3266527E275A300395A93 /* Bidder.m */; }; CBE327A127E275A400395A93 /* BidderPosition.m in Sources */ = {isa = PBXBuildFile; fileRef = CBE3266627E275A300395A93 /* BidderPosition.m */; }; CBE327A227E275A400395A93 /* SystemTime.m in Sources */ = {isa = PBXBuildFile; fileRef = CBE3266927E275A300395A93 /* SystemTime.m */; }; - E15070752CCFE89B00615118 /* BuildFile in Sources */ = {isa = PBXBuildFile; }; + E15070752CCFE89B00615118 /* (null) in Sources */ = {isa = PBXBuildFile; }; E15070762CCFE8A900615118 /* ARTLiveAuctionViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = CBE3259A27E275A200395A93 /* ARTLiveAuctionViewManager.m */; }; E15070772CCFE8C400615118 /* LiveAuctionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBE3259B27E275A200395A93 /* LiveAuctionView.swift */; }; E1856EA22C98923B00849C0E /* BootSplash.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E1856EA12C98923B00849C0E /* BootSplash.storyboard */; }; @@ -657,15 +648,6 @@ CB43269A27E8FAD900B29DD6 /* FullBleed.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FullBleed.swift; sourceTree = ""; }; CB43269B27E8FAD900B29DD6 /* FullBleed+View.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "FullBleed+View.swift"; sourceTree = ""; }; CB43269C27E8FAD900B29DD6 /* FullBleed+Widget.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "FullBleed+Widget.swift"; sourceTree = ""; }; - CB43269E27E8FAD900B29DD6 /* FeaturedArtworks+Entry.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "FeaturedArtworks+Entry.swift"; sourceTree = ""; }; - CB43269F27E8FAD900B29DD6 /* FeaturedArtworks+SmallView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "FeaturedArtworks+SmallView.swift"; sourceTree = ""; }; - CB4326A027E8FAD900B29DD6 /* FeaturedArtworks+Timeline.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "FeaturedArtworks+Timeline.swift"; sourceTree = ""; }; - CB4326A127E8FAD900B29DD6 /* FeaturedArtworks+Widget.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "FeaturedArtworks+Widget.swift"; sourceTree = ""; }; - CB4326A227E8FAD900B29DD6 /* FeaturedArtworks+Provider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "FeaturedArtworks+Provider.swift"; sourceTree = ""; }; - CB4326A327E8FAD900B29DD6 /* FeaturedArtworks+View.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "FeaturedArtworks+View.swift"; sourceTree = ""; }; - CB4326A427E8FAD900B29DD6 /* FeaturedArtworks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeaturedArtworks.swift; sourceTree = ""; }; - CB4326A527E8FAD900B29DD6 /* FeaturedArtworks+LargeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "FeaturedArtworks+LargeView.swift"; sourceTree = ""; }; - CB4326A627E8FAD900B29DD6 /* FeaturedArtworks+MediumView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "FeaturedArtworks+MediumView.swift"; sourceTree = ""; }; CB4326A827E8FAD900B29DD6 /* PrimaryText.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrimaryText.swift; sourceTree = ""; }; CB4326A927E8FAD900B29DD6 /* ImageUrl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageUrl.swift; sourceTree = ""; }; CB4326AA27E8FAD900B29DD6 /* Schedule.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Schedule.swift; sourceTree = ""; }; @@ -1677,7 +1659,6 @@ CB4326B927E8FAD900B29DD6 /* ArtsyWidgets.swift */, CB4326AD27E8FAD900B29DD6 /* Assets.xcassets */, CB43268B27E8FA6B00B29DD6 /* Assets.xcassets */, - CB43269D27E8FAD900B29DD6 /* FeaturedArtworks */, CB4326AE27E8FAD900B29DD6 /* Fixtures.swift */, CB43269627E8FAD800B29DD6 /* FullBleed */, CB43268D27E8FA6B00B29DD6 /* Info.plist */, @@ -1701,22 +1682,6 @@ path = FullBleed; sourceTree = ""; }; - CB43269D27E8FAD900B29DD6 /* FeaturedArtworks */ = { - isa = PBXGroup; - children = ( - CB4326A427E8FAD900B29DD6 /* FeaturedArtworks.swift */, - CB43269E27E8FAD900B29DD6 /* FeaturedArtworks+Entry.swift */, - CB4326A527E8FAD900B29DD6 /* FeaturedArtworks+LargeView.swift */, - CB4326A627E8FAD900B29DD6 /* FeaturedArtworks+MediumView.swift */, - CB4326A227E8FAD900B29DD6 /* FeaturedArtworks+Provider.swift */, - CB43269F27E8FAD900B29DD6 /* FeaturedArtworks+SmallView.swift */, - CB4326A027E8FAD900B29DD6 /* FeaturedArtworks+Timeline.swift */, - CB4326A327E8FAD900B29DD6 /* FeaturedArtworks+View.swift */, - CB4326A127E8FAD900B29DD6 /* FeaturedArtworks+Widget.swift */, - ); - path = FeaturedArtworks; - sourceTree = ""; - }; CB4326A727E8FAD900B29DD6 /* Shared */ = { isa = PBXGroup; children = ( @@ -3829,7 +3794,7 @@ files = ( E15070772CCFE8C400615118 /* LiveAuctionView.swift in Sources */, E15070762CCFE8A900615118 /* ARTLiveAuctionViewManager.m in Sources */, - E15070752CCFE89B00615118 /* BuildFile in Sources */, + E15070752CCFE89B00615118 /* (null) in Sources */, 1A4B97C7283CDD5A00878EAE /* ARMapContainerViewController.m in Sources */, CBE3279227E275A400395A93 /* User.m in Sources */, CBE3277927E275A400395A93 /* ArtsyAPI+Notifications.m in Sources */, @@ -4074,16 +4039,13 @@ files = ( CB43271227E8FC1F00B29DD6 /* ArtworkStore.swift in Sources */, CB4326EF27E8FBEF00B29DD6 /* ArtsyWidgets.swift in Sources */, - CB4326F627E8FC0200B29DD6 /* FeaturedArtworks+Timeline.swift in Sources */, CB43271327E8FC2900B29DD6 /* WidgetUrl.swift in Sources */, CB43270327E8FC1600B29DD6 /* LatestArticles+SmallView.swift in Sources */, CB43270827E8FC1600B29DD6 /* LatestArticles+Widget.swift in Sources */, CB43270727E8FC1600B29DD6 /* LatestArticles+Provider.swift in Sources */, - CB4326F827E8FC0200B29DD6 /* FeaturedArtworks+MediumView.swift in Sources */, CB4326FC27E8FC0D00B29DD6 /* FullBleed.swift in Sources */, CB43270127E8FC1600B29DD6 /* LatestArticles+View.swift in Sources */, CB4326FE27E8FC0D00B29DD6 /* FullBleed+Timeline.swift in Sources */, - CB4326F127E8FC0200B29DD6 /* FeaturedArtworks+Provider.swift in Sources */, CB43270C27E8FC1F00B29DD6 /* Artwork.swift in Sources */, CB4326FA27E8FC0D00B29DD6 /* FullBleed+Entry.swift in Sources */, CB43270A27E8FC1F00B29DD6 /* VolleyClient.swift in Sources */, @@ -4093,22 +4055,16 @@ CB43271527E8FC2900B29DD6 /* ImageUrl.swift in Sources */, CB43270027E8FC1600B29DD6 /* LatestArticles+MediumView.swift in Sources */, CB43271427E8FC2900B29DD6 /* SecondaryText.swift in Sources */, - CB4326F227E8FC0200B29DD6 /* FeaturedArtworks.swift in Sources */, CB43270227E8FC1600B29DD6 /* LatestArticles+Timeline.swift in Sources */, - CB4326F427E8FC0200B29DD6 /* FeaturedArtworks+Entry.swift in Sources */, CB43270427E8FC1600B29DD6 /* LatestArticles.swift in Sources */, CB43270927E8FC1F00B29DD6 /* ArticleParser.swift in Sources */, CB43270627E8FC1600B29DD6 /* LatestArticles+LargeView.swift in Sources */, CB4326FF27E8FC0D00B29DD6 /* FullBleed+Provider.swift in Sources */, CB43270527E8FC1600B29DD6 /* LatestArticles+Entry.swift in Sources */, CB43271727E8FC2900B29DD6 /* PrimaryText.swift in Sources */, - CB4326F027E8FC0200B29DD6 /* FeaturedArtworks+View.swift in Sources */, CB4326F927E8FC0600B29DD6 /* Fixtures.swift in Sources */, CB43270D27E8FC1F00B29DD6 /* ArticleStore.swift in Sources */, CB43270E27E8FC1F00B29DD6 /* ArtworkImage.swift in Sources */, - CB4326F527E8FC0200B29DD6 /* FeaturedArtworks+SmallView.swift in Sources */, - CB4326F727E8FC0200B29DD6 /* FeaturedArtworks+LargeView.swift in Sources */, - CB4326F327E8FC0200B29DD6 /* FeaturedArtworks+Widget.swift in Sources */, CB43270F27E8FC1F00B29DD6 /* VolleyMetric.swift in Sources */, CB4326FB27E8FC0D00B29DD6 /* FullBleed+Widget.swift in Sources */, CB43271627E8FC2900B29DD6 /* Schedule.swift in Sources */, diff --git a/ios/ArtsyWidget/ArtsyWidgets.swift b/ios/ArtsyWidget/ArtsyWidgets.swift index 941f09a151d..e50d2ac8f9e 100644 --- a/ios/ArtsyWidget/ArtsyWidgets.swift +++ b/ios/ArtsyWidget/ArtsyWidgets.swift @@ -4,7 +4,6 @@ import SwiftUI @main struct ArtsyWidgets: WidgetBundle { var body: some Widget { - FeaturedArtworks.Widget() FullBleed.Widget() LatestArticles.Widget() } diff --git a/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+Entry.swift b/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+Entry.swift deleted file mode 100644 index dc3fe50610a..00000000000 --- a/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+Entry.swift +++ /dev/null @@ -1,22 +0,0 @@ -import Foundation -import WidgetKit - -extension FeaturedArtworks { - struct Entry: TimelineEntry { - let artworks: [Artwork] - let date: Date - - static func fallback() -> Entry { - let artworks = [ - Fixtures.primaryArtwork, - Fixtures.secondaryArtwork, - Fixtures.tertiaryArtwork, - Fixtures.quaternaryArtwork - ] - let date = Date() - let entry = Entry(artworks: artworks, date: date) - - return entry - } - } -} diff --git a/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+LargeView.swift b/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+LargeView.swift deleted file mode 100644 index 9bd22376bb8..00000000000 --- a/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+LargeView.swift +++ /dev/null @@ -1,134 +0,0 @@ -import SwiftUI -import WidgetKit - -private struct TopArtwork: SwiftUI.View { - let artwork: Artwork - - var body: some SwiftUI.View { - if #available(iOSApplicationExtension 17.0, *) { - actualBody().containerBackground(for: .widget) { - Color.white - } - } else { - actualBody() - } - } - - func actualBody() -> some SwiftUI.View { - let artsyLogo = UIImage(named: "BlackArtsyLogo")! - let artworkImage = artwork.image! - let artistName = artwork.artist.name - let artworkTitle = artwork.title - let artworkUrl = artwork.url - - return HStack(alignment: .bottom) { - Image(uiImage: artworkImage) - .resizable() - .scaledToFit() - .clipped() - VStack(alignment: .trailing) { - Image(uiImage: artsyLogo) - .resizable() - .frame(width: 20, height: 20) - Spacer() - PrimaryText(name: artistName) - .lineLimit(1) - .frame(maxWidth: .infinity, alignment: .leading) - SecondaryText(title: artworkTitle) - .lineLimit(4) - .frame(maxWidth: .infinity, alignment: .leading) - } - } - .padding(16) - .background(Color.white) - .widgetURL(artworkUrl) - } -} - -private struct BottomArtwork: SwiftUI.View { - let artwork: Artwork - - var body: some SwiftUI.View { - let artworkImage = artwork.image! - let artistName = artwork.artist.name - let artworkTitle = artwork.title - let artworkUrl = artwork.url - - Link(destination: artworkUrl) { - VStack() { - Spacer() - Image(uiImage: artworkImage) - .resizable() - .scaledToFit() - VStack() { - PrimaryText(name: artistName) - .lineLimit(1) - .frame(maxWidth: .infinity, alignment: .leading) - SecondaryText(title: artworkTitle) - .lineLimit(2) - .frame(maxWidth: .infinity, alignment: .leading) - Spacer(minLength: 0) - } - .frame(height: 45) - } - } - } -} - -extension FeaturedArtworks { - struct LargeView: SwiftUI.View { - static let supportedFamilies: [WidgetFamily] = [.systemLarge] - - let entry: Entry - - var primaryArtwork: Artwork { - return entry.artworks[0] - } - - var secondaryArtwork: Artwork { - return entry.artworks[1] - } - - var tertiaryArtwork: Artwork { - return entry.artworks[2] - } - - var quaternaryArtwork: Artwork { - return entry.artworks[3] - } - - var body: some SwiftUI.View { - let topFactor: Double = 1 / 2 - let bottomFactor = 1 - topFactor - - GeometryReader { geo in - VStack(spacing: 0) { - TopArtwork(artwork: primaryArtwork) - .frame(height: geo.size.height * CGFloat(topFactor)) - HStack(alignment: .bottom) { - BottomArtwork(artwork: secondaryArtwork) - BottomArtwork(artwork: tertiaryArtwork) - BottomArtwork(artwork: quaternaryArtwork) - } - .padding(16) - .background(Color(white: 0.96)) - .frame(height: geo.size.height * CGFloat(bottomFactor)) - } - } - } - } -} - -struct FeaturedArtworks_LargeView_Previews: PreviewProvider { - static var previews: some SwiftUI.View { - let entry = FeaturedArtworks.Entry.fallback() - let families = FeaturedArtworks.LargeView.supportedFamilies - - Group { - ForEach(families, id: \.self) { family in - FeaturedArtworks.LargeView(entry: entry) - .previewContext(WidgetPreviewContext(family: family)) - } - } - } -} diff --git a/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+MediumView.swift b/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+MediumView.swift deleted file mode 100644 index 01c8f9f12ab..00000000000 --- a/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+MediumView.swift +++ /dev/null @@ -1,129 +0,0 @@ -import SwiftUI -import WidgetKit - -private struct TopArtwork: SwiftUI.View { - let artwork: Artwork - - var body: some SwiftUI.View { - if #available(iOSApplicationExtension 17.0, *) { - actualBody().containerBackground(for: .widget) { - Color.white - } - } else { - actualBody() - } - } - - func actualBody() -> some SwiftUI.View { - let artsyLogo = UIImage(named: "BlackArtsyLogo")! - let artworkImage = artwork.image! - let artistName = artwork.artist.name - let artworkTitle = artwork.title - let artworkUrl = artwork.url - - return HStack(alignment: .bottom) { - Image(uiImage: artworkImage) - .resizable() - .scaledToFit() - .padding(.trailing, 10) - VStack() { - HStack() { - Spacer() - Image(uiImage: artsyLogo) - .resizable() - .frame(width: 20, height: 20) - } - Spacer() - PrimaryText(name: artistName) - .lineLimit(1) - .frame(maxWidth: .infinity, alignment: .leading) - SecondaryText(title: artworkTitle) - .lineLimit(3) - .frame(maxWidth: .infinity, alignment: .leading) - } - } - .padding(16) - .background(Color.white) - .widgetURL(artworkUrl) - } -} - -private struct BottomArtwork: SwiftUI.View { - let artwork: Artwork - - var body: some SwiftUI.View { - let artworkImage = artwork.image! - let artistName = artwork.artist.name - let artworkTitle = artwork.title - let artworkUrl = artwork.url - - Link(destination: artworkUrl) { - HStack(alignment: .top) { - Image(uiImage: artworkImage) - .resizable() - .scaledToFit() - VStack() { - PrimaryText(name: artistName) - .lineLimit(1) - .frame(maxWidth: .infinity, alignment: .leading) - SecondaryText(title: artworkTitle) - .lineLimit(3) - .frame(maxWidth: .infinity, alignment: .leading) - } - } - } - } -} - -extension FeaturedArtworks { - struct MediumView: SwiftUI.View { - static let supportedFamilies: [WidgetFamily] = [.systemMedium] - - let entry: Entry - - var primaryArtwork: Artwork { - return entry.artworks[0] - } - - var secondaryArtwork: Artwork { - return entry.artworks[1] - } - - var tertiaryArtwork: Artwork { - return entry.artworks[2] - } - - var body: some SwiftUI.View { - let topFactor: Double = 11 / 20 - let bottomFactor = 1 - topFactor - - GeometryReader { geo in - VStack(spacing: 0) { - TopArtwork(artwork: primaryArtwork) - .frame(height: geo.size.height * CGFloat(topFactor)) - HStack() { - BottomArtwork(artwork: secondaryArtwork) - BottomArtwork(artwork: tertiaryArtwork) - } - .padding(16) - .background(Color(white: 0.96)) - .frame(height: geo.size.height * CGFloat(bottomFactor)) - } - } - } - } -} - -struct FeaturedArtworks_MediumView_Previews: PreviewProvider { - static var previews: some SwiftUI.View { - let entry = FeaturedArtworks.Entry.fallback() - let families = FeaturedArtworks.MediumView.supportedFamilies - - Group { - ForEach(families, id: \.self) { family in - FeaturedArtworks.MediumView(entry: entry) - .previewContext(WidgetPreviewContext(family: family)) - } - } - } -} diff --git a/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+Provider.swift b/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+Provider.swift deleted file mode 100644 index a71dd75ac40..00000000000 --- a/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+Provider.swift +++ /dev/null @@ -1,20 +0,0 @@ -import Foundation -import WidgetKit - -extension FeaturedArtworks { - struct Provider: TimelineProvider { - func placeholder(in context: Context) -> Entry { - Entry.fallback() - } - - func getSnapshot(in context: Context, completion: @escaping (Entry) -> ()) { - let entry = Entry.fallback() - completion(entry) - } - - func getTimeline(in context: Context, completion: @escaping (WidgetKit.Timeline) -> ()) { - VolleyClient.reportGetTimeline(kind: FeaturedArtworks.Widget.kind, family: context.family) - Timeline.generate(context: context, completion: completion) - } - } -} diff --git a/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+SmallView.swift b/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+SmallView.swift deleted file mode 100644 index eaeb302e7d0..00000000000 --- a/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+SmallView.swift +++ /dev/null @@ -1,64 +0,0 @@ -import SwiftUI -import WidgetKit - -extension FeaturedArtworks { - struct SmallView: SwiftUI.View { - static let supportedFamilies: [WidgetFamily] = [.systemSmall] - - let entry: Entry - - var artwork: Artwork { - return entry.artworks.first! - } - - var body: some SwiftUI.View { - if #available(iOSApplicationExtension 17.0, *) { - actualBody().containerBackground(for: .widget) { - Color.white - } - } else { - actualBody() - } - } - - func actualBody() -> some SwiftUI.View { - let artsyLogo = UIImage(named: "BlackArtsyLogo")! - let artworkImage = artwork.image! - let artistName = artwork.artist.name - let artworkUrl = artwork.url - - return VStack() { - HStack(alignment: .top) { - Image(uiImage: artworkImage) - .resizable() - .scaledToFit() - Spacer() - Image(uiImage: artsyLogo) - .resizable() - .frame(width: 20, height: 20) - } - Spacer() - PrimaryText(name: artistName) - .lineLimit(1) - .frame(maxWidth: .infinity, alignment: .leading) - } - .padding(16) - .widgetURL(artworkUrl) - .background(Color.white) - } - } -} - -struct FeaturedArtworks_SmallView_Previews: PreviewProvider { - static var previews: some SwiftUI.View { - let entry = FeaturedArtworks.Entry.fallback() - let families = FeaturedArtworks.SmallView.supportedFamilies - - Group { - ForEach(families, id: \.self) { family in - FeaturedArtworks.SmallView(entry: entry) - .previewContext(WidgetPreviewContext(family: family)) - } - } - } -} diff --git a/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+Timeline.swift b/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+Timeline.swift deleted file mode 100644 index 34f8170f474..00000000000 --- a/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+Timeline.swift +++ /dev/null @@ -1,29 +0,0 @@ -import WidgetKit - -extension FeaturedArtworks { - struct Timeline { - static func rotateArtworks(artworks: [Artwork]) -> [[Artwork]] { - let initialLineup = artworks - - let nextLineups: [[Artwork]] = [0, 1, 2, 3].map() { offset in - let trailing = Array(initialLineup.suffix(4 - offset)) - let leading = Array(initialLineup.prefix(offset)) - - return trailing + leading - } - - return nextLineups - } - - static func generate(context: TimelineProviderContext, completion: @escaping (WidgetKit.Timeline) -> ()) { - ArtworkStore.fetch(context: context) { artworks in - let schedule = Schedule() - let rotatedArtworks = Timeline.rotateArtworks(artworks: artworks) - let updateTimesToArtworks = Array(zip(schedule.updateTimes, rotatedArtworks)) - let entries = updateTimesToArtworks.map() { (date, artworks) in Entry(artworks: artworks, date: date) } - let timeline = WidgetKit.Timeline(entries: entries, policy: .after(schedule.nextUpdate)) - completion(timeline) - } - } - } -} diff --git a/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+View.swift b/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+View.swift deleted file mode 100644 index 31988ccac38..00000000000 --- a/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+View.swift +++ /dev/null @@ -1,38 +0,0 @@ -import Foundation -import SwiftUI -import WidgetKit - -extension FeaturedArtworks { - struct View: SwiftUI.View { - static let supportedFamilies: [WidgetFamily] = [.systemSmall, .systemMedium, .systemLarge] - - @Environment(\.widgetFamily) var family: WidgetFamily - - let entry: Entry - - var body: some SwiftUI.View { - switch family { - case .systemMedium: - FeaturedArtworks.MediumView(entry: entry) - case .systemLarge: - FeaturedArtworks.LargeView(entry: entry) - default: - FeaturedArtworks.SmallView(entry: entry) - } - } - } -} - -struct FeaturedArtworks_View_Previews: PreviewProvider { - static var previews: some SwiftUI.View { - let entry = FeaturedArtworks.Entry.fallback() - let families = FeaturedArtworks.View.supportedFamilies - - Group { - ForEach(families, id: \.self) { family in - FeaturedArtworks.View(entry: entry) - .previewContext(WidgetPreviewContext(family: family)) - } - } - } -} diff --git a/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+Widget.swift b/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+Widget.swift deleted file mode 100644 index e4360cd9fad..00000000000 --- a/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks+Widget.swift +++ /dev/null @@ -1,22 +0,0 @@ -import Foundation -import SwiftUI -import WidgetKit - -extension FeaturedArtworks { - struct Widget: SwiftUI.Widget { - static let description: String = "A curated selection of newly uploaded works from galleries, fairs, and auctions." - static let displayName: String = "New This Week" - static let kind: String = "FeaturedArtworksWidget" - - var body: some WidgetConfiguration { - StaticConfiguration(kind: Widget.kind, provider: Provider()) { entry in - View(entry: entry) - } - .configurationDisplayName(Widget.displayName) - .containerBackgroundRemovable(false) - .contentMarginsDisabled() - .description(Widget.description) - .supportedFamilies(View.supportedFamilies) - } - } -} diff --git a/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks.swift b/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks.swift deleted file mode 100644 index 7b84a18d20c..00000000000 --- a/ios/ArtsyWidget/FeaturedArtworks/FeaturedArtworks.swift +++ /dev/null @@ -1,3 +0,0 @@ -import Foundation - -enum FeaturedArtworks {} From 2433388fb9c5750693dac7ff2d35774f46e327e5 Mon Sep 17 00:00:00 2001 From: Jon Allured Date: Fri, 24 Jan 2025 14:40:02 -0600 Subject: [PATCH 2/9] Switch to previewing full widget code --- .../FullBleed/FullBleed+View.swift | 21 ++++++------------- .../LatestArticles/LatestArticles+View.swift | 19 ++++++----------- 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/ios/ArtsyWidget/FullBleed/FullBleed+View.swift b/ios/ArtsyWidget/FullBleed/FullBleed+View.swift index 755490fa309..a976aae180d 100644 --- a/ios/ArtsyWidget/FullBleed/FullBleed+View.swift +++ b/ios/ArtsyWidget/FullBleed/FullBleed+View.swift @@ -61,20 +61,11 @@ extension FullBleed { } } } - - } -struct FullBleed_View_Previews: PreviewProvider { - static var previews: some SwiftUI.View { - let entry = FullBleed.Entry.fallback() - let families = FullBleed.View.supportedFamilies - - Group { - ForEach(families, id: \.self) { family in - FullBleed.View(entry: entry) - .previewContext(WidgetPreviewContext(family: family)) - } - } - } -} +@available(iOSApplicationExtension 17.0, *) +#Preview(as: .systemLarge, widget: { + FullBleed.Widget() +}, timeline: { + FullBleed.Entry.fallback() +}) diff --git a/ios/ArtsyWidget/LatestArticles/LatestArticles+View.swift b/ios/ArtsyWidget/LatestArticles/LatestArticles+View.swift index cdc97450c5d..3ea65527168 100644 --- a/ios/ArtsyWidget/LatestArticles/LatestArticles+View.swift +++ b/ios/ArtsyWidget/LatestArticles/LatestArticles+View.swift @@ -26,16 +26,9 @@ extension LatestArticles { } } -struct LatestArticlesWidgetView_Previews: PreviewProvider { - static var previews: some View { - let entry = LatestArticles.Entry.fallback() - let families = LatestArticles.View.supportedFamilies - - Group { - ForEach(families, id: \.self) { family in - LatestArticles.View(entry: entry) - .previewContext(WidgetPreviewContext(family: family)) - } - } - } -} +@available(iOSApplicationExtension 17.0, *) +#Preview(as: .systemSmall, widget: { + LatestArticles.Widget() +}, timeline: { + LatestArticles.Entry.fallback() +}) From 60a221678706d9583ac90032b76b5d30b23f5236 Mon Sep 17 00:00:00 2001 From: Jon Allured Date: Fri, 24 Jan 2025 14:48:44 -0600 Subject: [PATCH 3/9] Relocate required background modifier --- .../FullBleed/FullBleed+View.swift | 14 ++-------- .../FullBleed/FullBleed+Widget.swift | 6 ++++- .../LatestArticles+LargeView.swift | 27 +------------------ .../LatestArticles+MediumView.swift | 27 +------------------ .../LatestArticles+SmallView.swift | 26 +----------------- .../LatestArticles+Widget.swift | 6 ++++- 6 files changed, 15 insertions(+), 91 deletions(-) diff --git a/ios/ArtsyWidget/FullBleed/FullBleed+View.swift b/ios/ArtsyWidget/FullBleed/FullBleed+View.swift index a976aae180d..b8f56ca7267 100644 --- a/ios/ArtsyWidget/FullBleed/FullBleed+View.swift +++ b/ios/ArtsyWidget/FullBleed/FullBleed+View.swift @@ -15,23 +15,13 @@ extension FullBleed { } var body: some SwiftUI.View { - if #available(iOSApplicationExtension 17.0, *) { - actualBody().containerBackground(for: .widget) { - Color.white - } - } else { - actualBody() - } - } - - func actualBody() -> some SwiftUI.View { let artsyLogo = UIImage(named: "WhiteArtsyLogo")! let artworkImage = artwork.image! let artistName = artwork.artist.name let artworkTitle = artwork.title let artworkUrl = artwork.url - return GeometryReader { geo in + GeometryReader { geo in ZStack() { Image(uiImage: artworkImage) .resizable() @@ -56,9 +46,9 @@ extension FullBleed { .padding(16) .background(Color.black) } - .widgetURL(artworkUrl) } } + .widgetURL(artworkUrl) } } } diff --git a/ios/ArtsyWidget/FullBleed/FullBleed+Widget.swift b/ios/ArtsyWidget/FullBleed/FullBleed+Widget.swift index c6533ff78e7..94022fe8f7a 100644 --- a/ios/ArtsyWidget/FullBleed/FullBleed+Widget.swift +++ b/ios/ArtsyWidget/FullBleed/FullBleed+Widget.swift @@ -10,7 +10,11 @@ extension FullBleed { var body: some WidgetConfiguration { StaticConfiguration(kind: Widget.kind, provider: Provider()) { entry in - View(entry: entry) + if #available(iOSApplicationExtension 17.0, *) { + View(entry: entry).containerBackground(Color.white, for: .widget) + } else { + View(entry: entry).background(Color.white) + } } .configurationDisplayName(Widget.displayName) .containerBackgroundRemovable(false) diff --git a/ios/ArtsyWidget/LatestArticles/LatestArticles+LargeView.swift b/ios/ArtsyWidget/LatestArticles/LatestArticles+LargeView.swift index 0c833466635..a25aea72873 100644 --- a/ios/ArtsyWidget/LatestArticles/LatestArticles+LargeView.swift +++ b/ios/ArtsyWidget/LatestArticles/LatestArticles+LargeView.swift @@ -8,21 +8,11 @@ extension LatestArticles { let entry: Entry var body: some SwiftUI.View { - if #available(iOSApplicationExtension 17.0, *) { - actualBody().containerBackground(for: .widget) { - Color.white - } - } else { - actualBody() - } - } - - func actualBody() -> some SwiftUI.View { let artsyLogo = UIImage(named: "BlackArtsyLogo")! let articles = entry.articles let artsyUrl = WidgetUrl.from(link: "https://www.artsy.net")! - return VStack() { + VStack() { HStack(alignment: .center) { Link(destination: artsyUrl) { Text("LATEST ARTICLES") @@ -57,21 +47,6 @@ extension LatestArticles { } } .padding(16) - .background(Color.white) - } - } -} - -struct LatestArticles_LargeView_Previews: PreviewProvider { - static var previews: some View { - let entry = LatestArticles.Entry.fallback() - let families = LatestArticles.LargeView.supportedFamilies - - Group { - ForEach(families, id: \.self) { family in - LatestArticles.LargeView(entry: entry) - .previewContext(WidgetPreviewContext(family: family)) - } } } } diff --git a/ios/ArtsyWidget/LatestArticles/LatestArticles+MediumView.swift b/ios/ArtsyWidget/LatestArticles/LatestArticles+MediumView.swift index a618be9a9d0..3272d352b0b 100644 --- a/ios/ArtsyWidget/LatestArticles/LatestArticles+MediumView.swift +++ b/ios/ArtsyWidget/LatestArticles/LatestArticles+MediumView.swift @@ -8,21 +8,11 @@ extension LatestArticles { let entry: Entry var body: some SwiftUI.View { - if #available(iOSApplicationExtension 17.0, *) { - actualBody().containerBackground(for: .widget) { - Color.white - } - } else { - actualBody() - } - } - - func actualBody() -> some SwiftUI.View { let artsyLogo = UIImage(named: "BlackArtsyLogo")! let articles = entry.articles[0...1] let artsyUrl = WidgetUrl.from(link: "https://www.artsy.net")! - return VStack() { + VStack() { HStack(alignment: .center) { Link(destination: artsyUrl) { Text("LATEST ARTICLES") @@ -57,21 +47,6 @@ extension LatestArticles { } } .padding(16) - .background(Color.white) - } - } -} - -struct LatestArticles_MediumView_Previews: PreviewProvider { - static var previews: some View { - let entry = LatestArticles.Entry.fallback() - let families = LatestArticles.MediumView.supportedFamilies - - Group { - ForEach(families, id: \.self) { family in - LatestArticles.MediumView(entry: entry) - .previewContext(WidgetPreviewContext(family: family)) - } } } } diff --git a/ios/ArtsyWidget/LatestArticles/LatestArticles+SmallView.swift b/ios/ArtsyWidget/LatestArticles/LatestArticles+SmallView.swift index ef6d5e6b471..eacbab713c5 100644 --- a/ios/ArtsyWidget/LatestArticles/LatestArticles+SmallView.swift +++ b/ios/ArtsyWidget/LatestArticles/LatestArticles+SmallView.swift @@ -12,22 +12,12 @@ extension LatestArticles { } var body: some SwiftUI.View { - if #available(iOSApplicationExtension 17.0, *) { - actualBody().containerBackground(for: .widget) { - Color.white - } - } else { - actualBody() - } - } - - func actualBody() -> some SwiftUI.View { let artsyLogo = UIImage(named: "WhiteArtsyLogo")! let articleImage = article.image! let articleTitle = article.title let articleUrl = article.url! - return GeometryReader { geo in + GeometryReader { geo in ZStack() { Image(uiImage: articleImage) .resizable() @@ -55,17 +45,3 @@ extension LatestArticles { } } } - -struct LatestArticles_SmallView_Previews: PreviewProvider { - static var previews: some View { - let entry = LatestArticles.Entry.fallback() - let families = LatestArticles.SmallView.supportedFamilies - - Group { - ForEach(families, id: \.self) { family in - LatestArticles.SmallView(entry: entry) - .previewContext(WidgetPreviewContext(family: family)) - } - } - } -} diff --git a/ios/ArtsyWidget/LatestArticles/LatestArticles+Widget.swift b/ios/ArtsyWidget/LatestArticles/LatestArticles+Widget.swift index 5bd2f556300..37f9ff42e67 100644 --- a/ios/ArtsyWidget/LatestArticles/LatestArticles+Widget.swift +++ b/ios/ArtsyWidget/LatestArticles/LatestArticles+Widget.swift @@ -10,7 +10,11 @@ extension LatestArticles { var body: some WidgetConfiguration { StaticConfiguration(kind: Widget.kind, provider: Provider()) { entry in - View(entry: entry) + if #available(iOSApplicationExtension 17.0, *) { + View(entry: entry).containerBackground(Color.white, for: .widget) + } else { + View(entry: entry).background(Color.white) + } } .configurationDisplayName(Widget.displayName) .containerBackgroundRemovable(false) From d5313760939dd7e04c0ae22e212d46efb5d036aa Mon Sep 17 00:00:00 2001 From: Jon Allured Date: Fri, 24 Jan 2025 14:52:54 -0600 Subject: [PATCH 4/9] Simplify widget lineup --- ios/Artsy.xcodeproj/project.pbxproj | 4 -- .../FullBleed/FullBleed+View.swift | 9 +++- .../LatestArticles+LargeView.swift | 52 ------------------- .../LatestArticles/LatestArticles+View.swift | 13 +++-- 4 files changed, 18 insertions(+), 60 deletions(-) delete mode 100644 ios/ArtsyWidget/LatestArticles/LatestArticles+LargeView.swift diff --git a/ios/Artsy.xcodeproj/project.pbxproj b/ios/Artsy.xcodeproj/project.pbxproj index 4d5dedadd3b..d3afa084444 100644 --- a/ios/Artsy.xcodeproj/project.pbxproj +++ b/ios/Artsy.xcodeproj/project.pbxproj @@ -79,7 +79,6 @@ CB43270327E8FC1600B29DD6 /* LatestArticles+SmallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB4326B727E8FAD900B29DD6 /* LatestArticles+SmallView.swift */; }; CB43270427E8FC1600B29DD6 /* LatestArticles.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB4326B827E8FAD900B29DD6 /* LatestArticles.swift */; }; CB43270527E8FC1600B29DD6 /* LatestArticles+Entry.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB4326B127E8FAD900B29DD6 /* LatestArticles+Entry.swift */; }; - CB43270627E8FC1600B29DD6 /* LatestArticles+LargeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB4326B527E8FAD900B29DD6 /* LatestArticles+LargeView.swift */; }; CB43270727E8FC1600B29DD6 /* LatestArticles+Provider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB4326B627E8FAD900B29DD6 /* LatestArticles+Provider.swift */; }; CB43270827E8FC1600B29DD6 /* LatestArticles+Widget.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB4326B227E8FAD900B29DD6 /* LatestArticles+Widget.swift */; }; CB43270927E8FC1F00B29DD6 /* ArticleParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB4326C427E8FAD900B29DD6 /* ArticleParser.swift */; }; @@ -660,7 +659,6 @@ CB4326B227E8FAD900B29DD6 /* LatestArticles+Widget.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LatestArticles+Widget.swift"; sourceTree = ""; }; CB4326B327E8FAD900B29DD6 /* LatestArticles+MediumView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LatestArticles+MediumView.swift"; sourceTree = ""; }; CB4326B427E8FAD900B29DD6 /* LatestArticles+Timeline.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LatestArticles+Timeline.swift"; sourceTree = ""; }; - CB4326B527E8FAD900B29DD6 /* LatestArticles+LargeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LatestArticles+LargeView.swift"; sourceTree = ""; }; CB4326B627E8FAD900B29DD6 /* LatestArticles+Provider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LatestArticles+Provider.swift"; sourceTree = ""; }; CB4326B727E8FAD900B29DD6 /* LatestArticles+SmallView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "LatestArticles+SmallView.swift"; sourceTree = ""; }; CB4326B827E8FAD900B29DD6 /* LatestArticles.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LatestArticles.swift; sourceTree = ""; }; @@ -1699,7 +1697,6 @@ children = ( CB4326B827E8FAD900B29DD6 /* LatestArticles.swift */, CB4326B127E8FAD900B29DD6 /* LatestArticles+Entry.swift */, - CB4326B527E8FAD900B29DD6 /* LatestArticles+LargeView.swift */, CB4326B327E8FAD900B29DD6 /* LatestArticles+MediumView.swift */, CB4326B627E8FAD900B29DD6 /* LatestArticles+Provider.swift */, CB4326B727E8FAD900B29DD6 /* LatestArticles+SmallView.swift */, @@ -4058,7 +4055,6 @@ CB43270227E8FC1600B29DD6 /* LatestArticles+Timeline.swift in Sources */, CB43270427E8FC1600B29DD6 /* LatestArticles.swift in Sources */, CB43270927E8FC1F00B29DD6 /* ArticleParser.swift in Sources */, - CB43270627E8FC1600B29DD6 /* LatestArticles+LargeView.swift in Sources */, CB4326FF27E8FC0D00B29DD6 /* FullBleed+Provider.swift in Sources */, CB43270527E8FC1600B29DD6 /* LatestArticles+Entry.swift in Sources */, CB43271727E8FC2900B29DD6 /* PrimaryText.swift in Sources */, diff --git a/ios/ArtsyWidget/FullBleed/FullBleed+View.swift b/ios/ArtsyWidget/FullBleed/FullBleed+View.swift index b8f56ca7267..014d520528d 100644 --- a/ios/ArtsyWidget/FullBleed/FullBleed+View.swift +++ b/ios/ArtsyWidget/FullBleed/FullBleed+View.swift @@ -5,7 +5,7 @@ import WidgetKit extension FullBleed { struct View: SwiftUI.View { static var supportedFamilies: [WidgetFamily] { - return [.systemLarge, .systemExtraLarge] + return [.systemSmall, .systemLarge] } let entry: Entry @@ -53,6 +53,13 @@ extension FullBleed { } } +@available(iOSApplicationExtension 17.0, *) +#Preview(as: .systemSmall, widget: { + FullBleed.Widget() +}, timeline: { + FullBleed.Entry.fallback() +}) + @available(iOSApplicationExtension 17.0, *) #Preview(as: .systemLarge, widget: { FullBleed.Widget() diff --git a/ios/ArtsyWidget/LatestArticles/LatestArticles+LargeView.swift b/ios/ArtsyWidget/LatestArticles/LatestArticles+LargeView.swift deleted file mode 100644 index a25aea72873..00000000000 --- a/ios/ArtsyWidget/LatestArticles/LatestArticles+LargeView.swift +++ /dev/null @@ -1,52 +0,0 @@ -import SwiftUI -import WidgetKit - -extension LatestArticles { - struct LargeView: SwiftUI.View { - static let supportedFamilies: [WidgetFamily] = [.systemLarge] - - let entry: Entry - - var body: some SwiftUI.View { - let artsyLogo = UIImage(named: "BlackArtsyLogo")! - let articles = entry.articles - let artsyUrl = WidgetUrl.from(link: "https://www.artsy.net")! - - VStack() { - HStack(alignment: .center) { - Link(destination: artsyUrl) { - Text("LATEST ARTICLES") - .foregroundColor(.black) - .font(.system(size: 14, weight: .medium)) - Spacer() - Image(uiImage: artsyLogo) - .resizable() - .frame(width: 20, height: 20) - } - } - Spacer() - VStack() { - ForEach(articles, id: \.url) { article in - Link(destination: article.url!) { - HStack(alignment: .center) { - Image(uiImage: article.image!) - .resizable() - .scaledToFill() - .frame(width: 64, height: 64, alignment: .top) - .clipped() - VStack() { - PrimaryText(name: article.title) - .lineLimit(3) - .frame(maxWidth: .infinity, alignment: .leading) - SecondaryText(title: article.pubDate) - .frame(maxWidth: .infinity, alignment: .leading) - } - } - } - } - } - } - .padding(16) - } - } -} diff --git a/ios/ArtsyWidget/LatestArticles/LatestArticles+View.swift b/ios/ArtsyWidget/LatestArticles/LatestArticles+View.swift index 3ea65527168..6c437b91ec6 100644 --- a/ios/ArtsyWidget/LatestArticles/LatestArticles+View.swift +++ b/ios/ArtsyWidget/LatestArticles/LatestArticles+View.swift @@ -3,7 +3,9 @@ import WidgetKit extension LatestArticles { struct View: SwiftUI.View { - static let supportedFamilies: [WidgetFamily] = [.systemSmall, .systemMedium, .systemLarge] + static var supportedFamilies: [WidgetFamily] { + return [.systemSmall, .systemMedium] + } @Environment(\.widgetFamily) var family: WidgetFamily @@ -17,8 +19,6 @@ extension LatestArticles { switch family { case .systemMedium: LatestArticles.MediumView(entry: entry) - case .systemLarge: - LatestArticles.LargeView(entry: entry) default: LatestArticles.SmallView(entry: entry) } @@ -32,3 +32,10 @@ extension LatestArticles { }, timeline: { LatestArticles.Entry.fallback() }) + +@available(iOSApplicationExtension 17.0, *) +#Preview(as: .systemMedium, widget: { + LatestArticles.Widget() +}, timeline: { + LatestArticles.Entry.fallback() +}) From 0d7de5eed2330ac0953b8c294374b31cc7f40bef Mon Sep 17 00:00:00 2001 From: Jon Allured Date: Mon, 27 Jan 2025 09:12:25 -0600 Subject: [PATCH 5/9] Match text-based editorial widget design --- ios/ArtsyWidget/Assets.xcassets/Contents.json | 6 +- .../Contents.json | 23 ----- .../PrimaryArticleImage.imageset/larger-1.jpg | Bin 312710 -> 0 bytes .../PrimaryArticleImage.imageset/larger-2.jpg | Bin 312710 -> 0 bytes .../PrimaryArticleImage.imageset/larger-3.jpg | Bin 312710 -> 0 bytes .../Contents.json | 23 ----- .../larger-3.jpg | Bin 111990 -> 0 bytes .../larger-4.jpg | Bin 111990 -> 0 bytes .../larger-5.jpg | Bin 111990 -> 0 bytes .../Contents.json | 23 ----- ...YMuMETC0VYbgsJR4g_New+Collector+copy-1.jpg | Bin 52939 -> 0 bytes ...YMuMETC0VYbgsJR4g_New+Collector+copy-2.jpg | Bin 52939 -> 0 bytes ...T0YMuMETC0VYbgsJR4g_New+Collector+copy.jpg | Bin 52939 -> 0 bytes .../Contents.json | 23 ----- .../larger-2.jpg | Bin 269276 -> 0 bytes .../larger-3.jpg | Bin 269276 -> 0 bytes .../larger-4.jpg | Bin 269276 -> 0 bytes ios/ArtsyWidget/Fixtures.swift | 8 -- .../LatestArticles+MediumView.swift | 79 ++++++++++++------ .../LatestArticles+SmallView.swift | 77 +++++++++++------ .../LatestArticles+Widget.swift | 4 +- ios/ArtsyWidget/Models/Article.swift | 8 +- ios/ArtsyWidget/Models/ArticleParser.swift | 3 - ios/ArtsyWidget/Models/ArticleStore.swift | 35 +------- 24 files changed, 113 insertions(+), 199 deletions(-) delete mode 100644 ios/ArtsyWidget/Assets.xcassets/PrimaryArticleImage.imageset/Contents.json delete mode 100644 ios/ArtsyWidget/Assets.xcassets/PrimaryArticleImage.imageset/larger-1.jpg delete mode 100644 ios/ArtsyWidget/Assets.xcassets/PrimaryArticleImage.imageset/larger-2.jpg delete mode 100644 ios/ArtsyWidget/Assets.xcassets/PrimaryArticleImage.imageset/larger-3.jpg delete mode 100644 ios/ArtsyWidget/Assets.xcassets/QuaternaryArticleImage.imageset/Contents.json delete mode 100644 ios/ArtsyWidget/Assets.xcassets/QuaternaryArticleImage.imageset/larger-3.jpg delete mode 100644 ios/ArtsyWidget/Assets.xcassets/QuaternaryArticleImage.imageset/larger-4.jpg delete mode 100644 ios/ArtsyWidget/Assets.xcassets/QuaternaryArticleImage.imageset/larger-5.jpg delete mode 100644 ios/ArtsyWidget/Assets.xcassets/SecondaryArticleImage.imageset/Contents.json delete mode 100644 ios/ArtsyWidget/Assets.xcassets/SecondaryArticleImage.imageset/LlvT0YMuMETC0VYbgsJR4g_New+Collector+copy-1.jpg delete mode 100644 ios/ArtsyWidget/Assets.xcassets/SecondaryArticleImage.imageset/LlvT0YMuMETC0VYbgsJR4g_New+Collector+copy-2.jpg delete mode 100644 ios/ArtsyWidget/Assets.xcassets/SecondaryArticleImage.imageset/LlvT0YMuMETC0VYbgsJR4g_New+Collector+copy.jpg delete mode 100644 ios/ArtsyWidget/Assets.xcassets/TertiaryArticleImage.imageset/Contents.json delete mode 100644 ios/ArtsyWidget/Assets.xcassets/TertiaryArticleImage.imageset/larger-2.jpg delete mode 100644 ios/ArtsyWidget/Assets.xcassets/TertiaryArticleImage.imageset/larger-3.jpg delete mode 100644 ios/ArtsyWidget/Assets.xcassets/TertiaryArticleImage.imageset/larger-4.jpg diff --git a/ios/ArtsyWidget/Assets.xcassets/Contents.json b/ios/ArtsyWidget/Assets.xcassets/Contents.json index 74d6a722cf3..73c00596a7f 100644 --- a/ios/ArtsyWidget/Assets.xcassets/Contents.json +++ b/ios/ArtsyWidget/Assets.xcassets/Contents.json @@ -1,6 +1,6 @@ { - "info": { - "author": "xcode", - "version": 1 + "info" : { + "author" : "xcode", + "version" : 1 } } diff --git a/ios/ArtsyWidget/Assets.xcassets/PrimaryArticleImage.imageset/Contents.json b/ios/ArtsyWidget/Assets.xcassets/PrimaryArticleImage.imageset/Contents.json deleted file mode 100644 index 40ce741ef6a..00000000000 --- a/ios/ArtsyWidget/Assets.xcassets/PrimaryArticleImage.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images": [ - { - "filename": "larger-3.jpg", - "idiom": "universal", - "scale": "1x" - }, - { - "filename": "larger-1.jpg", - "idiom": "universal", - "scale": "2x" - }, - { - "filename": "larger-2.jpg", - "idiom": "universal", - "scale": "3x" - } - ], - "info": { - "author": "xcode", - "version": 1 - } -} diff --git a/ios/ArtsyWidget/Assets.xcassets/PrimaryArticleImage.imageset/larger-1.jpg b/ios/ArtsyWidget/Assets.xcassets/PrimaryArticleImage.imageset/larger-1.jpg deleted file mode 100644 index 17c1e671496d5b6cd61c1c92c814a1044fbc0df6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 312710 zcmb5V2{@GB`#=6*#xiz>>;_{^wn9)DUV~C@n1=3kyV;ikcmufj~uQ73nz8X7u))q8`Dq8w_xz*YCK*E;jZ|a-TSj z_1uIZ#Vu~emGSUOo>4w~PRrcu0Y0HmLP|vyV`c6AFf_5eazI*JSMRce5Q&ptQx>paQ(@MG#$$kXhc+%KR8f}nELpoagZBd8(-3M$C}7F)9eR5a8O8YnFd zEe#Y3rD6xg*=a-|9ExbDnLRD2-3F&p?CW=p@QXckVyCf_n_M?Nk>>cgGA)O!@?LuG zGhXp0#I>Jfe^%D92q8*1R`hvKZBc#!Of-Mh#15cI70%s|)e8^t&$xdB(bv z$bnXx!4sNPdl0W{FU;U$?XFj05bY*df)zDJY-Dh;*f)t@2gKFJ?K z6zksDU4&{u!upBumtSraK%u3YKZ)>0Xv1v+Ix~#}*35Xum0-qZZ2Jh2uPMBQImyWR zk}M5%xG83VFE&eJjzDW&e>sfg%B;eBV~{kb?S_#Y2&a7{oO@VdY!*?3Y?vWjZex3d zg!6PdXQ5fFzJB_QHq;JQL&6QyZeygVU6l`zY$=*Oh&N2hq;VuZ?)%tAKaz_c2p>h{ zeSGnqph-{bEe(ltJ97tpVM3o&0A-^E2f`zjh-6Db&7mOpqTqfa7nTuh*JS`vk`J#7D10>q8N3AF{Ra{M0Nth*xGf_A`WZg%gc3I;$TcHi+zsx_=LSUhOvh~A^1!eRR*YE#j~hhh6LWIKz*p0$aiIo z$lYQCG=kO78_!hctc_1C_sBxiI6=m}@$3f=?)Add<7?2?G40AHFk)X8AXt6V_v+pnncCmvBjLd>2UprdgrJu+)E=9_lBA9AIo@AkIzDtf^ zkos+<7#YAg92&dr1krt$8xSwyUo@h>7*CKb(ZB$s{7 zjle}n*xuVVMC@8@0p=w8ed8QNW(Bi1Mv9iX0&_AL!P@Z~Bh}&m@eTpw-+3MJw4otI zvU|gl!1`bk@rFL~dJEzWL%2^IBY&2w6P6*xAq#zj{-eA!ROz6%4IB|7S?KZ!V_(Di&hQ``_R7TN5aC&jD%+~vOzX;YZ&o{^UuPe&k63;;DZjwAw;1F zF{2#|(@x(2E2np_Ekrv|yK*oh@we(WF-Xj_5hNFag9Z!RrIA)6a!feQW}%I3yK2x{ zZ9(UV?DeztXYlWyC95UiooF2#@n7s3M~GZyA13&TY|hkTgDr@>D_(9`7_lO@4e|QJ zxep9bulyK4M|?0e*Hs*m<;Z@Zmr20V*p0P8l~$j|(L2;!zezBirvYyJV5Hs5kh~#y z{Au53i%`4kj{qc>9eeUH5zdS_Du4#~bt!pcWcKFl5jm|6uQ4)AAKTH_S|7+gz(_+z zYTBTe!|`V@i2GqGn3Dh?UYURolbAvCA>k)@Vmh((A~i>CP{BS=P`QaV3Lt|v8?5R< z6iJ9V;;U$^mI&tZWV7WiM6TwKW+JzOuFDYOjr+Q_E5Uq>-&YUBp3w>VDvV4gqkAFx z3UOAY6eG>PE@*(ZNUEO$F$8FOL$D$&S2bcz#-abJy?dQno&hSj(7{LK+Nn~SBXY{m z32mVTjHs$HGGp2?K8R?Mo)Z{p-fUUxI|NG)HsBMI&CqWcj(>-jUt1wq-8&jiz!xZb zffFyENF;KFsGED^+wN=9)DWywot#YxSNIjZ@%XE%stl0o`ctSvv{n{miD1DOHh?IL zw^v&sSSE64L+~XZ$wd6uVS2R?d`>0>knhIAZkjx9K?KpayBeScfhScMX_f~>O^i%X zUsAjyp8ckGlp2xk1Uq1ageUpLe9|a@0O^YrAfz<;_rd~(g}rZM8P;(*h-4dgBoQ9O z(8&R#v0PJT{h!TM5V*gMgp~Z6=x_V&($em%( zz!IP5U5|r#?qNoVY(uZXHZnRu1k&sqm4?c>BvWHyXzym$8!k{5C5#FcqNphPE)qVY zaE=HceVbH+zWxOgg8#zD@Qy&RLVOk7AYd63?*{b3N|uY;ptKX0s*!B;5Pr@qw4hzL zJ)%UZ_c4;o=2j-_8GHqsNEQ}`Tu~n;a#69|d8gK&S&kpndRSXxa2!91<$9+uvQzS97G&bzN9 z0!>AYOIjU35Sy94z|eXpn;w8pe1=0}7C{V7paz4L94Y~he^$Y+PGmd7>F$Hbq^5u0 z3;TWBCmcllJ>zJMbWq>jYDBUd(?cRxcnY&BI8Sb1x8NALC%3^kbYUKhR{TjS?xTqG zl_yR_IMdrf3;bCvO@UsRV}>^dBlUdl0Y<_wS|38V@l%O_oqnhSMa17$;YY%QX+GlM z_@JHwu*=>W3{Xv)AP^-zS4;a2iEtG!-T}nxxy?32iBohqgc;~AfSSp=B_`mj*zE|` zW#2yDCs@@+>V`uB0)~1P@n)L1UWnF?1&;C-2%2r_SCR0btFO+-!Q2zNB0vng$=u5* zVFq|&Wahk^uOprrIk9oTe%ybDk>VB{+r%JB6Yp@qPJ`jxxLH#glDt*AM6i+&?NK9g zc_yd5$4Ju}cDF$h)&wVTsDt!ANdy)^B~%r_&Y$5uCBXsHdgkDVgvV*d$q_8XJnj=N zcUA4_E<%l(jTfQzUc{(FBwKPU@ixJ-9S!^fCr%A;;-D9RSThVDGWVh?_=#}0o15PF zWL3HEM6Oq8fIk7Rw#yfSFLECRjXrLeF$7OAk@5gTmns-4&nU_B?Stq$H%G8yd7{=` z%fXN;(1<9cI}KWfky zXp{oM2k8@3F|yAgj7tPdUq8doXmszO`Zh+yCCCSZh;;9MfH|o~&*syE$d|={9c?1z zDPlyt?~P$j`Z|d&LZ64LfU`OQ4aP`+Ea9v`a*eV%H6jXd+m%^p^&beAWstW$Z3;nh ztcgNj5lkmNuYM?iUJrre+mN()WCH$!y`m~;>(DuBv|x&E7z4yB`x2HR=>$DS+V_+J zTC*cJ2NCB>BZJmT?NuYfe?G(C#L}bJ8d3`&c=>NP(ix!Ekmr?ASlAo_q%c;IP9VPt z8d+{bBnQ2FhmqmD{ryQ9T0h8Pl#d8b4>IyN4o0}tLIEuBU+GJer6C=U67Z3D=TVH5 zf={WM4@TT#dQ>sc~-lDWdkGSkt7YhU2fENz89u>;KFBWU zYTP*J8EY5V2&M}j1VAQ?_(DtDEXW*h?-T&RU!CLhCT~? zm?Co(M#@)Zfq)$q{{jMSwGzK0KFZ0Jt__i>vCxBfyMDI_3#(l`|Evw_G_KN1(C;`k zL$It32mN~<-8+fMrBBqZB60~969`x2g_h9fpC*AT2qHnJcFYALR-+Ff;is=-VGV3k zH(L-zlC_`w<6ufvV2lC)UlBy%P&|mby^cZO309{QweeqQqCTUqH%GR<0!=mPNkTih0eYjlm|(@pHr$Rz640d}dXEjS_9NkF2#pIy>icgHKamw*!?-arT2Z~QhCBLI z1Bk3^tI%E;GC7h(A9B0P1>^?w1BhJRyU7etIY~b-gq%ACQg0P^A_O&DAg=Mn;Sf1aI~ZE$H}46INNuQJA==vTl`rUp zj%S9YF*2%JrE`SKso7V=5&4Y8J`7L?gpm;`j=_u5O&`jV)@;&+$cd-z<$y6r=w9cb zABuUX&*=dNKuG?rCwgBrGK<15x*Hcb#LlfDz-U)56UeW*1daSe3H zZ5l5qLg$y4*N|44aJR941IaEYvrSD>4V9X)8M=xOQ@ZCkZ}K~ytZ-b45vAu_;Y>qy zn=}Xh6oHJ%nS-yG>^JQ;S_yv5Q$wX^Y=&^XVo2tfRKulagdLY!0WX7*@Oi!edEFAv z@WJu#f6Qrb8a)Ev`JYzaoOS(YU6;sUo@&x`o$-9YI90c}M+%8S2MLPME*2Bbb)zu01`wT>ilQIb3Us z=28t8+tak1&Ql)^uejswf=kq%2tl=8*mhd)zSbJ98l&giO>Q@d^DH`uqyX%;Ww6HR zdkvCAsV({AZf6Q0W=jFIpe*)sjmfX;~THjGM0WPAEA((C&QI`C101tWM+^jQ51mCwTn~z z#Ch^rOY^ph2^w`YmhDWw=r%ruMmxN*i+c<|tVK8E7EplrZVIq~AkqctUUYtKcKF`x z*UKXEB^22Wrc{qXDGL`4P=Lpl6rc^%wyV(?tC>vaC;TeFs^qA*gluR=0aPKP5N3aP zV8NB+c~Em?K1fgT1$RRl6enTA7H`PE-%@}$i;T|}TxDsRPdc;@bDZ~HxRavu$ai4C z1EN7p|1$2=-TE0HvCS9s=M!ktnx!ISrr$Gr?3!5$QvfLRp0b-;j^2_o1vr+k@}&S6 zP@~SzddfF;%iXzH3ohdxUZwzF?@)j_yJD)aG+&eaK??Bj^4>or8|m4p8RM6fTPeWp z%hMDf>`ra{nu0|rOZb6Tt8(|A>-I?Q{ees&@lPZ1$xX-e~uyG81v{h zqW;s(6a2{{wDt%D@=d`88=a!r1v)9OU$7pr8t;Q5w|bj}j!Qp=?LXcX6uDhDcH4Pm zW%p!vQQr^0*y{9i%mAN z4Jp8|@e2wtn{9$yKL43jH2?aePRI@n^*KP10^H*R2jFD@iUPcOO&6E?S)SIHknvZE z>*1f0yL9BT5Fvd#xefYXxI!GmcI$EZB946JjqqVR+oO{wx|^ny&B&ZC8Anci!lZI* z)J}p@x{hTo6P`8c*nHnGw|+In2)ET?M*)7AK4~*F)OqfIF=iwF5~!72GN@Ht6WFvp zT^tRwm;&vir=3|fSLM9w-nv%*TJt#{@yg|`uX;c?(NN2)^GrXNIk$LDt5WqN?Bv&A z$Q=<{Qzo|QnUA;vE71OafHt{=o6BNvbsEyhxq3W(74-H$vyTr47ZrBY#@G4A4+Kp} z{al&aoTsxw`8|Fm*t+usTpMPBp&Fmh(e z8f_nwe>ztEoE?$+-s^vFsj)60*q4xvPd*Znf&{c5DtmytN`Q6 zqxMP^Nza@DC_^DUy<(1sY3_SbzJI*s4$LmLU$TGs3OVQMdUk;@83rp|5LL#?rDxeZ zn(MP@*QGoE>rwCbdBE!wpuUZ-U_XI$FU*0kKiV?&81bKiiLQRiQ&`hb&{DeT&?Vq2 z%noJq`Lq_T9utOtzZHB!Pq4KaO`kI29Rf;gbGfte)4fXUH6%YqeKA?Z$EGx=MLgEW zt%XqlUepJMu_!rT6MgyP9^q-p-NtLwOmhj_aTFjuW;6cCE}w64COyvfDC@6R!|p3^ z{|auYh5ZowSX6uCo3K&gk?r4gRQyv`qn?qg>%^_v8j| zg#R6;h&1n8H4Nm`V^RYZ^r-1-rKYQJu3ReIzyH$Q=2Qa9?ves_RRTfel%)WPS!mI# z4#|ij&t5MuFPlCQ6a$5v<(VU3sZx^E#Tv!p*9fLws>J-W5AM&~_ct10(!}N$@*6ed zMUlrGFwNde!w)ecYH2oDn8@@i^!2x*Ga%vC9o-^e7pQ+oL#W-^&LO!j9eU3ZFduH7 z8GePW$)J)a@R^}4Cl;b#Pv#yqa?BR zyZ6Mqgmnt^s|!NUb&I!*Cy#eN{&fbpjW}f^Y!KS3D@;zeOpfiMnDDO0!_-4bWOkdB)Do1*p|^SYaRb&Sh>m$!pyNA*r+AyoBbi?0R>Q*4_jdpp5~kG z`_?n>^@)W$s5F5x$8+Nv_QVN0pXd8_27g835-FKEAhBmz;D-?xy zH)rU@bMC7lDFBO_%qynI+9}jJs3m&4{20j(cHN{|LVrArYi6}tD2Df8AV>6 z^7gv`v2r%k625fNa~3?6>~gowFy_ZZMLJhJ>!o+BpL;TVOeS5vo-4eXW|Kz&IxKp& zi;u-_3*>JWP02ogzR9;zcCPaLlKFh~SvS1!(@dtB45jRigzT|=9O;zF@tu-`6%^(d zHbnAEVwfizulO~ck6x$og4ep=J9y4_3qQ-$eknQWqK~Yj0DJFoJI8Rd?RQ}PhPV{N zW;IR7i7Dm&N=3Ncw}D$3LZ6W^t&nD-89=b&}<99fE)&V=SK}=OmFb?;riL`s{Q6oc5~I9 zEL+vhydvpW*9sz%rA6Sr(sn`b<5oK#m`OM5fBp{mN{m%lo)tKK^zCl?Jx=WF;i7}U z!jKYTQ!6nX6PLjwB+4mc(Ohi9%Iy%cOH|W+D~*Pv!MztO>GI@=GL3i>p{?001Ap87aE@7o2y07}-4($8 z{M^b6Ew7x{r>h$YSpi80_U3 z^V|Vi%V{rtIyTw4ET9fu_fz#Gi<{&IJTA^EU!>kFxNq_P$A0l9Gq%8e;bonY2Lr9G z>dCEK<80#0;q#%;eT1s7DE@MJbUBhCv7f8-f2lT zI^B*t?CGnU%UnEnPCGGd2xZ4rHQ4jrGntwPE%chs{=w#}%+?m?u&kr_FM*<=UOn#- z0aMe=CI|d(VG7o!eiam8Q;h=bC&HYgzwvTv3`Uf&Usp(1_CTP_Kja9acwWCY;@Q2a z7Sk73^?CCBu5aI%?^2by|NV!JNiBiWpR|i8fZ&Lc5H7n=F@CS*3-@!DiAo(Y){FOy zVpIbQlQ%1;jwDI_V`2h30`60OFIjBK5gu%}dn?zP_n9r8EA#AWxE))HKOETf&b;^u zyZ?Mt-J>;p^6S}#fk3UDW3i-m>?AcJh z@^;Ce=A%K6q<7&Vz8cOu*KX~1Zo0n9fTxRn(*gu&O>20hiLSIq@;SenGVT? z_)jV`mil9>^-qH6C*)4OAS*bCW%8ZmqTs7jeJvN-U*$fVoN{iy z;KSwkw0EFqV6!9Q1^m55pQ)Kjdam}Ujk$)wcMR47X2Hm&tyi9x?+{33QkJXDP0jkM zH1UhjsRE>Y1j$tT@-O`<-73UKyO<90ho(u+7x7Nv8)hrFSM{^W?1yqn`_(O1qEEC4 zNg7cZpWBam`xWAUDIkU7mUs{V<~$+$h*-{!x7O4|OPK%037* z2zVjCcWECgGL^yEO}aFN-rZ!i5v(WIf`xjGdSyA})q0>HU2;>tgkwK;eTutcXk@SeIfu#*=o+L^&+A0%k3Fg)(?HOt09PJOA7AU#W-;(Q4VFsbcvE%3 zG$*{-B(VO6^&;rb-96Ck#IJ!77t&BO!oX|NEsqnz3!%-b6d?4lV-1xkl3*e-fzsY} zC8Gm_H8&;0Qosz}|6*XqcEB5xS}>)UzwC!P^!dfB zhe+lnJ(*zJWDTQ}w7m-^siA5gH%RZ9-twLC=M+N`{Hb^R7Ssm$+RGQsHe&TXe?0zD zhc7qt;CuNYV!FsjJb?L@(!OHzqulhu=nsoZmPQ$uBn%F$p0YfWGWQZk+BFBS2)o&u zzWGt9@GJ&@%%5}Ww0MqYl{5>vaWh)2>m^OL&&J*3_=byQf`-7Mwqa6%2K?cDWZ_Lt zMNjQ9#HM2xM?$F)AqTMF&{M?7JY1Tn5Ain{x_Q5Lu-l8MS|Be>I)y4z8L;ydh6>q} z+Hg~nyJ&=`@xT5wn-gBUEqH7(zlPVG$?iraWo()sAqeN7!un)-nx7d%kl?mUi!m7u z{_8CIG=zOQpSn%2_a@2@igLR9tZo&W{CKM>vutUbl{6N2`N!J9upsNZAt~-<2qLH(kF=@PGf|&ECw|`MQN-vnBW~_pKOw>fO}`KL=l}mRjEpxVlI6 zDDZpxxd3ov6a1-THiJvFVkUP#0iaWO6=}9=>MTjn$!9q_Z^Z)aax_-E#00_eK5Ht_OKJ@IAJNuUr-6<*5#?cj8H_&{#V|lL@n*|1g005c-92dm` za;OcxDbS+j4?EV$YudBa+PCxmGKSTa)O*u%DJ6+MeV-hrM)8X>*A_jCt!_vyA6fbr zn18?ZEm5v4)XXsX6yr++3+f=OJ`AGGUGcMmeIl8+*h~h@IFw5wN{;f+V?d7UUME+X zNM7-;TZnOLDxzzU&|Udy3QAP|C86(!i|Lm0$1SxBb!Ds#ZwO~Ox{IqG6#H8-e=^;V z17nR|-Kp)}WuDaMWb_6@Y(_gQY}0qDp1dT_p#?@A;nZssV7IAT>@Po;0v*ycS4iI9 z8aHYV?Y1yV6yQ%|qpoYSTOcezvk8jbdfBvf~=EAbqKLirIP@IQ_PZl)}b!o@Wod>D? zY@(I$mtvvMiANtuoKkbRIaFa%fRr%i>tFB7ldX5IknT+WrGYSzOm~_BoUXT2I5Z{4 zzN?HjfoB}p51`1(?E8=TdtJ5|!1{ly@0bZ2NcO7GunGi%if=U*qDama7oG|(o;iTD zvk<{$Hk>8FB`_J4BO3iGJx(uL=p65vvRmfuhg}Z{Z_{tJUA&dq{pM{ir=+FvEM_iQ z#j!0?F6XTQvT0*m^a8;s?_iVyC|-NL{q0yfQ}v*7zi(CMJMs8XLTsZSH416RrH%jQ zQaHRFm@r8Joc4IX#Tw(!E!KrKqnJaJ;Xy|A^S-3k9rKvn_{B^74}VRw@3w!J1ZhZE zMiXed4>WLvw@}^d2N9_O%EAT@!EtboY<7O^CcFb;ywG25#AGZz%{!hBCFxiSUvlnE z=O?GRof5uxf|ccH{q;w!KWebvxTBP@7fk_@3KtGt$q6&-)2IlUg^myRXB~3AURQ$3 zfQegW#PiVOX^@|vjEl)#Uc97toJ7Lh7w6x&OxLJnqFgQf+6OW8#g$zB(0f+{&^}yYg9x z(_+AQmU&S|#*#>#XMA?=AzYnp7!h@Wg;5|0Uqz1|t`zg!nlxK+Kc`k7SM z?CFv@FZ9iug(KuBRld%%65f}TU`G!zY^<{c*?yF2~6`{kz1FVfb^}fbA z7L&^{ptL2;=NI7gf3%E0j+O5<3V&L=!-8X00~?CR|AUi%`5^hamVx9@>s2mH8+ruJn#+YQPcJNuqnNNXR1}$`sxco z+@WpZ3^*OA?SvmDdBofwBWf9zm(?y^IFsxz{JlLzBP;8sWI`3o%UeDpT?8Y`MJCZZtmB(Y_k3IW?gpYz@eg5qu&=#sO(9{p`O z<-g?PS4gtG18Sb5`H4oCJ(40{_$W~TX(Q}n5siUSp@)KJTjGMLgwfK?Dq~jG(7VUU z%64b=!f$)9FfowB^Vt39sI zy0E+^5Inx0^}XfFPhz0a@bIs*6d)vzL_FBBX5p(6qX0F^S?91I#6^$`4OK z7bhovI)w1ie>_OJvHrWlWMZ-9i>*>dXd!|{ikI>_DL+`>@GP_oe(?it@OSwa^xAl#bfd3B zy~*fmgeFb$jyHPsA!nJ?ixb@*VIgL7-QPyMFQ_WYg}=;-QC}U3xwaE>HA#C;_$-ak zXxh|7_(tg{{9N~y%Ej+H-!7E{7}fewHu;~AX@+w}r%hr8ETY_k18N@F_uZ?F)dTF@ zH7ay#`~xvgQcMm-sce%qD)&+T77a=|wcfgI97g$GCq!C@y!Yh1C;4Lh9ORA=x<5c5)w;<|4#qI<_`#jISFg>6M$%d})wp+K>Xc}DVFf?hu_aE{3hoa~ zjQpmG<8R%wxFGUd(p8}DcCYPae_vqc~b#WUD~+t?Ay>zC$xdZ@p+)M8;~kW{vQ3YkvMUl#C* z^Lc_GC4LUwHRgnj6FD{6%lxG`x->RR_R9kHMb)b0Co*<~Gc6v}v>)_Gy|?(!X8)x_ z%k5f zm~J=>#z{Zg(3?(A_uHmEmB7K$h_3NUbtYXOJtVPq=v*7B8lV$>daDf@`f=pAX1X28 zokBAf6>#TSJM~>f@#8lNkB{f4lb$t*svf!JX!QynJX`X{cYdo9cFwCzSf|rh;9TM| zG0;R7G_75G*P$L8hhol(4liTiFX-&0EBqwDRLyj(rO?n+X4i|KIv-JMy-7Ef+=KzJ-@uGC%{BElTgsn8u zMuNkpI<5O^@}>CHb7J?^>QVp#ZRG^`n^07@V-i&owhLm;822rZvcZ8R|E2{Z{ED($TbN zdyb^gx1h75!+Xu5xqkO%SJvmI#Nnmdk<|XNqLSKXfjPI$8Z!IUs5F zoGBYO)%-RPkqsr@JhQ+=8W`+wFJT-xowOqy#yNS}Xd*vTV zyJ5)4u9s(@aB>t(V zp?9+52>BT=$yKG#lDclmuo%zJ?=+noHo0zwo;qz@kHoyqHq7$h3DXWw@zD<3O2Axt z{U7M{_dk(+>#xJlkL!O60kfO|tLkwv0g)-*W3wlmBv`ue{mAXmQmL!~@%oXz6h)eg{*qmN2(CXc*zz;0^6ydph=P9t z_lBML zn>|Rq)S2RMIW})0=YdQ#i7|PRNTm}F`7q4%+m$ZXVU;Atqtu;a${3f6c2zZ1VGsk< z>pI6gpry<+Nike*I*+}!&pR(FZCpfq`fIubX3~<917v1t@>ZhGTZ_iOy;TwsYM$L` z^?K{gH@!poJ|){fTLhUITiTx7ooId^^F~M2=$+4K(>WIP1U%th!UyoQ{s*K{5J3-+ z=j=gb0;{qFa}Mzz(oplHB@TLi_0MPePQLHa9AHbN{x{dV>)VgZNFvwtDNDPtqCGA+$ zTN)5g-px)f7lm^kRuCmy5A*# zES>K(^yblUUEK|+e{jZ8}?zC(D{n9hr<$KbUW`zN3A((`H03D0sAYoKYq- z>C)lDE|-?jP-ndh_+RbRJ-JdA&>xfN?z^Mid?5PdC}TFOSLa!nq<4_d%-9+2Fv&RN z#s7yZXQ0aHGf*gR_6sQotN()twVH=Ks3G+YaK9P0(^`K_w;vgE79?`id5Qg^$0D-z zOBS`|QVPFkgx`cs7ln&|D7B@>4T;aUjzv9aeRf08uYO@ZLUJ>@m~mh7SZ@K28ap{Z zrZRy2!xjG@TKsp3l>c;nMc}9+s)S$Xq#2qX?YNcHr)%q)>Wj|oAHs+>)S+gfVxH);u5^o)qZ|-A z76Wb99FpqD4sYXPeK*1urbL229o>urMw2(lySu-&Pw3OwFZUP8gx^={rqc>i3l&r6 zA;!sPy&2=$X?iQ=^P{Tw@deuV!k@41eCSbp&<=}CYlQE-XSigraBsUTQRzb|_RvAb z#x(D$mlAc@x2L&xFW=(b>$KLV$=J14w7hQoRIit6K$edoIEesBzvv}6ajI?8y=bOq zXyuTv%ONpm)pMy{QgqP5#o1QE=1fJQje*Oc!IF>MJ;$99ju4X!HG58pVWtQd@9ph5 zBcH02vff(~m9kZl%P%s~7o5!lPVvd*sHoEg^SIy5K-_g2vKt+8xXZAA_oQZf5>2~4 z)rPgh`ES3@PL=|aIz%R&L4kq|pq0S;Kw!*u6LGQZ%~M5RsF->*c4B23+W73(Ys5q7 z;^6l+y@R=Qdc$~f%;7a^ErDVAH}ostHh;4hJQuF& z(8&6wlO{2vM;`T;rbRmoIQG9N4hwD8AtJ1epTzx_8EORHkQD@Wbfo=N_%8(V9ISHm zLMP#MV{T7|Lp64T`!0DeL|p$pIK}(XUxWRG+Sr)`@tC-9k!KfHTE^!m;h)-+2r6s^ z1u4UGUE>}@Q)oQ9miq(0;~B?~Uo`FbF~i!X$P;V2*F`dL_ubyG^gLhvD$|&p3`0f- zN8BIDbWHVwi1%>XAHF^zbjLK;qg~$_NzM8R4ElaYN@w(wg1r@xu?ksmfN3@HKCM={ zgXAU&5$CF%as81&J~y37j}f;(sYr6t^u0DgfqL|Fba`#(aX-zYK@-6`sr8p%n`X%r zK&m~bnFPP)N~`McEQ~5dBn|4Yg!31)SAJUt_ZMP5Gxun!YbVU@KjRV0E5|vf8dPy- zTpk?UwdAZU-!okC&Ruf(^FxwnHE}FZr$K;Lh~voc!vbfZ1`+KqC%90rHPu2skb> z&QJaSff^m=jd9$&(b`h&A#jl7&o{!g|2?(+SN{r%oa|H6pZk$WHE zDNvi4qa1gAp{0-gz4mlEN)o-Xdq?Dew{W>9_vpS24seRsXs|RNC@ca8F{_(q{0kP* z`@F+cX~qI;U7^8{SoPzCRoG=`s^gX?^-jaC+Es@;#S20B+49mA%_WojO@jW@LNzXj znFnusHeTN|PE0O%_|daYrp3_p!`K;4mltG%NVS(|FDN{-dxmF8wYe{f#5 zT(~0G{YRRI<0FAlVL;g3i#LgRXFO-_hs<1+v3PTU? z+extcUH##JM${1*RnfNE_AuvQt9z+7ssr0P1BPap((M3+xp^C z+auXUOM}IC`U7q}5CSx>RwcgwCYto@-Rt_TDF4nEF$q~Fi?rX~=&vcJMKbxaN9gX_ zpnuV1h2gHc#gv1aL+Xyx!*H))Hu;kXF?88m*~bla_tCOL!y2~gEvMNF%HDB^JPz1a zmrPky-q2QcL%C!Pd34;V&$qAKxkg?XY>8Wv7r)~`=NXiAOa>Qy)m|N+zC{5feg=OUf_bjO!OGMB(3cjwLce4M|pv|d>r-z{Ms zkoR1QV(>lIaoKF#U19hw$S|g)eIQ%->QmdfrWMbdm?!i(|GjjAWJlM@e%C=je?Id( zxM}Eplyy*nf}1hV5A3;4%h!#oYyV;jw5^HEXH%MY?qEubR*TB!dtvmf^<~o@c!}mx z<{0Y`oWJg1*Jqt3^HUa8ef8mXnBfXhtoX6F?`n1T^dyIBd||$lxWTuc--*oqGlz{^ zqRkEOgSRbx`f#?Eio86slQBkAq@MBzDCUVl>u(uLA(5W+E9b6UplTc1tnaq7Q+u$u zoEVom7Z`yg%+~VWJLsDeEgF+%@*cPqr0sWxkWA$=r8i zj@dl86>j2!&EEuEBuEUG^m4R=XU}seKrQo;C+mQ~Ehjc6!OKnKyGGk^rSrBM+|!~j zjS81bo(+XnTO!!i-f^d&x_js9P3MB48~F6B$Ks_-$t`1Q4}~Y|k8K?Ti{{9xmVak; z|3zv3m%i%I3TpV*u_NP)zeWuTYk1ISM55Uz!hdfbZ)hKEjc@*<&;C1gBmK>g3b+xe zezkQY_EY+$3lYh~^E=w1wB28c=EqGl8Say84Do(h@#+r(f9{=UZeFk78_@kI#aX(T zo-9%(z=VDq_c&jI;RPoDsJt@CHFouRv8bd4twUi#k&N)flMl8j$l$rag)`xZG=1~I zixzBeexC+rj?seB!IcaMl6=yM`u)Elzw}${ER1nh{XDy6PGb6Bd1^NwXGxD9B1~E5R$>Cq3@V`RYsiEnh2czr%0(Djesz zaMBjeaErdeD%0eorE|%vV0}P$vr&y3VrQos4E8yO%04KLa#_%tu{9#W3S?BIw-&?1y}>4 z*Bw$Rc=~H+{~>r{?Q>p??V(}6*+>pa2DbLwtS$us4f;&|CDxIB_2=4DPEqaB54zVLtQ{k? zjh2^xgk=u<;Fc8WUnibg8Lr2OCd3_)d#5ibe$u3FwVz#Hc(Ozk`>G&E=aK5?`}{*# zUrFLyZYAaqE>DDU4bieKluk9C2J<{r%i&_KULBLH?6a^6Thy zQ=K#adsxpn3#KGmvwQobZM<0hGV|;Qy9j%xQ!mIs)Z*O}&JiPt0rq#=8#^&A(WI8?L(2q-{ zD9z+6hiS#WH{8Z~6jM5;$}*;_9LuS-<)9ixXhAyk2HcdI>WjCD-L+vc>ZR5GsxtD! zr(Hz@3}NrgV3)6CkP{|0my$9z9_qW^y>m@Tv&hL=I$xfV&tG(<-^tn2S@cW?WdArh zJRUS|oL5+2)WEeJoD~C!eBN-_*xMmigJl$S6zV5w@cuw0Al*suuSq7{i@TRQ@Zb($V}+2FD04V8 z)05%~WNnggfOs%u#yJYtUw>VA4UAl%*T`O<=TK#atLqyp_>y*a1)61>eP8F60(u&q zH<^FK`Ul33KQOcn{S9ine4Z<6G$+B7&$bSHT6^MDCdirod}O_1|ND3l3etKtdv+t? zd?DwfT!3fiblQuGb~b!7OJo8aA*Vja>~NlMgFk9twiE}?QxB_Nu*S}ueHf5K55N&Pb;2Hh$ zUBOE{-y&N4v$^2zCXgZ(jX*`iW?4{|I4OOK?GpM(?fuSVsm2TKC`AdZuPC>kgT2rb zo%~hf)?05raXZp5yX>st|44e|j(NGkTNcAWmwS;N4A#<{Q607O60di`AuB^TQs-jk zb+x$B8Bv*nbx(I!JNCn zf$e_J|C6HmANrYp+yIS#+=&ZWaz1Zl{cR6Z1n^v3)!qP)g%+*PJo*qu{TqocFGN;A zdI=s9vDX;Lc~pnzW>{LSZ83^4(+Q=hO?hi#m{$Z?1E0>C`+Ox5CTZk&UMn!Y|5IuI zqD#PXvRw5pT6byKR^VW)Nu&!$$D@R8vCv`mQ!8%A<=38W)Qf6B?U3mE)P@CtLHcN;c-?NW{HEj6S=NzCF;>d6Q6NGo$~) zLYzG=FQKTsTz!IrNn6jk{=J}C%7&YFy79702nqAsbRuF`Lzg+JI->mDk9M7AZ~ePT zAFO|?C|OjVy8DLNtI}HkV^_m%ddO99tbTtYqn-eSXGvu2XDZJN0s;TE&k&-rQYXq% z<5Fdg=SGmv1*Tp27imF@7$Z*J*xhoC^?8$euij%}TJiDlsKlO1$#Rj4VqQhyFv?I# zNPEU+_I#MUgPR_2@mW2#t|F{Bsf}ixAkiIh+H`uZ5KqzzL%`_nxN9aGeAKpvSYlPa@ z{6c>C6rutoX=s17-BX5;3f?D;(ZR*y2Qq{xla&EGIfk_aki9VE7^BjMiv&VxQo9s$ z!3Fd(sIV-P<0=Hw; zdF{V|>L0T9pA}TmdofH$npV)%y}C1`xkRU)P%0n(?2+r%4g>McJ>B3NFNW5V2rxHF{9g=ZAYjdaAhE1mBMdjpo zu>&#|3TO0RkGMBb3P}NQ-ZU@UGGVVdXYft4p7LSn*|r{SJ1x8KG#1LzVU`J86M3pj zl_+}rXm&+(%6;j4k9=d`ar}Tp35)7n5nts_z=oQ)T&yG27S3zHbyQgIwCQWQca8(^676RV49IVRTO1Lf z<837kKR5$T@aU`y!)=O-dsGsx+e7%kxt>pcj*0Ns<}#o|`Pb?2|KbDLnb$gQ%=Pad zH@g)#=OJ$X#uYF^lSsS%{^KwmS)cZkF|fig!hS?jFdFWAWr6-W}H}q zOa;P8w8WEA`(&{}nTqk{tKZ^1C18^uLaOMcIbN%{Xu+bp=}nLStyd>5k%R1e$WQ)7-A;*?ls3>F6Rc6@es$zGLvyz3Af*sc`(^vO zEEnieOdfJzAII2<46#2WgjtjM%@ERP{ir}UAzEP9;LrrSMYpx{$3s}+>yr_(fPl<- z<{1--wOi@~67Ed%j$h#{y>(%$%-B<8vC+?cWr$k$u{?901eeGN-Q5|_&MoCV&G-O0 zb6qKniNh1q$Q~~^9hAAaHrJ%Op&}cbY=5^Bynom&!!K%ga|Ji?NAm-a@Hg4RXeUdo zcPMi|Ojd;e#~lwFvQ7^hy_eG#3q(TY^9AH6a~b%7Kk?WLSINrzQqF_RSQXv@@m`>) zckb{$VBYsmyfri}Bl-|!xsTvF0LY}B-J|S3Fg|KBKu^<4MWXh2m&SezT#v}%fkV)% zuyOf=y<=twDG|7egXY>V+0j@O?s|knBMbe8${OrC*{MB=p;Ij zL?oOj2AftBW==Nblc5& z_?B?p7d^}e9w%BD(o@U>b&nQaUgS7uq5O1x-q|Nl*+k6}243gUZAlhSpbf;Fbn7~~ zel~2X;55rRpC*hANDf{*xk;a29*~@5kEn*Y!7Xh<9I~2T%gtDYiQ){+iJyi3_lb#Z z{v_qUa4`&cOMIjdMA_^N{+yakk&V(4^o`9RyGHhaRycit>nsVaivkTZ20}e)?v5-! zd;amY$kV}2YNjBm%=>Z1_|WVGp(7YU@Q(EgGNP^v=d~{8EC@yGc798I#q^sMhW>*U zmi+b)R@ldTq#`Wa^x_v%D;yY}h=9czprz^RzQOz@x&s!#703P!8+KQFl7QW4an=R! zfKZl4CEatBNV2QS9j{1NUeJnx5gH1|TF@Sx-HYWm^rc)iwq;|D zjnkVSJD$A!GC2cPzx}AY=c2Q{#_F!&O`}(&O@pT!;YXFPrTe)raw5jVC|f8us(_zb z{RtC9DzJ^zqGieEdVrY7e;!KJENS?j>hm7v=W#NhTps7PEYCuEof1ygxk7!46aAtW zgX@9pSh(%u9;x!ba`ao?J#Roy|+ib06A*`93z+P{+_1( zG!l0t2hk5Xu|q@ey{?(k9C2hJrN)Z0C!fo4YdeUYYzPcLk4Ls%^V zl^`>}1T!jYeE#k=sq|jH8YOG!%*tfBn&tzuELvb~-TphUzIz3iRy#!`-((;**#P<` zaqOm5^}{23SxO)cG2VIxUSy?H4rd#$P9$=Q9NX6 zBLtFN-cntZuKj_*#f3h9cI&_=gA3k8a3LAiZd@(~0gZ|dSOFb%E%;L=UrX?&d;tA! znT>|M^MBwY@De`uA7OK*g1o$}{^Km5-#M6jqo$30JP zwD`@d6Bt&l_CDMWqrdXntLv8~cce#e(0<)p zKb$9%e(9Z#gMfEIPNqrD2lrRFvk=kWnbTMolkM0}x@(EUOz%5ONr=ELv*DfEnkZ+q zJ#3q37;)Q+3>>;JD2JXxJD<0Q-C}DJ)ytNc6tE<~9oOJ3MA6{Qk*;TVh+Z^SgxKw- zo80`$qW5YRo|o)Ke{gX#$;>bIyQM`;oZl-?jelz*9NU=t=UnP_g8~`>Y542^2YyAF zDR>A8QaqP7Isj-QY9>#pWfyKP`sE1v4ZzVp2_D+^=WtIw@7@u;&aKJIQ%jaI1u-S8 z5)X|bgKm5_E5nf*_F=I+9XYf4i?44O`4slpbCj(wU3WFRxcc+hNeOY3@Ez%@skV}~ zMtS*$pM+?0!UU@Y&j{A>_)TpJ%C5WBC^)F6krTTs4gur0CHb93LogSDZq1fnHtMbG zWylmP-bEiPo%xYw*2=Fo)a^j0QW$|duR=XGyzYoMh{90#4-8#_+MSM25%JzC9##F0 zr?N{ihziUS)+@`Yf*|cwER& zLr*CL#*5aI8pYx?>fC&qPXO~`jDl%b)D{$Kg_!pU1+V2a{nn%sk-)`nq3deH3_~3W1CQlX{WlGN& zKZ*Tyk~h1R%Z*Gjs99x+Y1HF}n`LnUQgW3Mf=~YOG=mh&<68*aTFu z_Az>)Qe!~U;Q=uajP=qE4+!x!cZ|_Oe&F~U8ZO`ZH!n=KOs=`DoS?m>1>uLKD+jj; zLXX@y;Dp(}SKRLu-_{M?=6z!lcoZh*X7741UkMI-${RIQ@7Aq-(M~RcJtzx*v_AmS zl164ltmEeXtp)rKJ+Mx8w<}R}b{7MTxX=u1Da6ivr7ksa;7lh6a~q4WyP}f*mKa7h zDW$mEO>1fU)ofn|BTRQ)DN9yt)^3&}Q|1hHwjL%b;cPi|N7`tba==!poms&;$=cbw zBP-bJ`s*FFK!z}mZgoNDDNEGpN!STp?32H~4$xx%dyCG_z}=FHgvgQ?RA~T;GeQa+ zrsT#zWa>0FOTe4Q4%M8#3Nj627NtE!qx0~>6SNMZ?UKJXFOMomYRfT_Z#{GeUA}5O z4}t1wW4G+9uvCwWsCTrJub?vAWTnx=Fy3~qOJso<;O zM_!SHLTGwvJadGpD44$LuQs3PPSUL6rcwCmQ&MP`;mJ?V&o&^N4Y@>F)+NCFHPUn0 zsA=oX+Fp~OTzy}SQ*Z1{!Z_uWJ1}J7md152ZXfmxKw#gr^jYZr9#(cBtO0#23}L}O z_!GConm+Z4;Tft+5b;=FN5<^MwLqm2d<$Ty4ScCugKk@1K%PW=AIQL3COY!&Oee5$ zF%I(<^!$`R<}o4Us4p#dn%K8tm+ER5mu)}>345zM!p~!oO4z5Oqp?m{QfyGzdC#`G zSh?ncxinUeoE< z>#r{n(ifhQf$9B^*pu0kK?G z{gW83FAN9Ovaiy{fBb=wzcKpw$YJ-Tkm2*AN8cl%Gxmr_FadW7PM7Ydt(t zqZHdHPE}T2UcOG5ixg5b1>{x+{0_L|1{0QotSuljSH(!s2bQ*XufVA`Jp6c|U}f<0 zf1(7?Ks>v{+hCG76kTz4`e6X*b@QWWFJsA{w#RFApGyI z=%3H9PBJ~6>#Qr<4tIw%3?ulYhxy^?Pp>=^FlI?rGzHdId!?2-q?Cpai75p4>O(P8 zjy#pMwL#;?n;-)WdiSd{V4j$Yag^AXxn#h_nEz=&GPgmEKh1(}TD;|#!`%^Qf>biQ zPS=^&iigBK7NlvljN|B9SjY@TAN`lE`7cT^<#px@!;N2IA@4wFKB{iTm*Yq;+Q6~* zYO+Q~kZ4Ft|7u48V+LFf^?Uck=yvAYB>WcZM!|0K!9~TQ-tkqSNdZMNS}g&7@%#dG zdb}XIz1;PrSObB5M1+oayV|`G--mA5HhDp#=nbV^&z01$_n~ML3&P2=%j(Fre{(9Z z4fXuX1^tgV{a;6qHIUrA14;&1E#d5uSY5G+5?9C!l!Y-uOK%ULmftZ8E&_EBwyl68 zwdOeiUd@M_5!JkIT9Ue~g(bZAp_z3s)|Hj$ZE6ziE{&Bk_Sf~hG@-}y*D!55+xr>P z*DlnTZGrT=+Nws0^M@+GZROHHP^vx5#2DbtHLz8{*Kr4PUx^P#bZgvwS&Wg{Mz4e@+P!xU z19{}odO)4^W^B1=xZ&6$ZvHYu#M0(k@RGXAxvJiZscX%n;`DJZ-j(_dB`;(By!A1N zUZ{+=$dTx5UC06QKzrlZkWTii+C6u(N`&~XNue`h6)5ns(AAJNoQfvT_{mAWl#I&@RTzHNNdOU!UlLy0>w8&_Yd}mY=aqaQz~0Sa-+~+4|--8 z$!4$r|Ik2dDmt^d)s@)au2Ng%BNyR@!`R^o(6du#mFY{>9w4e$71jkT$aN9lf^Kg_ zo(HV#{Q5z@jn!}OnFQyxx=>K%(DAyey+vIIe}_b+vGEmy>;M;3tr<_4)qn8`p`a%@ zf0k8p5wsm*9;6MtE~-Z55(w?tp?Q!_Lb6yFAe=S?kB~Rj+HW`|p*r4ghtcdH%p*@g ziW1q)2hp}3UZ!D;>D*Uc9xKo?Y+_**sqwtV} zJWr_HB};!w{qCZQsMnL6`@O>v#VaUr+u}f7z|CF6ldlqO4l81=H`2*pK4;kzxSP+b zpSuG&AzjeeRb2B!=DRyb$%o#3d{3RK-j62q@-`$Q=KlUJ|G>EEF2hlTt#GW}%eS^} zFEaV0OL%waqiqY(`<|E!;H{oVIkP3F&&mL8#FP!#$v5~&xnfas5cmhi@ULPP|Ei(* zNeP<=Dd}Sl$m?=DGKfwGU?Tcr3XsmI0q6^=E#O6e43~xaMwxBO(x}h6ND@bMwvT|z zoCqwypE0JdAQbqWnWXnQ#DMcNK83tRS%3raCOKtgom0admDy*UUVy(i8Zl~e{RtP% zh*`2<_c}W<5M0>|(4CE=6p0TdD}eLiG`}>$4X`QQ`%@YjMd5IvRmUrKE^StrdI~Ig zX3;;94_lTBV^wP1cAduTCO|rWU>LQN&z`ZNeoykA0<)*k2o+*&{(}%0?!UgV|MuYe zo!6P{{DjQiANu41BdDIVW0RI2$N^1x$Ex*@OVH1PsCIEa)aHcL!*J+6@1h0lp~h?m zwzV*-u8sT*7n-d#3I*m`hdT8$1}vh-+L|Yticr5B(=dmlzbj|(&fcH6@K^6bF71t= z272-bxH;ZY(mvRWVc1pZ>WS>>U4ITE$LqTn79p2bOd?OFYHwf7*HZg~=iITXgCBKY z0aJ&GQ|DqIK2ok9RAMjV80Va%rk*v*PIT8+PY9dM1yN1JZrWoKqmPtHA=gh=#fADHzoiN>0brJp#k@6AwI)=oPf^49YR7zTM-hyn+~5eUm7F$ z14GSw&JIYZ2++@Lb&JZvxd1*qo0doL`d?N>PW`x7TaLrS6R0E)k4(*u7>N%qZ1!hA#2>z6C#!3+&1O3a*v_L%MbF%f>0>t5_nsuV#}j2-LYMS;`fYI@1flf)n@8f zX9MJj_eC_9G^^xbEsw>(_i6VH|InA zeC%^orGFWGO~Md%9r|(mdtz`ydg&;_-b}wHmQ#@j4=nm6@wg}X+S}py;jP7~_Sl9|t>`cMoaHWGAM08GZ!bD2`UzMynTu@W ziy#*(Ba^egH&&W`hEQZk>2qTe`xhUW-)q#Raa0q7G3zfEX|>n3x^<|wa~Udr7oj)IJpCa4k{cCYJnfJ=k|DIVr)5@xtj z`HT#t7!z47?QLtq-4X*LS^mt8Vbx-A^}vq-*!q~{(eDZ)74B0^nZP>>-uy)S(63v0 zq?2rS;EXH#2foht!D6aFhTEejJ_(LME^jg#ScZ;c&Zx`WuNBd4$I7|?9^f)#%$%L-Pfi2jslT2_9H7XD|OUKDkR$hilgaextLJh=`iy?%c>-OC~eRjQDakFfi z*A~9c;`2;e8a_F+A_xFU78Jgvq^snZe7JQ%l-Hp-M{5i~N_;RX`P^OFoT)J(+FaCL z{*EW&J0p3)tLwV-J8HuGq+z;;D3Q8pkd{B&{524!rV{r$FY5N7W8>(5#}!#}!I7ig zq2>@f_Cni(B&VoMWRcHis&J&zfD+#$t%zNvnp*%YbNEd z5T%N|#AnEZZmTjz8hB+0J0A8}g@LG$ z5-Uv+)i*WbfDW43DmJw5&yn-H({Mw_BY>6U!|a!2`-?zUt6=j#s0m;VLs$#Sq6UN| zYcBW&oct2q?oi?l$=*#5_)vKW#H_VXwC0y)1u(61ZX%5Nbq*9Qy3-*oMAYdXvyH3tYO$4ncX$NZKJbxA+7ao zs7iCk(xJ2iNdBr8OU!nD3b;js9vHOLSTquV)SBDx>uL(6KcCK#WYt!cq4zlgQp2zMsNV~r;&BPfRzq{j4R3rBoMsWGuR?64~ZDjr-hR54I z&)FV>xo6QPYU3);7$bzea1B(~)LVrodRyP45Hi-QB*e?^6@-mOhk(~P_PbVbZ_D&3 z4mOp!#}k6_2Pkp)DCKy`IFotRcQ=@6UABLG-5{NPj*L_KA)hGU>Qr5)@kaV0|2#gA zjmwRv$ZgQwk7%92_Hv8jYfblvrVs}~kd{p)hN&xj!zNoaB?Qu=vSx>U$Kh++wlMb& zl_jkWTHD?USBjiWut7tM4hom7dv0=A24=6e7 zQ`EoMC)-Q28<{U-=l<2}n^#p^WL-+$qrM1X-chuXJr!7&9wO?Xdn%Af##raz$4U$G z6OPZBIku*PhKPm{4$C0ixZt<%`q+2+Xk%c>ANaU3uk$8m)pVNSyDlIYa+4b{K$=&-0o-f}17lj? z(D295(WI?I2KL)bEj;dqH7MMs#sTu$AM%Be+2gr3)6{3)TTdzME8Ty3hdhwJ2CK#X zxhSLc7!?S{-B4_^C%(3cU7q9Tj?IUy1aSg{-Jc`(0mL{?(*1mv%9MJuA=to za}GE`tIvxSi&DtVrL|_pYXkD)9Hdur8*|+f5xEWua#;_)v#@t))GR!9#T0Npch0u7 zah-b%BW(5DAXd19Ta!q8;4%fgTKwPn!XWrdsf(XR?BWz;wT7vNFy_s+pDJUECE%l+YZ|t^1woJXd|G@aPTVhJ~fH&;|5N!ee)$5iIfH%L{x|KsfcqLo= z7Yt_`s>RJZNcy`;{B1T`40~zm<-Hee=NcMdTYI9wNz?r!<&2mKmka{@I`(Lv%|H!@ zE8p(=4J#&!*NZFV_8ydc43BjZy$tHOvzdQELXghd8_-`8dk3L@mo;a-FJeP_&cng)I3T4NicF~vJuQP#cg#XzTUcSk%C ztbVFZN~x#BA*JRQc)8?nkiA41`7w?cXPhlZRI*-FO@zzY42x{zA}I_hVp7$N%QFS| zP*qD|p>KM3_AF5wa47qy1DwgUk~=n6UKA{9ZfvHm*e!jxU-HVp?fiK$#rKZqT9>+v zlI@~K#3OmfOLXF#zH%pZSWjDr)LY*X%LQkZamcS8@6%h6UV^av(vaTI(SFDg*qig+68 z+!N>f9II!E10N^r^UBlwvZiN4iC+#eZJ(CzJ>0-d%)?RwgNUMvOP|*BnDF|ed%Yq6 zkCVfG&+|9f6WSw*F&$pVS3kN>YOnJG@6#ljvOZ%ntfUj9#CJQ(OgY#98X`W}cdTUC zcJc5C9}pvMv-p`E-6~=j#78zz?84`0BxdbOQXFP=u4Kif7ShPR1VoU9eZTM0Ifj0= zWy5fOc`RrDf_A|L;AAPg{XqYukOuzc z7;VfMVc04j{#*E3vkbwuB>jX%97McU3sPx9SbP=TdE9zXn$3eoNfPm_T@rJ?0F?gcl6(7$9#O5rjC1 zV2J~t43qJBG!pkWj9#Dr36KUK>BgE#Yj2 zNYe_b!t7-$&g3Y0HnsftE7Y64*?z3~W|_Cg>jAO=E#!19c;T~|%)lhZL@d~3E51@( zUEIYfHNtdVs#8~Ya5>f4@S_cupz6n+ojrfOY{YK{zPc{x%(;P5hS1~~$rb1MJtES~ zSfMwYp`pDE6CyiQ>Lobn)|q7xjp6QdKLH>^WKy4aqu-Sc@f2>Cz|DGf_Vg>TMfBmq zgNGTJAi)6gM!ZCp8f6k!uuKcSj}zL;G>G6K1;>B%IN40)v~5_w@6N#_mpgi7Dqw(#pJR@Us1(tFPoqX}IUJq;_)pD@kF31!JVEb`#>o^Jha zE;{kx!yN2Y;CHL?UbL3)3z_)-Ho!r&aHBZTGb#q$PD`_)PJ80rx`#80*%jl0teRDCy@^b;b1f!~ z-l*!W&hd_)xA%nJdA6a&q8iuW=&n8;&PDno{bSy_(3#ck5y~o~=DeQ)>CXVSS zw&!~Ad&SBlH6stZXW%8eeUplfSYMXjD^cA>WfRW4Ok3gX;5E|uHKg}LTQ5_u=_B{O z?=J-2zAc^|DvFE$h|}ZbSVagtbIw&>FJfflQj#pjHtxmF zPuX^LO51HC_$Flz=ZKu_lTeu=KrpL77Tugsm3a<#$Y`(Q{t5Ag_JCT$y(=^+q=4?k$O?dMv?6r#Ix2l z36h$VW7d67B-8GnCycQ@o&9olLi~}lNdM|mG2KNwUOhoIRyZl`T|sKDnb$H)VBw2f zdSBD`{Pl56gEj)Du^$}1)-E!T<*l{WEf;-czHa)~`E3&1dB65Me)@X-$a7=ImB(mL z6J47+y%(%AAKw*ge5z=fm@hIW;|Od}&Xf!g@Dt23uej6?{LI3k%Am#&d0u|*9D44= zy86?*_0wmJVwKMXRuDXH8e1U}d#D<>oo`M%O=Qa&4oV>e*t;?T~ zse?O=0gkb7+yjErKQ;l8>yH_3P^`Fu8nt!pK2LmDNf(%#vUYFhO zSu2t_Bkz`e4i|VldT4@@kY=FI>lY}ResnN#i*5z<&5jkjpx>jt{2E{fJ!WLZm|}_& zc@-5Ue`6-gj~mRpx^SBXk5J0U3vRiEm;bJh-mw7K1I6v%(Ee`?QWHp4R%Qy|cR1J~ z0%^<-X_|U@UBdF;j*y#`#K4GHQ7dOab00>1UN;|^6S5%l2Zk2%p%&~e^OW#$hc!rA zInT%`D-&vxE=!J!Q*75g$f_JWKp{YlLNC1R3Djaf0tApU-}bt5bLlCj=xX|C%`Rrg zFn;#jY`21Ybjl1$dk(_gW)qcyEx$viV_fJcUu+FbiVD;}KzNZ${8psS_DGw;` zUzYfD(3tq(z+4e*v~@B>_3g3qA+!S?J;h1tEWw-B^XHz&-y0lcYq#EqFhYbhFh%`V zqU1L!0BhXE-}g`&I9)=)pUo~S2sh`aRF(;mon|2RPg;;pt?JtlsIj(=I!& zN){1(4z=4pAXYzRS7)zP%9hWtRazmQJ~`VNhfF2%V-+U(H?G9R?XuPij`(!8gX;+1byHNS^xx1C~)a8xHbGwI{0Mp1Y|r_SZ0YnjI%Sh~qQ{G2QTb?dkp1%I{8}2(E_X zJYSo?SF}}txRsB}iUl^uIZY1^_|>tewRfxv_)NR~u_B+3qdxKLsU4Sl zMQW!YYflOCg45}to^UL0CT-WJiMlHF+Uj3q(-qTZU=xfQpgsl7gt7#V#s?0358Gcn z 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