Commit Diff


commit - 1ed36f6257c611d45fc129e4436a63b4513ba59e
commit + 35e7d1ea65e988b0b158fd2aa25cd9bb86f4190d
blob - 193ee72409b8b2a15037f9abbe1ec93489efbd1e (mode 644)
blob + /dev/null
--- apple/Alias.swift
+++ /dev/null
@@ -1,10 +0,0 @@
-import Foundation
-import SwiftUI
-
-struct Alias: Hashable, Codable, Identifiable {
-    var id: Int
-    var recipient: String
-    var destination: String
-    var expiry: String
-    var note: String
-}
\ No newline at end of file
blob - ee70c2e55a9cdf49943c48ccf17bf8db1752792a (mode 644)
blob + /dev/null
--- apple/AliasApp.swift
+++ /dev/null
@@ -1,10 +0,0 @@
-import SwiftUI
-
-@main
-struct AliasApp: App {
-    var body: some Scene {
-        WindowGroup {
-            ContentView()
-        }
-    }
-}
blob - /dev/null
blob + 1d7727f6836df33996b61fa8eec8ac9602905853 (mode 644)
--- /dev/null
+++ apple/Shared/Alias.swift
@@ -0,0 +1,25 @@
+import Foundation
+import SwiftUI
+
+struct Alias: Hashable, Codable, Identifiable {
+    var id: String
+	var recipient: String
+	var destination: String
+	var expiry: Date
+	var note: String
+}
+
+struct fAlias: Hashable, Codable {
+    var Recipient: String
+    var Destination: String
+    var Expiry: String
+    var Note: String
+}
+
+func createAlias(note: String, expiry: Date) -> Void {
+    print("TODO tried to create an alias")
+}
+
+func deleteAlias(recipient: String) -> Void {
+	print("TODO tried to delete \(recipient)")
+}
blob - /dev/null
blob + 2e4904004e9ef2d86622b33d5ace5951419d6e77 (mode 644)
--- /dev/null
+++ apple/Shared/AliasData.swift
@@ -0,0 +1,40 @@
+import Foundation
+
+var aliases: [Alias] = load("aliases.json")
+
+func load(_ filename: String) -> [Alias] {
+    let data: Data
+
+    guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
+        else {
+            fatalError("Couldn't find \(filename) in main bundle.")
+    }
+
+    do {
+        data = try Data(contentsOf: file)
+    } catch {
+        fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
+    }
+
+    do {
+        let decoder = JSONDecoder()
+        var faliases: [fAlias]
+        var aliases = [Alias]()
+        faliases = try decoder.decode([fAlias].self, from: data)
+		let rfc3339 = DateFormatter()
+		rfc3339.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
+		for fa in faliases {
+            let a = Alias(
+                id: fa.Recipient,
+				recipient: fa.Recipient,
+				destination: fa.Destination,
+				expiry: rfc3339.date(from: fa.Expiry) ?? Date(timeIntervalSince1970: 0),
+				note: fa.Note
+			)
+            aliases.append(a)
+        }
+        return aliases
+    } catch {
+        fatalError("Couldn't parse \(filename): \(error)")
+    }
+}
blob - /dev/null
blob + 9eaba13a4141a66a8956d2c31da261e80e4e8b95 (mode 644)
--- /dev/null
+++ apple/Shared/AliasDetail.swift
@@ -0,0 +1,39 @@
+import SwiftUI
+
+struct AliasDetail: View {
+    var alias: Alias
+
+    var body: some View {
+			List {
+				AliasAttribute(key: "Recipient", value: alias.recipient)
+				AliasAttribute(key: "Destination", value: alias.destination)
+				AliasAttribute(key: "Expiry", value: alias.expiry.description)
+				Section(header: Text("Note")) {
+					Text(alias.note)
+				}
+			}
+			.listStyle(.automatic)
+			.navigationTitle(alias.recipient)
+			.toolbar {
+				ToolbarItem(placement: .destructiveAction) {
+					Button(action: {
+						deleteAlias(recipient: alias.recipient)
+					}) {
+						Label("Delete", systemImage: "trash").foregroundColor(.red)
+					}
+				}
+			}
+		}
+}
+
+struct AliasAttribute: View {
+	var key: String
+	var value: String
+	var body: some View {
+		HStack {
+			Text(key).bold()
+			Spacer()
+			Text(value)
+		}
+	}
+}
blob - /dev/null
blob + 0ba64ae6c0442b7d1002d9510c7392aecacf3526 (mode 644)
--- /dev/null
+++ apple/Shared/AliasRow.swift
@@ -0,0 +1,10 @@
+import SwiftUI
+
+struct AliasRow: View {
+	var alias: Alias
+	var body: some View {
+		HStack {
+			Text(alias.recipient)
+		}
+	}
+}
blob - /dev/null
blob + eb8789700816459c1e1480e0b34781d9fb78a1ca (mode 644)
--- /dev/null
+++ apple/Shared/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,11 @@
+{
+  "colors" : [
+    {
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
blob - /dev/null
blob + c136eaff76757e350b64c7b5982d9c1f1dd4481f (mode 644)
--- /dev/null
+++ apple/Shared/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,148 @@
+{
+  "images" : [
+    {
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "size" : "20x20"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "size" : "20x20"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "size" : "29x29"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "size" : "29x29"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "size" : "40x40"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "size" : "40x40"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "2x",
+      "size" : "60x60"
+    },
+    {
+      "idiom" : "iphone",
+      "scale" : "3x",
+      "size" : "60x60"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "size" : "20x20"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "20x20"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "size" : "29x29"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "29x29"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "size" : "40x40"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "40x40"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "1x",
+      "size" : "76x76"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "76x76"
+    },
+    {
+      "idiom" : "ipad",
+      "scale" : "2x",
+      "size" : "83.5x83.5"
+    },
+    {
+      "idiom" : "ios-marketing",
+      "scale" : "1x",
+      "size" : "1024x1024"
+    },
+    {
+      "idiom" : "mac",
+      "scale" : "1x",
+      "size" : "16x16"
+    },
+    {
+      "idiom" : "mac",
+      "scale" : "2x",
+      "size" : "16x16"
+    },
+    {
+      "idiom" : "mac",
+      "scale" : "1x",
+      "size" : "32x32"
+    },
+    {
+      "idiom" : "mac",
+      "scale" : "2x",
+      "size" : "32x32"
+    },
+    {
+      "idiom" : "mac",
+      "scale" : "1x",
+      "size" : "128x128"
+    },
+    {
+      "idiom" : "mac",
+      "scale" : "2x",
+      "size" : "128x128"
+    },
+    {
+      "idiom" : "mac",
+      "scale" : "1x",
+      "size" : "256x256"
+    },
+    {
+      "idiom" : "mac",
+      "scale" : "2x",
+      "size" : "256x256"
+    },
+    {
+      "idiom" : "mac",
+      "scale" : "1x",
+      "size" : "512x512"
+    },
+    {
+      "idiom" : "mac",
+      "scale" : "2x",
+      "size" : "512x512"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
blob - /dev/null
blob + 73c00596a7fca3f3d4bdd64053b69d86745f9e10 (mode 644)
--- /dev/null
+++ apple/Shared/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
blob - /dev/null
blob + 833de7c1dda364a437a3c8d23bb4329e1d5477e2 (mode 644)
--- /dev/null
+++ apple/Shared/aliases.json
@@ -0,0 +1,14 @@
+[
+    {
+        "Recipient": "windclothes_isoamarine17",
+        "Destination": "o@olowe.co",
+        "Expiry": "1970-01-01T00:00:00Z",
+        "Note": "for Acme Insurance marketing mail"
+    },
+    {
+        "Recipient": "kotukutuku_cryptogamic30",
+        "Destination": "o@olowe.co",
+        "Expiry": "2023-06-10T10:23:45Z",
+        "Note": "newsletter for spam.example.org"
+    }
+]
blob - /dev/null
blob + 6e254c565bfa91f843fd20f222472df2245483d9 (mode 644)
--- /dev/null
+++ apple/Shared/mailmuxApp.swift
@@ -0,0 +1,80 @@
+import SwiftUI
+
+@main
+struct mailmuxApp: App {
+    var body: some Scene {
+        WindowGroup {
+            ContentView()
+        }
+        .commands {
+            CommandGroup(after: CommandGroupPlacement.newItem) {
+                Button("New Alias...", action: {
+                    print("clicked new from menu")
+                })
+            }
+        }
+        #if os(macOS)
+        Settings {
+            Preferences()
+        }
+        #endif
+    }
+}
+
+struct ContentView: View {
+    var body: some View {
+        AliasList(aliases: aliases)
+    }
+}
+
+struct AliasList: View {
+    var aliases: [Alias]
+    @State private var createPresented: Bool = false
+    var body: some View {
+        NavigationView {
+            List(aliases) { alias in
+                NavigationLink {
+                    AliasDetail(alias: alias)
+                }
+                label: {
+                    AliasRow(alias: alias)
+                }
+            }
+            .navigationTitle("Aliases")
+            .sheet(isPresented: $createPresented) {
+                Create(presented: $createPresented)
+            }
+            .toolbar {
+				ToolbarItem(placement: .primaryAction) {
+                    Button(action: {
+                        createPresented = true
+                    }) {
+                        Label("Create", systemImage: "plus")
+                    }
+                }
+            }
+        }
+    }
+}
+						
+struct CredentialsForm: View {
+	@AppStorage("username") private var username = ""
+	@AppStorage("password") private var password = ""
+
+	var body: some View {
+		Form {
+			TextField(text: $username, prompt: Text("me@example.com")) {
+				Text("Username:")
+			}
+			SecureField(text: $password, prompt: Text("Required")) {
+				Text("Password:")
+			}
+		}
+	}
+}
+
+struct ContentView_Previews: PreviewProvider {
+    static var previews: some View {
+        ContentView()
+    }
+}
blob - 1a4f6ecc8d51ee6db1cf36fd216aa631bcce0d71 (mode 644)
blob + /dev/null
--- apple/AliasData.swift
+++ /dev/null
@@ -1,25 +0,0 @@
-import Foundation
-
-var aliases: [Alias] = load("aliases.json")
-
-func load<T: Decodable>(_ filename: String) -> T {
-    let data: Data
-
-    guard let file = Bundle.main.url(forResource: filename, withExtension: nil)
-        else {
-            fatalError("Couldn't find \(filename) in main bundle.")
-    }
-
-    do {
-        data = try Data(contentsOf: file)
-    } catch {
-        fatalError("Couldn't load \(filename) from main bundle:\n\(error)")
-    }
-
-    do {
-        let decoder = JSONDecoder()
-        return try decoder.decode(T.self, from: data)
-    } catch {
-        fatalError("Couldn't parse \(filename) as \(T.self):\n\(error)")
-    }
-}
blob - /dev/null
blob + 801d4508191112976ad8efbcbc377429c0926e8c (mode 644)
--- /dev/null
+++ apple/iOS/Create.swift
@@ -0,0 +1,33 @@
+import SwiftUI
+
+struct Create: View {
+    @Binding var presented: Bool
+    @State private var note = ""
+    @State private var expiry = Date()
+    var body: some View {
+        NavigationView {
+            Form {
+                DatePicker("Expiry:", selection: $expiry, in: PartialRangeFrom(Date()))
+                Section(header: Text("Note")) {
+                    TextEditor(text: $note)
+                }
+            }
+            .toolbar {
+                ToolbarItem(placement: .confirmationAction) {
+                    Button("Create", action: {
+                        createAlias(note: note, expiry: expiry)
+                        presented = false
+                    })
+                    .keyboardShortcut(.return)
+                }
+                ToolbarItem(placement: .cancellationAction) {
+                    Button("Cancel", action: {
+                        presented = false
+                    })
+                    .keyboardShortcut(.cancelAction)
+                }
+            }
+
+        }
+    }
+}
blob - /dev/null
blob + 6ae8ce1425c4b42fd87fd78105f6c9d965663378 (mode 644)
--- /dev/null
+++ apple/iOS/Settings.swift
@@ -0,0 +1,7 @@
+import SwiftUI
+
+struct Settings: View {
+    var body: some View {
+        CredentialsForm()
+    }
+}
blob - 38af6c41384a010c8dfa4f15d470d4f0d35f4936 (mode 644)
blob + /dev/null
--- apple/AliasDetail.swift
+++ /dev/null
@@ -1,31 +0,0 @@
-import SwiftUI
-
-struct AliasDetail: View {
-	var alias: Alias
-
-	var body: some View {
-		ScrollView {
-			VStack(alignment: .leading) {
-				Text(alias.recipient)
-					.font(.title)
-
-                HStack {
-                    Text("Delivers to \(alias.destination)")
-                    Spacer()
-                    Text("Expires \(alias.expiry)")
-                }
-                	.font(.subheadline)
-                	.foregroundColor(.secondary)
-
-                Divider()
-
-                Text("Note")
-                    .font(.title2)
-                Text(alias.note)
-            }
-            .padding()
-        }
-        .navigationTitle(alias.recipient)
-        .navigationBarTitleDisplayMode(.inline)
-    }
-}
\ No newline at end of file
blob - /dev/null
blob + e1f94bbb40f8ed1739ba272652318d701a8a4d18 (mode 644)
--- /dev/null
+++ apple/macOS/Create.swift
@@ -0,0 +1,27 @@
+import SwiftUI
+
+struct Create: View {
+    @Binding var presented: Bool
+    @State private var note = ""
+    @State private var expiry = Date()
+    var body: some View {
+        Spacer()
+        HStack {
+            Spacer()
+            Form {
+				DatePicker("Expiry:", selection: $expiry, in: PartialRangeFrom(Date()))
+				TextField("Note:", text: $note, prompt: Text("Optional"))
+                HStack {
+                    Button("Cancel", action: {
+                        presented = false
+                    }).keyboardShortcut(.cancelAction)
+                    Button("Create", action: {
+                        createAlias(note: note, expiry: expiry)
+                    }).keyboardShortcut(.return)
+                }
+            }
+            Spacer()
+        }
+        Spacer()
+    }
+}
blob - /dev/null
blob + 983e6002d278b14e1d2d88402e885aa98ebdb151 (mode 644)
--- /dev/null
+++ apple/macOS/Preferences.swift
@@ -0,0 +1,13 @@
+import SwiftUI
+
+struct Preferences: View {
+    var body: some View {
+        Spacer()
+        HStack {
+            Spacer()
+            CredentialsForm()
+            Spacer()
+        }
+        Spacer()
+    }
+}
blob - /dev/null
blob + f2ef3ae0265b40c475e8ef90e3a311c31786c594 (mode 644)
--- /dev/null
+++ apple/macOS/macOS.entitlements
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+    <key>com.apple.security.app-sandbox</key>
+    <true/>
+    <key>com.apple.security.files.user-selected.read-only</key>
+    <true/>
+</dict>
+</plist>
blob - 77b4451c90fc7372139d078016fe037b55378461 (mode 644)
blob + /dev/null
--- apple/AliasList.swift
+++ /dev/null
@@ -1,22 +0,0 @@
-import SwiftUI
-
-struct AliasList: View {
-    var body: some View {
-        NavigationView {
-            List(aliases) { alias in
-                NavigationLink {
-                    AliasDetail(alias: alias)
-                } label: {
-                    AliasRow(alias: alias)
-                }
-            }
-            .navigationTitle("Aliases")
-        }
-    }
-}
-
-struct LandmarkList_Previews: PreviewProvider {
-    static var previews: some View {
-		AliasList()
-    }
-}
blob - /dev/null
blob + a3f6560f003e204b3f28e611394adc841c641f48 (mode 644)
--- /dev/null
+++ apple/mailmux.xcodeproj/project.pbxproj
@@ -0,0 +1,745 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 55;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		405422A8282E36E700B778CF /* Tests_iOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 405422A7282E36E700B778CF /* Tests_iOS.swift */; };
+		405422AA282E36E700B778CF /* Tests_iOSLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 405422A9282E36E700B778CF /* Tests_iOSLaunchTests.swift */; };
+		405422B4282E36E700B778CF /* Tests_macOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 405422B3282E36E700B778CF /* Tests_macOS.swift */; };
+		405422B6282E36E700B778CF /* Tests_macOSLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 405422B5282E36E700B778CF /* Tests_macOSLaunchTests.swift */; };
+		405422B8282E36E700B778CF /* mailmuxApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4054228F282E36E400B778CF /* mailmuxApp.swift */; };
+		405422BB282E36E700B778CF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 40542291282E36E700B778CF /* Assets.xcassets */; };
+		405422BC282E36E700B778CF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 40542291282E36E700B778CF /* Assets.xcassets */; };
+		405422D4282E38A100B778CF /* AliasList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 405422CB282E38A100B778CF /* AliasList.swift */; };
+		405422D5282E38A100B778CF /* aliases.json in Resources */ = {isa = PBXBuildFile; fileRef = 405422CC282E38A100B778CF /* aliases.json */; };
+		405422D8282E38A100B778CF /* AliasData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 405422CF282E38A100B778CF /* AliasData.swift */; };
+		405422DA282E38A100B778CF /* Alias.swift in Sources */ = {isa = PBXBuildFile; fileRef = 405422D1282E38A100B778CF /* Alias.swift */; };
+		405422DC282E38A100B778CF /* AliasRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 405422D3282E38A100B778CF /* AliasRow.swift */; };
+		4068C10D282E730300455B04 /* mailmuxApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4054228F282E36E400B778CF /* mailmuxApp.swift */; };
+		4068C10E282E730600455B04 /* Alias.swift in Sources */ = {isa = PBXBuildFile; fileRef = 405422D1282E38A100B778CF /* Alias.swift */; };
+		4068C10F282E730900455B04 /* AliasData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 405422CF282E38A100B778CF /* AliasData.swift */; };
+		4068C110282E730C00455B04 /* AliasRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 405422D3282E38A100B778CF /* AliasRow.swift */; };
+		4068C111282E730F00455B04 /* AliasList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 405422CB282E38A100B778CF /* AliasList.swift */; };
+		4068C113282E732E00455B04 /* aliases.json in Resources */ = {isa = PBXBuildFile; fileRef = 405422CC282E38A100B778CF /* aliases.json */; };
+		4068C115282E74A300455B04 /* Create.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4068C114282E74A300455B04 /* Create.swift */; };
+		408C2D95282E8DEF00540E59 /* Create.swift in Sources */ = {isa = PBXBuildFile; fileRef = 408C2D94282E8DEF00540E59 /* Create.swift */; };
+		408C2D97282E9B1600540E59 /* Settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 408C2D96282E9B1600540E59 /* Settings.swift */; };
+		40E153E5282E6CF900D30F9B /* Preferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40E153E4282E6CF900D30F9B /* Preferences.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+		405422A4282E36E700B778CF /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 4054228A282E36E400B778CF /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 40542295282E36E700B778CF;
+			remoteInfo = "mailmux (iOS)";
+		};
+		405422B0282E36E700B778CF /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 4054228A282E36E400B778CF /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 4054229B282E36E700B778CF;
+			remoteInfo = "mailmux (macOS)";
+		};
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+		4054228F282E36E400B778CF /* mailmuxApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = mailmuxApp.swift; sourceTree = "<group>"; };
+		40542291282E36E700B778CF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+		40542296282E36E700B778CF /* mailmux.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = mailmux.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		4054229C282E36E700B778CF /* mailmux.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = mailmux.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		4054229E282E36E700B778CF /* macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = macOS.entitlements; sourceTree = "<group>"; };
+		405422A3282E36E700B778CF /* Tests iOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Tests iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
+		405422A7282E36E700B778CF /* Tests_iOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_iOS.swift; sourceTree = "<group>"; };
+		405422A9282E36E700B778CF /* Tests_iOSLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_iOSLaunchTests.swift; sourceTree = "<group>"; };
+		405422AF282E36E700B778CF /* Tests macOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Tests macOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
+		405422B3282E36E700B778CF /* Tests_macOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_macOS.swift; sourceTree = "<group>"; };
+		405422B5282E36E700B778CF /* Tests_macOSLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests_macOSLaunchTests.swift; sourceTree = "<group>"; };
+		405422CB282E38A100B778CF /* AliasList.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AliasList.swift; path = Shared/AliasList.swift; sourceTree = SOURCE_ROOT; };
+		405422CC282E38A100B778CF /* aliases.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = aliases.json; path = Shared/aliases.json; sourceTree = SOURCE_ROOT; };
+		405422CF282E38A100B778CF /* AliasData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AliasData.swift; path = Shared/AliasData.swift; sourceTree = SOURCE_ROOT; };
+		405422D1282E38A100B778CF /* Alias.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Alias.swift; path = Shared/Alias.swift; sourceTree = SOURCE_ROOT; };
+		405422D3282E38A100B778CF /* AliasRow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AliasRow.swift; path = Shared/AliasRow.swift; sourceTree = SOURCE_ROOT; };
+		4068C114282E74A300455B04 /* Create.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Create.swift; sourceTree = "<group>"; };
+		408C2D94282E8DEF00540E59 /* Create.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Create.swift; sourceTree = "<group>"; };
+		408C2D96282E9B1600540E59 /* Settings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Settings.swift; sourceTree = "<group>"; };
+		40E153E4282E6CF900D30F9B /* Preferences.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Preferences.swift; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		40542293282E36E700B778CF /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		40542299282E36E700B778CF /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		405422A0282E36E700B778CF /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		405422AC282E36E700B778CF /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		40542289282E36E400B778CF = {
+			isa = PBXGroup;
+			children = (
+				408C2D93282E8DE400540E59 /* iOS */,
+				4054228E282E36E400B778CF /* Shared */,
+				4054229D282E36E700B778CF /* macOS */,
+				405422A6282E36E700B778CF /* Tests iOS */,
+				405422B2282E36E700B778CF /* Tests macOS */,
+				40542297282E36E700B778CF /* Products */,
+			);
+			sourceTree = "<group>";
+		};
+		4054228E282E36E400B778CF /* Shared */ = {
+			isa = PBXGroup;
+			children = (
+				4054228F282E36E400B778CF /* mailmuxApp.swift */,
+				405422D1282E38A100B778CF /* Alias.swift */,
+				405422CF282E38A100B778CF /* AliasData.swift */,
+				405422D3282E38A100B778CF /* AliasRow.swift */,
+				405422CB282E38A100B778CF /* AliasList.swift */,
+				40542291282E36E700B778CF /* Assets.xcassets */,
+				405422CC282E38A100B778CF /* aliases.json */,
+			);
+			path = Shared;
+			sourceTree = "<group>";
+			usesTabs = 1;
+		};
+		40542297282E36E700B778CF /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				40542296282E36E700B778CF /* mailmux.app */,
+				4054229C282E36E700B778CF /* mailmux.app */,
+				405422A3282E36E700B778CF /* Tests iOS.xctest */,
+				405422AF282E36E700B778CF /* Tests macOS.xctest */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		4054229D282E36E700B778CF /* macOS */ = {
+			isa = PBXGroup;
+			children = (
+				4068C114282E74A300455B04 /* Create.swift */,
+				40E153E4282E6CF900D30F9B /* Preferences.swift */,
+				4054229E282E36E700B778CF /* macOS.entitlements */,
+			);
+			path = macOS;
+			sourceTree = "<group>";
+		};
+		405422A6282E36E700B778CF /* Tests iOS */ = {
+			isa = PBXGroup;
+			children = (
+				405422A7282E36E700B778CF /* Tests_iOS.swift */,
+				405422A9282E36E700B778CF /* Tests_iOSLaunchTests.swift */,
+			);
+			path = "Tests iOS";
+			sourceTree = "<group>";
+		};
+		405422B2282E36E700B778CF /* Tests macOS */ = {
+			isa = PBXGroup;
+			children = (
+				405422B3282E36E700B778CF /* Tests_macOS.swift */,
+				405422B5282E36E700B778CF /* Tests_macOSLaunchTests.swift */,
+			);
+			path = "Tests macOS";
+			sourceTree = "<group>";
+		};
+		408C2D93282E8DE400540E59 /* iOS */ = {
+			isa = PBXGroup;
+			children = (
+				408C2D94282E8DEF00540E59 /* Create.swift */,
+				408C2D96282E9B1600540E59 /* Settings.swift */,
+			);
+			path = iOS;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		40542295282E36E700B778CF /* mailmux (iOS) */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 405422BF282E36E700B778CF /* Build configuration list for PBXNativeTarget "mailmux (iOS)" */;
+			buildPhases = (
+				40542292282E36E700B778CF /* Sources */,
+				40542293282E36E700B778CF /* Frameworks */,
+				40542294282E36E700B778CF /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = "mailmux (iOS)";
+			productName = "mailmux (iOS)";
+			productReference = 40542296282E36E700B778CF /* mailmux.app */;
+			productType = "com.apple.product-type.application";
+		};
+		4054229B282E36E700B778CF /* mailmux (macOS) */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 405422C2282E36E700B778CF /* Build configuration list for PBXNativeTarget "mailmux (macOS)" */;
+			buildPhases = (
+				40542298282E36E700B778CF /* Sources */,
+				40542299282E36E700B778CF /* Frameworks */,
+				4054229A282E36E700B778CF /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = "mailmux (macOS)";
+			productName = "mailmux (macOS)";
+			productReference = 4054229C282E36E700B778CF /* mailmux.app */;
+			productType = "com.apple.product-type.application";
+		};
+		405422A2282E36E700B778CF /* Tests iOS */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 405422C5282E36E700B778CF /* Build configuration list for PBXNativeTarget "Tests iOS" */;
+			buildPhases = (
+				4054229F282E36E700B778CF /* Sources */,
+				405422A0282E36E700B778CF /* Frameworks */,
+				405422A1282E36E700B778CF /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				405422A5282E36E700B778CF /* PBXTargetDependency */,
+			);
+			name = "Tests iOS";
+			productName = "Tests iOS";
+			productReference = 405422A3282E36E700B778CF /* Tests iOS.xctest */;
+			productType = "com.apple.product-type.bundle.ui-testing";
+		};
+		405422AE282E36E700B778CF /* Tests macOS */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 405422C8282E36E700B778CF /* Build configuration list for PBXNativeTarget "Tests macOS" */;
+			buildPhases = (
+				405422AB282E36E700B778CF /* Sources */,
+				405422AC282E36E700B778CF /* Frameworks */,
+				405422AD282E36E700B778CF /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				405422B1282E36E700B778CF /* PBXTargetDependency */,
+			);
+			name = "Tests macOS";
+			productName = "Tests macOS";
+			productReference = 405422AF282E36E700B778CF /* Tests macOS.xctest */;
+			productType = "com.apple.product-type.bundle.ui-testing";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		4054228A282E36E400B778CF /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				BuildIndependentTargetsInParallel = 1;
+				LastSwiftUpdateCheck = 1330;
+				LastUpgradeCheck = 1330;
+				TargetAttributes = {
+					40542295282E36E700B778CF = {
+						CreatedOnToolsVersion = 13.3.1;
+					};
+					4054229B282E36E700B778CF = {
+						CreatedOnToolsVersion = 13.3.1;
+					};
+					405422A2282E36E700B778CF = {
+						CreatedOnToolsVersion = 13.3.1;
+						TestTargetID = 40542295282E36E700B778CF;
+					};
+					405422AE282E36E700B778CF = {
+						CreatedOnToolsVersion = 13.3.1;
+						TestTargetID = 4054229B282E36E700B778CF;
+					};
+				};
+			};
+			buildConfigurationList = 4054228D282E36E400B778CF /* Build configuration list for PBXProject "mailmux" */;
+			compatibilityVersion = "Xcode 13.0";
+			developmentRegion = en;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+				Base,
+			);
+			mainGroup = 40542289282E36E400B778CF;
+			productRefGroup = 40542297282E36E700B778CF /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				40542295282E36E700B778CF /* mailmux (iOS) */,
+				4054229B282E36E700B778CF /* mailmux (macOS) */,
+				405422A2282E36E700B778CF /* Tests iOS */,
+				405422AE282E36E700B778CF /* Tests macOS */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		40542294282E36E700B778CF /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				4068C113282E732E00455B04 /* aliases.json in Resources */,
+				405422BB282E36E700B778CF /* Assets.xcassets in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		4054229A282E36E700B778CF /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				405422D5282E38A100B778CF /* aliases.json in Resources */,
+				405422BC282E36E700B778CF /* Assets.xcassets in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		405422A1282E36E700B778CF /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		405422AD282E36E700B778CF /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		40542292282E36E700B778CF /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				4068C10E282E730600455B04 /* Alias.swift in Sources */,
+				4068C10F282E730900455B04 /* AliasData.swift in Sources */,
+				4068C10D282E730300455B04 /* mailmuxApp.swift in Sources */,
+				4068C110282E730C00455B04 /* AliasRow.swift in Sources */,
+				408C2D97282E9B1600540E59 /* Settings.swift in Sources */,
+				408C2D95282E8DEF00540E59 /* Create.swift in Sources */,
+				4068C111282E730F00455B04 /* AliasList.swift in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		40542298282E36E700B778CF /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				405422DA282E38A100B778CF /* Alias.swift in Sources */,
+				405422DC282E38A100B778CF /* AliasRow.swift in Sources */,
+				405422B8282E36E700B778CF /* mailmuxApp.swift in Sources */,
+				405422D4282E38A100B778CF /* AliasList.swift in Sources */,
+				40E153E5282E6CF900D30F9B /* Preferences.swift in Sources */,
+				4068C115282E74A300455B04 /* Create.swift in Sources */,
+				405422D8282E38A100B778CF /* AliasData.swift in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		4054229F282E36E700B778CF /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				405422AA282E36E700B778CF /* Tests_iOSLaunchTests.swift in Sources */,
+				405422A8282E36E700B778CF /* Tests_iOS.swift in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		405422AB282E36E700B778CF /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				405422B6282E36E700B778CF /* Tests_macOSLaunchTests.swift in Sources */,
+				405422B4282E36E700B778CF /* Tests_macOS.swift in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+		405422A5282E36E700B778CF /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 40542295282E36E700B778CF /* mailmux (iOS) */;
+			targetProxy = 405422A4282E36E700B778CF /* PBXContainerItemProxy */;
+		};
+		405422B1282E36E700B778CF /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 4054229B282E36E700B778CF /* mailmux (macOS) */;
+			targetProxy = 405422B0282E36E700B778CF /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+		405422BD282E36E700B778CF /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_ENABLE_OBJC_WEAK = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+				MTL_FAST_MATH = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+			};
+			name = Debug;
+		};
+		405422BE282E36E700B778CF /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_ENABLE_OBJC_WEAK = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				MTL_FAST_MATH = YES;
+				SWIFT_COMPILATION_MODE = wholemodule;
+				SWIFT_OPTIMIZATION_LEVEL = "-O";
+			};
+			name = Release;
+		};
+		405422C0282E36E700B778CF /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+				CODE_SIGN_STYLE = Automatic;
+				CURRENT_PROJECT_VERSION = 1;
+				ENABLE_PREVIEWS = YES;
+				GENERATE_INFOPLIST_FILE = YES;
+				INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
+				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+				INFOPLIST_KEY_UILaunchScreen_Generation = YES;
+				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+				IPHONEOS_DEPLOYMENT_TARGET = 15.4;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+				);
+				MARKETING_VERSION = 1.0;
+				PRODUCT_BUNDLE_IDENTIFIER = net.mailmux.mailmux;
+				PRODUCT_NAME = mailmux;
+				SDKROOT = iphoneos;
+				SWIFT_EMIT_LOC_STRINGS = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = "1,2";
+			};
+			name = Debug;
+		};
+		405422C1282E36E700B778CF /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+				CODE_SIGN_STYLE = Automatic;
+				CURRENT_PROJECT_VERSION = 1;
+				ENABLE_PREVIEWS = YES;
+				GENERATE_INFOPLIST_FILE = YES;
+				INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
+				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+				INFOPLIST_KEY_UILaunchScreen_Generation = YES;
+				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+				IPHONEOS_DEPLOYMENT_TARGET = 15.4;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+				);
+				MARKETING_VERSION = 1.0;
+				PRODUCT_BUNDLE_IDENTIFIER = net.mailmux.mailmux;
+				PRODUCT_NAME = mailmux;
+				SDKROOT = iphoneos;
+				SWIFT_EMIT_LOC_STRINGS = YES;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		405422C3282E36E700B778CF /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+				CODE_SIGN_ENTITLEMENTS = macOS/macOS.entitlements;
+				CODE_SIGN_STYLE = Automatic;
+				COMBINE_HIDPI_IMAGES = YES;
+				CURRENT_PROJECT_VERSION = 1;
+				ENABLE_PREVIEWS = YES;
+				GENERATE_INFOPLIST_FILE = YES;
+				INFOPLIST_KEY_NSHumanReadableCopyright = "";
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/../Frameworks",
+				);
+				MACOSX_DEPLOYMENT_TARGET = 12.3;
+				MARKETING_VERSION = 1.0;
+				PRODUCT_BUNDLE_IDENTIFIER = net.mailmux.mailmux;
+				PRODUCT_NAME = mailmux;
+				SDKROOT = macosx;
+				SWIFT_EMIT_LOC_STRINGS = YES;
+				SWIFT_VERSION = 5.0;
+			};
+			name = Debug;
+		};
+		405422C4282E36E700B778CF /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+				CODE_SIGN_ENTITLEMENTS = macOS/macOS.entitlements;
+				CODE_SIGN_STYLE = Automatic;
+				COMBINE_HIDPI_IMAGES = YES;
+				CURRENT_PROJECT_VERSION = 1;
+				ENABLE_PREVIEWS = YES;
+				GENERATE_INFOPLIST_FILE = YES;
+				INFOPLIST_KEY_NSHumanReadableCopyright = "";
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/../Frameworks",
+				);
+				MACOSX_DEPLOYMENT_TARGET = 12.3;
+				MARKETING_VERSION = 1.0;
+				PRODUCT_BUNDLE_IDENTIFIER = net.mailmux.mailmux;
+				PRODUCT_NAME = mailmux;
+				SDKROOT = macosx;
+				SWIFT_EMIT_LOC_STRINGS = YES;
+				SWIFT_VERSION = 5.0;
+			};
+			name = Release;
+		};
+		405422C6282E36E700B778CF /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+				CODE_SIGN_STYLE = Automatic;
+				CURRENT_PROJECT_VERSION = 1;
+				GENERATE_INFOPLIST_FILE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 15.4;
+				MARKETING_VERSION = 1.0;
+				PRODUCT_BUNDLE_IDENTIFIER = "net.mailmux.Tests-iOS";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SDKROOT = iphoneos;
+				SWIFT_EMIT_LOC_STRINGS = NO;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				TEST_TARGET_NAME = "mailmux (iOS)";
+			};
+			name = Debug;
+		};
+		405422C7282E36E700B778CF /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+				CODE_SIGN_STYLE = Automatic;
+				CURRENT_PROJECT_VERSION = 1;
+				GENERATE_INFOPLIST_FILE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 15.4;
+				MARKETING_VERSION = 1.0;
+				PRODUCT_BUNDLE_IDENTIFIER = "net.mailmux.Tests-iOS";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SDKROOT = iphoneos;
+				SWIFT_EMIT_LOC_STRINGS = NO;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				TEST_TARGET_NAME = "mailmux (iOS)";
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		405422C9282E36E700B778CF /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+				CODE_SIGN_STYLE = Automatic;
+				CURRENT_PROJECT_VERSION = 1;
+				GENERATE_INFOPLIST_FILE = YES;
+				MACOSX_DEPLOYMENT_TARGET = 12.3;
+				MARKETING_VERSION = 1.0;
+				PRODUCT_BUNDLE_IDENTIFIER = "net.mailmux.Tests-macOS";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SDKROOT = macosx;
+				SWIFT_EMIT_LOC_STRINGS = NO;
+				SWIFT_VERSION = 5.0;
+				TEST_TARGET_NAME = "mailmux (macOS)";
+			};
+			name = Debug;
+		};
+		405422CA282E36E700B778CF /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+				CODE_SIGN_STYLE = Automatic;
+				CURRENT_PROJECT_VERSION = 1;
+				GENERATE_INFOPLIST_FILE = YES;
+				MACOSX_DEPLOYMENT_TARGET = 12.3;
+				MARKETING_VERSION = 1.0;
+				PRODUCT_BUNDLE_IDENTIFIER = "net.mailmux.Tests-macOS";
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SDKROOT = macosx;
+				SWIFT_EMIT_LOC_STRINGS = NO;
+				SWIFT_VERSION = 5.0;
+				TEST_TARGET_NAME = "mailmux (macOS)";
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		4054228D282E36E400B778CF /* Build configuration list for PBXProject "mailmux" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				405422BD282E36E700B778CF /* Debug */,
+				405422BE282E36E700B778CF /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		405422BF282E36E700B778CF /* Build configuration list for PBXNativeTarget "mailmux (iOS)" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				405422C0282E36E700B778CF /* Debug */,
+				405422C1282E36E700B778CF /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		405422C2282E36E700B778CF /* Build configuration list for PBXNativeTarget "mailmux (macOS)" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				405422C3282E36E700B778CF /* Debug */,
+				405422C4282E36E700B778CF /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		405422C5282E36E700B778CF /* Build configuration list for PBXNativeTarget "Tests iOS" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				405422C6282E36E700B778CF /* Debug */,
+				405422C7282E36E700B778CF /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		405422C8282E36E700B778CF /* Build configuration list for PBXNativeTarget "Tests macOS" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				405422C9282E36E700B778CF /* Debug */,
+				405422CA282E36E700B778CF /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 4054228A282E36E400B778CF /* Project object */;
+}
blob - /dev/null
blob + 919434a6254f0e9651f402737811be6634a03e9c (mode 644)
--- /dev/null
+++ apple/mailmux.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "self:">
+   </FileRef>
+</Workspace>
blob - /dev/null
blob + 18d981003d68d0546c4804ac2ff47dd97c6e7921 (mode 644)
--- /dev/null
+++ apple/mailmux.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>
blob - /dev/null
blob + 3faa664ef66e1539df9d1ad48962039e29646a90 (mode 644)
Binary files /dev/null and apple/mailmux.xcodeproj/project.xcworkspace/xcuserdata/otl.xcuserdatad/UserInterfaceState.xcuserstate differ
blob - /dev/null
blob + 2e0c08c1054ad49fe3b0478a470b3d4398aaec68 (mode 644)
--- /dev/null
+++ apple/mailmux.xcodeproj/xcuserdata/otl.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Bucket
+   uuid = "651B7C64-B5E4-4708-B946-D37D92590821"
+   type = "1"
+   version = "2.0">
+</Bucket>
blob - /dev/null
blob + b5c30e0501b4caeb0bff655b62f2d7aa147d29df (mode 644)
--- /dev/null
+++ apple/mailmux.xcodeproj/xcuserdata/otl.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>SchemeUserState</key>
+	<dict>
+		<key>mailmux (iOS).xcscheme_^#shared#^_</key>
+		<dict>
+			<key>orderHint</key>
+			<integer>1</integer>
+		</dict>
+		<key>mailmux (macOS).xcscheme_^#shared#^_</key>
+		<dict>
+			<key>orderHint</key>
+			<integer>0</integer>
+		</dict>
+	</dict>
+</dict>
+</plist>
blob - 39d0dd052dfbd852651230635bb6780dbd1337d3 (mode 644)
blob + /dev/null
--- apple/AliasRow.swift
+++ /dev/null
@@ -1,21 +0,0 @@
-import SwiftUI
-
-struct AliasRow: View {
-    var alias: Alias
-
-	var body: some View {
-		HStack {
-			Text(alias.recipient)
-		}
-	}
-}
-
-struct LandmarkRow_Previews: PreviewProvider {
-	static var previews: some View {
-		Group {
-			AliasRow(alias: aliases[0])
-            AliasRow(alias: aliases[1])
-		}
-		.previewLayout(.fixed(width: 300, height: 70))
-	}
-}
blob - a4fc745a011e67b81d1c1bc2732d56e8f5d55a15 (mode 644)
blob + /dev/null
--- apple/ContentView.swift
+++ /dev/null
@@ -1,13 +0,0 @@
-import SwiftUI
-
-struct ContentView: View {
-    var body: some View {
-        AliasList()
-    }
-}
-
-struct ContentView_Previews: PreviewProvider {
-    static var previews: some View {
-        ContentView()
-    }
-}
blob - 09888a84e017e83bc71e1e843ba854aad514ef1f (mode 644)
blob + /dev/null
--- apple/Login.swift
+++ /dev/null
@@ -1,13 +0,0 @@
-import SwiftUI
-
-struct Login: View {
-	var body: some View {
-		Form {
-			TextField(text: $username, prompt: Text("me@example.com")) {
-				Text("Username")
-		}
-			SecureField(text: $password, prompt: Text("Required")) {
-				Text("Password")
-		}
-	}
-}
\ No newline at end of file
blob - a8aba7b257748713587713472bae813d4ef56353
blob + 8fe5766bd560d0ad5698e0ff91814aaf5e263b2f
--- apple/README
+++ apple/README
@@ -1,2 +1 @@
-This is untested barebones SwiftUI code for creating a CRUD macOS, iOS, iPadOS
-app for mailmux.
+A macOS, iOS, iPadOS app for interacting with mailmux as a non-administrative user.
blob - aa73bf51dee87c2735db641552498e2e93b21b03 (mode 644)
blob + /dev/null
--- apple/aliases.json
+++ /dev/null
@@ -1,14 +0,0 @@
-[
-    {
-        "Recipient": "windclothes_isoamarine17",
-        "Destination": "o@olowe.co",
-        "Expiry": "1970-01-01T00:00:00Z",
-        "Note": ""
-    },
-    {
-        "Recipient": "kotukutuku_cryptogamic30",
-        "Destination": "o@olowe.co",
-        "Expiry": "1970-01-01T00:00:00Z",
-        "Note": ""
-    }
-]
\ No newline at end of file