From bcfb41917ac0d28378fdb332d558bb15416ecf2d Mon Sep 17 00:00:00 2001 From: Oleksandr Kozachuk Date: Mon, 26 Jun 2023 17:53:16 +0200 Subject: [PATCH] Add App. --- app/ChatMasterMind.xcodeproj/project.pbxproj | 687 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 5 + .../xcshareddata/swiftpm/Package.resolved | 50 ++ .../UserInterfaceState.xcuserstate | Bin 0 -> 37936 bytes .../WorkspaceSettings.xcsettings | 14 + .../xcschemes/xcschememanagement.plist | 14 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 63 ++ .../Assets.xcassets/Contents.json | 6 + app/ChatMasterMind/ChatData.swift | 58 ++ .../ChatMasterMind.entitlements | 22 + app/ChatMasterMind/ChatMasterMindApp.swift | 20 + app/ChatMasterMind/ContentView.swift | 159 ++++ app/ChatMasterMind/Info.plist | 10 + .../Preview Assets.xcassets/Contents.json | 6 + .../ChatMasterMindTests.swift | 35 + .../ChatMasterMindUITests.swift | 41 ++ .../ChatMasterMindUITestsLaunchTests.swift | 32 + 20 files changed, 1248 insertions(+) create mode 100644 app/ChatMasterMind.xcodeproj/project.pbxproj create mode 100644 app/ChatMasterMind.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 app/ChatMasterMind.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 app/ChatMasterMind.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 app/ChatMasterMind.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 app/ChatMasterMind.xcodeproj/project.xcworkspace/xcuserdata/ok.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 app/ChatMasterMind.xcodeproj/project.xcworkspace/xcuserdata/ok.xcuserdatad/WorkspaceSettings.xcsettings create mode 100644 app/ChatMasterMind.xcodeproj/xcuserdata/ok.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 app/ChatMasterMind/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 app/ChatMasterMind/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 app/ChatMasterMind/Assets.xcassets/Contents.json create mode 100644 app/ChatMasterMind/ChatData.swift create mode 100644 app/ChatMasterMind/ChatMasterMind.entitlements create mode 100644 app/ChatMasterMind/ChatMasterMindApp.swift create mode 100644 app/ChatMasterMind/ContentView.swift create mode 100644 app/ChatMasterMind/Info.plist create mode 100644 app/ChatMasterMind/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 app/ChatMasterMindTests/ChatMasterMindTests.swift create mode 100644 app/ChatMasterMindUITests/ChatMasterMindUITests.swift create mode 100644 app/ChatMasterMindUITests/ChatMasterMindUITestsLaunchTests.swift diff --git a/app/ChatMasterMind.xcodeproj/project.pbxproj b/app/ChatMasterMind.xcodeproj/project.pbxproj new file mode 100644 index 0000000..ab22070 --- /dev/null +++ b/app/ChatMasterMind.xcodeproj/project.pbxproj @@ -0,0 +1,687 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 4F50EF442A49CE31009BD94E /* MarkdownView in Frameworks */ = {isa = PBXBuildFile; productRef = 4F50EF432A49CE31009BD94E /* MarkdownView */; }; + 4F50EF472A49D012009BD94E /* Highlightr in Frameworks */ = {isa = PBXBuildFile; productRef = 4F50EF462A49D012009BD94E /* Highlightr */; }; + 4F772B052A4706F600D3266B /* ChatMasterMindApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F772B042A4706F600D3266B /* ChatMasterMindApp.swift */; }; + 4F772B072A4706F600D3266B /* ChatData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F772B062A4706F600D3266B /* ChatData.swift */; }; + 4F772B092A4706F600D3266B /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F772B082A4706F600D3266B /* ContentView.swift */; }; + 4F772B0B2A4706F800D3266B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4F772B0A2A4706F800D3266B /* Assets.xcassets */; }; + 4F772B0F2A4706F800D3266B /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4F772B0E2A4706F800D3266B /* Preview Assets.xcassets */; }; + 4F772B1A2A4706F900D3266B /* ChatMasterMindTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F772B192A4706F900D3266B /* ChatMasterMindTests.swift */; }; + 4F772B242A4706F900D3266B /* ChatMasterMindUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F772B232A4706F900D3266B /* ChatMasterMindUITests.swift */; }; + 4F772B262A4706F900D3266B /* ChatMasterMindUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F772B252A4706F900D3266B /* ChatMasterMindUITestsLaunchTests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 4F772B162A4706F900D3266B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4F772AF92A4706F600D3266B /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4F772B002A4706F600D3266B; + remoteInfo = ChatMasterMind; + }; + 4F772B202A4706F900D3266B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 4F772AF92A4706F600D3266B /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4F772B002A4706F600D3266B; + remoteInfo = ChatMasterMind; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 4F772B012A4706F600D3266B /* ChatMasterMind.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ChatMasterMind.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 4F772B042A4706F600D3266B /* ChatMasterMindApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMasterMindApp.swift; sourceTree = ""; }; + 4F772B062A4706F600D3266B /* ChatData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatData.swift; sourceTree = ""; }; + 4F772B082A4706F600D3266B /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 4F772B0A2A4706F800D3266B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 4F772B0C2A4706F800D3266B /* ChatMasterMind.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = ChatMasterMind.entitlements; sourceTree = ""; }; + 4F772B0E2A4706F800D3266B /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 4F772B102A4706F800D3266B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 4F772B152A4706F900D3266B /* ChatMasterMindTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ChatMasterMindTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 4F772B192A4706F900D3266B /* ChatMasterMindTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMasterMindTests.swift; sourceTree = ""; }; + 4F772B1F2A4706F900D3266B /* ChatMasterMindUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ChatMasterMindUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 4F772B232A4706F900D3266B /* ChatMasterMindUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMasterMindUITests.swift; sourceTree = ""; }; + 4F772B252A4706F900D3266B /* ChatMasterMindUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMasterMindUITestsLaunchTests.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 4F772AFE2A4706F600D3266B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4F50EF442A49CE31009BD94E /* MarkdownView in Frameworks */, + 4F50EF472A49D012009BD94E /* Highlightr in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4F772B122A4706F900D3266B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4F772B1C2A4706F900D3266B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 4F772AF82A4706F600D3266B = { + isa = PBXGroup; + children = ( + 4F772B032A4706F600D3266B /* ChatMasterMind */, + 4F772B182A4706F900D3266B /* ChatMasterMindTests */, + 4F772B222A4706F900D3266B /* ChatMasterMindUITests */, + 4F772B022A4706F600D3266B /* Products */, + ); + sourceTree = ""; + }; + 4F772B022A4706F600D3266B /* Products */ = { + isa = PBXGroup; + children = ( + 4F772B012A4706F600D3266B /* ChatMasterMind.app */, + 4F772B152A4706F900D3266B /* ChatMasterMindTests.xctest */, + 4F772B1F2A4706F900D3266B /* ChatMasterMindUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 4F772B032A4706F600D3266B /* ChatMasterMind */ = { + isa = PBXGroup; + children = ( + 4F772B042A4706F600D3266B /* ChatMasterMindApp.swift */, + 4F772B062A4706F600D3266B /* ChatData.swift */, + 4F772B082A4706F600D3266B /* ContentView.swift */, + 4F772B0A2A4706F800D3266B /* Assets.xcassets */, + 4F772B0C2A4706F800D3266B /* ChatMasterMind.entitlements */, + 4F772B102A4706F800D3266B /* Info.plist */, + 4F772B0D2A4706F800D3266B /* Preview Content */, + ); + path = ChatMasterMind; + sourceTree = ""; + }; + 4F772B0D2A4706F800D3266B /* Preview Content */ = { + isa = PBXGroup; + children = ( + 4F772B0E2A4706F800D3266B /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 4F772B182A4706F900D3266B /* ChatMasterMindTests */ = { + isa = PBXGroup; + children = ( + 4F772B192A4706F900D3266B /* ChatMasterMindTests.swift */, + ); + path = ChatMasterMindTests; + sourceTree = ""; + }; + 4F772B222A4706F900D3266B /* ChatMasterMindUITests */ = { + isa = PBXGroup; + children = ( + 4F772B232A4706F900D3266B /* ChatMasterMindUITests.swift */, + 4F772B252A4706F900D3266B /* ChatMasterMindUITestsLaunchTests.swift */, + ); + path = ChatMasterMindUITests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 4F772B002A4706F600D3266B /* ChatMasterMind */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4F772B292A4706F900D3266B /* Build configuration list for PBXNativeTarget "ChatMasterMind" */; + buildPhases = ( + 4F772AFD2A4706F600D3266B /* Sources */, + 4F772AFE2A4706F600D3266B /* Frameworks */, + 4F772AFF2A4706F600D3266B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ChatMasterMind; + packageProductDependencies = ( + 4F50EF432A49CE31009BD94E /* MarkdownView */, + 4F50EF462A49D012009BD94E /* Highlightr */, + ); + productName = ChatMasterMind; + productReference = 4F772B012A4706F600D3266B /* ChatMasterMind.app */; + productType = "com.apple.product-type.application"; + }; + 4F772B142A4706F900D3266B /* ChatMasterMindTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4F772B2C2A4706F900D3266B /* Build configuration list for PBXNativeTarget "ChatMasterMindTests" */; + buildPhases = ( + 4F772B112A4706F900D3266B /* Sources */, + 4F772B122A4706F900D3266B /* Frameworks */, + 4F772B132A4706F900D3266B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4F772B172A4706F900D3266B /* PBXTargetDependency */, + ); + name = ChatMasterMindTests; + productName = ChatMasterMindTests; + productReference = 4F772B152A4706F900D3266B /* ChatMasterMindTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 4F772B1E2A4706F900D3266B /* ChatMasterMindUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4F772B2F2A4706F900D3266B /* Build configuration list for PBXNativeTarget "ChatMasterMindUITests" */; + buildPhases = ( + 4F772B1B2A4706F900D3266B /* Sources */, + 4F772B1C2A4706F900D3266B /* Frameworks */, + 4F772B1D2A4706F900D3266B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4F772B212A4706F900D3266B /* PBXTargetDependency */, + ); + name = ChatMasterMindUITests; + productName = ChatMasterMindUITests; + productReference = 4F772B1F2A4706F900D3266B /* ChatMasterMindUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 4F772AF92A4706F600D3266B /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1500; + LastUpgradeCheck = 1500; + TargetAttributes = { + 4F772B002A4706F600D3266B = { + CreatedOnToolsVersion = 15.0; + }; + 4F772B142A4706F900D3266B = { + CreatedOnToolsVersion = 15.0; + TestTargetID = 4F772B002A4706F600D3266B; + }; + 4F772B1E2A4706F900D3266B = { + CreatedOnToolsVersion = 15.0; + TestTargetID = 4F772B002A4706F600D3266B; + }; + }; + }; + buildConfigurationList = 4F772AFC2A4706F600D3266B /* Build configuration list for PBXProject "ChatMasterMind" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 4F772AF82A4706F600D3266B; + packageReferences = ( + 4F50EF3F2A49CA5E009BD94E /* XCRemoteSwiftPackageReference "Down" */, + 4F50EF422A49CE31009BD94E /* XCRemoteSwiftPackageReference "MarkdownView" */, + 4F50EF452A49D012009BD94E /* XCRemoteSwiftPackageReference "Highlightr" */, + ); + productRefGroup = 4F772B022A4706F600D3266B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 4F772B002A4706F600D3266B /* ChatMasterMind */, + 4F772B142A4706F900D3266B /* ChatMasterMindTests */, + 4F772B1E2A4706F900D3266B /* ChatMasterMindUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 4F772AFF2A4706F600D3266B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4F772B0F2A4706F800D3266B /* Preview Assets.xcassets in Resources */, + 4F772B0B2A4706F800D3266B /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4F772B132A4706F900D3266B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4F772B1D2A4706F900D3266B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 4F772AFD2A4706F600D3266B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4F772B072A4706F600D3266B /* ChatData.swift in Sources */, + 4F772B052A4706F600D3266B /* ChatMasterMindApp.swift in Sources */, + 4F772B092A4706F600D3266B /* ContentView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4F772B112A4706F900D3266B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4F772B1A2A4706F900D3266B /* ChatMasterMindTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4F772B1B2A4706F900D3266B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4F772B262A4706F900D3266B /* ChatMasterMindUITestsLaunchTests.swift in Sources */, + 4F772B242A4706F900D3266B /* ChatMasterMindUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 4F772B172A4706F900D3266B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4F772B002A4706F600D3266B /* ChatMasterMind */; + targetProxy = 4F772B162A4706F900D3266B /* PBXContainerItemProxy */; + }; + 4F772B212A4706F900D3266B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4F772B002A4706F600D3266B /* ChatMasterMind */; + targetProxy = 4F772B202A4706F900D3266B /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 4F772B272A4706F900D3266B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + 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; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + 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; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 4F772B282A4706F900D3266B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + 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; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + 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; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SWIFT_COMPILATION_MODE = wholemodule; + }; + name = Release; + }; + 4F772B2A2A4706F900D3266B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = ChatMasterMind/ChatMasterMind.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"ChatMasterMind/Preview Content\""; + DEVELOPMENT_TEAM = 8KC3NAN2CJ; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = ChatMasterMind/Info.plist; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = no.fjerkroa.ChatMasterMind; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,6"; + }; + name = Debug; + }; + 4F772B2B2A4706F900D3266B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = ChatMasterMind/ChatMasterMind.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"ChatMasterMind/Preview Content\""; + DEVELOPMENT_TEAM = 8KC3NAN2CJ; + ENABLE_HARDENED_RUNTIME = YES; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = ChatMasterMind/Info.plist; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = no.fjerkroa.ChatMasterMind; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2,6"; + }; + name = Release; + }; + 4F772B2D2A4706F900D3266B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 8KC3NAN2CJ; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = no.fjerkroa.ChatMasterMindTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ChatMasterMind.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/ChatMasterMind"; + }; + name = Debug; + }; + 4F772B2E2A4706F900D3266B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 8KC3NAN2CJ; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = no.fjerkroa.ChatMasterMindTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ChatMasterMind.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/ChatMasterMind"; + }; + name = Release; + }; + 4F772B302A4706F900D3266B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 8KC3NAN2CJ; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = no.fjerkroa.ChatMasterMindUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = ChatMasterMind; + }; + name = Debug; + }; + 4F772B312A4706F900D3266B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_TEAM = 8KC3NAN2CJ; + GENERATE_INFOPLIST_FILE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 17.0; + MACOSX_DEPLOYMENT_TARGET = 14.0; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = no.fjerkroa.ChatMasterMindUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SWIFT_EMIT_LOC_STRINGS = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = ChatMasterMind; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 4F772AFC2A4706F600D3266B /* Build configuration list for PBXProject "ChatMasterMind" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4F772B272A4706F900D3266B /* Debug */, + 4F772B282A4706F900D3266B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4F772B292A4706F900D3266B /* Build configuration list for PBXNativeTarget "ChatMasterMind" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4F772B2A2A4706F900D3266B /* Debug */, + 4F772B2B2A4706F900D3266B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4F772B2C2A4706F900D3266B /* Build configuration list for PBXNativeTarget "ChatMasterMindTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4F772B2D2A4706F900D3266B /* Debug */, + 4F772B2E2A4706F900D3266B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4F772B2F2A4706F900D3266B /* Build configuration list for PBXNativeTarget "ChatMasterMindUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4F772B302A4706F900D3266B /* Debug */, + 4F772B312A4706F900D3266B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 4F50EF3F2A49CA5E009BD94E /* XCRemoteSwiftPackageReference "Down" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/iwasrobbed/Down"; + requirement = { + branch = master; + kind = branch; + }; + }; + 4F50EF422A49CE31009BD94E /* XCRemoteSwiftPackageReference "MarkdownView" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/LiYanan2004/MarkdownView.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.3.0; + }; + }; + 4F50EF452A49D012009BD94E /* XCRemoteSwiftPackageReference "Highlightr" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/raspu/Highlightr.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 2.1.2; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 4F50EF432A49CE31009BD94E /* MarkdownView */ = { + isa = XCSwiftPackageProductDependency; + package = 4F50EF422A49CE31009BD94E /* XCRemoteSwiftPackageReference "MarkdownView" */; + productName = MarkdownView; + }; + 4F50EF462A49D012009BD94E /* Highlightr */ = { + isa = XCSwiftPackageProductDependency; + package = 4F50EF452A49D012009BD94E /* XCRemoteSwiftPackageReference "Highlightr" */; + productName = Highlightr; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 4F772AF92A4706F600D3266B /* Project object */; +} diff --git a/app/ChatMasterMind.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/app/ChatMasterMind.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/app/ChatMasterMind.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/app/ChatMasterMind.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/app/ChatMasterMind.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/app/ChatMasterMind.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/app/ChatMasterMind.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/app/ChatMasterMind.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/app/ChatMasterMind.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,5 @@ + + + + + diff --git a/app/ChatMasterMind.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/app/ChatMasterMind.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..083cf4f --- /dev/null +++ b/app/ChatMasterMind.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,50 @@ +{ + "pins" : [ + { + "identity" : "down", + "kind" : "remoteSourceControl", + "location" : "https://github.com/iwasrobbed/Down", + "state" : { + "branch" : "master", + "revision" : "e754ab1c80920dd51a8e08290c912ac1c2ac8b58" + } + }, + { + "identity" : "highlightr", + "kind" : "remoteSourceControl", + "location" : "https://github.com/raspu/Highlightr.git", + "state" : { + "revision" : "93199b9e434f04bda956a613af8f571933f9f037", + "version" : "2.1.2" + } + }, + { + "identity" : "markdownview", + "kind" : "remoteSourceControl", + "location" : "https://github.com/LiYanan2004/MarkdownView.git", + "state" : { + "revision" : "e2dfc286ffbc2297c3654699843473bb6152ab20", + "version" : "1.3.0" + } + }, + { + "identity" : "swift-cmark", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-cmark.git", + "state" : { + "revision" : "29d9c97e6310b87c4799268eaa2fc76164b2dbd8", + "version" : "0.2.0" + } + }, + { + "identity" : "swift-markdown", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-markdown.git", + "state" : { + "revision" : "68b2fed9fb12fb71ac81e537f08bed430b189e35", + "version" : "0.2.0" + } + } + ], + "version" : 2 +} diff --git a/app/ChatMasterMind.xcodeproj/project.xcworkspace/xcuserdata/ok.xcuserdatad/UserInterfaceState.xcuserstate b/app/ChatMasterMind.xcodeproj/project.xcworkspace/xcuserdata/ok.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..5db0577d059240af7d0378df216152b95af6ff82 GIT binary patch literal 37936 zcmeFa2V7Lwwm*LMK6PeP29P2}z>y--L8?+zK#Gbqr49oOFfuSW1GYpx+ZNMIH5yG3 z)EG5J6BAR7i7~|(jV;Y+Ofg*(6O-7@f1Pt?P{eqB_uc#6|MxyOWRN*$pIyIe?X_1s zwQXjTtvxF05QQjA(G)|m6i4xtdeY#jMyt(aX)POUu+}x1;9K$Fc1zo&!Is*|#=3T! z3xyW0)N7r_73CRc80$0ah4xbdr79_EH?$i?w8@#SqBK+=%7gNx22in795sxJrxK_{ zDv3&_QmEn72r89IqsCI>sPR+*HGwLmCR1(H6lxlE3w0|cQiNJSEu`+C?xgOa?xh~2 zmQW8<%c;kx$Ej7+YU)*L8}%BsoqC;mgW5s8N$sTGqTZ(7qxMq=s1K=+s3X)->Kp1? z>O1O3>L==F>KEz^b(T6uT}1tn8*)b;$P*1fUdS8yAYU{P4MIauB#J_bCQFs0q6Rb>O+i*akcmz(xX*eB^#(6j&7vdsZfh%zpZo#eCg4^&EY{fR*j%VUq z@U3_jo`>h-1^9M+AHE;2#~bidcq4uqZ^E1LGx%A&1wV&h#M|-f_znCHei!e<`|$yM z7=MOO(^}e@9zc81-n5P$Ob@3=(5ZA9ola-a zBk57}XgZV5qI2m9^hA0RT|*n_dfG_0(5>`B`ZjtIeLH;zeJ6bveK)4 zKSFoWtLP2%Q}jmqX?hd=0{tTWI=z#Ai{3@QM<1d;q(7oRraz-Ur@y4Xp}(b1(ZADY z=(F@?1~W9%m+8kiFsQAU}iERLzvr{JD59}2bc$$rCr^E>kg^CxqLIm?`5&NCO7i_9e!u>#wVbz(hOPu8Ce zV1wDAY#5u)X0RjKQS4|olg(nY*)eP$JB}UC7O=%^Ia|S2vo)-NHL@1Ajh(_;+3D;I zb`~qL3)$P)JK1~KrR*~HVfGRBadr*+1iO~q#=gdGXJ2REV0W-@vOC$g*tgkt*mv1o z?0f8P_I>sf_EYvS`x$$LJ<5L09%H{@e_>Ctzp}rvr`g}x%j{nq#W9?~d2$0dFV36u z;e5G)TmUzS3*y4KC@z-E=JL3FuA0+xHJpK~3xZT|Q+#YT(_W`$$`C{mA{yo#!s_m=|~z-t;r}62020xM?!{_k1d>%i6FXT)4iTotKn%DESd>wD%C-YX`#<%l}`Fr?#`TO|$ z`3Lw1`6c{A{8D}y|1iItU%@}ZKgzG-SM%%mE&Ox*^ZZu+1^z{T2mdC&lYf{0g#VO3 z%zwro;g9m4^T+rf_#gS7_!Io^0wZXIK7xzjE_evuf}h|o3>HF!FdLmFiEHs>V!sNnlN3MAJinWs!r9Ds;5<(R4=Gr zRK2cxL-n3&zv^SvXR0HrFI2}>->802BQ;jjYDUefIW?~q)GD=Ftx-Fv-PJy7Uv;25 zNFAY$RL80l)amMM^;q=;b&0x6U9PTHPgl=S&s5){zEwR-JzG6TEvkunu6myOHuYll zgX$&fN7aw1pH^>DZ&p8}epbCj{ha!F^(*RE)jQO0s&}j3SMO8rSAU}ZT>X{$TlJ6X zpVYsoFQ_l7FR3r9|I%nQeKdVF{WMM*H;uc-TN9`W(gbUwH8Gl4O}1u?CP$O2$(v*O?7ATNmX_ zxrkV#yQuz@8*mczr8ruz?VmF`bE3uCY-=;r8An^{I$Dga?RxFtn5eAixRKF`;iKZ> zqQc`cGh@OthKFtHaIvAdXVb8^h!L{n?MWg0Z@rTmp) zwHjI*p|#fb(Z<@2#+=p$i(czjXt5dF+YLQiE;ZRqwI(xE3l$a_%^=Je>$@xTRK}o; z)X|(YP?cjj(y1&eW(}1=jig3Vqp3{MMRXPWi*BO(8Y-I_L*-DpRG#QTkT*f$1f>x) zSDM=JNp+TbV+7zK&(t2#v;K$zW23>=VJot9SnG_VpqySCe8cjR)TY#-*Cr?><=?Rd zR*NK_6?L>pQ+91TJ<8~{$v136>C-q%YnI7uESdp}({gnOLvHkNh7D$Zl%d^Vwlq2> zu869pV%Af|R0&l|O{6AKWmGv;K~+*!qNnIB`ig#HfT$A##b9xWICMRwr)nqzRZG=T z^^}onpc<(rFi?lRH=9_A*2J4K-(Z;Dpv!%^wjg*H4->vXm{b(3M z4I{0y^s_*V-nxwzpWD3{3`eq%uPVhPq}$qtO-# zBv99E>1ek_jqg|9it3Yp^y03AUD+jMF0R!;P>_Gc~kd-P1X8PY3F?6MFSj zqG?-XMq8Whn)$u)S9qXzGxOzU{Po&rK^EJyXytQ3g&)y9@AU6=C*N*vbGyqg2kyG#5m&vt<=(XE=)&9S; zdv9;c41qM-Q|6{1cs7IPDbq86Xf7>4$i-Z+AMMYC#bd5lhitDJ+*;)irPp$O>Gh* z#7Hqpj22_WSTRl#1ize%S&)&r@4La@j(?LFY%6=GOlectP#PI2Tv&k|In7FCM(5BZ0T=%xLs-rBR?*Il4GQ@Su4#93K312h1;LB9OvEUz5pHl9f)F)zUCv{j%lO$n~AjZVOa$M196NrzNR@mLUs1wvw9cBN|(cCHOwA9?M)Nf+8IOeM6N*Z9kdN(AE z_&jw%uXP<)G`6GN0Ly=+iB)h58gbNp2?-M7FH?UZ3L%6MjTpot4)J21m@keM$BE;` z0&#*^C>Dvu>yb)9JnD=3Nr*?zfcO$S;wOrgGUBWLgLwJ;5n%%&{#PL$`2pgQzgTKV zJknhk@%D8^p(qT1jfRSoI#IY-c5}c+(I`#^Hi`vcmjlvJJOH~w9DNO#o$39$?WYu& zI$9i#(qxpPR6uF<-#_appNR?pc_<5IqcJE4<)S>4kH(^LXuMb>8pK+$POKM=VuRQy zHi@S7Xo4MiC3fVM0rDo>k=JTRp6x%#`!^u3Q9@pm*z7=FGawI{QH%5u&7$&2(Q37h zqbF)dQzi6uh?Y(?O>DbK^xcAH1A@@4)G=|2nBIlvP+y5wz+W%)p;QNm7NA86=xzhh zwM(Fz0}ohxJ>n?87(Fb3?jCe6x)0rt9zYMGCFmiv6fF~{iqpjD;tX-7c#C+eI7^%@ z&RLI^+d=o3vcaP+0G((D-CX+yf7^dR_iq5*W(jo9h{OT9=WfXEUP0R=z`ZKY>qM`K z^KTMxJJ4GSyW0uuZh?fJcK|&Ld!fhKX@CPj@1qYC!0iRVE&BUM9OXYmUr2!a2z`t` zL7$?-=reQ#9Yvp`W8xj+o#I{M-Qr^L9`RoBKJk9>f%WK1JK(;tbGaV?a1Yu6_mG{- zt@sb%{tbXTBLVKLxWoat3pWBB#+U)XVOm_;iCJ;k%>fRpa32|PSOb827|?_J0pOPR z1{|X80K%@=T?QO>1He7<_m4Qr``{2z!eU=M5c^?&9DoO59UhDWaS#p`9}^!JSBjlt zm$*t?Ev^xt5Z8)NZooqn(BW`uE0!eaEjR{Xx6Tf`r-08rBMWwK{NDp!2bqu=$Pm|_%s`zpzo-V#3j;^dX!BN=M0>%SSQQ5$| zz*JY@C_NjCQt3J3Yn_;g+pj5IX6R_Qv`7y)$}hyXQSK{OilZGD?!b2|yx=b21v~zJ zVI1Wjz>mS^gCE38@I!bhUWOmW%kc{Q2!2%DDZVAXExseZEAA5C6L*X6i+k4N$L)Mz zl_KrnwZH}T+PT01yR`H1|2-biTQTxKt> zr*(C#?GC(C0@It~!A|^^c<3fcdl!CRA?@8j+8;^?+6$!pQE$@bY8(w6#2+c3`w&3) z$=^TXD1QWhCxPxL{v02}U*IqCSNLmu9Djqq6%UJ_iAThv;^*Qq@eA=w@hkD`_4s=` z=uX%{cM3pv+zz_$?VvmPAJF~lB_4cP0^MKYH+Im`7(hqUG$Vb)Z^iHAPm0z{8)9Eu zT0{2*(9wOwA3EuN;*U26I@*PH0|e2oaIX6a&ULgqoa;^i?0TK++*}+D`Otnc=;(m} zx}O1bv^zX-qSqsi@_}>|fQ}BLgXs`@2pvifrNiiOI)aWAPl>;Zzlo>C-^D+~KgBcR zS@GO@I$8l8Jxl=|odlpeZwK8)1#|@A|Df()k2*RVP)CmuFE~(_cOyBQE~JYk#1)B` zI_VPe@=YSHjINZ~99;oy?yoMoimoPzA_(;YkgS%aYZbLDv(tg62HK?HuSv`%2%NtD zz6Qr57J8-x!8UpdZKZ8=JKaG~rKi!;=@|sE1aSoM1PKJG2vQTIA*c^QeF^Hfp1#En z#yPY|6KV@Rj|wKpNkJn)E(C#%-cuY-(18B{^4|c+`y@c#PmtDu$R+aTOE1MQ(@VvD z1UW0eQnb8dtskWymr(f_L9U(jN`m^|BraFeYZY8RA*K`LCh@g(;z)wrd*RaA>69)# zLea2lgB|T|rne}td{%;`*A1R`Jn<6!Diza3zf8YEkPkrvyXbB7YXtcdG^B?+0{y0B znj^^fzi0IYca{j*Q}-%+GX1VnwVz&F(#!03vqr{ijO`KNKx1k*%Z@ZQ$5?mMA5bx? z==bS8^j?Aj2pU9?ZWWO3e)@n+{(}h$k&YY#;n1fq$j>P%)@P2+DIQ;_FUri%995h% zew;opv+Q~WGA9*ej4SFc;NPo;(ww54k@=a0P>ocF!dE__4|md^5)?>KuyW-HeH8E# zB%6QeWAqo*-6k5@I<<;ECfTQy+h5UNgLTMm!6`DfucE)Ak5f~@>jJ*$wVt=!5*6kj z9+NmL%>R~{gxL5n|LEAn_*t_Y^YI=1)Ai@$B>l5IAE5+=i8)HgewDiV8$m<6yZVRH z)thMO9DRX`>7>sS6wygvBq*u}v>2qUf23YJ>YrZ!i0P7junnAs?4x5C1}s;r7?$A} zV64#u#Sj#`icv9Y2AFFcK_dv5B4D+{jLBqt9LyQ~a&UjExj3+aIL5z1< zw>`M5-P8g$bwf*Ag~NsjZZ-rZ5EM^PBtgS<8E*~#{;{!VmpLY5AQJ#&&iFAv*og!s zbuoh&9YNqRmm=nrDq}8H`r|lp$6npN>YlDcGX9uQW~g54+hcs!&etj?j0vZv{-a`G ziX2^9eC@;6?TKSVQA{)y1BYMmnUeh)nK&j@JOdK}>=XFr=v7P-lgy+LltoYl zL6)AtOILuGq1Voy9zITqP+0fBi*HmP*Nv7~Z zW5bAqhWcT3@xx+=B@K%Tl1pYu1;-d{O(UX*#U;fgMJFXDB*Y{o#Y9I9OBi-l8OP)G z2?>c&^|4V`aYH6k>C~wIMyF!q;*Bv$|8%F~<717++8&+CRXUaV-{@3KOhZEaKRZ+L z(Zhx%L>ptEQ_5CTxJ2tLd-ns7(o-^SjjA; zs|cC|8(VK-3VrWr?JnjXS%P8~OA=H$2=>fEc`uyQ>nX=0OPG}s6dz)iGRv5UndQt1 z<`L#m<}v1Rf+`7uM&WRwC#Z%X13|R})e%%rka0cJX@}w(I~3PRP;78O(d2+)%YUHw zZ-C+p5)@w~sL=t%S0pID3Q&X(0edz;5q<#_HI9{jlL32RC$p2F$(_vG1U26z6yIa^ zNKo7@LD76;C_0)t$S7Jh2DEAfwcZR4k1&#AjXBDE&KzUDV7_F&V!mdMGv6@Z5(FeS zg&-?IHiFs->L6$;LDLADPSA|?j9taXoUr2%RBQyzbl~t-2M#5}_J2IpEY^Ri-wq>b z*_giwy2Xw|R#LNFk0sin!KzpdppXS6!K_XelmxSH4u!0ig}{$4)>%T~oSQ-+JAn0( zxgqN6Llr?{zFwR2Ps{p|vQxedM1DzBYj>RQ z*l;$Uig}WaU?bTmHkyrLW7#-%7(u|mZzE_CLAMih2SIldbQeK)KglMriEI*^%%-rz z*%53iL5m5xhoE~2x{sjy33`B_r35@b0P`M-@NKM@{FZa-rPF1D2|VvBY;vT7bQNTM zZN0JGU@}V{$dXf}(F$jyHmk7#%tOX{#d9(r;vFWM>f4*DY;|T+9XKgiJ zmjWW}mz>}P(Vhiff>Hzt6snS(IVBsUd|y5>usQVMm5vh`o3DHUX**|R&M14-f@GbN z9=g&iUAp;oS##h()C9J$hb+yOuoI<4EG6i{P8PPzCDI%?8K<`yz;{uZgVBnkC0of> zK?fdEPNc_KeV23u1tS~C^F>ndY_X-;*gDQ+E;X1tjFKO+(duZnmaXgAYy&%)a$m(Z zvQ4aspydRuAn1`*Y%^(6AiqnC3iTa*l zG$Usy56aI4UGKS`<)sE3Be1a@(mVl2eXNrOj{3NmbL~lqok=;dx3ITL(Hzpb4UT5I zmo~b+1w^<~o-}qgJEs(!JYlZ7*xB8lmn>oDNp;U9sH>BmPtdB~bwkaI*xT7V%Ajsr zyA{Ah&}zLl31sE0sLc4J@Wf#;vEjpFViLkfW@L^GAC)nB*s!RP8KXxfCg@uXbr#!n zy~$#Ozx2}+|!~Nqe%Yln1XxR2jFDM-p2yLJVDUf zF7`oo2|-U1v`zxeKi?O$<>I_qFMZzx z7agNm$#zLR74Ws8lU+s7Q{w0xxvyi_vFq6l>{IMU_Gxw# zyP184pr;AiM9^k};O}P%+CtEC1U*mCRuJ;o=cq00R`vz;eL{#-y zL)}P=r5WPDqT|D&9TUEXJwU~*X7{omu>08k1c9z{J3+4#^u}uTAbW`Yko}0D9R$5e z5Qu4SNf300h3pxCS1hRpfj9TMQL3a0xZbVtZITZ*%xYAxr|hwRaJ#6Zr3KtV6vz}A z8>KitTgk`{levCU^stO!(ecr>+8-6p{RMq=75gRo75gYJ ze#d^#{y@+>1ieepu2t+$> z|3FOnAK(z>#9@w>cx63A*o=2(G_{Vz4hYi>%klqwLI*)rY_(Y0A)AACfToXYe;?l= zp;5^x!*wGva&q(X#}-YTRH?Ve%J%K&q;+g_p1f)+8{>OQ>4p^ zI_m0-M%Wb(y1DoB7~n1S{hG+yPEV2P^nwUiSK#wmARK%&(9b_$P(R(^z@Xp|xK;#V zc+gfumf6r~lN|nyl9NaqECj^of<8$W7@(ZQj&$ik%6vO7(u%wwa-s)7JOaYW9I=fh zIZ_)V!S(-OzoB8_5ujJ~P};pxZ#SB~uDx^B0Nq_g1oaEj$fAdNuZoF{Q^Ips#U~`n zA-Zm&s~kljH7E_D`(eG-e_YY1V(EI8(ID{?P)S3`Y@_X}BA$*SB{?NF2vX_3b-=w} zYIC_cq98zq+D+}D4pCoH-$U%kWu!t{$RXkb*+cwL z0Meo1kTs+VvVz=-K$b^$pvB-6eLpxvFGI`GBj_=-5^V*K)!)%MbOBvLe_;;X7d5yq zWc_f#{joca!{cxP0|Y0-D!9Z`Q(+3FZ+14ssW>e-ow46>8mfaG0+ebO~1_Q=vSyxY7#dRbn(NO1QBAP!Sn-R(L=>xDMVT} zHA43WLacNEK_Ci)u09>q^-_ZX7qBE8r$@g9Gchqdaa2Y|cwACKTzFFA=#k-Z2_rLO zqcW35#U^HgucHHx#=ogXJD|IB#TJXX)?m$X^hJ@8uI}emxBQ}`ll+Ip`Nu@XCizDv z#wYqm!B1>rT$F!IbnGyPpujb9Q>d7AToY&FCUec4nQP%%ISbcD&`$)NAm}7PKNIu| zL8l1%m7w1UIt}78XXDzr4sI$pjhhZj0g5VuekVAI;ADbF5S&VII;;sEB~h;yMj*L| zjx$U(H7c@=bgBERbg+ip4{)iZT}q~4GAi4x@?=h{txeust`zHjQr?v-CAU*KRYRk6 z+;<&oY_V8pWJ54w)0L}^K6JMroh=ljn^doZ3Kw#BK|%)ZHf|AjJ9h_nCqaJ@^d~`Q z2s%s9xi#F~++yw??q2Rbg3c4n5*$QuFu`D>h5c5x!#UD2bayhMdu1I?v%QPR9fdh? z6=9Y6SxJNiRzF!~+ z99r{ujZN;_KT#%VdUgflM1CXGkXv`Bd&Ko!q-?SG;iDOIksJ zbe+PUN*%`flALSnkp%u8)f8D^#X(?qba*}Y6dVJ&4Fsc3ZX>~1Qa1eUQwM+tKEplB zZ2^a4Fdj-&T_CA%z-Pf~w1Ma^n~Vu&2&Tt7Xp@vZ86Zo7 zN=wStV60Z0ObaYF0Hvk1>S_&??MbeWw!f!uK;QvhP-%+W4DC&2kkY|8eGFtg=~Q2H zT7@uI5NI{mYed%RNES`G8?lnz_{ff@1E5-GO_z)7H5Fa+^?;kZ$IaLJ&OK1;0G}=| zZ#akAGcEX!HnvGo=&f}?cVGaX)(RULNXL*9qW6ScudnAD#zL)w26uVsDkbfbBb9@e zJ^-@y%~$i7D2@I1PYc7p?;0A>6&9{@NFTb_2P=PeMMmk;rzn5x(pNku|J4}-&Bw;C zigO)y&Ex<706gLC1#EH}cR2M{)ZwB+^ z4#@oW5%mLg79ohWRUv;Ah=NfVN`v^viIB-n53zNvkhN_ggr_}*)`-d z+aZW1`V1XIKVz(Pwp*e~P`*2UV@46DwsJ4Pu9G>v&8%!q<2%}=IAy8ZN;W(R*>-AL z#l6VABq{iAvb9j|lEda6f{b2!=s8ui-ucn_@8c8Fz$W7Z6C`q8q_FX=HAWp2Ku@ z>v5sqfsX4LX4s7CXGlG5g{(;9jMEAXlI~d^pk5md<;EDMLi{=~B!k&J!%@$uf)Zt~ zljf-jbRAZs!cG)Lt$eTN-U4{CtITy!>8K9SkGHnxU*li_Q{P%AZ2*eYdYnGo#eKtl zORy`!{Xys5i{4y&I;r>v2Kw72-k(5@w!{z1!M)lVqp%ux6?vUCBRN&RIbC5Ee2ETmEw93og{udzQIxFm3xp35_?L& z1`+H*Z~#p0l}%L^Q|$8-kvZL1*CBELOvuwIM+( zL-0U?{XmZ9X`Z2+c$SLf`SL4mm&m;$*bB^?7#Oj8l)qkYsFku(O#|st-)5L$wiuMO zKD?R-?(PFCbcGEl=TNzl0)xrg#rKhz!41nex&jFScpybzx#da4O%mArqwROOZP z@?FOx9?C_3duIm?ua}Zy`P&r2@CW^;f6p~fb)EB<@}JDwcwZiJ_DC^Y3Srvk^~!L1 zZq;49pER1AE?+6T0NK55U@jGhyXYvz;Vvf3KPds+?X>tNq%%8x^MO2^#8&Y^d@vtE zF#JD+;LugvJ^WB^ku2{G1(8sq=D=>q$O4!{x|QX%2w0^KS&It?(;Jn`vDrH0)E_r0 zB-1aX{^&0A4+TFymIq&~)qEU3jF0CN2o5JWg5XGkqgL}td@^q4f$>HY90%eb9wrUv z-zxbzCU+E{3E~|;n&6mDK8xVk8;W-zvbFXU+5RQk$90-M9^L_igNKGGy2cL`U88G% zH+OpqzDg;5mvmH7R10qHk_j!#WHi?+DYWDb0mKWdoTW|?ckS$Sps`ijtm{X1w71Lo z&R_$(Li{#S&{CkcWJK^n%eQe@$w zz@TeYV}S$xq5cqE=MYHg$13McdpEmHr+NiNnO3XC3YCOMz-FNb5kV;jTZ?`7lQ$oE z#H%Btq9HZbKPUx^_ewRg@$pIxz3<7hD%buuDzqxd+SUqcw7HP1_i5?_5X%liLS88? z%;zAU{RpX2euX5wEaW?plxK?SEC>yQw7aP&9gT#vyA7xrQtIA^o<)1F5yxU2f|&9z z`tb&54F`nt`Ee42#}XXh$&V*E;f4@~6AE9%JV}xh|_)g_7 z6`;xD%Lz{D0`KQ5Ig5SVD#cw2dBEgdgE?dQKqJsHn2ric-e@M(z1=U{J z04k+#S2TE9_$tA6tf3KP`i^>I8O)b5VqN;uWjzS%B_1+p^lt7oXb$#pNa;jywZw~@ zz+xYkR-TeFf9)2(X0l@}>YYDC+ zxSn93yM`zD{rmy`ApHK2+Cp$6!A*pQ^IRjLhXF<9^aPSJ21R{pKfSmr*T#T;2528H z09xui` zTi&_HU8$X`gB9RuM}Mxc;cnT0U@O755Il?ER)QafucD6NTYH?`1Xkb#o;xF`z*`ef zCAf{?>GF}vA|~s#O7>Gp*V$vd$}#PVQnXu8mZw?hOYK@E^b?!}K=TxWZ3MSpIZ9pR z-j&WT(6vDM=+s-iV?VYqI{DZFp%u~@%YIStQO+_Q^2KY;t_S5n4|i&@FoI=}RwvJkGZc}t#;fiD1e>HKioxX%PAsx0kVVDpv zBnXK@l8`K<2*ZUDLaLBP@N9zT5DfbrA$Tsq^9Y_#@B)Gt5_}uMi#7-uii@?7No^If zLG80e$fbe_zFoG}z#-&LF_YlCKm`PUFI9H-|4W$||DQ@{f$xSQa`1m8pOy#(J!@cmD)=K%y(ArqT~ z4sb@17XASV2d@$=yE*>L^Nsv{z7XJo@}U|;)2Xlx+amspxkwxnF+Lq z$%@wtL3BtG4t1l$xesLJ>lK$F_ur3L6yBC5_Z@D5r@L(!ZF2N z`I^nUH3GHB(kB+E|;ii zcJ2TDghQ%GplekW!SC6(VpS|`#UMXjlR(+A%E_wXu(haC z2!6j)1uhtSq@&qHF6V*tFNr6m5>0Q*PRk-&lDBQfw= z3RP99s;^M!VS*1`OQEWIpiq@j)u3u5_(Ot$o<8ZOP*t%)XR?PG_Lg~wbmX!pL09PX zx+e#fO`+{iueVz{2=f7%FoR^mbWGK)s@o*eo28nqnxhg`L^W46Pc>h)Km`)O5rU5r z{5ioe@m~=9CBa`2{58SH3I1liYLT7v?y{5Ky%Ont>mWUQ)+K^Z{D<`Z^?`}1$0X8w zoZ#;qq}L@$!M&1wIaYa{YJ)_2u+RR`se(Q5CbKT7Hml@ZA;(nDLaq_~lO*PWTQ+r_ zWM7V!UQ)fPklrg2>7Bg66TJy;2N2v&)muPtJE&5L;C_<{?hL`d$OQMB=-Z3ncB|gM zLU6F@o$5t!2PA?!s5+zqYWtPo(**y1h2VB5Wb>O$Hj+zlkGG#(dH=?ZNbgIfjz4Zh zdUIsb1G6jaiH@oIQT2yJdOxX7s7|VWR{f$nrTSI%o9eU*{M618e2(Dr1YaQdBEgpk zzD)36gr*3M)~o)sliqnH7E^T@NRO5>O~E?@2+i1IF=^pHr1!5UJ#`--J#}9~gKMlT zbE&mJdQuu|=_7WhvbL|X+Cx16NKfraXtq=BMQHBkc0Kh#b$~=j$JG8ndNdD&gyu-3 z_qTbe)xqjene@~{fb?k94W3Z?9R+Gubu^(hpk_Uwj-#B^!_@I$UaC`EEqdreC0!(; z`w%*=7uiZ`M0K({#i2&DE9U6_gzhVo?R6A$>J0VBZnC9a3El5nvQ>`(vQ_7(bJcl- zb|SQv(9Ydt%lA~X-AJXTE|sa1cDWICUaeAdteall3_2xsjoP5DRoAKO)kbxLx>4Pv zHmN5Q+Ktfeg!Ujbtm^6FwR5|R2lh;$I> zl;|K?I;CU&@6qZ1Q#vK}e2JtN5IVp?(u;1SQ&QifzE2|QdkL-URNqhN!8b|L52+tk zNP3w>(t*<6_%})u2M8ZmKLN@r^-6W8x=X!Ey;{A7(14;4LJuKyD4~ZEI_wGcT0qx2 zNm-?SiqPTG763XBNm)fh5+%oRwOfDm-%pPF?^9M?n;ciYRsEtg)h`e_vJ>~tj_a7G zZR+h(vDXM4eFLqPdZ+pwg+snAamd&kEP$-FQtwgkRb1kF@Iu)x)TRDFQd>#>a=mX# z7B0J;NUz-Op^#D^P#?U){b0EgdU3x`CGK}v{h9g*p%V$6L}*AdVdr!I74G+)!u=F0 z!!-6qv?#cV3s(aH*?S0_nEMf>_`C=CnEX^;kMXbnT?QG^~%XyA}p ztHB%|3Fo(9kZmB@2Bok{Z#h^MoLIn4X`CjT!V3-4WFHOCWqI|yYfsZvR0l3IV3O@| zQ+^yA+pa{t!Sn7tipaG~MlVNawHg;N&1#$pJ*HCwdsog4OtTsfFwJT_HLyqI5_;?v zgQmtu<9{7nsRk4n8XckYz*b7PkK^v zOMoBcT~!Vjh2hF}Cdr-BBuL?--PW>ta7?gS%tpz;Ykx6Urs8-61SEO0OCd1VEiFYZ zfhDn}t!MerzbjvmGrAb=^{71T?+TBF^b7THrtVo>+OMwP7g+e7MgO+jMIE&^`Nfev z%SZlQ)eyBTdGbqU&z?{GZQr}SQhE&4#qN+GQDCt}rmcgT37SIiUiGE+Yl^^c0J08B zj;4|ys`4f&@MFE|noKx^u8_H&rbJT;uaoS4pi46mYj( z6%Fq>PlKq!Qh3j0HN3}o5WKxO0p3`g!;j+&;BCbd`7*u|-d5ZJ?;u{szYgyl-pRiW z?;L&)Z2EioePFyl#DBz}1QYhJ{O@3@KF?nQ{U{A)Tmjxa+!x+AoB?kYu7&pqKLr}^ z&*1I9PV#$x6IG*BnW}7fzi*yutZI^~9P}_X@Q&XGRTI3=cZcetItc{0De8slMd~}$ zcflKW?^WLqZ`plFy-d9v-m&`(ykGZu^$Y5k;0?R5m8joz>q1 z*AUHJnkAYQnw6S$nys1_H7{#k?NijJrcZ63`aTVPUheZwpIv=+_u138rf*AMOW!Gd zZGB(v`%d3oeRucW)6ctKNWaj2Vf`Zd&FHtV-=cnZ^t;O`->J;0!l}wh@AR_MJ5IZt zc029SR%@HV8+)#HzILH@k@gPlUE0Okd$sp#AJneXZqRPjZqh!Z-J*S7`-1i*?JL@C z+U?pS+6&Hp&Kb@|=R2J@Iq!8o>7sUVb#Zs`bn$Z0xrDhyxJ0?cxWu`{yCk|~xa7Eu za~bba>7sWrxYWBexHP#eaJk=QsmsGID_mB(bh)f{dBWvcmp5GAbJ^{($7P?(r!L>R z{N(bxD{|#r1y{AJldH3P^-$=W$gX>1uO|H+l?sYxc-?@Km|B3x)_3!NedjDhnFS@aA zf}7f{kDHs@KsSH4L2iTHg4{yfhPfrWCA*DqOLNO`t9EO4Yjd-@wY$x5yTxsm+Z?yW zZuhw@cU$ZBl-tv8o86vwd%^7`w^!WWbNkrsgxk+MJ z5Q_T%cW-xJcR%+4cb$8nd$9Wu_o41%+#B8Rbl>Q{-~Eh-w@0!^na5O*IUaL8=6fvk zxW{9e$8wKHJRb8{>Cxq}+T#h2EgoAvUi5gyW1Gizk0TyGc>L^f%HubWGalzWE_ht> z?BnU=>EjvTsq+l<4D}52jPQ)|O!Lh5G?05xFHfUE)L0rw8rG+^(5p9cIs;LLz?11@+m zUVXisyqvvUz1+M!yasy(dkygl^NR3_@*3+^?xpuKc-46|c}?~*d$oGa@)Eu7_PXEe zL9d6rR(L(?^|)83*JiJ6UI)Amd41&diPvGTBVM0-ec|<$*Kx0Jy)JlN^7_jgdDGsk zH}9?T)_C{zcJc;4JMXdHQ@kJWe!=^w5AyN%N%N`nG5R$5O!hJRbok8n5q;+R%=cO7 zv&d(O&oZCoK9Bl5?$hb>n$K>ZeLe?#4*7iQ^O?_4pJP5h`~2#2*_ZZZeRf=3C)w^=O0+crthu3vwcP1xxVv# z7y2&py~B5{@7umV4(u~9YGCO=GH}hnoddu2qx@8Uef;|QY5fNH4e}f87vvY>7wQ-0 z7vY!Um+F`9H_9*5FWax)Z;Ibkzv+H6{pR=)zj=NO{2ugM>bKhO8NV%l&-=aL_mbZ$ ze%t)s^LyWKuirku1Ad46KJxp-@1%bp{~`X_{wDtg{)_!r_&?^q(tnlz8vnKa&-uUN z|Em8k|M&g(`tSEY=>MVrSN5z`ru{vI-(z)vf=)83Ub^f|R zx-?zBZi22zSE4J|RqCpBH9CvVs+*&muUn{Fq`O;pkM2I*1G+BVCf!cm+q!pk@9Eyx z?bYqm9nc-peWd$DcT)F@?pNJu-5v9Jkou6ukoJ%nA-9Cg4w)CSFy!`-J42R-tPOcJWP8YtkhenK4cQ&CH)Mav zp^%S54u|{_@>|I7A%BLP4Y?3Wfsm#hRzRN82UiyL!l3cJ`(zPXlLkap}Rx(g&qj~F!XTf zk9LHhWZTk8yYY)YUqfeBZp=V9W!+7(1M{wLraF% z4y_;BFw``3^U!TWw-0?|=*}>oupwblVXVWYyb!g9j$!pvcJhiwjfDeTp- z?O{8@c89$m_CeSuVc&)Q9Cjw03D<->hlhnHg{Oy)3eO792`>mQ3NH;W3$F;T4{r>g z9NrQ>HGEq5%k+#m-jDboVt>R}5ho)4jKq;_q!6iz>=)?~IXH4iWEi}pIxaFHGC6X1 zL2A1H83h5YH(C=)R3t7 zsKlt`s1Z@GMeUB-6ZJvVf#{;>n&{f-`sl{!@1y^SQOER+(Z;yOxW^2L@rm(^859#3 z6B08bCOu|k%;=b`n4Flrn6WYAV+v!6V@hLeG55!8jrkG{HHpgv=dpB-( z+@81(;`YZKiu)+;leoiiN8^sgeHnLom@lM+sT+3Nu#Lm^4?7j_6dx8pEIu(lC4NMF zR{Z$*!uaC&iScFe74cQ^ljB?B+v08UQ{$({FNyDpUmL$Z{;Bw9;-8CuA^xTKcjG^d zKOBD~{#g9+`0wI>j6V^7Awfv+P4G|9B?Ki5NeD}bOo&MsmXMf`l2DLPlu(i|F`+D> zGNC%5CZRULn9!JDN?4e%CSg~?Pl-;6!xGC9rzb8=d@gZY;_HcTCcc%pH}T`d!-+={ zk0pMY_;uo`#M6m?CZ0>Yn0PtKJ1Hb7JShrt-6kX@Cyhu-OB$C{kyMjZn`BIyoYa!k zmSjyLNsE*2OL{PAY0~nfN0QbhZAjXfv^nWwvMSjt**DogS(hA?JR~_RIWjpWc~o*% za!zu7^7!P!O!D^R1Ifpee@niQd@=d26d^^G(kCS>Wmw9{ zlu;?8Q?gQuQc6?GQYusQDTWkV%B?B0QpA+oQx>N@mGV-`%PFsjtmcs$c4$)S;iX1esoPU`r0z_8C-uG5J*oRr52k*Y`f=)4spryM(gM?lr%gz!NVBEgmG(f|^0e(~ zZ>Q}~`y%aR+Mj9X(k`a`m5$Rj>HX53)BC4;qz_1sNgtcul)fUpGktyfQ|ZsAznZ>1 zeMkCR>F=h0n0_SvSo&A#-=v>N|0Vsm^gq(iWcX){%b1xlFJnQ*{TUBuJd*KvMpwqV zjHfa-WjvelT*kJHof&&FKFmCx`CaCz%*$D9R-dc^SwUGtvcj?=vtqJ_WhG{1W{t_p z%Nmz8A*(oRVpdt!?5tH;d$P`CQ`tCMlifetBReQNGCL+aE;~MZRCZSOnC!glaoGjg zW!aV4)!ByZ$=S`>t=ZGEAIW|!du8^j>^0eIv)5&B$ljQ}IeSa?*6bIvU(Vi^{d)GB z*>7jRoBd(-$Jw7|9~qM{X7re%F{NY5##D~ckEtDF9Md#r+L#$*ZXGjw3>hyqo1>yaCpJ0f>NZhh|b+y%KSa-Yt9HFsC;q1=yi59c1u{UZ14+@EuQ z&HX+1Oz!#IOSymL4a&>NE6HojyE|`r-m1JO^48@&mA5JH#k`mEw&lH^w<7gp1fBp-5BIuSi?uTNF|hQ50PiTNGb3zGza> zw4z&!Runy1w4rEY(dMF;iry~TRkXWkZ_#H(pBH^m^mVaN>|E?soLQV(+)+HYct!D} z#jh9dDLz#Eaq;2eqs7OIzbpQ+_+;@fB_1WiOKM6MmON1MNXg?RT_tNuo-BE$yFMq21>GI9x@0R~qex{;dg>yy!3Xck}3f~I<3SC7|#gK}yipYwrikyo4it!bN z6(tpuDk>_fD-0F&6^#|9is=<=Dqg7AQSnj5&z1cvLo3HtwpBh*xukMwWmo0u%4aH{ zt9+sI<;rc9+ba)N9;y7Y@_6NUl|NRVsk~f;s+cOis$Z3Jm1~uIm1k8@RcuvORY6r* zRYO%vRa=#~ovXT7b-9|V)>QjdLoj;v_-ae_lgCmsRzF_- zT=hHEpH_cWeX{yg_37$AtIt(mtiG)G)2Hb5`YHN*^sDrn^n3LC^au4H=|9yU(I3-) zsXwm2R72I!HC&CVrcX`3n)I5Snu405n$nuGnu?mHn&z6;nkh94YVNODQnR#XdCl6I z^)*k`Y^r&!W_Qh=nte3~YCfy^wdPMlAA_60-=H%D8H|Qj!%V{*!<~js!+yi(hCd8v z4HpcTYf&vz%h#%F`_^h}U2ENI!)v2zV`}4S<7<;@Q)*Ld(`!f8X4Yoc=F~RSE~s5s zySw(6I=8y?y860#bzODa>)x%~UAMPxU)`s5U)3G2`?l`;x*zLK)Sat4Uw5JIQoXv~ zqu#6Dx8A>AS07YAq&~hrsXnDXwLYVMRDD+cnEI;vTk9XLf4=@;{U1hbWQ~GRW9(~m zGWr;Y7{iQ_#u#IqG2S@JSYRwMPBfMq^~PGr{?%aYFwQnEF)lYgV?1E|(D;e*GvnvR zFOA2I-x+^wpc}XbRYRW!rv{e>w}ycY0S$v2f*N8Q;u{hhQW|m_iW+Jf>KYmvni}Rd zyxOpxOR|erWiq(W^11(b{-R=6jp(Z{F1WYV#Y-JDcBb-rc;Xd0+E^<}aInZa&@oNAua{ zOJ>T9&5YUA>}yUnXP8Huv(35YvE~AEp}EA|YMx?lH%~LqG|w{6F)uRTW4_>io^(_r8O)ZmKT3ReEQ(9~-Q(LCD%xqcOvbE)K%f(jz)~wdat+%&6 z+4@%N-q!uChgv^sJ=Xet>yND`T7Pam)%siOUlwd(ErLa3>1zqKBv^)9QY{&lEK80h z&ob6hX@S@%3wY*Rrdw{Y%(Bd}EVgX2JZpL0@}lJx%WIZ5EN@!gwj8s3W%ohXluVg6WyO>?rhH>%tU7DDHOHE79dDgrEw@6>M{A?iWNo&#SZ7*iSw-tS>q6@y z>l*8`))%ZVSzoojVcltc+xo8cW9xD257wWoKU+^*|FoX9p0}xNE;cutr_I|o*p_A+ zY0I=V*i1IF&0@3KI&9NzGi|eM57{2JJz{&@)@55`TWi~Fd%^ay?fr^@cr^9*ce8pId!vtK1$(V}ixE*(3Cho%Bn1e^K0E@5`%aO1OYw!xzVF2r~0UPli zKE{50iLY@Ghj0YPa0-JM!Wo>yPdJZX>=L`l9@8SJ?nDe-hi@A&|_!N6w&3`38(Hg7Cx=~X!Rnv5 + + + + BuildLocationStyle + UseAppPreferences + CustomBuildLocationType + RelativeToDerivedData + DerivedDataLocationStyle + Default + ShowSharedSchemesAutomaticallyEnabled + + + diff --git a/app/ChatMasterMind.xcodeproj/xcuserdata/ok.xcuserdatad/xcschemes/xcschememanagement.plist b/app/ChatMasterMind.xcodeproj/xcuserdata/ok.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..848d2c2 --- /dev/null +++ b/app/ChatMasterMind.xcodeproj/xcuserdata/ok.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + ChatMasterMind.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/app/ChatMasterMind/Assets.xcassets/AccentColor.colorset/Contents.json b/app/ChatMasterMind/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/app/ChatMasterMind/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/app/ChatMasterMind/Assets.xcassets/AppIcon.appiconset/Contents.json b/app/ChatMasterMind/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..532cd72 --- /dev/null +++ b/app/ChatMasterMind/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,63 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "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 + } +} diff --git a/app/ChatMasterMind/Assets.xcassets/Contents.json b/app/ChatMasterMind/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/app/ChatMasterMind/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/app/ChatMasterMind/ChatData.swift b/app/ChatMasterMind/ChatData.swift new file mode 100644 index 0000000..9f27cd1 --- /dev/null +++ b/app/ChatMasterMind/ChatData.swift @@ -0,0 +1,58 @@ +// +// Item.swift +// ChatMasterMind +// +// Created by Oleksandr Kozachuk on 2023-06-24. +// + +import Foundation +import SwiftData + +@Model +final class ChatPair: Identifiable { + let id: UUID + var timestamp: Date + var question: String + var answer: String? + var previousVersions: [ChatPair] + + init(question: String, answer: String? = nil, timestamp: Date = Date(), previousVersions: [ChatPair] = []) { + self.id = UUID() + self.question = question + self.answer = answer + self.timestamp = timestamp + self.previousVersions = previousVersions + } +} + +@Model +final class ChatHistory: Identifiable { + let id: UUID + var name: String + var chatPairs: [ChatPair] + + init(name: String, chatPairs: [ChatPair] = []) { + self.id = UUID() + self.name = name + self.chatPairs = chatPairs + } + + func addChatPair(question: String, answer: String? = nil, timestamp: Date = Date()) { + let newPair = ChatPair(question: question, answer: answer, timestamp: timestamp) + chatPairs.append(newPair) + } + + func editChatPair(withId id: UUID, question: String? = nil, answer: String? = nil) { + guard let index = chatPairs.firstIndex(where: { $0.id == id }) else { return } + let newChatPair = chatPairs[index] + newChatPair.previousVersions.append(chatPairs[index]) + if let question = question { + newChatPair.question = question + } + if let answer = answer { + newChatPair.answer = answer + } + newChatPair.timestamp = Date() + chatPairs[index] = newChatPair + } +} diff --git a/app/ChatMasterMind/ChatMasterMind.entitlements b/app/ChatMasterMind/ChatMasterMind.entitlements new file mode 100644 index 0000000..068b8e8 --- /dev/null +++ b/app/ChatMasterMind/ChatMasterMind.entitlements @@ -0,0 +1,22 @@ + + + + + aps-environment + development + com.apple.developer.aps-environment + development + com.apple.developer.icloud-container-identifiers + + com.apple.developer.icloud-services + + CloudKit + + com.apple.security.app-sandbox + + com.apple.security.files.user-selected.read-only + + com.apple.security.network.client + + + diff --git a/app/ChatMasterMind/ChatMasterMindApp.swift b/app/ChatMasterMind/ChatMasterMindApp.swift new file mode 100644 index 0000000..b3bfc36 --- /dev/null +++ b/app/ChatMasterMind/ChatMasterMindApp.swift @@ -0,0 +1,20 @@ +// +// ChatMasterMindApp.swift +// ChatMasterMind +// +// Created by Oleksandr Kozachuk on 2023-06-24. +// + +import SwiftUI +import SwiftData + +@main +struct ChatMasterMindApp: App { + + var body: some Scene { + WindowGroup { + ContentView() + } + .modelContainer(for: ChatHistory.self) + } +} diff --git a/app/ChatMasterMind/ContentView.swift b/app/ChatMasterMind/ContentView.swift new file mode 100644 index 0000000..59550e1 --- /dev/null +++ b/app/ChatMasterMind/ContentView.swift @@ -0,0 +1,159 @@ +// +// ContentView.swift +// ChatMasterMind +// +// Created by Oleksandr Kozachuk on 2023-06-24. +// + +import SwiftUI +import SwiftData +import MarkdownView + +struct ContentView: View { + @Environment(\.modelContext) private var modelContext + @Query private var chatHistoryList: [ChatHistory] + + var body: some View { + NavigationView { + List { + ForEach(chatHistoryList) { chatHistory in + NavigationLink(destination: ChatHistoryDetailView(chatHistory: chatHistory)) { + Text(chatHistory.name) + } + } + .onDelete(perform: deleteItems) + } + .toolbar { +#if os(iOS) + ToolbarItem(placement: .navigationBarTrailing) { + EditButton() + } +#endif + ToolbarItem { + Button(action: newChat) { + Label("New chat", systemImage: "plus") + } + } + } + Text("Select an chat") + } + } + + private func newChat() { + withAnimation { + let newChatHistory = ChatHistory(name: "test1") + modelContext.insert(newChatHistory) + } + } + + private func deleteItems(offsets: IndexSet) { + withAnimation { + for index in offsets { + modelContext.delete(chatHistoryList[index]) + } + } + } +} + +struct ChatHistoryDetailView: View { + @Environment(\.modelContext) private var modelContext + var chatHistory: ChatHistory + @State private var newQuestion: String = "" + @State private var pairToEdit: ChatPair? = nil + @State private var newAnswer: String = "" + + var body: some View { + VStack { + List { + ForEach(chatHistory.chatPairs) { chatPair in + VStack(alignment: .leading) { + MarkdownView(text: chatPair.question) + if let answer = chatPair.answer { + MarkdownView(text: answer) + .tint(.secondary) + } + Button(action: { + pairToEdit = chatPair + newAnswer = chatPair.answer ?? "" + }) { + Text("Edit") + .foregroundColor(.blue) + } + } + Text("Timestamp: \(chatPair.timestamp)") + .foregroundColor(.secondary) + .font(.footnote) + } + } + HStack { + TextEditor(text: $newQuestion) + .frame(height: 100) + .overlay(RoundedRectangle(cornerRadius: 5).stroke(Color.gray)) + Button(action: { + addChatPair() + }) { + Text("Add") + } + Button(action: { + cancelEdit() + }) { + Text("Cancel") + } + } + .padding() + } + .navigationTitle(chatHistory.name) + .sheet(item: $pairToEdit) { pairToEdit in + VStack { + Text(pairToEdit.question) + TextEditor(text: $newAnswer) + .overlay(RoundedRectangle(cornerRadius: 5).stroke(Color.gray)) + .frame(maxHeight: .infinity) + Button(action: { + editChatPair(pairToEdit) + }) { + Text("Save") + } + } + .padding() + } + } + + private func addChatPair() { + guard !newQuestion.isEmpty else { return } + withAnimation { + let newPair = ChatPair(question: newQuestion) + chatHistory.chatPairs.append(newPair) + newQuestion = "" + do { + try modelContext.save() + } catch { + print("Error saving model context: \(error)") + } + } + } + + private func editChatPair(_ chatPair: ChatPair) { + guard !newAnswer.isEmpty else { return } + withAnimation { + chatHistory.editChatPair(withId: chatPair.id, question: nil, answer: newAnswer) + newAnswer = "" + pairToEdit = nil + do { + try modelContext.save() + } catch { + print("Error saving model context: \(error)") + } + } + } + + private func cancelEdit() { + newAnswer = "" + pairToEdit = nil + } +} + +#Preview { + ContentView() + .modelContainer(for: ChatHistory.self, inMemory: true) +} diff --git a/app/ChatMasterMind/Info.plist b/app/ChatMasterMind/Info.plist new file mode 100644 index 0000000..ca9a074 --- /dev/null +++ b/app/ChatMasterMind/Info.plist @@ -0,0 +1,10 @@ + + + + + UIBackgroundModes + + remote-notification + + + diff --git a/app/ChatMasterMind/Preview Content/Preview Assets.xcassets/Contents.json b/app/ChatMasterMind/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/app/ChatMasterMind/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/app/ChatMasterMindTests/ChatMasterMindTests.swift b/app/ChatMasterMindTests/ChatMasterMindTests.swift new file mode 100644 index 0000000..fcb7c03 --- /dev/null +++ b/app/ChatMasterMindTests/ChatMasterMindTests.swift @@ -0,0 +1,35 @@ +// +// ChatMasterMindTests.swift +// ChatMasterMindTests +// +// Created by Oleksandr Kozachuk on 2023-06-24. +// + +import XCTest + +final class ChatMasterMindTests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + // Any test you write for XCTest can be annotated as throws and async. + // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error. + // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards. + } + + func testPerformanceExample() throws { + // This is an example of a performance test case. + measure { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/app/ChatMasterMindUITests/ChatMasterMindUITests.swift b/app/ChatMasterMindUITests/ChatMasterMindUITests.swift new file mode 100644 index 0000000..70b8e26 --- /dev/null +++ b/app/ChatMasterMindUITests/ChatMasterMindUITests.swift @@ -0,0 +1,41 @@ +// +// ChatMasterMindUITests.swift +// ChatMasterMindUITests +// +// Created by Oleksandr Kozachuk on 2023-06-24. +// + +import XCTest + +final class ChatMasterMindUITests: XCTestCase { + + override func setUpWithError() throws { + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDownWithError() throws { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + + func testExample() throws { + // UI tests must launch the application that they test. + let app = XCUIApplication() + app.launch() + + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testLaunchPerformance() throws { + if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) { + // This measures how long it takes to launch your application. + measure(metrics: [XCTApplicationLaunchMetric()]) { + XCUIApplication().launch() + } + } + } +} diff --git a/app/ChatMasterMindUITests/ChatMasterMindUITestsLaunchTests.swift b/app/ChatMasterMindUITests/ChatMasterMindUITestsLaunchTests.swift new file mode 100644 index 0000000..1c4d924 --- /dev/null +++ b/app/ChatMasterMindUITests/ChatMasterMindUITestsLaunchTests.swift @@ -0,0 +1,32 @@ +// +// ChatMasterMindUITestsLaunchTests.swift +// ChatMasterMindUITests +// +// Created by Oleksandr Kozachuk on 2023-06-24. +// + +import XCTest + +final class ChatMasterMindUITestsLaunchTests: XCTestCase { + + override class var runsForEachTargetApplicationUIConfiguration: Bool { + true + } + + override func setUpWithError() throws { + continueAfterFailure = false + } + + func testLaunch() throws { + let app = XCUIApplication() + app.launch() + + // Insert steps here to perform after app launch but before taking a screenshot, + // such as logging into a test account or navigating somewhere in the app + + let attachment = XCTAttachment(screenshot: app.screenshot()) + attachment.name = "Launch Screen" + attachment.lifetime = .keepAlways + add(attachment) + } +}